batik-1.9.orig/0000755000175000017500000000000013153020772012736 5ustar mans0954mans0954batik-1.9.orig/MAINTAIN0000644000175000017500000001471013063003300014050 0ustar mans0954mans0954 Project Maintanance Howto ------------------------- This document introduces newcomers to the management and maintenance of the Batik project hosted under xmlgraphics.apache.org (http://xmlgraphics.apache.org/batik). Each project is required to use Ant as build tool and to be coherent with the rest of the build systems of the other projects, so that nightly builds and distribution creation can be done automatically without per-project scripts. This implies it is *very* important that properties names are not changed but kept consistent with the other projects. Distribution Creation --------------------- For creating a distribution the following steps must be done: 1) Modify build.xml with the distribution version. Only modify the version for main releases (e.g. version value="1.1") but not for release candidates or beta versions where only the revision type and number should be updated (e.g. revisionType value="beta" and revisionNumber value="3") 2) Add your public key to the KEYS file in the root directory of Batik if it isn't already there. The following link has the details on what this means and how to do it. http://wiki.apache.org/old/SigningReleases 3) Commit these changes to SVN, in general only the following files should be modified: build.xml KEYS 4) Tag the release on SVN: svn copy https://svn.apache.org/repos/asf/xmlgraphics/batik/trunk \ https://svn.apache.org/repos/asf/xmlgraphics/batik/tags/ where is the version name, e.g. "batik-1_1rc3". Note: sometimes, it is necessary to remove a tag because the tests failed and a fix was required. To remove a tag, use the delete command: svn delete https://svn.apache.org/repos/asf/xmlgraphics/batik/tags/ 5) Check out the tagged release to a new directory: svn co https://svn.apache.org/repos/asf/xmlgraphics/batik/tags/ 6) Run the build script with target "dist-zip": build dist-zip This will create the binary release zip, the source release zip and the javadoc zip. 7) Test the distributions build regard build regard.manual The build results are in the test-reports directory. Check that there are no show-stoppers for the release. If there are fixes required, you need to remove the tag (as explained in step 2) and then fix any problem that requires attention. Then, you need to start at step 1) again. Note that you will need to have a copy of the W3C SVG working group test suite in the 'beSuite' directory and have that directory under the same root as xml-batik. See http://www.w3.org/Graphics/SVG for instructions on how to get the SVG test suite. 8) Update the README and CHANGES files describing the content of the release and the modifications which have taken place, http://www.apache.org/dist/xmlgraphics/batik/README. This file has a small header followed by the contents of the CHANGES file from the distribution. 9) If you are creating a release candidate, rename the distribution files to an rc name. For example: mv batik-src-1.1.zip batik-src-1.1rc1.zip 10) Sign and create md5 hashes for the releases. The following link has full details on how to sign things (if you don't want to know anything the last section 'Using GPG' tells you what commands work). http://wiki.apache.org/old/SigningReleases For example: gpg --detach-sig --armor --output batik-1.5.zip.asc batik-1.5.zip md5 batik-1.5.zip > batik-1.5.zip.md5 11) Use 'scp' to copy the distributions (with md5 hashes, and signature files), the README, and the KEYS file under /www/www.apache.org/dist/xmlgraphics/batik/ For example: scp batik-1.1rc1.zip* vhardy@people.apache.org:/www/www.apache.org/dist/xml/batik/ 12) Finish setting up the distribution directory in accordance with: http://www.apache.org/dev/mirrors.html http://people.apache.org/~bodewig/mirror.html This makes sure that the distribution is mirrored nicely around the world. Start by logging into svn.apache.org (e.g. 'ssh vhardy@svn.apache.org'). First make sure file permissions are correct. The new files should be owned by group 'xmlgraphics' and be group writable. The following commands can do this (don't worry about links): chgrp xmlgraphics batik-1.5.zip chmod 664 batik-1.5.zip If you are making a 'final' release you should delete the existing 'current' links and re-point them at the new release (do this for every file with a version number in it - including md5, and asc files): cd /www/www.apache.org/dist/xmlgraphics/batik rm batik-current.zip ln -s batik-1.5.zip batik-current.zip rm batik-current.zip.md5 ln -s batik-1.5.zip.md5 batik-current.zip.md5 rm batik-current.zip.asc ln -s batik-1.5.zip.asc batik-current.zip.asc <- lots more files -> Finally remove the old releases (every release is automatically copied to 'archive.apache.org/dist/xmlgraphics/batik' from 'www.apache.org/dist/xmlgraphics/batik' so you can just remove an old release from www.apache.org: rm batik-1.5b4.zip 13) Wait approximately 24hrs for the files to get to all the mirrors, then send an email to the batik-dev and batik-users mailing lists announcing the release. Site Creation ------------- For creating the web site, the following steps must be done: [Note: due to JVM font-rendering problems, this is best done on a windows machine] 1) run the build script with target "publish", which will generate the site and use ForrestBot to commit it to the repository 2) connect to people.apache.org with your account 3) execute "cd /www/xmlgraphics.apache.org/batik" 4) execute "svn update" If the javadocs don't need to be regenerated, the "publishdoc" build target can be used instead of "publish". This will be much quicker. Note that because of the way ForrestBot works, any files that are no longer part of the site will still remain in Subversion, and thus will still be deployed. To delete files permanently, check out https://svn.apache.org/repos/asf/xmlgraphics/site/deploy/batik/ and make changes there directly. Nightly Builds -------------- The nightly builds are current performed by a crontab entry in Thomas DeWeese's people.apache.org account: /home/deweese/bin/nightly.csh batik-1.9.orig/test-sources/0000755000175000017500000000000013063003277015377 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/0000755000175000017500000000000013063003277016166 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/0000755000175000017500000000000013063003277017407 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/0000755000175000017500000000000013063003301020465 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/swing/0000755000175000017500000000000013153020772021627 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/swing/JSVGMemoryLeakTest.java0000644000175000017500000001606213063003302026064 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.swing; import java.io.File; import java.net.MalformedURLException; import java.lang.ref.WeakReference; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.w3c.dom.Element; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.anim.dom.SVGOMElement; import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.UpdateManager; import org.apache.batik.dom.svg.SVGContext; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.MemoryLeakTest; import org.apache.batik.test.TestReport; /** * One line Class Desc * * Complete Class Desc * * @author l449433 * @version $Id: JSVGMemoryLeakTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JSVGMemoryLeakTest extends MemoryLeakTest implements JSVGCanvasHandler.Delegate { public JSVGMemoryLeakTest() { } public String getName() { return "JSVGMemoryLeakTest."+getId(); } TestReport failReport = null; boolean done; JSVGCanvasHandler handler; JFrame theFrame; /** * A WeakReference to the JSVGCanvas. */ WeakReference theCanvas; protected void setTheCanvas(JSVGCanvas c) { theCanvas = new WeakReference(c); } protected JSVGCanvas getTheCanvas() { return (JSVGCanvas) theCanvas.get(); } public static String fmt(String key, Object []args) { return TestMessages.formatMessage(key, args); } public JSVGCanvasHandler createHandler() { return new JSVGCanvasHandler(this, this); } public TestReport doSomething() throws Exception { handler = createHandler(); registerObjectDesc(handler, "Handler"); done = false; handler.runCanvas(getId()); SwingUtilities.invokeAndWait( new Runnable() { public void run() { // System.out.println("In Invoke"); theFrame.remove(getTheCanvas()); getTheCanvas().dispose(); theFrame.dispose(); theFrame=null; theCanvas=null; } }); try { Thread.sleep(100); } catch (InterruptedException ie) { } SwingUtilities.invokeAndWait( new Runnable() { public void run() { // Create a new Frame to take focus for Swing so old one // can be GC'd. theFrame = new JFrame("FocusFrame"); // registerObjectDesc(jframe, "FocusFrame"); theFrame.setSize(new java.awt.Dimension(40, 50)); theFrame.setVisible(true); }}); try { Thread.sleep(100); } catch (InterruptedException ie) { } SwingUtilities.invokeAndWait( new Runnable() { public void run() { theFrame.setVisible(false); theFrame.dispose(); }}); handler = null; if (failReport != null) return failReport; DefaultTestReport report = new DefaultTestReport(this); report.setPassed(true); return report; } public void scriptDone() { synchronized (this) { done = true; handler.scriptDone(); } } public void registerElement(Element e, String desc) { registerObjectDesc(e, desc); UpdateManager um = getTheCanvas().getUpdateManager(); BridgeContext bc = um.getBridgeContext(); GraphicsNode gn = bc.getGraphicsNode(e); if (gn != null) registerObjectDesc(gn, desc+"_GN"); if (e instanceof SVGOMElement) { SVGOMElement svge = (SVGOMElement)e; SVGContext svgctx = svge.getSVGContext(); if (svgctx != null) { registerObjectDesc(svgctx, desc+"_CTX"); } } } public void registerResourceContext(String uriSubstring, String desc) { UpdateManager um = getTheCanvas().getUpdateManager(); BridgeContext bc = um.getBridgeContext(); BridgeContext[] ctxs = bc.getChildContexts(); for (int i = 0; i < ctxs.length; i++) { bc = ctxs[i]; if (bc == null) { continue; } String url = ((SVGOMDocument) bc.getDocument()).getURL(); if (url.indexOf(uriSubstring) != -1) { registerObjectDesc(ctxs[i], desc); } } } /* JSVGCanvasHandler.Delegate Interface */ public boolean canvasInit(JSVGCanvas canvas) { // System.err.println("In Init"); setTheCanvas(canvas); theFrame = handler.getFrame(); File f = new File(getId()); try { canvas.setURI(f.toURL().toString()); } catch (MalformedURLException mue) { } registerObjectDesc(canvas, "JSVGCanvas"); registerObjectDesc(handler.getFrame(), "JFrame"); return true; } public void canvasLoaded(JSVGCanvas canvas) { // System.err.println("Loaded"); registerObjectDesc(canvas.getSVGDocument(), "SVGDoc"); } public void canvasRendered(JSVGCanvas canvas) { // System.err.println("Rendered"); registerObjectDesc(canvas.getGraphicsNode(), "GVT"); UpdateManager um = canvas.getUpdateManager(); if (um == null) { return; } BridgeContext bc = um.getBridgeContext(); registerObjectDesc(um, "updateManager"); registerObjectDesc(bc, "bridgeContext"); BridgeContext[] subCtxs = bc.getChildContexts(); for (int i = 0; i < subCtxs.length; i++) { if (subCtxs[i] != null) { SVGOMDocument doc = (SVGOMDocument) subCtxs[i].getDocument(); registerObjectDesc(subCtxs[i], "BridgeContext_" + doc.getURL()); } } } public boolean canvasUpdated(JSVGCanvas canvas) { // System.err.println("Updated"); synchronized (this) { return done; } } public void canvasDone(final JSVGCanvas canvas) { // System.err.println("Done"); } public void failure(TestReport report) { synchronized (this) { done = true; failReport = report; } } } batik-1.9.orig/test-sources/org/apache/batik/swing/NullURITest.java0000644000175000017500000000257113063003304024621 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.swing; /** * This test makes sure that setting the canvas's document uri to * null does not cause a NullPointerException * * @author Vincent Hardy * @version $Id: NullURITest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NullURITest extends NullSetSVGDocumentTest { public String getName() { return getId(); } public Runnable getRunnable(final JSVGCanvas canvas) { return new Runnable () { public void run() { canvas.setURI(null); }}; } } batik-1.9.orig/test-sources/org/apache/batik/swing/JSVGInterruptTest.java0000644000175000017500000003771613063003304026026 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.swing; import java.awt.EventQueue; import java.awt.geom.AffineTransform; import java.io.File; import java.net.MalformedURLException; import java.lang.ref.WeakReference; import org.apache.batik.swing.gvt.GVTTreeRendererListener; import org.apache.batik.swing.gvt.GVTTreeRendererEvent; import org.apache.batik.swing.svg.SVGDocumentLoaderListener; import org.apache.batik.swing.svg.SVGLoadEventDispatcherListener; import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent; import org.apache.batik.swing.svg.SVGDocumentLoaderEvent; import org.apache.batik.swing.svg.GVTTreeBuilderListener; import org.apache.batik.swing.svg.GVTTreeBuilderEvent; import org.w3c.dom.svg.SVGDocument; /** * One line Class Desc * * Complete Class Desc * * @author l449433 * @version $Id: JSVGInterruptTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JSVGInterruptTest extends JSVGMemoryLeakTest { public String getName() { return "JSVGInterruptTest."+getId(); } public JSVGInterruptTest() { } /* JSVGCanvasHandler.Delegate Interface */ Runnable stopRunnable; int state = 0; MyLoaderListener loadListener = new MyLoaderListener(); MyBuildListener buildListener = new MyBuildListener(); MyOnloadListener onloadListener = new MyOnloadListener(); MyRenderListener renderListener = new MyRenderListener(); DelayRunnable stopper = null; static final int COMPLETE = 1; static final int CANCELLED = 2; static final int FAILED = 4; static final int MAX_WAIT = 40000; public JSVGCanvasHandler createHandler() { return new JSVGCanvasHandler(this, this) { public void runCanvas(String desc) { this.desc = desc; setupCanvas(); if ( abort) return; try { synchronized (renderMonitor) { delegate.canvasInit(canvas); if ( abort) return; while (!done) { checkRender(); if ( abort) return; } } } catch (Throwable t) { t.printStackTrace(); } finally { delegate.canvasDone(canvas); dispose(); } } public void checkSomething(Object monitor, String errorCode) { synchronized (monitor) { try { monitor.wait(); } catch(InterruptedException ie) { /* nothing */ } } } }; } public boolean canvasInit(final JSVGCanvas canvas) { // System.err.println("In Init"); theCanvas = new WeakReference( canvas ); theFrame = handler.getFrame(); registerObjectDesc(canvas, "JSVGCanvas"); registerObjectDesc(handler.getFrame(), "JFrame"); stopRunnable = new StopRunnable(canvas); File f = new File(getId()); String uri; try { uri = f.toURL().toString(); } catch (MalformedURLException mue) { throw new IllegalArgumentException(mue.getMessage()); } tweakIt(canvas, uri); return false; } public void canvasDone(JSVGCanvas canvas) { loadListener = null; buildListener = null; renderListener = null; onloadListener = null; stopper = null; stopRunnable = null; } public void tweakIt(final JSVGCanvas canvas, final String uri) { Thread t = new Thread() { public void run() { int state; Runnable setURI = new Runnable() { public void run() { canvas.setURI(uri); } }; System.err.println("Starting Load Tweak"); canvas.addSVGDocumentLoaderListener(loadListener); state = doTweak(setURI, loadListener); canvas.removeSVGDocumentLoaderListener(loadListener); System.err.println("Finished Load Tweak: " + state); final SVGDocument doc = canvas.getSVGDocument(); Runnable setDoc = new Runnable() { public void run() { canvas.setSVGDocument(doc); } }; System.err.println("Starting setDoc Tweak"); canvas.addGVTTreeBuilderListener(buildListener); state = doTweak(setDoc, buildListener); canvas.removeGVTTreeBuilderListener(buildListener); System.err.println("Finished setDoc Tweak: " + state); if (canvas.isDynamic()) { System.err.println("Starting onload Tweak"); canvas.addSVGLoadEventDispatcherListener (onloadListener); state = doTweak(setDoc, onloadListener); canvas.removeSVGLoadEventDispatcherListener (onloadListener); System.err.println("Finished onload Tweak: " + state); } Runnable setTrans = new Runnable() { public void run() { canvas.setRenderingTransform (new AffineTransform(), true); } }; System.err.println("Starting render Tweak"); canvas.addGVTTreeRendererListener(renderListener); state = doTweak(setTrans, renderListener); canvas.removeGVTTreeRendererListener(renderListener); System.err.println("Finished render Tweak: " + state); handler.scriptDone(); } }; t.setDaemon(true); t.start(); } public int doTweak(Runnable r, SetDelayable delayable) { synchronized (JSVGInterruptTest.this) { int delay = 0; int delayInc = 3; int delayIncInc = 4; int ret = 0; state = 0; while ((state & (COMPLETE | FAILED)) == 0) { ret |= state; state = 0; System.err.println("Tweaking: " + delay); delayable.setDelay(delay); EventQueue.invokeLater(r); long start = System.currentTimeMillis(); long end = start + MAX_WAIT; long curr = start; while ((state == 0) && (curr < end)) { // No 'complete' event generated yet and // Still willing to wait a bit... try { JSVGInterruptTest.this.wait(end-curr); } catch(InterruptedException ie) { } curr = System.currentTimeMillis(); } if (state == 0) { throw new IllegalArgumentException ("Timed out - proabably indicates failure"); } delay += delayInc + (curr-start-delay)/8; delayInc += delayIncInc; } ret |= state; return ret; } } public void triggerStopProcessing(int delay) { stopper = new DelayRunnable(delay, stopRunnable); stopper.start(); } public boolean stopStopper() { return stopper.abort(); } interface SetDelayable { void setDelay(int delay); } class MyLoaderListener implements SVGDocumentLoaderListener, SetDelayable { int delay = 0; public void setDelay(int delay) { this.delay = delay; } public void documentLoadingStarted(SVGDocumentLoaderEvent e) { triggerStopProcessing(delay); } public void documentLoadingCompleted(SVGDocumentLoaderEvent e) { stopStopper(); synchronized (JSVGInterruptTest.this) { state |= COMPLETE; JSVGInterruptTest.this.notifyAll(); } } public void documentLoadingCancelled(SVGDocumentLoaderEvent e) { synchronized (JSVGInterruptTest.this) { state |= CANCELLED; JSVGInterruptTest.this.notifyAll(); } } public void documentLoadingFailed(SVGDocumentLoaderEvent e) { synchronized (JSVGInterruptTest.this) { state |= FAILED; JSVGInterruptTest.this.notifyAll(); } } } class MyBuildListener implements GVTTreeBuilderListener, SetDelayable { int delay = 0; public void setDelay(int delay) { this.delay = delay; } public void gvtBuildStarted(GVTTreeBuilderEvent e) { // System.err.println("Build Start: " + e.getSource()); triggerStopProcessing(delay); } public void gvtBuildCompleted(GVTTreeBuilderEvent e) { stopStopper(); // System.err.println("Build Complete: " + e.getSource()); synchronized (JSVGInterruptTest.this) { state |= COMPLETE; JSVGInterruptTest.this.notifyAll(); } } public void gvtBuildCancelled(GVTTreeBuilderEvent e) { // System.err.println("Build Cancelled"); synchronized (JSVGInterruptTest.this) { state |= CANCELLED; JSVGInterruptTest.this.notifyAll(); } } public void gvtBuildFailed(GVTTreeBuilderEvent e) { // System.err.println("Build Failed"); synchronized (JSVGInterruptTest.this) { state |= FAILED; JSVGInterruptTest.this.notifyAll(); } } } class MyOnloadListener implements SVGLoadEventDispatcherListener, SetDelayable { int delay = 0; public void setDelay(int delay) { this.delay = delay; } public void svgLoadEventDispatchStarted (SVGLoadEventDispatcherEvent e) { // System.err.println("Onload Start: " + e.getSource()); triggerStopProcessing(delay); } public void svgLoadEventDispatchCompleted (SVGLoadEventDispatcherEvent e) { stopStopper(); // System.err.println("Onload Complete: " + e.getSource()); synchronized (JSVGInterruptTest.this) { state |= COMPLETE; JSVGInterruptTest.this.notifyAll(); } } public void svgLoadEventDispatchCancelled (SVGLoadEventDispatcherEvent e) { // System.err.println("Onload Cancelled"); synchronized (JSVGInterruptTest.this) { state |= CANCELLED; JSVGInterruptTest.this.notifyAll(); } } public void svgLoadEventDispatchFailed (SVGLoadEventDispatcherEvent e) { // System.err.println("Onload Failed"); synchronized (JSVGInterruptTest.this) { state |= FAILED; JSVGInterruptTest.this.notifyAll(); } } } class MyRenderListener implements GVTTreeRendererListener, SetDelayable { int delay = 0; public void setDelay(int delay) { this.delay = delay; } public void gvtRenderingPrepare(GVTTreeRendererEvent e) { // System.err.println("Render Prep"); triggerStopProcessing(delay); } public void gvtRenderingStarted(GVTTreeRendererEvent e) { // System.err.println("Render Start"); } public void gvtRenderingCompleted(GVTTreeRendererEvent e) { stopStopper(); // System.err.println("Render Complete"); synchronized (JSVGInterruptTest.this) { state |= COMPLETE; JSVGInterruptTest.this.notifyAll(); } } public void gvtRenderingCancelled(GVTTreeRendererEvent e) { // System.err.println("Render Cancelled"); synchronized (JSVGInterruptTest.this) { state |= CANCELLED; JSVGInterruptTest.this.notifyAll(); } } public void gvtRenderingFailed(GVTTreeRendererEvent e) { // System.err.println("Render Failed"); synchronized (JSVGInterruptTest.this) { state |= FAILED; JSVGInterruptTest.this.notifyAll(); } } } static class StopRunnable implements Runnable { JSVGCanvas canvas; public StopRunnable(JSVGCanvas canvas) { this.canvas = canvas; } public void run() { if (EventQueue.isDispatchThread()) canvas.stopProcessing(); else EventQueue.invokeLater(this); } } /** * a Runnable is run after the given delay has elapsed. * A call to abort() can prevent the start of the Runable before it is * started - it does not abort after it started. */ class DelayRunnable extends Thread { /** * delay in milliSeconds - must not change after creation. */ private final int delay; /** * the Runnable to start - must not change after creation. */ private final Runnable r; volatile boolean stop = false; volatile boolean complete = false; /** * @param delay to wait before r is started in milliSeconds * @param r a Runnable to start after delay */ DelayRunnable(int delay, Runnable r) { if ( delay < 0 ){ throw new IllegalArgumentException("delay must be >= 0 ! is:" + delay ); } if ( r == null ){ throw new IllegalArgumentException("Runnable must not be null!"); } this.delay = delay; this.r = r; setDaemon(true); } public boolean getComplete() { return complete; } public boolean abort() { synchronized (this) { if (complete) return false; stop = true; return true; } } public void run() { long start = System.currentTimeMillis(); long end = start + delay; long curr = start; while (curr < end) { try { Thread.sleep(end-curr); } catch(InterruptedException ie) { } curr = System.currentTimeMillis(); } synchronized (this) { if (stop) return; r.run(); complete = true; } } } } batik-1.9.orig/test-sources/org/apache/batik/swing/NullSetSVGDocumentTest.java0000644000175000017500000001224213063003303026767 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.swing; import java.awt.EventQueue; import java.io.PrintWriter; import java.io.StringWriter; import org.w3c.dom.svg.SVGDocument; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; /** * Test setDocument on JSVGComponent with non-Batik SVGOMDocument. * * This test constructs a generic Document with SVG content then it * ensures that when this is passed to JSVGComponet.setDocument it is * properly imported to an SVGOMDocument and rendered from there. * * @author l449433 * @version $Id: NullSetSVGDocumentTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NullSetSVGDocumentTest extends JSVGMemoryLeakTest { public NullSetSVGDocumentTest() { } public static final String TEST_NON_NULL_URI = "file:samples/anne.svg"; /** * Entry describing the error */ public static final String ENTRY_KEY_ERROR_DESCRIPTION = "JSVGCanvasHandler.entry.key.error.description"; /** * Entry describing the error */ public static final String ERROR_IMAGE_NOT_CLEARED = "NullSetSVGDocumentTest.message.error.image.not.cleared"; public static final String ERROR_ON_SET = "NullSetSVGDocumentTest.message.error.on.set"; public String getName() { return getId(); } public JSVGCanvasHandler createHandler() { return new JSVGCanvasHandler(this, this) { public JSVGCanvas createCanvas() { return new JSVGCanvas() { protected void installSVGDocument(SVGDocument doc){ super.installSVGDocument(doc); if (doc != null) return; handler.scriptDone(); } }; } }; } public Runnable getRunnable(final JSVGCanvas canvas) { return new Runnable () { public void run() { canvas.setSVGDocument(null); }}; } /* JSVGCanvasHandler.Delegate Interface */ public boolean canvasInit(JSVGCanvas canvas) { setTheCanvas(canvas); theFrame = handler.getFrame(); canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); canvas.setURI(TEST_NON_NULL_URI); registerObjectDesc(canvas, "JSVGCanvas"); registerObjectDesc(handler.getFrame(), "JFrame"); return true; // We did trigger a load event. } public void canvasRendered(JSVGCanvas canvas) { super.canvasRendered(canvas); try { EventQueue.invokeAndWait(getRunnable(canvas)); } catch (Throwable t) { t.printStackTrace(); StringWriter trace = new StringWriter(); t.printStackTrace(new PrintWriter(trace)); DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_ON_SET); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (fmt(ENTRY_KEY_ERROR_DESCRIPTION, null), fmt(ERROR_ON_SET, new Object[]{ trace.toString()})) }); report.setPassed(false); failReport = report; } } public boolean canvasUpdated(JSVGCanvas canvas) { return true; } public void canvasDone(JSVGCanvas canvas) { synchronized (this) { // Check that the original SVG // Document and GVT tree are cleared. checkObjects(new String[] { "SVGDoc", "GVT", "updateManager" }); if (canvas.getOffScreen() == null) return; System.err.println(">>>>>>> Canvas not cleared"); DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_IMAGE_NOT_CLEARED); // It would be great to provide the image here // but it's a lot of work and this isn't _really_ // what we are testing. More testing that // everything works (no exceptions thrown). report.setDescription(new TestReport.Entry[] { new TestReport.Entry (fmt(ENTRY_KEY_ERROR_DESCRIPTION, null), fmt(ERROR_IMAGE_NOT_CLEARED, null))}); report.setPassed(false); failReport = report; return; } } } batik-1.9.orig/test-sources/org/apache/batik/swing/SetSVGDocumentTest.java0000644000175000017500000000620213063003302026132 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.swing; import org.apache.batik.test.svg.JSVGRenderingAccuracyTest; import org.apache.batik.util.SVGConstants; import org.apache.batik.dom.GenericDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Element; /** * Test setDocument on JSVGComponent with non-Batik SVGOMDocument. * * This test constructs a generic Document with SVG content then it * ensures that when this is passed to JSVGComponet.setDocument it is * properly imported to an SVGOMDocument and rendered from there. * * @author l449433 * @version $Id: SetSVGDocumentTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SetSVGDocumentTest extends JSVGRenderingAccuracyTest { public SetSVGDocumentTest() { } protected String[] breakSVGFile(String svgFile){ if(svgFile == null) { throw new IllegalArgumentException(svgFile); } String [] ret = new String[3]; ret[0] = "test-resources/org/apache/batik/test/svg/"; ret[1] = "SetSVGDocumentTest"; ret[2] = ".svg"; return ret; } /* JSVGCanvasHandler.Delegate Interface */ public boolean canvasInit(JSVGCanvas canvas) { DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); Document doc = impl.createDocument(SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_SVG_TAG, null); Element e = doc.createElementNS(SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_RECT_TAG); e.setAttribute("x", "10"); e.setAttribute("y", "10"); e.setAttribute("width", "100"); e.setAttribute("height", "50"); e.setAttribute("fill", "crimson"); doc.getDocumentElement().appendChild(e); e = doc.createElementNS(SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_CIRCLE_TAG); e.setAttribute("cx", "55"); e.setAttribute("cy", "35"); e.setAttribute("r", "30"); e.setAttribute("fill", "gold"); doc.getDocumentElement().appendChild(e); canvas.setDocument(doc); return false; // We didn't trigger a load event. } public boolean canvasUpdated(JSVGCanvas canvas) { return true; } } batik-1.9.orig/test-sources/org/apache/batik/bridge/0000755000175000017500000000000013153020772021734 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/bridge/ScriptSelfTest.java0000644000175000017500000001052513063003300025504 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.test.TestReport; import org.apache.batik.test.svg.SelfContainedSVGOnLoadTest; import org.apache.batik.util.ApplicationSecurityEnforcer; import org.apache.batik.util.ParsedURL; /** * Helper class to simplify writing the unitTesting.xml file for * the bridge. * * @author Vincent Hardy * @version $Id: ScriptSelfTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ScriptSelfTest extends SelfContainedSVGOnLoadTest { String scripts = "text/ecmascript, application/java-archive"; boolean secure = true; String scriptOrigin = "any"; String fileName; TestUserAgent userAgent = new TestUserAgent(); public void setId(String id){ super.setId(id); if (id != null) { int i = id.indexOf("("); if (i != -1) { id = id.substring(0, i); } fileName = "test-resources/org/apache/batik/bridge/" + id + ".svg"; svgURL = resolveURL(fileName); } } public void setSecure(boolean secure){ this.secure = secure; } public boolean getSecure(){ return secure; } public String getScriptOrigin() { return scriptOrigin; } public void setScriptOrigin(String scriptOrigin) { this.scriptOrigin = scriptOrigin; } public void setScripts(String scripts){ this.scripts = scripts; } public String getScripts(){ return scripts; } public TestReport runImpl() throws Exception { ApplicationSecurityEnforcer ase = new ApplicationSecurityEnforcer(this.getClass(), "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy"); if (secure) { ase.enforceSecurity(true); } try { return super.runImpl(); } catch (ExceptionInInitializerError e) { e.printStackTrace(); throw e; } catch (NoClassDefFoundError e) { // e.printStackTrace(); throw new Exception(e.getMessage()); } finally { ase.enforceSecurity(false); } } protected UserAgent buildUserAgent(){ return userAgent; } class TestUserAgent extends UserAgentAdapter { public ScriptSecurity getScriptSecurity(String scriptType, ParsedURL scriptPURL, ParsedURL docPURL){ ScriptSecurity scriptSecurity = null; if (scripts.indexOf(scriptType) == -1){ scriptSecurity = new NoLoadScriptSecurity(scriptType); } else { if ("any".equals(scriptOrigin)) { scriptSecurity = new RelaxedScriptSecurity (scriptType, scriptPURL, docPURL); } else if ("document".equals(scriptOrigin)) { scriptSecurity = new DefaultScriptSecurity (scriptType, scriptPURL, docPURL); } else if ("embeded".equals(scriptOrigin)) { scriptSecurity = new EmbededScriptSecurity (scriptType, scriptPURL, docPURL); } else if ("none".equals(scriptOrigin)) { scriptSecurity = new NoLoadScriptSecurity(scriptType); } else { throw new Error("Wrong scriptOrigin : " + scriptOrigin); } } return scriptSecurity; } } } batik-1.9.orig/test-sources/org/apache/batik/bridge/EcmaLoadTest.java0000644000175000017500000000575013063003300025077 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.test.*; /** * Checks that ECMA Scripts which should be loaded are indeed * loaded. * * @author Vincent Hardy * @version $Id: EcmaLoadTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EcmaLoadTest extends DefaultTestSuite { public EcmaLoadTest() { String scripts = "text/ecmascript"; String[] scriptSource = {"ecmaCheckLoadAny", "ecmaCheckLoadSameAsDocument", "ecmaCheckLoadEmbed", "ecmaCheckLoadEmbedAttr", }; boolean[] secure = {true, false}; String[][] scriptOrigin = {{"any"}, {"any", "document"}, {"any", "document", "embeded"}, {"any", "document", "embeded"}, }; // // Need to make restricted {true/false} // // // An ecma script can be loaded if ECMA is listed // as an allowed script _and_ the loaded script // has an origin allowed by the scriptOrigin setting. // All other security settings should not have an // influence on whether or not the script can be loaded. // for (int i=0; iVincent Hardy * @version $Id: EcmaNoLoadTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EcmaNoLoadTest extends DefaultTestSuite { public EcmaNoLoadTest() { String scripts = "application/java-archive"; String[] scriptSource = {"bridge/ecmaCheckNoLoadAny", "bridge/ecmaCheckNoLoadSameAsDocument", "bridge/ecmaCheckNoLoadEmbed", "bridge/ecmaCheckNoLoadEmbedAttr", }; boolean[] secure = {true, false}; String[] scriptOrigin = {"ANY", "DOCUMENT", "EMBEDED", "NONE"}; // // If "application/ecmascript" is disallowed, scripts // should not be loaded, no matter their origin or the // other security settings. // for (int i=0; i=2) && (k <= 2)); SVGOnLoadExceptionTest t = buildTest(scripts, scriptSource[i], scriptOrigin[k], true, true, expectSuccess); addTest(t); } } // // If "applicatin/ecmascript" is allowed, but the accepted // script origin is lower than the candidate script, then // the script should not be loaded (e.g., if scriptOrigin // is embeded and trying to load an external script). // for (int j=0; jVincent Hardy * @version $Id: ExternalResourcesTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ExternalResourcesTest extends AbstractTest implements ErrorConstants { /** * Error when the input file cannot be loaded into a * Document object * {0} = IOException message */ public static final String ERROR_CANNOT_LOAD_SVG_DOCUMENT = "ExternalResourcesTest.error.cannot.load.svg.document"; /** * Error while processing the document * {0} = BridgeException message */ public static final String ERROR_WHILE_PROCESSING_SVG_DOCUMENT = "ExternalResourcesTest.error.while.processing.svg.document"; /** * Error: an expected exception was not thrown * {0} = List of ids for which the exception was not thrown */ public static final String ERROR_UNTHROWN_SECURITY_EXCEPTIONS = "ExternalResourcesTest.error.unthrown.security.exceptions"; /** * Error: an unexpected exception was thrown * {0} = List of ids for which an exception was thrown */ public static final String ERROR_THROWN_SECURITY_EXCEPTIONS = "ExternalResourcesTest.error.thrown.security.exceptions"; /** * Error when the insertion point cannot be found in the * test document * {0} = insertion point id */ public static final String ERROR_NO_INSERTION_POINT_IN_DOCUMENT = "ExternalResourceTest.error.no.insertion.point.in.document"; /** * Error when the test could not find a list of ids for testing */ public static final String ERROR_NO_ID_LIST = "ExternalResourceTest.error.no.id.list"; /** * Error when one of the target id cannot be found * {0} = id which was not found */ public static final String ERROR_TARGET_ID_NOT_FOUND = "ExternalResourcesTest.error.target.id.not.found"; /** * Entry describing the error */ public static final String ENTRY_KEY_ERROR_DESCRIPTION = "ExternalResourcesTest.entry.key.error.description"; public static final String ENTRY_KEY_INSERTION_POINT_ID = "ExternalResourcesTest.entry.key.insertion.point.id"; public static final String ENTRY_KEY_TARGET_ID = "ExternalResourcesTest.entry.target.id"; public static final String ENTRY_KEY_EXPECTED_EXCEPTION_ON = "ExternalResourcesTest.entry.key.expected.exception.on"; public static final String ENTRY_KEY_UNEXPECTED_EXCEPTION_ON = "ExternalResourcesTest.entry.key.unexpected.exception.on"; /** * Pseudo id for the external stylesheet test */ public static final String EXTERNAL_STYLESHEET_ID = "external-stylesheet"; /** * Test Namespace */ public static final String testNS = "http://xml.apache.org/batik/test"; /** * Id of the element where unsecure content is inserted */ public static final String INSERTION_POINT_ID = "insertionPoint"; /** * Location of test files in filesystem. */ public static final String FILE_DIR = "test-resources/org/apache/batik/bridge/"; /** * Controls whether the test works in secure mode or not */ protected boolean secure = true; String svgURL; public void setId(String id){ super.setId(id); String file = id; int idx = file.indexOf('.'); if (idx != -1) { file = file.substring(0,idx); } svgURL = resolveURL(FILE_DIR + file + ".svg"); } public Boolean getSecure(){ return secure ? Boolean.TRUE : Boolean.FALSE; } public void setSecure(Boolean secure) { this.secure = secure.booleanValue(); } /** * Resolves the input string as follows. * + First, the string is interpreted as a file description. * If the file exists, then the file name is turned into * a URL. * + Otherwise, the string is supposed to be a URL. If it * is an invalid URL, an IllegalArgumentException is thrown. */ protected String resolveURL(String url){ // Is url a file? File f = (new File(url)).getAbsoluteFile(); if(f.getParentFile().exists()){ try{ return f.toURL().toString(); }catch(MalformedURLException e){ throw new IllegalArgumentException(); } } // url is not a file. It must be a regular URL... try{ return (new URL(url)).toString(); }catch(MalformedURLException e){ throw new IllegalArgumentException(url); } } /** * This test uses a list of ids found in the test document. These ids reference * elements found in a defs section. For each such element, the test will * attempt to insert the target id at a given insertion point. That insertion * should cause a SecurityException. If so, the test passes. Otherwise, the test * will fail */ public TestReport runImpl() throws Exception{ DefaultTestReport report = new DefaultTestReport(this); // // First step: // // Load the input SVG into a Document object // String parserClassName = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parserClassName); Document doc = null; try { doc = f.createDocument(svgURL); } catch(IOException e){ report.setErrorCode(ERROR_CANNOT_LOAD_SVG_DOCUMENT); report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, e.getMessage()); report.setPassed(false); return report; } catch(Exception e){ report.setErrorCode(ERROR_CANNOT_LOAD_SVG_DOCUMENT); report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, e.getMessage()); report.setPassed(false); return report; } List failures = new ArrayList(); // // Do an initial processing to validate that the external // stylesheet causes a SecurityException // MyUserAgent userAgent = buildUserAgent(); GVTBuilder builder = new GVTBuilder(); BridgeContext ctx = new BridgeContext(userAgent); ctx.setDynamic(true); // We expect either a SecurityException or a BridgeException // with ERR_URI_UNSECURE. Throwable th = null; try { GraphicsNode gn = builder.build(ctx, doc); gn.getBounds(); th = userAgent.getDisplayError(); } catch (BridgeException e){ th = e; } catch (SecurityException e) { th = e; } catch (Throwable t) { th = t; } if (th == null) { if (secure) failures.add(EXTERNAL_STYLESHEET_ID); } else if (th instanceof SecurityException) { if (!secure) failures.add(EXTERNAL_STYLESHEET_ID); } else if (th instanceof BridgeException) { BridgeException be = (BridgeException)th; if (!secure || (secure && !ERR_URI_UNSECURE.equals(be.getCode()))) { report.setErrorCode(ERROR_WHILE_PROCESSING_SVG_DOCUMENT); report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, be.getMessage()); report.setPassed(false); return report; } } // // Remove the stylesheet from the document // Node child = doc.getFirstChild(); Node next = null; while (child != null) { next = child.getNextSibling(); if (child.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) { doc.removeChild(child); } child = next; } // // Now, get the list of ids to be checked // Element root = doc.getDocumentElement(); String idList = root.getAttributeNS(testNS, "targetids"); if (idList == null || "".equals(idList)) { report.setErrorCode(ERROR_NO_ID_LIST); report.setPassed(false); return report; } StringTokenizer st = new StringTokenizer(idList, ","); String[] ids = new String[st.countTokens()]; for (int i=0; iVincent Hardy * @version $Id: JarLoadTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JarLoadTest extends DefaultTestSuite { public JarLoadTest() { String scripts = "application/java-archive"; // Note: base64 encoding of jar content is not supported. String[] scriptSource = {"jarCheckLoadAny", "jarCheckLoadSameAsDocument"}; boolean[] secure = {true, false}; String[] scriptOrigin = {"any", "document", "embeded"}; // // Need to make restricted {true/false} // // // An jar script can be loaded if JAR is listed // as an allowed script _and_ the loaded script // has an origin allowed by the scriptOrigin setting. // All other security settings should not have an // influence on whether or not the script can be loaded. // for (int i=0; iVincent Hardy * @version $Id: JarNoLoadTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JarNoLoadTest extends DefaultTestSuite { public JarNoLoadTest() { String scripts = "text/ecmascript"; String[] scriptSource = {"bridge/jarCheckNoLoadAny", "bridge/jarCheckNoLoadSameAsDocument", "bridge/jarCheckNoLoadEmbed", }; boolean[] secure = {true, false}; String[] scriptOrigin = {"ANY", "DOCUMENT", "EMBEDED", "NONE"}; // // If "application/java-archive" is disallowed, scripts // should not be loaded, no matter their origin or the // other security settings. // for (int i=0; iSVGRasterizer. * It validates the option setting and the manipulation * of source and destination sources. * * @author Vincent Hardy * @version $Id: SVGConverterTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SVGConverterTest extends DefaultTestSuite { public SVGConverterTest(){ /////////////////////////////////////////////////////////////////////// // Add configuration tests /////////////////////////////////////////////////////////////////////// AbstractTest t = null; // // Test Trancoder usage // t = new TranscoderConfigTest(DestinationType.PNG, org.apache.batik.transcoder.image.PNGTranscoder.class); addTest(t); t.setId("TranscoderConfigTest.PNG"); t = new TranscoderConfigTest(DestinationType.JPEG, org.apache.batik.transcoder.image.JPEGTranscoder.class); addTest(t); t.setId("TranscoderConfigTest.JPEG"); t = new TranscoderConfigTest(DestinationType.TIFF, org.apache.batik.transcoder.image.TIFFTranscoder.class); addTest(t); t.setId("TranscoderConfigTest.TIFF"); try { Class pdfClass = Class.forName("org.apache.fop.svg.PDFTranscoder"); t = new TranscoderConfigTest(DestinationType.PDF, pdfClass); t.setId("TranscoderConfigTest.PDF"); addTest(t); } catch (Exception e) { } // // Checks that the proper hints are used // t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_AOI, new Rectangle(40, 50, 40, 80)}}){ protected void deltaConfigure(SVGConverter c){ c.setArea(new Rectangle(40, 50, 40, 80)); } }; addTest(t); t.setId("HintsConfigTest.KEY_AOI"); t = new HintsConfigTest(new Object[][]{ {JPEGTranscoder.KEY_QUALITY, new Float(.5)}}){ protected void deltaConfigure(SVGConverter c){ c.setQuality(.5f); } }; addTest(t); t.setId("HintsConfigTest.KEY_QUALITY"); t = new HintsConfigTest(new Object[][]{ {PNGTranscoder.KEY_INDEXED, new Integer(8)}}){ protected void deltaConfigure(SVGConverter c){ c.setIndexed(8); } }; addTest(t); t.setId("HintsConfigTest.KEY_INDEXED"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_BACKGROUND_COLOR, Color.pink}}){ protected void deltaConfigure(SVGConverter c){ c.setBackgroundColor(Color.pink); } }; addTest(t); t.setId("HintsConfigTest.KEY_BACKGROUND_COLOR"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_HEIGHT, new Float(50)}}){ protected void deltaConfigure(SVGConverter c){ c.setHeight(50); } }; addTest(t); t.setId("HintsConfigTest.KEY_HEIGHT"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_WIDTH, new Float(50)}}){ protected void deltaConfigure(SVGConverter c){ c.setWidth(50); } }; addTest(t); t.setId("HintsConfigTest.KEY_WIDTH"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_MAX_HEIGHT, new Float(50)}}){ protected void deltaConfigure(SVGConverter c){ c.setMaxHeight(50); } }; addTest(t); t.setId("HintsConfigTest.KEY_MAX_HEIGHT"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_MAX_WIDTH, new Float(50)}}){ protected void deltaConfigure(SVGConverter c){ c.setMaxWidth(50); } }; addTest(t); t.setId("HintsConfigTest.KEY_MAX_WIDTH"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_MEDIA, "print"}}){ protected void deltaConfigure(SVGConverter c){ c.setMediaType("print"); } }; addTest(t); t.setId("HintsConfigTest.KEY_MEDIA"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_DEFAULT_FONT_FAMILY, "Times"}}){ protected void deltaConfigure(SVGConverter c){ c.setDefaultFontFamily("Times"); } }; addTest(t); t.setId("HintsConfigTest.KEY_DEFAULT_FONT_FAMILY"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_ALTERNATE_STYLESHEET, "myStyleSheet"}}){ protected void deltaConfigure(SVGConverter c){ c.setAlternateStylesheet("myStyleSheet"); } }; addTest(t); t.setId("HintsConfigTest.KEY_ALTERNATE_STYLESHEET"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_USER_STYLESHEET_URI, new File(System.getProperty("user.dir"), "userStylesheet.css").toURI().toString()}}){ protected void deltaConfigure(SVGConverter c){ c.setUserStylesheet("userStylesheet.css"); } }; addTest(t); t.setId("HintsConfigTest.KEY_USER_STYLESHEET_URI"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_LANGUAGE, "fr"}}){ protected void deltaConfigure(SVGConverter c){ c.setLanguage("fr"); } }; addTest(t); t.setId("HintsConfigTest.KEY_LANGUAGE"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, new Float(.5f)}}){ protected void deltaConfigure(SVGConverter c){ c.setPixelUnitToMillimeter(.5f); } }; addTest(t); t.setId("HintsConfigTest.KEY_PIXEL_UNIT_TO_MILLIMETER"); t = new HintsConfigTest(new Object[][]{ {ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.TRUE }}){ protected void deltaConfigure(SVGConverter c){ c.setValidate(true); } }; addTest(t); t.setId("HintsConfigTest.KEY_XML_PARSER_VALIDATING"); // // Check sources // t = new SourcesConfigTest(new String[] { "samples/anne", "samples/batikFX", "samples/tests/spec/styling/smiley" }){ protected void setSources(SVGConverter c){ c.setSources(new String[] {"samples/anne.svg", "samples/batikFX.svg", "samples/tests/spec/styling/smiley.svg"}); } }; addTest(t); t.setId("SourcesConfigTest.SimpleList"); // // Check destination // t = new DestConfigTest(new String[] { "samples/anne.svg" }, new String[] { "test-reports/anne.png"}){ protected void setDestination(SVGConverter c){ c.setDst(new File("test-reports/anne.png")); } }; addTest(t); t.setId("DestConfigTest.DstFile"); t = new DestConfigTest(new String[] { "samples/anne.svg", "samples/tests/spec/styling/smiley.svg" }, new String[] { "test-resources/anne.png", "test-resources/smiley.png"}){ protected void setDestination(SVGConverter c){ c.setDst(new File("test-resources")); } }; addTest(t); t.setId("DestConfigTest.DstDir"); // // Check that complete process goes without error // t = new OperationTest(){ protected void configure(SVGConverter c){ c.setSources(new String[]{"samples/anne.svg"}); c.setDst(new File("anne.png")); File file = new File("anne.png"); file.deleteOnExit(); } }; addTest(t); t.setId("OperationTest.Bug4888"); t = new OperationTest(){ protected void configure(SVGConverter c){ c.setDestinationType(DestinationType.PDF); c.setSources(new String[]{"samples/anne.svg"}); } }; addTest(t); t.setId("Operationtest.PDFTranscoding"); /////////////////////////////////////////////////////////////////////// // Add configuration error test. These tests check that the expected // error gets reported for a given mis-configuration /////////////////////////////////////////////////////////////////////// t = new ConfigErrorTest(SVGConverter.ERROR_NO_SOURCES_SPECIFIED) { protected void configure(SVGConverter c){ c.setSources(null); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_NO_SOURCES_SPECIFIED"); t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_COMPUTE_DESTINATION){ protected void configure(SVGConverter c){ // Do not set destination file or destination directory c.setSources(new String[]{"http://xml.apache.org/batik/dummy.svg"}); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_CANNOT_COMPUTE_DESTINATION"); t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_USE_DST_FILE){ protected void configure(SVGConverter c){ File dummy = null; try { dummy = File.createTempFile("dummyPNG", ".png"); } catch(IOException ioEx ){ throw new Error( ioEx.getMessage() ); } c.setSources(new String[]{"samples/anne.svg", "samples/batikFX.svg"}); c.setDst(dummy); dummy.deleteOnExit(); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_CANNOT_USE_DST_FILE"); t = new ConfigErrorTest(SVGConverter.ERROR_SOURCE_SAME_AS_DESTINATION){ protected void configure(SVGConverter c){ c.setSources(new String[]{ "samples/anne.svg" }); c.setDst(new File("samples/anne.svg")); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_SOURCE_SAME_AS_DESTINATION"); t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_READ_SOURCE){ protected void configure(SVGConverter c){ c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/notReadable.svg" }); c.setDst(new File("test-reports")); } public boolean proceedWithSourceTranscoding(SVGConverterSource source, File dest){ // Big hack to simulate a non-readable SVG file File hackedFile = new File(((SVGConverterFileSource)source).file.getPath()){ public boolean canRead(){ System.out.println("Yahoooooooo! In canRead"); return false; } }; ((SVGConverterFileSource)source).file = hackedFile; return true; } }; addTest(t); t.setId("ConfigErrorTest.ERROR_CANNOT_READ_SOURCE"); t = new ConfigErrorTest(SVGConverter.ERROR_CANNOT_OPEN_SOURCE){ protected void configure(SVGConverter c){ c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/notReadable.svg" }); } public boolean proceedWithComputedTask(Transcoder transcoder, Map hints, List sources, List dest){ System.out.println("==================> Hacked Starting to process Task <========================="); SVGConverterFileSource source = (SVGConverterFileSource)sources.get(0); source = new SVGConverterFileSource(source.file){ public InputStream openStream() throws FileNotFoundException { throw new FileNotFoundException("Simulated FileNotFoundException"); } }; sources.set(0, source ); return true; } }; addTest(t); t.setId("ConfigErrorTest.ERROR_CANNOT_OPEN_SOURCE"); t = new ConfigErrorTest(SVGConverter.ERROR_OUTPUT_NOT_WRITEABLE){ protected void configure(SVGConverter c){ c.setSources(new String[]{ "samples/anne.svg" }); File o = new File("test-resources/org/apache/batik/apps/rasterizer/readOnly.png"); o.setReadOnly(); c.setDst(o); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_OUTPUT_NOT_WRITEABLE"); t = new ConfigErrorTest(SVGConverter.ERROR_UNABLE_TO_CREATE_OUTPUT_DIR){ protected void configure(SVGConverter c){ c.setDst(new File("ZYZ::/cannotCreate\000")); } }; addTest(t); t.setId("ConfigErrorTest.ERROR_UNABLE_TO_CREATE_OUTPUT_DIR"); t = new ConfigErrorTest(SVGConverter.ERROR_WHILE_RASTERIZING_FILE){ protected void configure(SVGConverter c){ c.setSources(new String[]{ "test-resources/org/apache/batik/apps/rasterizer/invalidSVG.svg"}); } }; addTest(t); t.setId("ConfigErrorTest(SVGConverter.ERROR_WHILE_RASTERIZING_FILE"); // // Test that files are created as expected and are producing the // expected result. // // Plain file t = new ConverterOutputTest("samples/anne.svg", // File to convert "test-reports/anne.png", // Output "test-references/samples/anne.png"); // reference addTest(t); t.setId("OutputTest.plain"); // File with reference t = new ConverterOutputTest("samples/anne.svg#svgView(viewBox(0,0,100,200))", // File to convert "test-reports/anne.png", // Output "test-references/samples/anneViewBox1.png"); // reference addTest(t); t.setId("OutputTest.reference"); } } /** * A ConfigTest builds an SVGConverter, configures it, * sets itself as the SVGConverterController and checks that * the computed task is as expected (i.e., right set of * hints). */ abstract class AbstractConfigTest extends AbstractTest implements SVGConverterController { /** * The 'proceedWithComputedTask' handler was not called */ public static final String ERROR_NO_COMPUTED_TASK = "ConfigTest.error.no.computed.task"; /** * The transcoderClass is not the one expected. */ public static final String ERROR_UNEXPECTED_TRANSCODER_CLASS = "ConfigTest.error.unexpected.transcoder.class"; public static final String ENTRY_KEY_EXPECTED_TRANSCODER_CLASS = "ConfigTest.entry.key.expected.transcoder.class"; public static final String ENTRY_KEY_COMPUTED_TRANSCODER_CLASS = "ConfigTest.entry.key.computed.trancoder.class"; /** * Error if the hints do not match */ public static final String ERROR_UNEXPECTED_NUMBER_OF_HINTS = "ConfigTest.error.unexpected.number.of.hints"; public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_HINTS = "ConfigTest.entry.key.expected.number.of.hints"; public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_HINTS = "ConfigTest.entry.key.computed.number.of.hints"; public static final String ENTRY_KEY_EXPECTED_HINTS = "ConfigTest.entry.key.expected.hints"; public static final String ENTRY_KEY_COMPUTED_HINTS = "ConfigTest.entry.key.computed.hints"; public static final String ERROR_UNEXPECTED_TRANSCODING_HINT = "ConfigTest.error.unexpected.transcoding.hint"; public static final String ENTRY_KEY_EXPECTED_HINT_KEY = "ConfigTest.entry.key.expected.hint.key"; public static final String ENTRY_KEY_COMPUTED_HINT_VALUE = "ConfigTest.entry.key.computed.hint.value"; public static final String ENTRY_KEY_EXPECTED_HINT_VALUE = "ConfigTest.entry.key.expected.hint.value"; /** * Error if the sources do not match */ public static final String ERROR_UNEXPECTED_SOURCES_LIST = "ConfigTest.error.unexpected.sources.list"; public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_SOURCES = "ConfigTest.entry.key.expected.number.of.sources"; public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_SOURCES = "ConfigTest.entry.key.computed.number.of.sources"; public static final String ENTRY_KEY_EXPECTED_SOURCE_AT_INDEX = "ConfigTest.entry.key.expected.source.at.index"; public static final String ENTRY_KEY_COMPUTED_SOURCE_AT_INDEX = "ConfigTest.entry.key.computed.source.at.index"; public static final String ENTRY_KEY_COMPUTED_SOURCES_LIST = "ConfigTest.entry.key.computed.sources.list"; public static final String ENTRY_KEY_EXPECTED_SOURCES_LIST = "ConfigTest.entry.key.expected.sources.list"; /** * Error if the dest do not match */ public static final String ERROR_UNEXPECTED_DEST_LIST = "ConfigTest.error.unexpected.dest.list"; public static final String ENTRY_KEY_EXPECTED_NUMBER_OF_DEST = "ConfigTest.entry.key.expected.number.of.dest"; public static final String ENTRY_KEY_COMPUTED_NUMBER_OF_DEST = "ConfigTest.entry.key.computed.number.of.dest"; public static final String ENTRY_KEY_EXPECTED_DEST_AT_INDEX = "ConfigTest.entry.key.expected.dest.at.index"; public static final String ENTRY_KEY_COMPUTED_DEST_AT_INDEX = "ConfigTest.entry.key.computed.dest.at.index"; public static final String ENTRY_KEY_COMPUTED_DEST_LIST = "ConfigTest.entry.key.computed.dest.list"; public static final String ENTRY_KEY_EXPECTED_DEST_LIST = "ConfigTest.entry.key.expected.dest.list"; /** * Configuration Description */ static class Config { Class transcoderClass; HashMap hints; List sources; List dest; } protected Config expectedConfig; protected Config computedConfig; protected AbstractConfigTest(){ } protected void setExpectedConfig(Config expectedConfig){ this.expectedConfig = expectedConfig; } protected abstract void configure(SVGConverter c); protected String makeSourceList(List v){ int n = v.size(); StringBuffer sb = new StringBuffer( n * 8 ); for (int i=0; i Starting to process Task <========================="); return true; } public boolean proceedWithSourceTranscoding(SVGConverterSource source, File dest) { System.out.print("Transcoding " + source + " to " + dest + " ... "); return true; } public boolean proceedOnSourceTranscodingFailure(SVGConverterSource source, File dest, String errorCode){ System.out.println(" ... FAILURE"); foundErrorCode = errorCode; return true; } public void onSourceTranscodingSuccess(SVGConverterSource source, File dest){ System.out.println(" ... SUCCESS"); } } /** * This test checks that a file is indeed created and that it is identical to * an expected reference. */ class ConverterOutputTest extends AbstractTest { String svgSource; String pngDest; String pngRef; public ConverterOutputTest(String svgSource, String pngDest, String pngRef){ this.svgSource = svgSource; this.pngDest = pngDest; this.pngRef = pngRef; } public TestReport runImpl() throws Exception { SVGConverter c = new SVGConverter(); System.out.println("Converting : " + svgSource); c.setSources(new String[]{svgSource}); c.setDst(new File(pngDest)); c.setDestinationType(DestinationType.PNG); c.execute(); ImageCompareTest t = new ImageCompareTest(pngDest, pngRef); TestReport r = t.run(); (new File(pngDest)).delete(); return r; } } batik-1.9.orig/test-sources/org/apache/batik/apps/rasterizer/MainTest.java0000644000175000017500000006303413063003301026217 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.rasterizer; import java.awt.Color; import java.awt.geom.Rectangle2D; import java.io.File; import java.util.StringTokenizer; import java.util.List; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestSuite; import org.apache.batik.test.Test; import org.apache.batik.test.TestReport; /** * Validates the operation of the Main class. * * @author Vincent Hardy * @version $Id: MainTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class MainTest extends DefaultTestSuite { public MainTest(){ Test t = new MainConfigTest("-d samples") { public TestReport validate(SVGConverter c){ File dst = c.getDst(); if(dst!= null && dst.equals(new File("samples"))){ return reportSuccess(); } else { return reportError("-d", "samples", "" + dst); } } }; addTest(t); t.setId("MainConfigTest.output"); t = new MainConfigTest("samples/anne.svg") { String ERROR_UNEXPECTED_SOURCES = "MainConfigTest.error.unexpected.sources"; public TestReport validate(SVGConverter c){ List sources = c.getSources(); if(sources.size() == 1){ String src = (String)sources.get(0); if ("samples/anne.svg".equals(src)){ return reportSuccess(); } } return reportError(ERROR_UNEXPECTED_SOURCES); } }; addTest(t); t.setId("MainConfigTest.source"); t = new MainConfigTest("-m image/jpeg") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.JPEG)){ return reportSuccess(); } else { return reportError("-m", DestinationType.JPEG.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.jpegA"); t = new MainConfigTest("-m image/jpg") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.JPEG)){ return reportSuccess(); } else { return reportError("-m", DestinationType.JPEG.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.jpegB"); t = new MainConfigTest("-m image/jpe") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.JPEG)){ return reportSuccess(); } else { return reportError("-m", DestinationType.JPEG.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.jpegC"); t = new MainConfigTest("-m image/png") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.PNG)){ return reportSuccess(); } else { return reportError("-m", DestinationType.PNG.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.png"); t = new MainConfigTest("-m application/pdf") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.PDF)){ return reportSuccess(); } else { return reportError("-m", DestinationType.PDF.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.pdf"); t = new MainConfigTest("-m image/tiff") { public TestReport validate(SVGConverter c){ DestinationType type = c.getDestinationType(); if(type.equals(DestinationType.TIFF)){ return reportSuccess(); } else { return reportError("-m", DestinationType.TIFF.toString(), "" + type); } } }; addTest(t); t.setId("MainConfigTest.mimeType.tiff"); t = new MainConfigTest("-w 467.69") { public TestReport validate(SVGConverter c){ float width = c.getWidth(); if(width == 467.69f){ return reportSuccess(); } else { return reportError("-w", "" + 467.69, "" + width); } } }; addTest(t); t.setId("MainConfigTest.width"); t = new MainConfigTest("-h 345.67") { public TestReport validate(SVGConverter c){ float height = c.getHeight(); if(height == 345.67f){ return reportSuccess(); } else { return reportError("-h", "" + 345.67, "" + height); } } }; addTest(t); t.setId("MainConfigTest.height"); t = new MainConfigTest("-maxw 467.69") { public TestReport validate(SVGConverter c){ float maxWidth = c.getMaxWidth(); if(maxWidth == 467.69f){ return reportSuccess(); } else { return reportError("-maxw", "" + 467.69, "" + maxWidth); } } }; addTest(t); t.setId("MainConfigTest.maxWidth"); t = new MainConfigTest("-maxh 345.67") { public TestReport validate(SVGConverter c){ float maxHeight = c.getMaxHeight(); if(maxHeight == 345.67f){ return reportSuccess(); } else { return reportError("-maxh", "" + 345.67, "" + maxHeight); } } }; addTest(t); t.setId("MainConfigTest.maxHeight"); t = new MainConfigTest("-a 5,10,20,30") { public TestReport validate(SVGConverter c){ Rectangle2D aoi = c.getArea(); Rectangle2D.Float eAoi = new Rectangle2D.Float(5,10,20,30); if(eAoi.equals(aoi)){ return reportSuccess(); } else { return reportError("-a", toString(eAoi), toString(aoi)); } } public String toString(Rectangle2D r){ if (r == null){ return "null"; } else { return r.getX() + "," + r.getY() + "," + r.getWidth() + "," + r.getHeight(); } } }; addTest(t); t.setId("MainConfigTest.aoi"); t = new MainConfigTest("-bg 128.200.100.50") { public TestReport validate(SVGConverter c){ Color bg = c.getBackgroundColor(); Color eBg = new Color(200,100,50,128); // Alpha is last if(eBg.equals(bg)){ return reportSuccess(); } else { return reportError("-bg", toString(eBg), toString(bg)); } } public String toString(Color c){ if (c==null){ return "null"; } else { return c.getAlpha() + "." + c.getRed() + "." + c.getGreen() + "." + c.getBlue(); } } }; addTest(t); t.setId("MainConfigTest.backgroundColor"); t = new MainConfigTest("-cssMedia projection"){ public TestReport validate(SVGConverter c){ String cssMedia = c.getMediaType(); String eCssMedia = "projection"; if(eCssMedia.equals(cssMedia)){ return reportSuccess(); } else { return reportError("-cssMedia", eCssMedia, cssMedia); } } }; addTest(t); t.setId("MainConfigTest.cssMedia"); t = new MainConfigTest("-font-family Arial, Comic Sans MS"){ public TestReport validate(SVGConverter c){ String fontFamily = c.getDefaultFontFamily(); String eFontFamily = "Arial, Comic Sans MS"; if(eFontFamily.equals(fontFamily)){ return reportSuccess(); } else { return reportError("-font-family", eFontFamily, fontFamily); } } String[] makeArgsArray(String args) { return new String[] {"-font-family", "Arial, Comic Sans MS"}; } }; addTest(t); t.setId("MainConfigTest.fontFamily"); t = new MainConfigTest("-cssAlternate myAlternateStylesheet"){ public TestReport validate(SVGConverter c){ String alternate = c.getAlternateStylesheet(); String eAlternate = "myAlternateStylesheet"; if(eAlternate.equals(alternate)){ return reportSuccess(); } else { return reportError("-cssAlternate", eAlternate, alternate); } } }; addTest(t); t.setId("MainConfigTest.cssAlternate"); t = new MainConfigTest("-validate"){ public TestReport validate(SVGConverter c){ if(c.getValidate()){ return reportSuccess(); } else { return reportError("-validate", "true", "false"); } } }; addTest(t); t.setId("MainConfigTest.validate"); t = new MainConfigTest("-onload"){ public TestReport validate(SVGConverter c){ if(c.getExecuteOnload()){ return reportSuccess(); } else { return reportError("-onload", "true", "false"); } } }; addTest(t); t.setId("MainConfigTest.onload"); t = new MainConfigTest("-scripts text/jpython"){ public TestReport validate(SVGConverter c){ if("text/jpython".equals(c.getAllowedScriptTypes())){ return reportSuccess(); } else { return reportError("-scripts", "text/jpython", ">>" + c.getAllowedScriptTypes() + "<<"); } } }; addTest(t); t.setId("MainConfigTest.scripts"); t = new MainConfigTest("-anyScriptOrigin"){ public TestReport validate(SVGConverter c){ if(!c.getConstrainScriptOrigin()){ return reportSuccess(); } else { return reportError("-anyScriptOrigin", "true", "false"); } } }; addTest(t); t.setId("MainConfigTest.anyScriptOrigin"); t = new MainConfigTest("-scriptSecurityOff"){ public TestReport validate(SVGConverter c){ if(c.getSecurityOff()){ return reportSuccess(); } else { return reportError("-scriptSecurityOff", "true", "false"); } } }; addTest(t); t.setId("MainConfigTest.scriptSecurityOff"); t = new MainConfigTest("-lang fr"){ public TestReport validate(SVGConverter c){ if("fr".equals(c.getLanguage())){ return reportSuccess(); } else { return reportError("-lang", "fr", c.getLanguage()); } } }; addTest(t); t.setId("MainConfigTest.lang"); t = new MainConfigTest("-cssUser myStylesheet.css"){ public TestReport validate(SVGConverter c){ if("myStylesheet.css".equals(c.getUserStylesheet())){ return reportSuccess(); } else { return reportError("-cssUser", "myStylesheet.css", c.getUserStylesheet()); } } }; addTest(t); t.setId("MainConfigTest.cssUser"); t = new MainConfigTest("-dpi 5.08"){ public TestReport validate(SVGConverter c){ if(c.getPixelUnitToMillimeter() == 5f){ return reportSuccess(); } else { return reportError("-dpi", "5f", "" + c.getPixelUnitToMillimeter()); } } }; addTest(t); t.setId("MainConfigTest.dpi"); t = new MainConfigTest("-q .5"){ public TestReport validate(SVGConverter c){ if(c.getQuality() == .5f){ return reportSuccess(); } else { return reportError("-q", ".5f", "" + c.getQuality()); } } }; addTest(t); t.setId("MainConfigTest.quality"); t = new MainConfigTest("-indexed 8"){ public TestReport validate(SVGConverter c){ if(c.getIndexed() == 8){ return reportSuccess(); } else { return reportError("-indexed", "8", "" + c.getIndexed()); } } }; addTest(t); t.setId("MainConfigTest.indexed"); t = new MainConfigErrorTest("-d", "hello.svg -d"); addTest(t); t.setId("MainConfigErrorTest.output"); t = new MainConfigErrorTest("-m", "hello.svg -m"); addTest(t); t.setId("MainConfigErrorTest.mimeType"); t = new MainConfigErrorTest("-w", "hello.svg -w"); addTest(t); t.setId("MainConfigErrorTest.width"); t = new MainConfigErrorTest("-h", "hello.svg -h"); addTest(t); t.setId("MainConfigErrorTest.height"); t = new MainConfigErrorTest("-maxw", "hello.svg -maxw"); addTest(t); t.setId("MainConfigErrorTest.maxWidth"); t = new MainConfigErrorTest("-maxh", "hello.svg -maxh"); addTest(t); t.setId("MainConfigErrorTest.maxHeight"); t = new MainConfigErrorTest("-a", "hello.svg -a"); addTest(t); t.setId("MainConfigErrorTest.area"); t = new MainConfigErrorTest("-bg", "hello.svg -bg"); addTest(t); t.setId("MainConfigErrorTest.backgroundColor"); t = new MainConfigErrorTest("-cssMedia", "hello.svg -cssMedia"); addTest(t); t.setId("MainConfigErrorTest.mediaType"); t = new MainConfigErrorTest("-font-family", "hello.svg -font-family"); addTest(t); t.setId("MainConfigErrorTest.font-family"); t = new MainConfigErrorTest("-cssAlternate", "hello.svg -cssAlternate"); addTest(t); t.setId("MainConfigErrorTest.cssAlternate"); t = new MainConfigErrorTest("-lang", "hello.svg -lang"); addTest(t); t.setId("MainConfigErrorTest.lang"); t = new MainConfigErrorTest("-cssUser", "hello.svg -cssUser"); addTest(t); t.setId("MainConfigErrorTest.cssUser"); t = new MainConfigErrorTest("-dpi", "hello.svg -dpi"); addTest(t); t.setId("MainConfigErrorTest.dpi"); t = new MainConfigErrorTest("-q", "hello.svg -q"); addTest(t); t.setId("MainConfigErrorTest.quality"); t = new MainConfigErrorTest("-scripts", "hello.svg -scripts"); addTest(t); t.setId("MainConfigErrorTest.allowedScriptTypes"); t = new MainIllegalArgTest("-m", "-m images/jpeq"); addTest(t); t.setId("MainIllegalArgTest.mediaType"); t = new MainIllegalArgTest("-w", "-w abd"); addTest(t); t.setId("MainIllegalArgTest.width"); t = new MainIllegalArgTest("-h", "-h abaa"); addTest(t); t.setId("MainIllegalArgTest.height"); t = new MainIllegalArgTest("-maxw", "-maxw abd"); addTest(t); t.setId("MainIllegalArgTest.maxWidth"); t = new MainIllegalArgTest("-maxh", "-maxh abaa"); addTest(t); t.setId("MainIllegalArgTest.maxHeight"); t = new MainIllegalArgTest("a", "-a aaaaaa"); addTest(t); t.setId("MainIllegalArgTest.aoi"); t = new MainIllegalArgTest("bg", "-bg a.b.c.d"); addTest(t); t.setId("MainIllegalArgTest.bg"); t = new MainIllegalArgTest("dpi", "-dpi invalidDPI"); addTest(t); t.setId("MainIllegalArgTest.dpi"); t = new MainIllegalArgTest("q", "-q illegalQuality"); addTest(t); t.setId("MainIllegalArgTest.q"); } } class MainIllegalArgTest extends AbstractTest { String badOption; String args; TestReport report; public MainIllegalArgTest(String badOption, String args){ this.badOption = badOption; this.args = args; } public String getName(){ return getId(); } public static final String ERROR_NO_ERROR_REPORTED = "MainIllegalArgTest.error.no.error.reported"; public static final String ERROR_UNEXPECTED_ERROR_CODE = "MainIllegalArgTest.error.unexpected.error.code"; public static final String ENTRY_KEY_EXPECTED_ERROR_CODE = "MainIllegalArgTest.entry.key.expected.error.code"; public static final String ENTRY_KEY_GOT_ERROR_CODE = "MainIllegalArgTest.entry.key.got.error.code"; public TestReport runImpl() throws Exception { String[] argsArray = makeArgsArray(args); Main main = new Main(argsArray) { public void error(String errorCode, Object[] errorArgs){ if (Main.ERROR_ILLEGAL_ARGUMENT.equals(errorCode)){ report = reportSuccess(); } else { report = reportError(ERROR_UNEXPECTED_ERROR_CODE); report.addDescriptionEntry(ENTRY_KEY_EXPECTED_ERROR_CODE, Main.ERROR_ILLEGAL_ARGUMENT); report.addDescriptionEntry(ENTRY_KEY_GOT_ERROR_CODE, errorCode); } } }; main.execute(); if (report == null){ report = reportError(ERROR_NO_ERROR_REPORTED); } return report; } String[] makeArgsArray(String args){ StringTokenizer st = new StringTokenizer(args, " "); String[] argsArray = new String[st.countTokens()]; for (int i=0; i 0 && badOption.equals(errorArgs[0])){ report = reportSuccess(); } else { report = reportError(ERROR_UNEXPECTED_ERROR_ARGS_0); report.addDescriptionEntry(ENTRY_KEY_EXPECTED_ERROR_ARGS_0, badOption); report.addDescriptionEntry(ENTRY_KEY_GOT_ERROR_ARGS_0, errorArgs!= null && errorArgs.length>0 ? errorArgs[0] : "none"); } } else { report = reportError(ERROR_UNEXPECTED_ERROR_CODE); report.addDescriptionEntry(ENTRY_KEY_EXPECTED_ERROR_CODE, Main.ERROR_NOT_ENOUGH_OPTION_VALUES); report.addDescriptionEntry(ENTRY_KEY_GOT_ERROR_CODE, errorCode); } } }; main.execute(); if (report == null){ report = reportError(ERROR_NO_ERROR_REPORTED); } return report; } String[] makeArgsArray(String args){ StringTokenizer st = new StringTokenizer(args, " "); String[] argsArray = new String[st.countTokens()]; for (int i=0; i/test-resources/org/apache/batik/ * * @author Vincent Hardy * @version $Id: ScriptSelfTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ScriptSelfTest extends SelfContainedSVGOnLoadTest { boolean secure = true; boolean constrain = true; String scripts = "text/ecmascript, application/java-archive"; TestUserAgent userAgent = new TestUserAgent(); public void setId(String id){ super.setId(id); svgURL = resolveURL("test-resources/org/apache/batik/" + id + ".svg"); } public void setSecure(Boolean secure){ this.secure = secure.booleanValue(); } public Boolean getSecure(){ return secure ? Boolean.TRUE : Boolean.FALSE; } public void setConstrain(Boolean constrain){ this.constrain = constrain.booleanValue(); } public Boolean getConstrain(){ return constrain ? Boolean.TRUE : Boolean.FALSE; } public void setScripts(String scripts){ this.scripts = scripts; } public String getScripts(){ return scripts; } public TestReport runImpl() throws Exception{ ApplicationSecurityEnforcer ase = new ApplicationSecurityEnforcer(this.getClass(), "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy"); if (secure) { ase.enforceSecurity(true); } try { return super.runImpl(); } finally { ase.enforceSecurity(false); } } protected UserAgent buildUserAgent(){ return userAgent; } class TestUserAgent extends UserAgentAdapter { public ScriptSecurity getScriptSecurity(String scriptType, ParsedURL scriptPURL, ParsedURL docPURL){ if (scripts.indexOf(scriptType) == -1){ return new NoLoadScriptSecurity(scriptType); } else { if (constrain){ return new DefaultScriptSecurity (scriptType, scriptPURL, docPURL); } else { return new RelaxedScriptSecurity (scriptType, scriptPURL, docPURL); } } } } } batik-1.9.orig/test-sources/org/apache/batik/parser/0000755000175000017500000000000013153020772021774 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/parser/LengthParserTest.java0000644000175000017500000000732713063003302026074 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.parser; import java.io.*; import org.apache.batik.test.*; /** * To test the length parser. * * @author Stephane Hillion * @version $Id: LengthParserTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class LengthParserTest extends AbstractTest { protected String sourceLength; protected String destinationLength; protected StringBuffer buffer; protected String resultLength; /** * Creates a new LengthParserTest. * @param slength The length to parse. * @param dlength The length after serialization. */ public LengthParserTest(String slength, String dlength) { sourceLength = slength; destinationLength = dlength; } public TestReport runImpl() throws Exception { LengthParser pp = new LengthParser(); pp.setLengthHandler(new TestHandler()); try { pp.parse(new StringReader(sourceLength)); } catch (ParseException e) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("parse.error"); report.addDescriptionEntry("exception.text", e.getMessage()); report.setPassed(false); return report; } if (!destinationLength.equals(resultLength)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("invalid.parsing.events"); report.addDescriptionEntry("expected.text", destinationLength); report.addDescriptionEntry("generated.text", resultLength); report.setPassed(false); return report; } return reportSuccess(); } class TestHandler extends DefaultLengthHandler { public TestHandler() {} public void startLength() throws ParseException { buffer = new StringBuffer(); } public void lengthValue(float v) throws ParseException { buffer.append(v); } public void em() throws ParseException { buffer.append("em"); } public void ex() throws ParseException { buffer.append("ex"); } public void in() throws ParseException { buffer.append("in"); } public void cm() throws ParseException { buffer.append("cm"); } public void mm() throws ParseException { buffer.append("mm"); } public void pc() throws ParseException { buffer.append("pc"); } public void pt() throws ParseException { buffer.append("pt"); } public void px() throws ParseException { buffer.append("px"); } public void percentage() throws ParseException { buffer.append("%"); } public void endLength() throws ParseException { resultLength = buffer.toString(); } } } batik-1.9.orig/test-sources/org/apache/batik/parser/PathParserTest.java0000644000175000017500000002147613063003302025550 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.parser; import java.io.*; import org.apache.batik.test.*; /** * To test the path parser. * * @author Stephane Hillion * @version $Id: PathParserTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class PathParserTest extends AbstractTest { protected String sourcePath; protected String destinationPath; protected StringBuffer buffer; protected String resultPath; /** * Creates a new PathParserTest. * @param spath The path to parse. * @param dpath The path after serialization. */ public PathParserTest(String spath, String dpath) { sourcePath = spath; destinationPath = dpath; } public TestReport runImpl() throws Exception { PathParser pp = new PathParser(); pp.setPathHandler(new TestHandler()); try { pp.parse(new StringReader(sourcePath)); } catch (ParseException e) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("parse.error"); report.addDescriptionEntry("exception.text", e.getMessage()); report.setPassed(false); return report; } if (!destinationPath.equals(resultPath)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("invalid.parsing.events"); report.addDescriptionEntry("expected.text", destinationPath); report.addDescriptionEntry("generated.text", resultPath); report.setPassed(false); return report; } return reportSuccess(); } class TestHandler extends DefaultPathHandler { public TestHandler() {} public void startPath() throws ParseException { buffer = new StringBuffer(); } public void movetoRel(float x, float y) throws ParseException { buffer.append('m'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void movetoAbs(float x, float y) throws ParseException { buffer.append('M'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void endPath() throws ParseException { resultPath = buffer.toString(); } public void closePath() throws ParseException { buffer.append('Z'); } public void linetoRel(float x, float y) throws ParseException { buffer.append('l'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void linetoAbs(float x, float y) throws ParseException { buffer.append('L'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void linetoHorizontalRel(float x) throws ParseException { buffer.append('h'); buffer.append(x); } public void linetoHorizontalAbs(float x) throws ParseException { buffer.append('H'); buffer.append(x); } public void linetoVerticalRel(float y) throws ParseException { buffer.append('v'); buffer.append(y); } public void linetoVerticalAbs(float y) throws ParseException { buffer.append('V'); buffer.append(y); } public void curvetoCubicRel(float x1, float y1, float x2, float y2, float x, float y) throws ParseException { buffer.append('c'); buffer.append(x1); buffer.append(' '); buffer.append(y1); buffer.append(' '); buffer.append(x2); buffer.append(' '); buffer.append(y2); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoCubicAbs(float x1, float y1, float x2, float y2, float x, float y) throws ParseException { buffer.append('C'); buffer.append(x1); buffer.append(' '); buffer.append(y1); buffer.append(' '); buffer.append(x2); buffer.append(' '); buffer.append(y2); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoCubicSmoothRel(float x2, float y2, float x, float y) throws ParseException { buffer.append('s'); buffer.append(x2); buffer.append(' '); buffer.append(y2); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoCubicSmoothAbs(float x2, float y2, float x, float y) throws ParseException { buffer.append('S'); buffer.append(x2); buffer.append(' '); buffer.append(y2); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoQuadraticRel(float x1, float y1, float x, float y) throws ParseException { buffer.append('q'); buffer.append(x1); buffer.append(' '); buffer.append(y1); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoQuadraticAbs(float x1, float y1, float x, float y) throws ParseException { buffer.append('Q'); buffer.append(x1); buffer.append(' '); buffer.append(y1); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoQuadraticSmoothRel(float x, float y) throws ParseException { buffer.append('t'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void curvetoQuadraticSmoothAbs(float x, float y) throws ParseException { buffer.append('T'); buffer.append(x); buffer.append(' '); buffer.append(y); } public void arcRel(float rx, float ry, float xAxisRotation, boolean largeArcFlag, boolean sweepFlag, float x, float y) throws ParseException { buffer.append('a'); buffer.append(rx); buffer.append(' '); buffer.append(ry); buffer.append(' '); buffer.append(xAxisRotation); buffer.append(' '); buffer.append(largeArcFlag ? '1' : '0'); buffer.append(' '); buffer.append(sweepFlag ? '1' : '0'); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } public void arcAbs(float rx, float ry, float xAxisRotation, boolean largeArcFlag, boolean sweepFlag, float x, float y) throws ParseException { buffer.append('A'); buffer.append(rx); buffer.append(' '); buffer.append(ry); buffer.append(' '); buffer.append(xAxisRotation); buffer.append(' '); buffer.append(largeArcFlag ? '1' : '0'); buffer.append(' '); buffer.append(sweepFlag ? '1' : '0'); buffer.append(' '); buffer.append(x); buffer.append(' '); buffer.append(y); } } } batik-1.9.orig/test-sources/org/apache/batik/parser/LengthParserFailureTest.java0000644000175000017500000000351313063003300027373 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.parser; import java.io.*; import org.apache.batik.test.*; /** * To test the length parser. * * @author Stephane Hillion * @version $Id: LengthParserFailureTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class LengthParserFailureTest extends AbstractTest { protected String sourceLength; /** * Creates a new LengthParserFailureTest. * @param slength The length to parse. */ public LengthParserFailureTest(String slength) { sourceLength = slength; } public TestReport runImpl() throws Exception { LengthParser pp = new LengthParser(); try { pp.parse(new StringReader(sourceLength)); } catch (ParseException e) { return reportSuccess(); } DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("parse.without.error"); report.addDescriptionEntry("input.text", sourceLength); report.setPassed(false); return report; } } batik-1.9.orig/test-sources/org/apache/batik/parser/TransformListParserTest.java0000644000175000017500000001333613063003300027455 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.parser; import java.io.*; import org.apache.batik.test.*; /** * To test the transform list parser. * * @author Stephane Hillion * @version $Id: TransformListParserTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TransformListParserTest extends AbstractTest { protected String sourceTransform; protected String destinationTransform; protected StringBuffer buffer; protected String resultTransform; /** * Creates a new TransformListParserTest. * @param stransform The transform to parse. * @param dtransform The transform after serialization. */ public TransformListParserTest(String stransform, String dtransform) { sourceTransform = stransform; destinationTransform = dtransform; } public TestReport runImpl() throws Exception { TransformListParser pp = new TransformListParser(); pp.setTransformListHandler(new TestHandler()); try { pp.parse(new StringReader(sourceTransform)); } catch (ParseException e) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("parse.error"); report.addDescriptionEntry("exception.text", e.getMessage()); report.setPassed(false); return report; } if (!destinationTransform.equals(resultTransform)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("invalid.parsing.events"); report.addDescriptionEntry("expected.text", destinationTransform); report.addDescriptionEntry("generated.text", resultTransform); report.setPassed(false); return report; } return reportSuccess(); } class TestHandler extends DefaultTransformListHandler { boolean first; public TestHandler() {} public void startTransformList() throws ParseException { buffer = new StringBuffer(); first = true; } public void matrix(float a, float b, float c, float d, float e, float f) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("matrix("); buffer.append(a); buffer.append(", "); buffer.append(b); buffer.append(", "); buffer.append(c); buffer.append(", "); buffer.append(d); buffer.append(", "); buffer.append(e); buffer.append(", "); buffer.append(f); buffer.append(")"); } public void rotate(float theta) throws ParseException { if (!first) { buffer.append(' '); } first = false; } public void rotate(float theta, float cx, float cy) throws ParseException { if (!first) { buffer.append(' '); } first = false; } public void translate(float tx) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("translate("); buffer.append(tx); buffer.append(")"); } public void translate(float tx, float ty) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("translate("); buffer.append(tx); buffer.append(", "); buffer.append(ty); buffer.append(")"); } public void scale(float sx) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("scale("); buffer.append(sx); buffer.append(")"); } public void scale(float sx, float sy) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("scale("); buffer.append(sx); buffer.append(", "); buffer.append(sy); buffer.append(")"); } public void skewX(float skx) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("skewX("); buffer.append(skx); buffer.append(")"); } public void skewY(float sky) throws ParseException { if (!first) { buffer.append(' '); } first = false; buffer.append("skewY("); buffer.append(sky); buffer.append(")"); } public void endTransformList() throws ParseException { resultTransform = buffer.toString(); } } } batik-1.9.orig/test-sources/org/apache/batik/parser/PathParserFailureTest.java0000644000175000017500000000345013063003301027047 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.parser; import java.io.*; import org.apache.batik.test.*; /** * To test the path parser. * * @author Stephane Hillion * @version $Id: PathParserFailureTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class PathParserFailureTest extends AbstractTest { protected String sourcePath; /** * Creates a new PathParserFailureTest. * @param spath The path to parse. */ public PathParserFailureTest(String spath) { sourcePath = spath; } public TestReport runImpl() throws Exception { PathParser pp = new PathParser(); try { pp.parse(new StringReader(sourcePath)); } catch (Exception e) { return reportSuccess(); } DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("parse.without.error"); report.addDescriptionEntry("input.text", sourcePath); report.setPassed(false); return report; } } batik-1.9.orig/test-sources/org/apache/batik/anim/0000755000175000017500000000000013063003300021410 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/anim/dom/0000755000175000017500000000000013153020772022203 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/anim/dom/SystemIdTest.java0000644000175000017500000000556213063003301025444 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.anim.dom; import java.util.Locale; import java.util.ResourceBundle; import java.util.StringTokenizer; import java.util.MissingResourceException; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.TestReport; import org.apache.batik.test.DefaultTestReport; /** * This class tests that there is System Id for each public Id * in the dtdids.properties resource file. * * @author Vincent Hardy * @author $Id: SystemIdTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SystemIdTest extends AbstractTest { public static final String ERROR_MISSING_SYSTEM_ID = "error.missing.system.id"; public static final String KEY_MISSING_IDS = "key.missing.ids"; public SystemIdTest() { } public TestReport runImpl() throws Exception { ResourceBundle rb = ResourceBundle.getBundle(SAXSVGDocumentFactory.DTDIDS, Locale.getDefault()); String dtdids = rb.getString(SAXSVGDocumentFactory.KEY_PUBLIC_IDS); StringTokenizer st = new StringTokenizer(dtdids, "-"); int nIds = st.countTokens(); String missingIds = ""; for (int i=0; iStephane Hillion * @version $Id: GetElementsByTagNameNSTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GetElementsByTagNameNSTest extends AbstractTest { protected String testFileName; protected String rootTag; protected String tagName; public GetElementsByTagNameNSTest(String file, String root, String tag) { testFileName = file; rootTag = root; tagName = tag; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element root = doc.getDocumentElement(); NodeList lst = root.getElementsByTagNameNS(null, tagName); if (lst.getLength() != 1) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.getElementByTagNameNS.failed"); report.setPassed(false); return report; } Node n; while ((n = root.getFirstChild()) != null) { root.removeChild(n); } if (lst.getLength() != 0) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.getElementByTagNameNS.failed"); report.setPassed(false); return report; } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/NodeGetUserDataTest.java0000644000175000017500000000367413063003300025736 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.UserDataHandler; /** * Tests Node.setUserData and Node.getUserData. * * @author Cameron McCormack * @version $Id: NodeGetUserDataTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NodeGetUserDataTest extends DOM3Test { static class UserHandler implements UserDataHandler { int count = 0; public void handle(short op, String key, Object data, Node src, Node dest) { count++; } public int getCount() { return count; } } public boolean runImplBasic() throws Exception { UserHandler udh = new UserHandler(); Document doc = newDoc(); AbstractNode n = (AbstractNode) doc.createElementNS(null, "test"); n.setUserData("key", "val", udh); ((AbstractDocument) doc).renameNode(n, null, "abc"); return udh.getCount() == 1 && ((String) n.getUserData("key")).equals("val"); } } batik-1.9.orig/test-sources/org/apache/batik/dom/EventTargetAddEventListenerNSTest.java0000644000175000017500000000512313063003303030564 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; /** * Tests EventTarget.addEventListenerNS. * * @author Cameron McCormack * @version $Id: EventTargetAddEventListenerNSTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EventTargetAddEventListenerNSTest extends DOM3Test { static class Listener1 implements EventListener { int count = 0; public void handleEvent(Event e) { count++; } int getCount() { int c = count; count = 0; return c; } } static class Listener2 implements EventListener { int count = 0; public void handleEvent(Event e) { count++; e.stopPropagation(); } int getCount() { int c = count; count = 0; return c; } } public boolean runImplBasic() throws Exception { Listener1 l1 = new Listener1(); Listener2 l2 = new Listener2(); Document doc = newDoc(); Element e = doc.createElementNS(null, "test"); AbstractNode et = (AbstractNode) e; doc.appendChild(e); et.addEventListenerNS(XML_EVENTS_NAMESPACE_URI, "DOMAttrModified", l1, false, null); et.addEventListenerNS(null, "DOMAttrModified", l1, false, null); e.setAttributeNS(null, "test", "abc"); boolean pass = l1.getCount() == 2; et.addEventListenerNS(XML_EVENTS_NAMESPACE_URI, "DOMAttrModified", l2, false, "g1"); et.addEventListenerNS(null, "DOMAttrModified", l2, false, "g1"); e.setAttributeNS(null, "test", "def"); pass = pass && l2.getCount() == 2; return pass; } } batik-1.9.orig/test-sources/org/apache/batik/dom/RemoveAttributeTest.java0000644000175000017500000000626313063003301026077 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * This class tests the removeAttribute method. * * @author Stephane Hillion * @version $Id: RemoveAttributeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class RemoveAttributeTest extends AbstractTest { public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ENTRY_KEY_ID = "entry.key.id"; protected String testFileName; protected String rootTag; protected String targetId; protected String targetAttr; public RemoveAttributeTest(String file, String root, String id, String attr) { testFileName = file; rootTag = root; targetId = id; targetAttr = attr; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } try { e.removeAttribute(targetAttr); } catch (DOMException ex) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(TestReport.ERROR_TEST_FAILED); report.addDescriptionEntry("exception.message", ex.getMessage()); report.setPassed(false); return report; } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/AppendChildTest.java0000644000175000017500000000655413063003301025134 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * This class tests the appendChild method. * * @author Stephane Hillion * @version $Id: AppendChildTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AppendChildTest extends AbstractTest { public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ERROR_EXCEPTION_NOT_THROWN = "error.exception.not.thrown"; public static String ENTRY_KEY_ID = "entry.key.id"; protected String testFileName; protected String rootTag; protected String targetId; public AppendChildTest(String file, String root, String id) { testFileName = file; rootTag = root; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } Document otherDocument = df.createDocument(null, rootTag, url.toString(), url.openStream()); DocumentFragment docFrag = otherDocument.createDocumentFragment(); try { docFrag.appendChild(doc.getDocumentElement()); } catch (DOMException ex) { return reportSuccess(); } DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_EXCEPTION_NOT_THROWN); report.setPassed(false); return report; } } batik-1.9.orig/test-sources/org/apache/batik/dom/DOM3Test.java0000644000175000017500000000350513063003301023454 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.apache.batik.test.AbstractTest; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.anim.dom.SVGOMDocument; import org.w3c.dom.Document; /** * * @version $Id: DOM3Test.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DOM3Test extends AbstractTest { static String SVG_NAMESPACE_URI = "http://www.w3.org/2000/svg"; static String EX_NAMESPACE_URI = "http://www.example.org/"; static String XML_NAMESPACE_URI = "http://www.w3.org/XML/1998/namespace"; static String XMLNS_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/"; static String XML_EVENTS_NAMESPACE_URI = "http://www.w3.org/2001/xml-events"; protected Document newDoc() { return new GenericDocument(null, GenericDOMImplementation.getDOMImplementation()); } protected Document newSVGDoc() { Document doc = new SVGOMDocument(null, SVGDOMImplementation.getDOMImplementation()); doc.appendChild(doc.createElementNS(SVG_NAMESPACE_URI, "svg")); return doc; } } batik-1.9.orig/test-sources/org/apache/batik/dom/SetAttributeTest.java0000644000175000017500000000673013063003300025373 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * @author Stephane Hillion * @version $Id: SetAttributeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SetAttributeTest extends AbstractTest { protected String testFileName; protected String rootTag; protected String targetId; protected String targetAttribute; protected String targetValue; protected String parserClassName = XMLResourceDescriptor.getXMLParserClassName(); public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ENTRY_KEY_ID = "entry.key.id"; public SetAttributeTest(String testFileName, String rootTag, String targetId, String targetAttribute, String targetValue){ this.testFileName = testFileName; this.rootTag = rootTag; this.targetId = targetId; this.targetAttribute = targetAttribute; this.targetValue = targetValue; } public String getParserClassName(){ return parserClassName; } public void setParserClassName(String parserClassName){ this.parserClassName = parserClassName; } public TestReport runImpl() throws Exception { DocumentFactory df = new SAXDocumentFactory(GenericDOMImplementation.getDOMImplementation(), parserClassName); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if(e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } e.setAttribute(targetAttribute, targetValue); if(targetValue.equals(e.getAttribute(targetAttribute))){ return reportSuccess(); } DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(TestReport.ERROR_TEST_FAILED); report.setPassed(false); return report; } } batik-1.9.orig/test-sources/org/apache/batik/dom/EcmaScriptDOMTest.java0000644000175000017500000000250113063003301025337 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.apache.batik.test.svg.SelfContainedSVGOnLoadTest; /** * Helper class to simplify writing the unitTesting.xml file for * DOM Tests. * * @author Vincent Hardy * @version $Id: EcmaScriptDOMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EcmaScriptDOMTest extends SelfContainedSVGOnLoadTest { public void setId(String id){ super.setId(id); svgURL = resolveURL("test-resources/org/apache/batik/dom/" + id + ".svg"); } } batik-1.9.orig/test-sources/org/apache/batik/dom/DocumentNormalizeDocumentTest.java0000644000175000017500000002567113063003302030121 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.apache.batik.test.TestReport; import org.w3c.dom.Attr; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMError; import org.w3c.dom.DOMErrorHandler; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Tests Document.normalizeDocument. * * @author Cameron McCormack * @version $Id: DocumentNormalizeDocumentTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DocumentNormalizeDocumentTest extends DOM3Test { static class Handler implements DOMErrorHandler { int cd = 0; int wf = 0; int wfn = 0; public boolean handleError(DOMError e) { if (e.getType().equals("cdata-sections-splitted")) { cd++; } else if (e.getType().equals("wf-invalid-character")) { wf++; } else if (e.getType().equals("wf-invalid-character-in-node-name")) { wfn++; } return true; } public int get(String s) { if (s.equals("cdata-sections-splitted")) { return cd; } else if (s.equals("wf-invalid-character")) { return wf; } else if (s.equals("wf-invalid-character-in-node-name")) { return wfn; } else { return 0; } } } public TestReport runImpl() throws Exception { Handler h = new Handler(); TestReport report = null; // cdata-sections == false Document doc = newSVGDoc(); DOMConfiguration conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("cdata-sections", Boolean.FALSE); Element e = doc.getDocumentElement(); e.appendChild(doc.createTextNode("abc")); e.appendChild(doc.createCDATASection("def")); e.appendChild(doc.createTextNode("ghi")); ((AbstractDocument) doc).normalizeDocument(); if (!(e.getFirstChild().getNodeType() == Node.TEXT_NODE && e.getFirstChild().getNodeValue().equals("abcdefghi") && e.getFirstChild() == e.getLastChild())) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "cdata-sections == false"); } // comments == false doc = newSVGDoc(); conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("comments", Boolean.FALSE); e = doc.getDocumentElement(); e.appendChild(doc.createTextNode("abc")); e.appendChild(doc.createComment("def")); e.appendChild(doc.createTextNode("ghi")); ((AbstractDocument) doc).normalizeDocument(); if (!(e.getFirstChild().getNodeType() == Node.TEXT_NODE && e.getFirstChild().getNodeValue().equals("abcghi") && e.getFirstChild() == e.getLastChild())) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "comments == false"); } // element-content-whitespace == false doc = newSVGDoc(); conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("element-content-whitespace", Boolean.FALSE); e = doc.getDocumentElement(); e.appendChild(doc.createTextNode(" ")); e.appendChild(doc.createElementNS(SVG_NAMESPACE_URI, "g")); e.appendChild(doc.createTextNode(" ")); ((AbstractDocument) doc).normalizeDocument(); if (!(e.getFirstChild().getNodeType() == Node.ELEMENT_NODE && e.getFirstChild().getNodeName().equals("g") && e.getFirstChild() == e.getLastChild())) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "element-content-whitespace == false"); } // split-cdata-sections == true doc = newSVGDoc(); conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("split-cdata-sections", Boolean.TRUE); conf.setParameter("error-handler", h); e = doc.getDocumentElement(); e.appendChild(doc.createCDATASection("before ]]> after")); ((AbstractDocument) doc).normalizeDocument(); if (!(e.getFirstChild().getNodeType() == Node.CDATA_SECTION_NODE && e.getFirstChild().getNodeValue().equals("before ]]") && e.getFirstChild().getNextSibling().getNodeType() == Node.CDATA_SECTION_NODE && e.getFirstChild().getNextSibling().getNodeValue().equals("> after") && e.getFirstChild().getNextSibling() == e.getLastChild() && h.get("cdata-sections-splitted") == 1)) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "split-cdata-sections == true"); } // well-formed doc = newSVGDoc(); ((AbstractDocument) doc).setStrictErrorChecking(false); conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("error-handler", h); e = doc.getDocumentElement(); e.appendChild(doc.createComment("before -- after")); e.appendChild(doc.createComment("ends in a dash -")); e.setAttribute("*", "blah"); e.appendChild(doc.createProcessingInstruction("abc", "def?>")); ((AbstractDocument) doc).normalizeDocument(); if (!(h.get("wf-invalid-character-in-node-name") == 1 && h.get("wf-invalid-character") == 3)) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "well-formed == true"); } // namespaces doc = newDoc(); e = doc.createElementNS(null, "root"); doc.appendChild(e); Element e2 = doc.createElementNS(null, "parent"); e.appendChild(e2); e2.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:ns", "http://www.example.org/ns1"); e2.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:bar", "http://www.example.org/ns2"); Element e3 = doc.createElementNS("http://www.example.org/ns1", "ns:child1"); e2.appendChild(e3); e3.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:ns", "http://www.example.org/ns2"); e3 = doc.createElementNS("http://www.example.org/ns2", "ns:child2"); e2.appendChild(e3); ((AbstractDocument) doc).normalizeDocument(); Attr a = e3.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "ns"); if (!(a != null && a.getNodeName().equals("xmlns:ns") && a.getNodeValue().equals("http://www.example.org/ns2"))) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "namespaces == true, test 1"); } doc = newDoc(); e = doc.createElementNS(null, "root"); doc.appendChild(e); e2 = doc.createElementNS("http://www.example.org/ns1", "ns:child1"); e.appendChild(e2); e2.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:ns", "http://www.example.org/ns1"); e3 = doc.createElementNS("http://www.example.org/ns1", "ns:child2"); e2.appendChild(e3); e2 = (Element) ((AbstractDocument) doc).renameNode(e2, "http://www.example.org/ns2", "ns:child1"); ((AbstractDocument) doc).normalizeDocument(); a = e2.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "ns"); Attr a2 = e3.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "ns"); if (!(a != null && a.getNodeName().equals("xmlns:ns") && a.getNodeValue().equals("http://www.example.org/ns2") && a2 != null && a2.getNodeName().equals("xmlns:ns") && a2.getNodeValue().equals("http://www.example.org/ns1"))) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "namespaces == true, test 2"); } doc = newDoc(); e = doc.createElementNS(null, "root"); doc.appendChild(e); e2 = doc.createElementNS("http://www.example.org/ns1", "child1"); e.appendChild(e2); e2.setAttributeNS("http://www.example.org/ns2", "blah", "hi"); ((AbstractDocument) doc).normalizeDocument(); a = e2.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "xmlns"); a2 = e2.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "NS1"); if (!(a != null && a.getNodeValue().equals("http://www.example.org/ns1") && a2 != null && a2.getNodeValue().equals("http://www.example.org/ns2"))) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "namespaces == true, test 3"); } // namespace-declarations == false doc = newDoc(); e = doc.createElementNS(null, "ex:root"); e.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:ex", "http://www.example.org/ns1"); conf = ((AbstractDocument) doc).getDomConfig(); conf.setParameter("namespace-declarations", Boolean.FALSE); doc.appendChild(e); ((AbstractDocument) doc).normalizeDocument(); if (!(e.getAttributeNodeNS(XMLNS_NAMESPACE_URI, "ex") == null)) { if (report == null) { report = reportError("Document.normalizeDocument test failed"); } report.addDescriptionEntry("DOMConfiguration parameter", "namespace-declarations == false"); } if (report == null) { return reportSuccess(); } return report; } } batik-1.9.orig/test-sources/org/apache/batik/dom/svg/0000755000175000017500000000000013153020772022056 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/dom/svg/CloneNodeTest.java0000644000175000017500000000627713063003300025427 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom.svg; import java.io.File; import java.net.URL; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.util.XMLResourceDescriptor; /** * This class tests the cloneNode method. * * @author Stephane Hillion * @version $Id: CloneNodeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class CloneNodeTest extends AbstractTest { protected String testFileName; protected String targetId; public CloneNodeTest(String file, String id) { testFileName = file; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory df = new SAXSVGDocumentFactory(parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.get.element.by.id.failed"); report.addDescriptionEntry("entry.key.id", targetId); report.setPassed(false); return report; } Element celt = (Element)e.cloneNode(true); NamedNodeMap attrs = e.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Node attr = attrs.item(i); String ns = attr.getNamespaceURI(); String name = (ns == null) ? attr.getNodeName() : attr.getLocalName(); String val = attr.getNodeValue(); String val2 = celt.getAttributeNS(ns, name); if (!val.equals(val2)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.attr.comparison.failed"); report.addDescriptionEntry("entry.attr.name", name); report.setPassed(false); return report; } } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/svg/EcmaScriptSVGDOMTest.java0000644000175000017500000000252313063003302026523 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom.svg; import org.apache.batik.test.svg.SelfContainedSVGOnLoadTest; /** * Helper class to simplify writing the unitTesting.xml file for * CSS DOM Tests. * * @author Vincent Hardy * @version $Id: EcmaScriptSVGDOMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EcmaScriptSVGDOMTest extends SelfContainedSVGOnLoadTest { public void setId(String id){ super.setId(id); svgURL = resolveURL("test-resources/org/apache/batik/dom/svg/" + id + ".svg"); } } batik-1.9.orig/test-sources/org/apache/batik/dom/svg/ImportNodeTest.java0000644000175000017500000000721213063003301025630 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom.svg; import java.io.File; import java.net.URL; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.util.XMLResourceDescriptor; /** * This class tests the importNode method. * * @author Stephane Hillion * @version $Id: ImportNodeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ImportNodeTest extends AbstractTest { protected String testFileName; protected String targetId; public ImportNodeTest(String file, String id) { testFileName = file; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory df = new SAXSVGDocumentFactory(parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.get.element.by.id.failed"); report.addDescriptionEntry("entry.key.id", targetId); report.setPassed(false); return report; } DOMImplementation di = SVGDOMImplementation.getDOMImplementation(); Document d = di.createDocument(SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null); Element celt = (Element)d.importNode(e, true); NamedNodeMap attrs = e.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Node attr = attrs.item(i); String ns = attr.getNamespaceURI(); String name = (ns == null) ? attr.getNodeName() : attr.getLocalName(); String val = attr.getNodeValue(); String val2 = celt.getAttributeNS(ns, name); if (!val.equals(val2)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.attr.comparison.failed"); report.addDescriptionEntry("entry.attr.name", name); report.addDescriptionEntry("entry.attr.value1", val); report.addDescriptionEntry("entry.attr.value2", val2); report.setPassed(false); return report; } } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/ReplaceChildTest.java0000644000175000017500000000642313063003300025272 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * This class tests the hasChildNodes method. * * @author Stephane Hillion * @version $Id: ReplaceChildTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ReplaceChildTest extends AbstractTest { public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ENTRY_KEY_ID = "entry.key.id"; protected String testFileName; protected String rootTag; protected String targetId; public ReplaceChildTest(String file, String root, String id) { testFileName = file; rootTag = root; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } Element fc = null; for (Node n = e.getFirstChild(); n != null; n = n.getNextSibling()) { if (n.getNodeType() == Node.ELEMENT_NODE) { fc = (Element)n; break; } } Element ne = doc.createElementNS(null, "elt4"); e.replaceChild(ne, fc); if (ne.getParentNode() != e || fc.getParentNode() != null) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(TestReport.ERROR_TEST_FAILED); report.setPassed(false); return report; } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/HasChildNodesTest.java0000644000175000017500000000541013063003301025417 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * This class tests the hasChildNodes method. * * @author Stephane Hillion * @version $Id: HasChildNodesTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class HasChildNodesTest extends AbstractTest { public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ENTRY_KEY_ID = "entry.key.id"; protected String testFileName; protected String rootTag; protected String targetId; public HasChildNodesTest(String file, String root, String id) { testFileName = file; rootTag = root; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } while (e.hasChildNodes()) { e.removeChild(e.getFirstChild()); } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/NodeCompareDocumentPositionTest.java0000644000175000017500000000453313063003302030375 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; /** * Tests Node.compareDocumentPosition. * * @author Cameron McCormack * @version $Id: NodeCompareDocumentPositionTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NodeCompareDocumentPositionTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); AbstractNode e = (AbstractNode) doc.createElementNS(null, "test"); doc.getDocumentElement().appendChild(e); AbstractNode e2 = (AbstractNode) doc.createElementNS(null, "two"); e.appendChild(e2); AbstractNode e3 = (AbstractNode) doc.createElementNS(null, "three"); e.appendChild(e3); AbstractNode e4 = (AbstractNode) doc.createElementNS(null, "four"); doc.getDocumentElement().appendChild(e4); return e.compareDocumentPosition(e2) == (AbstractNode.DOCUMENT_POSITION_CONTAINS | AbstractNode.DOCUMENT_POSITION_PRECEDING) && e2.compareDocumentPosition(e) == (AbstractNode.DOCUMENT_POSITION_CONTAINED_BY | AbstractNode.DOCUMENT_POSITION_FOLLOWING) && e.compareDocumentPosition(e) == 0 && e2.compareDocumentPosition(e3) == AbstractNode.DOCUMENT_POSITION_PRECEDING && e3.compareDocumentPosition(e2) == AbstractNode.DOCUMENT_POSITION_FOLLOWING && e3.compareDocumentPosition(e4) == AbstractNode.DOCUMENT_POSITION_PRECEDING && e4.compareDocumentPosition(e3) == AbstractNode.DOCUMENT_POSITION_FOLLOWING; } } batik-1.9.orig/test-sources/org/apache/batik/dom/ElementSetIdAttributeNSTest.java0000644000175000017500000000355013063003301027421 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Tests Element.setIdAttributeNS. * * @author Cameron McCormack * @version $Id: ElementSetIdAttributeNSTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ElementSetIdAttributeNSTest extends DOM3Test { private static final String ATTR_NAME = "blah"; private static final String ATTR_VALUE = "abc"; public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); doc.getDocumentElement().setAttributeNS(null, ATTR_NAME, ATTR_VALUE); if (!setIdAttributeWorks(doc, true)) { return false; } return setIdAttributeWorks(doc, false); } private boolean setIdAttributeWorks(Document doc, boolean isId) { doc.getDocumentElement().setIdAttributeNS(null, ATTR_NAME, isId); Element e = doc.getElementById(ATTR_VALUE); if (isId) { return e == doc.getDocumentElement(); } else { return e == null; } } } batik-1.9.orig/test-sources/org/apache/batik/dom/TextReplaceWholeTextTest.java0000644000175000017500000000333013063003301027032 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Text; /** * Tests Text.replaceWholeText. * * @author Cameron McCormack * @version $Id: TextReplaceWholeTextTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TextReplaceWholeTextTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); Text n1 = doc.createTextNode("abc"); Text n2 = doc.createTextNode("def"); Text n3 = doc.createCDATASection("ghi"); doc.getDocumentElement().appendChild(n1); doc.getDocumentElement().appendChild(n2); doc.getDocumentElement().appendChild(n3); ((AbstractText) n2).replaceWholeText("xyz"); return doc.getDocumentElement().getFirstChild().getNodeValue().equals("xyz") && doc.getDocumentElement().getFirstChild().getNextSibling() == null; } } batik-1.9.orig/test-sources/org/apache/batik/dom/DocumentAdoptNodeTest.java0000644000175000017500000000302713063003301026325 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Tests Document.adoptNode. * * @author Cameron McCormack * @version $Id: DocumentAdoptNodeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DocumentAdoptNodeTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc1 = newSVGDoc(); Document doc2 = newSVGDoc(); Element e = doc2.getDocumentElement(); e.setAttributeNS(EX_NAMESPACE_URI, "test", "blah"); ((AbstractDocument) doc1).adoptNode(e); return e.getOwnerDocument() == doc1 && e.getAttributeNodeNS(EX_NAMESPACE_URI, "test").getOwnerDocument() == doc1; } } batik-1.9.orig/test-sources/org/apache/batik/dom/DOMUtilitiesCharacterEscaping.java0000644000175000017500000000627113063003301027717 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.TestReport; import org.apache.batik.util.SVGConstants; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.dom.util.DOMUtilities; import org.apache.batik.util.XMLResourceDescriptor; import org.w3c.dom.*; import java.io.*; /** * Checks that Text nodes can be properly written and read. * This test creates a Document with a CDATA section and checks * that the CDATA section content can be written out and then read * without being altered. * * @author Vincent Hardy */ public class DOMUtilitiesCharacterEscaping extends AbstractTest { public TestReport runImpl() throws Exception { DOMImplementation impl = new SVGDOMImplementation(); Document doc = impl.createDocument(SVGConstants.SVG_NAMESPACE_URI, "svg", null); Element svg = doc.getDocumentElement(); Element text = doc.createElementNS(SVGConstants.SVG_NAMESPACE_URI, "text"); svg.appendChild(text); text.setAttributeNS(null, "id", "myText"); String unescapedContent = "You should not escape: & # \" ..."; CDATASection cdata = doc.createCDATASection(unescapedContent); text.appendChild(cdata); Writer stringWriter = new StringWriter(); DOMUtilities.writeDocument(doc, stringWriter); String docString = stringWriter.toString(); System.err.println(">>>>>>>>>>> Document content \n\n" + docString + "\n\n<<<<<<<<<<<<<<<<"); String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); doc = f.createDocument("http://xml.apache.org/batik/foo.svg", new StringReader(stringWriter.toString())); text = doc.getElementById("myText"); cdata = (CDATASection)text.getFirstChild(); if (cdata.getData().equals(unescapedContent)) { return reportSuccess(); } TestReport report = reportError("Unexpected CDATA read-back"); report.addDescriptionEntry("expected cdata", unescapedContent); report.addDescriptionEntry("actual cdata", cdata.getData()); return report; } } batik-1.9.orig/test-sources/org/apache/batik/dom/DocumentRenameNodeTest.java0000644000175000017500000000351613063003301026470 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGGElement; import org.w3c.dom.svg.SVGSVGElement; /** * Tests Document.renameNode. * * @author Cameron McCormack * @version $Id: DocumentRenameNodeTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DocumentRenameNodeTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); Element e2 = doc.createElementNS(SVG_NAMESPACE_URI, "g"); boolean pass = e2 instanceof SVGGElement; e2 = (Element) ((AbstractDocument) doc).renameNode(e2, SVG_NAMESPACE_URI, "svg"); pass = pass && e2 instanceof SVGSVGElement; Attr a = doc.createAttributeNS(null, "test"); a = (Attr) ((AbstractDocument) doc).renameNode(a, EX_NAMESPACE_URI, "test2"); pass = pass && a.getNamespaceURI().equals(EX_NAMESPACE_URI) && a.getLocalName().equals("test2"); return pass; } } batik-1.9.orig/test-sources/org/apache/batik/dom/TextWholeTextTest.java0000644000175000017500000000326713063003301025547 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; /** * Tests Text.wholeText. * * @author Cameron McCormack * @version $Id: TextWholeTextTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TextWholeTextTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); AbstractText n1 = (AbstractText) doc.createTextNode("abc"); AbstractText n2 = (AbstractText) doc.createTextNode("def"); AbstractText n3 = (AbstractText) doc.createCDATASection("ghi"); doc.getDocumentElement().appendChild(n1); doc.getDocumentElement().appendChild(n2); doc.getDocumentElement().appendChild(n3); return n1.getWholeText().equals("abcdefghi") && n2.getWholeText().equals("abcdefghi") && n3.getWholeText().equals("abcdefghi"); } } batik-1.9.orig/test-sources/org/apache/batik/dom/SerializationTest.java0000644000175000017500000000744413063003303025577 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * To test the Java serialization. * * @author Stephane Hillion * @version $Id: SerializationTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SerializationTest extends AbstractTest { protected String testFileName; protected String rootTag; protected String parserClassName = XMLResourceDescriptor.getXMLParserClassName(); public SerializationTest(String file, String root) { testFileName = file; rootTag = root; } public TestReport runImpl() throws Exception { DocumentFactory df = new SAXDocumentFactory(GenericDOMImplementation.getDOMImplementation(), parserClassName); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); File ser1 = File.createTempFile("doc1", "ser"); File ser2 = File.createTempFile("doc2", "ser"); try { // Serialization 1 ObjectOutputStream oos; oos = new ObjectOutputStream(new FileOutputStream(ser1)); oos.writeObject(doc); oos.close(); // Deserialization 1 ObjectInputStream ois; ois = new ObjectInputStream(new FileInputStream(ser1)); doc = (Document)ois.readObject(); ois.close(); // Serialization 2 oos = new ObjectOutputStream(new FileOutputStream(ser2)); oos.writeObject(doc); oos.close(); } catch (IOException e) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("io.error"); report.addDescriptionEntry("message", e.getClass().getName() + ": " + e.getMessage()); report.addDescriptionEntry("file.name", testFileName); report.setPassed(false); return report; } // Binary diff InputStream is1 = new FileInputStream(ser1); InputStream is2 = new FileInputStream(ser2); for (;;) { int i1 = is1.read(); int i2 = is2.read(); if (i1 == -1 && i2 == -1) { return reportSuccess(); } if (i1 != i2) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("difference.found"); report.addDescriptionEntry("file.name", testFileName); report.setPassed(false); return report; } } } } batik-1.9.orig/test-sources/org/apache/batik/dom/AttrIsIdTest.java0000644000175000017500000000271113063003300024432 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Tests Attr.isId. * * @author Cameron McCormack * @version $Id: AttrIsIdTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AttrIsIdTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); Element g = doc.createElementNS(SVG_NAMESPACE_URI, "g"); g.setAttributeNS(null, "id", "n1"); doc.getDocumentElement().appendChild(g); Attr a = g.getAttributeNodeNS(null, "id"); return ((AbstractAttr) a).isId(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/CloneElementTest.java0000644000175000017500000000711413063003301025324 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import java.io.File; import java.net.URL; import org.apache.batik.dom.util.SAXDocumentFactory; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.util.XMLResourceDescriptor; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; /** * This class tests the non-deep cloneNode method for elements. * * @author Stephane Hillion * @version $Id: CloneElementTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class CloneElementTest extends AbstractTest { protected String testFileName; protected String rootTag; protected String targetId; public CloneElementTest(String file, String root, String id) { testFileName = file; rootTag = root; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXDocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.get.element.by.id.failed"); report.addDescriptionEntry("entry.key.id", targetId); report.setPassed(false); return report; } Element celt = (Element)e.cloneNode(false); NamedNodeMap attrs = e.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Node attr = attrs.item(i); String ns = attr.getNamespaceURI(); String name = (ns == null) ? attr.getNodeName() : attr.getLocalName(); String val = attr.getNodeValue(); String val2 = celt.getAttributeNS(ns, name); if (!val.equals(val2)) { DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode("error.attr.comparison.failed"); report.addDescriptionEntry("entry.attr.name", name); report.addDescriptionEntry("entry.attr.value1", val); report.addDescriptionEntry("entry.attr.value2", val2); report.setPassed(false); return report; } } return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/NodeBaseURITest.java0000644000175000017500000000357113063003301025015 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Tests Node.baseURI. * * @author Cameron McCormack * @version $Id: NodeBaseURITest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NodeBaseURITest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); ((AbstractDocument) doc).setDocumentURI("http://example.com/blah"); Element e = doc.createElementNS(SVG_NAMESPACE_URI, "g"); doc.getDocumentElement().appendChild(e); e.setAttributeNS(XML_NAMESPACE_URI, "xml:base", "http://example.org/base"); Element e2 = doc.createElementNS(SVG_NAMESPACE_URI, "g"); e.appendChild(e2); e2.setAttributeNS(XML_NAMESPACE_URI, "xml:base", "/somewhere"); return "http://example.com/blah".equals(((AbstractNode) doc).getBaseURI()) && "http://example.org/base".equals(((AbstractNode) e).getBaseURI()) && "http://example.org/somewhere".equals(((AbstractNode) e2).getBaseURI()); } } batik-1.9.orig/test-sources/org/apache/batik/dom/NodeTextContentTest.java0000644000175000017500000000352613063003302026043 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Tests Node.textContent. * * @author Cameron McCormack * @version $Id: NodeTextContentTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NodeTextContentTest extends DOM3Test { public boolean runImplBasic() throws Exception { Document doc = newSVGDoc(); AbstractElement e = (AbstractElement) doc.getDocumentElement(); e.appendChild(doc.createTextNode("abc")); Element e2 = doc.createElementNS(SVG_NAMESPACE_URI, "text"); e2.appendChild(doc.createTextNode("def")); e.appendChild(e2); e.appendChild(doc.createCDATASection("ghi")); String s = e.getTextContent(); e.setTextContent("blah"); return s.equals("abcdefghi") && e.getFirstChild().getNodeType() == Node.TEXT_NODE && e.getFirstChild().getNodeValue().equals("blah") && e.getLastChild() == e.getFirstChild(); } } batik-1.9.orig/test-sources/org/apache/batik/dom/NullNamespaceTest.java0000644000175000017500000000567213063003301025510 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import org.w3c.dom.*; import java.io.*; import java.net.*; import org.apache.batik.dom.util.*; import org.apache.batik.util.*; import org.apache.batik.test.*; /** * This class tests the empty string value for an xmlns attribute. * * @author Stephane Hillion * @version $Id: NullNamespaceTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NullNamespaceTest extends AbstractTest { public static String ERROR_GET_ELEMENT_BY_ID_FAILED = "error.get.element.by.id.failed"; public static String ENTRY_KEY_ID = "entry.key.id"; protected String testFileName; protected String rootTag; protected String targetId; public NullNamespaceTest(String file, String root, String id) { testFileName = file; rootTag = root; targetId = id; } public TestReport runImpl() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); DocumentFactory df = new SAXDocumentFactory (GenericDOMImplementation.getDOMImplementation(), parser); File f = (new File(testFileName)); URL url = f.toURL(); Document doc = df.createDocument(null, rootTag, url.toString(), url.openStream()); Element e = doc.getElementById(targetId); if (e == null){ DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(ERROR_GET_ELEMENT_BY_ID_FAILED); report.addDescriptionEntry(ENTRY_KEY_ID, targetId); report.setPassed(false); return report; } if (e.getNamespaceURI() == null) { return reportSuccess(); } DefaultTestReport report = new DefaultTestReport(this); report.setErrorCode(TestReport.ERROR_TEST_FAILED); report.setPassed(false); return report; } } batik-1.9.orig/test-sources/org/apache/batik/dom/ElementTraversalTest.java0000644000175000017500000001170313063003301026226 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.dom; import java.io.StringReader; import org.apache.batik.dom.AbstractElement; import org.apache.batik.dom.util.SAXDocumentFactory; import org.apache.batik.test.AbstractTest; import org.apache.batik.util.XMLResourceDescriptor; import org.w3c.dom.Document; import org.w3c.dom.ElementTraversal; /** * Tests the {@link ElementTraversal} interface. * * @author Cameron McCormack * @version $Id: ElementTraversalTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ElementTraversalTest extends AbstractTest { private String DOC = "....."; public boolean runImplBasic() throws Exception { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXDocumentFactory df = new SAXDocumentFactory(GenericDOMImplementation.getDOMImplementation(), parser); Document doc = df.createDocument("http://example.org/", new StringReader(DOC)); AbstractElement a = (AbstractElement) doc.getDocumentElement(); AbstractElement b = (AbstractElement) a.getFirstChild(); AbstractElement c = (AbstractElement) b.getNextSibling(); AbstractElement d = (AbstractElement) c.getNextSibling(); AbstractElement g = (AbstractElement) d.getNextSibling(); // (1) Test firstElementChild with no children ensure(1, b.getFirstElementChild() == null); // (2) Test firstElementChild with children but no element children ensure(2, c.getFirstElementChild() == null); // (3) Test firstElementChild with children but element child is not first AbstractElement e = (AbstractElement) d.getFirstElementChild(); ensure(3, e != null && e.getNodeName().equals("e")); // (4) Test firstElementChild with children and element child is first AbstractElement h = (AbstractElement) g.getFirstElementChild(); ensure(4, h != null && h.getNodeName().equals("h")); // (5) Test lastElementChild with no children ensure(5, b.getLastElementChild() == null); // (6) Test lastElementChild with children but no element children ensure(6, c.getLastElementChild() == null); // (7) Test lastElementChild with children but element child is not last AbstractElement f = (AbstractElement) d.getLastElementChild(); ensure(7, f != null && f.getNodeName().equals("f")); // (8) Test lastElementChild with children and element child is last AbstractElement i = (AbstractElement) g.getLastElementChild(); ensure(8, i != null && i.getNodeName().equals("i")); // (9) Test nextElementSibling with no next sibling ensure(9, a.getNextElementSibling() == null); // (10) Test nextElementSibling with next siblings but no element next sibling ensure(10, f.getNextElementSibling() == null); // (11) Test nextElementSibling with next element sibling but not first ensure(11, h.getNextElementSibling() == i); // (12) Test nextElementSibling with next element sibling which is first ensure(12, e.getNextElementSibling() == f); // (13) Test previousElementSibling with no previous sibling ensure(13, a.getPreviousElementSibling() == null); // (14) Test previousElementSibling with previous siblings but no element previous sibling ensure(14, e.getPreviousElementSibling() == null); // (15) Test previousElementSibling with previous element sibling but not first ensure(15, i.getPreviousElementSibling() == h); // (16) Test previousElementSibling with previous element sibling which is first ensure(16, f.getPreviousElementSibling() == e); // (17-20) Test childElementCount for a few cases ensure(17, a.getChildElementCount() == 4); ensure(18, b.getChildElementCount() == 0); ensure(19, c.getChildElementCount() == 0); ensure(20, d.getChildElementCount() == 2); return true; } protected void ensure(int subTestNumber, boolean b) { if (!b) { throw new RuntimeException("Assertion failure in sub-test " + subTestNumber); } } } batik-1.9.orig/test-sources/org/apache/batik/css/0000755000175000017500000000000013063003301021255 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/css/dom/0000755000175000017500000000000013153020772022047 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/css/dom/EcmaScriptCSSDOMTest.java0000644000175000017500000000253113063003302026504 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.css.dom; import org.apache.batik.test.svg.SelfContainedSVGOnLoadTest; /** * Helper class to simplify writing the unitTesting.xml file for * CSS DOM Tests. * * @author Vincent Hardy * @version $Id: EcmaScriptCSSDOMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EcmaScriptCSSDOMTest extends SelfContainedSVGOnLoadTest { public void setId(String id){ super.setId(id); svgURL = resolveURL("test-resources/org/apache/batik/css/dom/" + id + ".svg"); } } batik-1.9.orig/test-sources/org/apache/batik/css/engine/0000755000175000017500000000000013063003301022522 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/css/engine/value/0000755000175000017500000000000013153020772023651 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/css/engine/value/PropertyManagerTest.java0000644000175000017500000002532013063003302030463 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.css.engine.value; import java.util.StringTokenizer; import org.w3c.css.sac.LexicalUnit; import org.apache.batik.css.engine.value.svg.MarkerManager; import org.apache.batik.css.engine.value.svg.OpacityManager; import org.apache.batik.css.engine.value.svg.SVGColorManager; import org.apache.batik.css.engine.value.svg.SVGPaintManager; import org.apache.batik.css.engine.value.svg.SpacingManager; import org.apache.batik.css.parser.Parser; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.util.CSSConstants; /** * The class to test the CSS properties's manager. * * @author Thierry Kormann * @version $Id: PropertyManagerTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class PropertyManagerTest extends AbstractTest { /** * The error code for the 'is inherited' test. */ public static final String ERROR_IS_INHERITED = "PropertyManagerTest.error.inherited"; /** * The error code if the property does not support the 'inherit' value. */ public static final String ERROR_INHERIT_VALUE = "PropertyManagerTest.error.inherit.value"; /** * The error code for the 'default value' test. */ public static final String ERROR_INVALID_DEFAULT_VALUE = "PropertyManagerTest.error.invalid.default.value"; /** * The error code for an invalid property value. */ public static final String ERROR_INVALID_VALUE = "PropertyManagerTest.error.invalid.value"; /** * The error code if an exception occured while creating the manager. */ public static final String ERROR_INSTANTIATION = "PropertyManagerTest.error.instantiation"; /** * The class of the manager. */ protected String managerClassName; /** * This flag bit indicates whether or not the property is inherited. */ protected Boolean isInherited; /** * The candidate values of the property. */ protected String [] identValues; /** * The candidate default value of the property. */ protected String defaultValue; /** * Constructs a new test for the specified manager classname. * * @param managerClassName the classname of the manager to test * @param isInherited the expected flag to see if the property is inherited * @param defaultValue the default value * @param identValueList the list of possible identifiers */ public PropertyManagerTest(String managerClassName, Boolean isInherited, String defaultValue, String identValueList) { this.managerClassName = managerClassName; this.isInherited = isInherited; this.defaultValue = defaultValue; StringTokenizer tokens = new StringTokenizer(identValueList, "|"); int nbIdentValue = tokens.countTokens(); if (nbIdentValue > 0) { identValues = new String[nbIdentValue]; for (int i=0; tokens.hasMoreTokens(); ++i) { identValues[i] = tokens.nextToken().trim(); } } } /** * Creates the value manager. */ protected ValueManager createValueManager() throws Exception { return (ValueManager)Class.forName(managerClassName).newInstance(); } /** * Runs this test. This method will only throw exceptions if some aspect of * the test's internal operation fails. */ public TestReport runImpl() throws Exception { DefaultTestReport report = new DefaultTestReport(this); ValueManager manager; try { manager = createValueManager(); } catch (Exception ex) { report.setErrorCode(ERROR_INSTANTIATION); report.setPassed(false); report.addDescriptionEntry(ERROR_INSTANTIATION, ex.getMessage()); return report; } // test default value if any if (!defaultValue.equals("__USER_AGENT__")) { String s = manager.getDefaultValue().getCssText(); if (!defaultValue.equalsIgnoreCase(s)) { report.setErrorCode(ERROR_INVALID_DEFAULT_VALUE); report.setPassed(false); report.addDescriptionEntry(ERROR_INVALID_DEFAULT_VALUE, "should be: "+defaultValue); } } // test if the property is inherited or not if (isInherited.booleanValue() != manager.isInheritedProperty()) { report.setErrorCode(ERROR_IS_INHERITED); report.setPassed(false); report.addDescriptionEntry(ERROR_IS_INHERITED, ""); } Parser cssParser = new Parser(); // see if the property supports the value 'inherit' try { LexicalUnit lu = cssParser.parsePropertyValue("inherit"); Value v = manager.createValue(lu, null); String s = v.getCssText(); if (!"inherit".equalsIgnoreCase(s)) { report.setErrorCode(ERROR_INHERIT_VALUE); report.setPassed(false); report.addDescriptionEntry(ERROR_INHERIT_VALUE, "inherit"); } } catch (Exception ex) { report.setErrorCode(ERROR_INHERIT_VALUE); report.setPassed(false); report.addDescriptionEntry(ERROR_INHERIT_VALUE, ex.getMessage()); } // test all possible identifiers if (identValues != null) { try { for (int i=0; i < identValues.length; ++i) { LexicalUnit lu = cssParser.parsePropertyValue(identValues[i]); Value v = manager.createValue(lu, null); String s = v.getCssText(); if (!identValues[i].equalsIgnoreCase(s)) { report.setErrorCode(ERROR_INVALID_VALUE); report.setPassed(false); report.addDescriptionEntry(ERROR_INVALID_VALUE, identValues[i]+ '/' +s); } } } catch (Exception ex) { report.setErrorCode(ERROR_INVALID_VALUE); report.setPassed(false); report.addDescriptionEntry(ERROR_INVALID_VALUE, ex.getMessage()); } } return report; } /** * Manager for 'fill'. */ public static class FillManager extends SVGPaintManager { public FillManager() { super(CSSConstants.CSS_FILL_PROPERTY); } } /** * Manager for 'fill-opacity'. */ public static class FillOpacityManager extends OpacityManager { public FillOpacityManager() { super(CSSConstants.CSS_FILL_OPACITY_PROPERTY, true); } } /** * Manager for 'flood-color'. */ public static class FloodColorManager extends SVGColorManager { public FloodColorManager() { super(CSSConstants.CSS_FLOOD_COLOR_PROPERTY); } } /** * Manager for 'flood-opacity'. */ public static class FloodOpacityManager extends OpacityManager { public FloodOpacityManager() { super(CSSConstants.CSS_FLOOD_OPACITY_PROPERTY, false); } } /** * Manager for 'letter-spacing'. */ public static class LetterSpacingManager extends SpacingManager { public LetterSpacingManager() { super(CSSConstants.CSS_LETTER_SPACING_PROPERTY); } } /** * Manager for 'lighting-color'. */ public static class LightingColorManager extends SVGColorManager { public LightingColorManager() { super(CSSConstants.CSS_LIGHTING_COLOR_PROPERTY, ValueConstants.WHITE_RGB_VALUE); } } /** * Manager for 'marker-end'. */ public static class MarkerEndManager extends MarkerManager { public MarkerEndManager() { super(CSSConstants.CSS_MARKER_END_PROPERTY); } } /** * Manager for 'marker-mid'. */ public static class MarkerMidManager extends MarkerManager { public MarkerMidManager() { super(CSSConstants.CSS_MARKER_MID_PROPERTY); } } /** * Manager for 'marker-start'. */ public static class MarkerStartManager extends MarkerManager { public MarkerStartManager() { super(CSSConstants.CSS_MARKER_START_PROPERTY); } } /** * Manager for 'opacity'. */ public static class DefaultOpacityManager extends OpacityManager { public DefaultOpacityManager() { super(CSSConstants.CSS_OPACITY_PROPERTY, false); } } /** * Manager for 'stop-color'. */ public static class StopColorManager extends SVGColorManager { public StopColorManager() { super(CSSConstants.CSS_STOP_COLOR_PROPERTY); } } /** * Manager for 'stop-opacity'. */ public static class StopOpacityManager extends OpacityManager { public StopOpacityManager() { super(CSSConstants.CSS_STOP_OPACITY_PROPERTY, false); } } /** * Manager for 'stroke'. */ public static class StrokeManager extends SVGPaintManager { public StrokeManager() { super(CSSConstants.CSS_STROKE_PROPERTY, ValueConstants.NONE_VALUE); } } /** * Manager for 'stroke-opacity'. */ public static class StrokeOpacityManager extends OpacityManager { public StrokeOpacityManager() { super(CSSConstants.CSS_STROKE_OPACITY_PROPERTY, true); } } /** * Manager for 'word-spacing'. */ public static class WordSpacingManager extends SpacingManager { public WordSpacingManager() { super(CSSConstants.CSS_WORD_SPACING_PROPERTY); } } } batik-1.9.orig/test-sources/org/apache/batik/util/0000755000175000017500000000000013153020772021455 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/util/ApplicationSecurityEnforcerTest.java0000644000175000017500000001063713063003301030633 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.util; import org.apache.batik.test.*; /** * Validates the operation of the security enforcer class. * * @author Vincent Hardy * @version $Id: ApplicationSecurityEnforcerTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ApplicationSecurityEnforcerTest extends DefaultTestSuite { static final Class APP_MAIN_CLASS = org.apache.batik.apps.svgbrowser.Main.class; static final String APP_SECURITY_POLICY = "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy"; /** * In the constructor, append atomic tests */ public ApplicationSecurityEnforcerTest(){ addTest(new CheckNoSecurityManagerOverride()); addTest(new CheckSecurityEnforcement()); addTest(new CheckSecurityRemoval()); addTest(new CheckNoPolicyFile()); } static ApplicationSecurityEnforcer buildTestTarget(){ return new ApplicationSecurityEnforcer(APP_MAIN_CLASS, APP_SECURITY_POLICY); } static class CheckNoSecurityManagerOverride extends AbstractTest { public boolean runImplBasic(){ ApplicationSecurityEnforcer aseA = buildTestTarget(); aseA.enforceSecurity(true); ApplicationSecurityEnforcer aseB = buildTestTarget(); boolean passed = false; try { // This should throw a SecurityException aseB.enforceSecurity(true); } catch (SecurityException se){ System.out.println(">>>>>>>>>>>>> got expected SecurityException A"); try { System.out.println(">>>>>>>>>>>>> got expected SecurityException B"); aseB.enforceSecurity(false); } catch (SecurityException se2){ passed = true; } } aseA.enforceSecurity(false); return passed; } } static class CheckSecurityEnforcement extends AbstractTest { public boolean runImplBasic() { ApplicationSecurityEnforcer ase = buildTestTarget(); try { ase.enforceSecurity(true); SecurityManager sm = System.getSecurityManager(); if (sm == ase.lastSecurityManagerInstalled){ return true; } } finally { System.setSecurityManager(null); } return false; } } static class CheckSecurityRemoval extends AbstractTest { public boolean runImplBasic() { ApplicationSecurityEnforcer ase = buildTestTarget(); try { ase.enforceSecurity(true); ase.enforceSecurity(false); SecurityManager sm = System.getSecurityManager(); if (sm == null && ase.lastSecurityManagerInstalled == null) { return true; } } finally { System.setSecurityManager(null); } return false; } } static class CheckNoPolicyFile extends AbstractTest { public boolean runImplBasic() { ApplicationSecurityEnforcer ase = new ApplicationSecurityEnforcer(APP_MAIN_CLASS, "dont.exist.policy"); try { ase.enforceSecurity(true); } catch (NullPointerException se) { return true; } finally { ase.enforceSecurity(false); } return false; } } } batik-1.9.orig/test-sources/org/apache/batik/ext/0000755000175000017500000000000013063003300021264 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/0000755000175000017500000000000013063003300022057 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/geom/0000755000175000017500000000000013153020772023022 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/geom/Messages.java0000644000175000017500000000437413063003301025431 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.geom; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * This class manages the message for the test.svg module. * * @author Stephane Hillion * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.ext.awt.geom.resources.TestMessages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/ext/awt/geom/RectListManagerTest.java0000644000175000017500000003276413063003301027552 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.ext.awt.geom; import java.awt.Rectangle; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.util.Base64Test; /** * This test validates that the text selection API's work properly. * * @author Thomas DeWeese * @version $Id: RectListManagerTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class RectListManagerTest extends AbstractTest { /** * Directory for reference files */ public static final String REFERENCE_DIR = "test-references/org/apache/batik/ext/awt/geom/"; public static final String VARIATION_DIR = "variation/"; public static final String CANDIDATE_DIR = "candidate/"; /** * Error when unable to load requested rects file * {0} = file * {1} = exception */ public static final String ERROR_READING_RECTS = "RectListManagerTest.error.reading.rects"; /** * Error when unable to read/open ref URL * {0} = URL * {1} = exception stack trace. */ public static final String ERROR_CANNOT_READ_REF_URL = "RectListManagerTest.error.cannot.read.ref.url"; /** * Result didn't match reference result. * {0} = first byte of mismatch */ public static final String ERROR_WRONG_RESULT = "RectListManagerTest.error.wrong.result"; /** * No Reference or Variation file to compaire with. * {0} = reference url */ public static final String ERROR_NO_REFERENCE = "RectListManagerTest.error.no.reference"; public static final String ENTRY_KEY_ERROR_DESCRIPTION = "RectListManagerTest.entry.key.error.description"; protected URL rects = null; protected URL ref = null; protected URL var = null; protected File can = null; /** * Constructor. ref is ignored if action == ROUND. * @param rects The rects file to load * @param ref The reference file. */ public RectListManagerTest(String rects, String ref) { this.rects = resolveURL(REFERENCE_DIR+rects); this.ref = resolveURL(REFERENCE_DIR+ref); this.var = resolveURL(REFERENCE_DIR+VARIATION_DIR+ref); this.can = new File(REFERENCE_DIR+CANDIDATE_DIR+ref); } /** * Resolves the input string as follows. * + First, the string is interpreted as a file description. * If the file exists, then the file name is turned into * a URL. * + Otherwise, the string is supposed to be a URL. If it * is an invalid URL, an IllegalArgumentException is thrown. */ protected URL resolveURL(String url){ // Is url a file? File f = (new File(url)).getAbsoluteFile(); if(f.getParentFile().exists()){ try{ return f.toURL(); }catch(MalformedURLException e){ throw new IllegalArgumentException(); } } // url is not a file. It must be a regular URL... try{ return new URL(url); }catch(MalformedURLException e){ throw new IllegalArgumentException(url); } } /** * Returns this Test's name */ public String getName() { return rects.toString(); } static final String RECT_PREF ="rect"; static final String RLM_PREF ="rectlistmanger"; static final String MERGE_PREF ="merge"; static final String ADD_PREF ="add"; static final String SUBTRACT_PREF ="subtract"; static final String CONTAINS_ALL_PREF ="containsall"; static final String REMOVE_ALL_PREF ="removeall"; static final String RETAIN_ALL_PREF ="retainall"; static final String PRINT_PREF ="print"; /** * This method will only throw exceptions if some aspect * of the test's internal operation fails. */ public TestReport runImpl() throws Exception { DefaultTestReport report = new DefaultTestReport(this); int lineNo=0; try { BufferedReader reader; reader = new BufferedReader (new InputStreamReader(rects.openStream())); // Now write a canidate reference/variation file... if (can.exists()) can.delete(); FileOutputStream fos = new FileOutputStream(can); PrintStream ps = new PrintStream(fos); Map rlms = new HashMap(); RectListManager currRLM = null; String currID = null; String line; while ((line = reader.readLine()) != null) { lineNo++; line = line.toLowerCase(); StringTokenizer st = new StringTokenizer(line); // Check blank line... if (!st.hasMoreTokens()) continue; // Get first token String pref = st.nextToken(); // Check for comment. if (pref.startsWith("#")) continue; if (RECT_PREF.equals(pref)) { if (st.countTokens() != 4) continue; if (currRLM == null) continue; int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); int w = Integer.parseInt(st.nextToken()); int h = Integer.parseInt(st.nextToken()); currRLM.add(new Rectangle(x, y, w, h)); } else if (RLM_PREF.equals(pref)) { String id = st.nextToken(); Object o = rlms.get(id); if (o == null) { o = new RectListManager(); rlms.put(id, o); } currRLM = (RectListManager)o; currID = id; } else if (MERGE_PREF.equals(pref)) { if (currRLM == null) continue; int overhead = Integer.parseInt(st.nextToken()); int lineOverhead = Integer.parseInt(st.nextToken()); currRLM.mergeRects(overhead, lineOverhead); } else if (ADD_PREF.equals(pref)) { if (currRLM == null) continue; String id = st.nextToken(); Object o = rlms.get(id); if (o == null) continue; currRLM.add((RectListManager)o); } else if (SUBTRACT_PREF.equals(pref)) { if (currRLM == null) continue; String id = st.nextToken(); Object o = rlms.get(id); if (o == null) continue; int overhead = Integer.parseInt(st.nextToken()); int lineOverhead = Integer.parseInt(st.nextToken()); currRLM.subtract((RectListManager)o, overhead, lineOverhead); } else if (CONTAINS_ALL_PREF.equals(pref)) { if (currRLM == null) continue; String id = st.nextToken(); Object o = rlms.get(id); if (o == null) continue; RectListManager rlm = (RectListManager)o; ps.println("ID: " + currID + " Sz: " + currRLM.size()); if (currRLM.containsAll(rlm)) { ps.println(" Contains all: " + id + " Sz: " + rlm.size()); } else { ps.println(" Does not contain all: " + id + " Sz: " + rlm.size()); } ps.println(); } else if (REMOVE_ALL_PREF.equals(pref)) { if (currRLM == null) continue; String id = st.nextToken(); Object o = rlms.get(id); if (o == null) continue; currRLM.removeAll((RectListManager)o); } else if (RETAIN_ALL_PREF.equals(pref)) { if (currRLM == null) continue; String id = st.nextToken(); Object o = rlms.get(id); if (o == null) continue; currRLM.retainAll((RectListManager)o); } else if (PRINT_PREF.equals(pref)) { if (currRLM == null) continue; Iterator i = currRLM.iterator(); ps.println("ID: " + currID + " Sz: " + currRLM.size()); while (i.hasNext()) { ps.println(" " + i.next()); } ps.println(); } } ps.close(); fos.close(); } catch(Exception e) { StringWriter trace = new StringWriter(); e.printStackTrace(new PrintWriter(trace)); report.setErrorCode(ERROR_READING_RECTS); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage (ERROR_READING_RECTS, new String[]{ ""+lineNo, rects.toString(), trace.toString()})) }); report.setPassed(false); return report; } InputStream refIS = null; try { refIS = var.openStream(); } catch(Exception e) { try { refIS = ref.openStream(); } catch(Exception ex) { StringWriter trace = new StringWriter(); e.printStackTrace(new PrintWriter(trace)); report.setErrorCode(ERROR_CANNOT_READ_REF_URL); report.setDescription (new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage (ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage (ERROR_CANNOT_READ_REF_URL, new String[]{ref.toString(), trace.toString()})) }); report.setPassed(false); } } int mismatch = -2; if (refIS != null) { InputStream canIS = new FileInputStream(can); Checker check = new Checker(canIS, refIS); check.start(); mismatch = check.getMismatch(); } if (mismatch == -1) { report.setPassed(true); can.delete(); return report; } if (mismatch == -2) { report.setErrorCode(ERROR_NO_REFERENCE); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage(ERROR_NO_REFERENCE, new String[]{ref.toString()})) }); } else { report.setErrorCode(ERROR_WRONG_RESULT); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage(ERROR_WRONG_RESULT, new String[]{""+mismatch})) }); } report.setPassed(false); return report; } public static class Checker extends Thread { int mismatch = -2; InputStream is1, is2; public Checker(InputStream is1, InputStream is2) { this.is1 = is1; this.is2 = is2; } public int getMismatch() { while (true) { try { this.join(); break; } catch (InterruptedException ie) { } } return mismatch; } public void run() { mismatch = Base64Test.compareStreams (is1, is2, true); } } } batik-1.9.orig/test-sources/org/apache/batik/ext/awt/image/0000755000175000017500000000000013063003300023141 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/image/codec/0000755000175000017500000000000013153020772024232 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/image/codec/Messages.java0000644000175000017500000000440413063003303026635 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * This class manages the message for the test.svg module. * * @author Vincent Hardy * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.ext.awt.image.codec.resources.Messages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/ext/awt/image/codec/png/0000755000175000017500000000000013153020772025016 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/ext/awt/image/codec/png/PNGEncoderTest.java0000644000175000017500000001371313063003301030437 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import org.apache.batik.test.*; import java.awt.*; import java.awt.geom.*; import java.awt.image.*; import java.io.*; /** * This test validates the PNGEncoder operation. It creates a * BufferedImage, then encodes it with the PNGEncoder, then * decodes it and compares the decoded image with the original one. * * @author Vincent Hardy * @version $Id: PNGEncoderTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class PNGEncoderTest extends AbstractTest { /** * Error when image cannot be encoded * {0} = trace for the exception which was reported */ public static final String ERROR_CANNOT_ENCODE_IMAGE = "PNGEncoderTest.error.cannot.encode.image"; /** * Error when image cannot be decoded * {0} = trace for the exception which was reported */ public static final String ERROR_CANNOT_DECODE_IMAGE = "PNGEncoderTest.error.cannot.decode.image"; /** * Decoded image differs from encoded image */ public static final String ERROR_DECODED_DOES_NOT_MATCH_ENCODED = "PNGEncoderTest.error.decoded.does.not.match.encoded"; public TestReport runImpl() throws Exception { // Create a BufferedImage to be encoded BufferedImage image = new BufferedImage(100, 75, BufferedImage.TYPE_INT_ARGB); Graphics2D ig = image.createGraphics(); ig.scale(.5, .5); ig.setPaint(new Color(128,0,0)); ig.fillRect(0, 0, 100, 50); ig.setPaint(Color.orange); ig.fillRect(100, 0, 100, 50); ig.setPaint(Color.yellow); ig.fillRect(0, 50, 100, 50); ig.setPaint(Color.red); ig.fillRect(100, 50, 100, 50); ig.setPaint(new Color(255, 127, 127)); ig.fillRect(0, 100, 100, 50); ig.setPaint(Color.black); ig.draw(new Rectangle2D.Double(0.5, 0.5, 199, 149)); ig.dispose(); image = image.getSubimage(50, 0, 50, 25); // Create an output stream where the PNG data // will be stored. ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStream os = buildOutputStream(bos); // Now, try to encode image PNGEncodeParam params = PNGEncodeParam.getDefaultEncodeParam(image); PNGImageEncoder pngImageEncoder = new PNGImageEncoder(os, params); try{ pngImageEncoder.encode(image); os.close(); }catch(Exception e){ return reportException(ERROR_CANNOT_ENCODE_IMAGE, e); } // Now, try to decode image InputStream is = buildInputStream(bos); PNGImageDecoder pngImageDecoder = new PNGImageDecoder(is, new PNGDecodeParam()); RenderedImage decodedRenderedImage = null; try{ decodedRenderedImage = pngImageDecoder.decodeAsRenderedImage(0); }catch(Exception e){ return reportException(ERROR_CANNOT_DECODE_IMAGE, e); } BufferedImage decodedImage = null; if(decodedRenderedImage instanceof BufferedImage){ decodedImage = (BufferedImage)decodedRenderedImage; } else{ decodedImage = new BufferedImage(decodedRenderedImage.getWidth(), decodedRenderedImage.getHeight(), BufferedImage.TYPE_INT_ARGB); ig = decodedImage.createGraphics(); ig.drawRenderedImage(decodedRenderedImage, new AffineTransform()); ig.dispose(); } // Compare images if( ! checkIdentical(image, decodedImage) ){ return reportError(ERROR_DECODED_DOES_NOT_MATCH_ENCODED); } return reportSuccess(); } /** * Template method for building the PNG output stream. This gives a * chance to sub-classes (e.g., Base64PNGEncoderTest) to add an * additional encoding. */ public OutputStream buildOutputStream(ByteArrayOutputStream bos){ return bos; } /** * Template method for building the PNG input stream. This gives a * chance to sub-classes (e.g., Base64PNGEncoderTest) to add an * additional decoding. */ public InputStream buildInputStream(ByteArrayOutputStream bos){ return new ByteArrayInputStream(bos.toByteArray()); } /** * Compares the data for the two images */ public static boolean checkIdentical(BufferedImage imgA, BufferedImage imgB){ boolean identical = true; if(imgA.getWidth() == imgB.getWidth() && imgA.getHeight() == imgB.getHeight()){ int w = imgA.getWidth(); int h = imgA.getHeight(); for(int i=0; iVincent Hardy * @version $Id: Base64PNGEncoderTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Base64PNGEncoderTest extends PNGEncoderTest { /** * Template method for building the PNG output stream */ public OutputStream buildOutputStream(ByteArrayOutputStream bos){ return new Base64EncoderStream(bos); } /** * Template method for building the PNG input stream */ public InputStream buildInputStream(ByteArrayOutputStream bos){ ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); return new Base64DecodeStream(bis); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/0000755000175000017500000000000013153020772021771 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/svggen/Gradient.java0000644000175000017500000001020013063003304024352 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * This test validates the convertion of Java 2D GradientPaints * into SVG linearGradient definition and reference. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Gradient.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Gradient implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); java.awt.geom.AffineTransform defaultTransform = g.getTransform(); Color labelColor = Color.black; // // First, define cross hair marker // GeneralPath crossHair = new GeneralPath(); crossHair.moveTo(-5, 0); crossHair.lineTo(5, 0); crossHair.moveTo(0, -5); crossHair.lineTo(0, 5); // // Simple test checking color values and start // and end points // java.awt.GradientPaint gradient = new java.awt.GradientPaint(30, 40, Color.red, 30, 120, Color.yellow); g.setPaint(labelColor); g.drawString("Simple vertical gradient", 10, 20); g.setPaint(gradient); g.fillRect(10, 30, 100, 100); g.setPaint(labelColor); g.translate(30, 40); g.draw(crossHair); g.setTransform(defaultTransform); g.translate(30, 120); g.draw(crossHair); g.setTransform(defaultTransform); g.translate(0, 140); // // Now, test cycling behavior // java.awt.GradientPaint nonCyclicGradient = new java.awt.GradientPaint(0, 0, Color.red, 20, 0, Color.yellow); java.awt.GradientPaint cyclicGradient = new java.awt.GradientPaint(0, 0, Color.red, 20, 0, Color.yellow, true); g.setPaint(labelColor); g.drawString("Non Cyclic / Cyclic Gradients", 10, 20); g.translate(10, 30); g.setPaint(nonCyclicGradient); g.fillRect(0, 0, 100, 30); g.translate(0, 30); g.setPaint(cyclicGradient); g.fillRect(0, 0, 100, 30); g.setPaint(labelColor); g.drawLine(0, 0, 100, 0); g.setTransform(defaultTransform); g.translate(0, 240); // // Now, test transformations // g.setPaint(labelColor); g.drawString("Sheared GradientPaint", 10, 20); g.translate(10, 25); java.awt.GradientPaint shearedGradient = new java.awt.GradientPaint(0, 0, Color.red, 100, 0, Color.yellow); g.setPaint(shearedGradient); g.shear(0.5, 0); g.fillRect(0, 0, 100, 40); g.setTransform(defaultTransform); g.translate(0, 320); g.setPaint(labelColor); g.drawString("Opacity in stop color", 10, 20); java.awt.GradientPaint transparentGradient = new java.awt.GradientPaint(10, 30, new Color(255, 0, 0, 0), 110, 30, Color.yellow); g.setPaint(transparentGradient); g.fillRect(10, 30, 100, 30); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Clip.java0000644000175000017500000001014613063003304023515 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; import java.awt.image.*; /** * This test validates convertion of Java 2D clip inot SVG clipPath * definition and attributes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Clip.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Clip implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Save original clip Shape clipShape = g.getClip(); java.awt.geom.AffineTransform transform = g.getTransform(); g.setPaint(Color.black); Dimension size = new Dimension(300, 400); int w=100, h=50; int vOffset = h + 20; BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D gi = image.createGraphics(); gi.setPaint(Color.white); gi.fillRect(0, 0, 100, 50); gi.setPaint(Color.green); gi.fillRect(0, 0, 50, 25); gi.setPaint(Color.black); gi.fillRect(50, 0, 50, 25); gi.setPaint(Color.red); gi.fillRect(50, 25, 50, 25); gi.dispose(); // Set simple clip : does not modify the output g.clipRect(0, 0, size.width, size.height); g.drawImage(image, 0, 0, null); g.setClip(clipShape); g.drawString("Clip set to device bounds", 110, 25); g.translate(0, vOffset); // Intersect current clip with a smaller clip : show only // the top right corner of the image g.drawString("Clip set to upper right quarter", 110, 25); g.clipRect(w/2, 0, w/2, h/2); g.drawImage(image, 0, 0, null); // Restore g.setTransform(transform); g.setClip(clipShape); g.translate(0, 2*vOffset); // Scale before setting the same clip g.drawString("Clip set to upper right quarter", 110, 15); g.drawString("after .5 scale", 110, 30); g.scale(.5, .5); g.clipRect(w/2, 0, w/2, h/2); g.drawImage(image, 0, 0, null); // Restore g.setTransform(transform); g.setClip(clipShape); g.translate(0, 3*vOffset); // Use a non-rectangle clipping area g.drawString("Non-Rectagular clip", 110, 25); Shape circle = new Ellipse2D.Float(0, 0, w, h); g.clip(circle); g.drawImage(image, 0, 0, null); // Restore g.setTransform(transform); g.setClip(clipShape); g.translate(0, 4*vOffset); // Use a non-rectangle clipping area again, // after setting a scale transform g.drawString("Non-Rectagular clip after", 110, 15); g.drawString(".5 scale", 110, 30); g.scale(.5, .5); g.clip(circle); g.drawImage(image, 0, 0, null); // Restore g.setTransform(transform); g.setClip(clipShape); g.translate(0, 5*vOffset); // Use a non-rectangle clipping area again, // before setting a scale transform g.drawString("Non-Rectagular clip before", 110, 15); g.drawString(".5 scale", 110, 30); g.clip(circle); g.scale(.5, .5); g.drawImage(image, 0, 0, null); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/GraphicObjects.java0000644000175000017500000000651713063003303025523 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; import java.awt.image.*; /** * This test validates the convertion of the three elementary * thypes of Java 2D API graphic objects: shapes, text and * images * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: GraphicObjects.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GraphicObjects implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Text g.setPaint(Color.black); g.setFont(new Font("Times New Roman", Font.PLAIN, 20)); g.drawString("Hello SVG drawString(...)", 20, 40); g.translate(0, 70); // Shapes Ellipse2D ellipse = new Ellipse2D.Float(20, 0, 60, 60); g.setPaint(new Color(176, 22, 40)); g.fill(ellipse); g.translate(60, 0); g.setPaint(new Color(208, 170, 119)); g.fill(ellipse); g.translate(60, 0); g.setPaint(new Color(221, 229, 111)); g.fill(ellipse); g.translate(60, 0); g.setPaint(new Color(240, 165, 0)); g.fill(ellipse); g.translate(-180, 60); // Draw background pattern BufferedImage pattern = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB); Graphics2D ig = pattern.createGraphics(); ig.setPaint(Color.white); ig.fillRect(0, 0, 10, 10); ig.setPaint(new Color(0xaaaaaa)); ig.fillRect(0, 0, 5, 5); ig.fillRect(5, 5, 5, 50); TexturePaint texture = new TexturePaint(pattern, new Rectangle(0, 0, 10, 10)); // Image BufferedImage image = new BufferedImage(200, 150, BufferedImage.TYPE_INT_ARGB); ig = image.createGraphics(); ig.setPaint(texture); ig.fillRect(0, 0, 200, 150); g.drawImage(image, 40, 40, null); image = new BufferedImage(200, 150, BufferedImage.TYPE_INT_ARGB); ig = image.createGraphics(); GradientPaint paint = new GradientPaint(0, 0, new Color(103, 103, 152), 200, 150, new Color(103, 103, 152, 0)); ig.setPaint(paint); ig.fillRect(0, 0, 200, 150); ig.setPaint(Color.black); ig.setFont(new Font("Arial", Font.PLAIN, 10)); ig.drawString("This is an image with alpha", 10, 30); ig.dispose(); g.drawImage(image, 40, 40, null); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/GVector.java0000644000175000017500000000371513063003304024203 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; /** * This test validates the convertion of Java 2D GlyphVectors * SVG Shapes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: GVector.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GVector implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Set default font Font font = new Font("Arial", Font.BOLD, 15); g.setFont(font); // Colors used for labels and test output Color labelColor = new Color(0x666699); g.setPaint(labelColor); // Simple String String text = "This is a GlyphVector"; // Get GlyphVector from from java.awt.font.GlyphVector gv = font.createGlyphVector(g.getFontRenderContext(), text); g.drawGlyphVector(gv, 30, 30); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Bug21259.java0000644000175000017500000000451113063003305023746 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Dimension; import java.awt.Rectangle; import java.io.StringWriter; import java.io.Writer; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.TestReport; /** * Checks that the streamed root is not removed from its parent * as shown by bug report 21259. * * @author Vincent Hardy * @version $Id: Bug21259.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Bug21259 extends AbstractTest{ public TestReport runImpl() throws Exception { Document document = SVGDOMImplementation.getDOMImplementation() .createDocument(SVGDOMImplementation.SVG_NAMESPACE_URI , "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document); ctx.setComment("Test"); SVGGraphics2D graphics = new SVGGraphics2D(ctx, false); graphics.setSVGCanvasSize(new Dimension(600, 400)); graphics.setColor(Color.red); graphics.setBackground(Color.black); graphics.fill(new Rectangle(0,0,100,100)); // Populate the Document's root with the content of the tree Element root = document.getDocumentElement(); graphics.getRoot(root); Writer writer = new StringWriter(); graphics.stream(root, writer); assertTrue(root.getParentNode() == document); return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/DoubleStringPerformanceTest.java0000644000175000017500000000437713063003302030260 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import org.w3c.dom.Document; import org.w3c.dom.DOMImplementation; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.test.PerformanceTest; /** * This test checks that there is no performance degradation in the * doubleString utility method. * * @author Vincent Hardy * @version $Id: DoubleStringPerformanceTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DoubleStringPerformanceTest extends PerformanceTest { static double[] testValues = { 0, 0.00000000001, 0.2e-14, 0.45, 123412341234e14, 987654321e-12, 234143, 2.3333444000044e56, 45.3456 }; public void runOp() { DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document doc = impl.createDocument(svgNS, "svg", null); final SVGGeneratorContext gc = new SVGGeneratorContext(doc); int maxLength = 0; for (int i=0; i<1000; i++) { for (int j=0; jStephane Hillion * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.svggen.resources.Messages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/IdentityTest.java0000644000175000017500000000316513063003304025262 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; /** * This test validates the convertion of Java 2D AffineTransform into SVG * Shapes. * * @author Vincent Hardy * @version $Id: IdentityTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class IdentityTest implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // new Color(102, 102, 144)); g.translate(10,10); g.scale(2, 2); g.scale(0.5, 0.5); g.translate(20,40); g.rotate(0); g.translate(-30,-50); g.fillRect(10,10, 100,80); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Paints.java0000644000175000017500000000600313063003303024060 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.TexturePaint; import java.awt.image.BufferedImage; /** * This test validates the convertion of Java 2D paints * into an SVG attributes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Paints.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Paints implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Get default paint for painting text Paint defaultPaint = Color.black; g.setPaint(defaultPaint); g.translate(0, 30); // Define the rectangle that will be drawn multiple // times Rectangle rect = new Rectangle(10, 20, 100, 60); // First, test plain color with transparency Color fillColor = new Color(255, 255, 0, 128); g.drawString("Semi transparent black", 10, 10); g.drawString("Behind Rectangle", 40, 60); g.setPaint(fillColor); g.fill(rect); g.translate(0, 90); // Now, test linear gradient GradientPaint fillGradient = new GradientPaint(10, 20, Color.red, 110, 80, Color.yellow); g.setPaint(defaultPaint); g.drawString("Red to Yellow linear gradient", 10, 10); g.setPaint(fillGradient); g.fill(rect); g.translate(0, 90); // Now, test texture paint BufferedImage buf = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB); Graphics2D bg = buf.createGraphics(); bg.setPaint(Color.red); bg.fillRect(0, 0, 10, 10); bg.setPaint(Color.yellow); bg.fillRect(10, 10, 10, 10); bg.dispose(); TexturePaint fillTexture = new TexturePaint(buf, new Rectangle(10, 20, 20, 20)); g.setPaint(defaultPaint); g.drawString("Texture Paint", 10, 10); g.setPaint(fillTexture); g.fill(rect); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/BasicShapes.java0000644000175000017500000000633313063003303025015 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * This test validates the convertion of Java 2D shapes into SVG * Shapes. * * @author Vincent Hardy * @version $Id: BasicShapes.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class BasicShapes implements Painter { public void paint(Graphics2D g){ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // Rectangle g.drawString("Rectangle", 10, 20); Rectangle rect = new Rectangle(10, 30, 50, 40); g.draw(rect); g.translate(0, 90); // Round Rectangle g.drawString("RoundRectangle", 10, 20); RoundRectangle2D roundRect = new RoundRectangle2D.Double(10, 30, 50, 40, 10, 10); g.draw(roundRect); g.translate(0, 90); // Circle g.drawString("Circle", 10, 20); Ellipse2D circle = new Ellipse2D.Float(10, 30, 50, 50); g.draw(circle); g.translate(0, 90); // CubicCurve2D g.drawString("CubicCurve2D", 10, 20); CubicCurve2D curve = new CubicCurve2D.Float(10, 55, 22.5f, 00, 38.5f, 110, 60, 55); g.draw(curve); g.translate(150, -270); // Polygon g.drawString("Polygon", 10, 20); Polygon polygon = new Polygon(new int[] { 30, 50, 10 }, new int[] { 30, 60, 60 }, 3); g.draw(polygon); g.translate(0, 90); // General Path g.drawString("GeneralPath", 10, 20); GeneralPath path = new GeneralPath(); path.moveTo(30, 30); path.quadTo(30, 50, 50, 60); path.quadTo(30, 50, 10, 60); path.quadTo(30, 50, 30, 30); path.closePath(); g.draw(path); g.translate(0, 90); // Area g.drawString("Area", 10, 20); Area area = new Area(new Rectangle(10, 30, 50, 50)); area.subtract(new Area(new Ellipse2D.Double(12, 32, 46, 46))); g.fill(area); g.translate(0, 90); // QuadCurve 2D g.drawString("QuadCurve2D", 10, 20); QuadCurve2D quad = new QuadCurve2D.Float(10, 55, 35, 105, 60, 55); g.draw(quad); g.translate(-75, 70); // Line g.drawString("Line2D", 10, 20); g.draw(new Line2D.Float(10, 30, 60, 30)); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/NegativeLengths.java0000644000175000017500000001772113063003304025723 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * This test validates the convertion of Java 2D negative length values:
* - On rectangles: a negative width or height makes the rectangle invisible.
* - On rounded rectangles: a negative width or height makes the rectangle invisible.
* - On ellipses: a negative width or height makes the ellipse invisible
* - On 3D rect: a negative width *and* height makes the rectangle invisible. A * negative width or height makes the rectangle display as a line.
* The above behavior is that of the default Graphics2D implementations. * * @author Vincent Hardy * @version $Id: NegativeLengths.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class NegativeLengths implements Painter { public void paint(Graphics2D g){ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // Rectangle g.drawString("Rectangle", 10, 20); // w negative, h negative Rectangle rect = new Rectangle(10, 30, -10, -8); g.draw(rect); // w negative, h zero rect = new Rectangle(30, 30, -10, 0); g.draw(rect); // w negative, h positive rect = new Rectangle(50, 30, -10, 8); g.draw(rect); // w zero, h negative rect = new Rectangle(70, 30, 0, -8); g.draw(rect); // w zero, h zero rect = new Rectangle(90, 30, 0, 0); g.draw(rect); // w zero, h positive rect = new Rectangle(110, 30, 0, 8); g.draw(rect); // w positive, h negative rect = new Rectangle(130, 30, 10, -8); g.draw(rect); // w positive, h zero rect = new Rectangle(150, 30, 5, 0); g.draw(rect); // w positive, h positive rect = new Rectangle(170, 30, 5, 8); g.draw(rect); g.translate(0, 35); // // Round Rectangle // g.drawString("RoundRectangle2D", 10, 20); // w negative, h negative RoundRectangle2D rrect = new RoundRectangle2D.Double(10, 30, -10, -8, 2, 2); g.draw(rrect); // w negative, h zero rrect = new RoundRectangle2D.Double(30, 30, -10, 0, 2, 2); g.draw(rrect); // w negative, h positive rrect = new RoundRectangle2D.Double(50, 30, -10, 8, 2, 2); g.draw(rrect); // w zero, h negative rrect = new RoundRectangle2D.Double(70, 30, 0, -8, 2, 2); g.draw(rrect); // w zero, h zero rrect = new RoundRectangle2D.Double(90, 30, 0, 0, 2, 2); g.draw(rrect); // w zero, h positive rrect = new RoundRectangle2D.Double(110, 30, 0, 8, 2, 2); g.draw(rrect); // w positive, h negative rrect = new RoundRectangle2D.Double(130, 30, 5, -8, 2, 2); g.draw(rrect); // w positive, h zero rrect = new RoundRectangle2D.Double(150, 30, 5, 0, 2, 2); g.draw(rrect); // w positive, h positive rrect = new RoundRectangle2D.Double(170, 30, 5, 8, 2, 2); g.draw(rrect); g.translate(0, 35); // // Round Rectangle 2 // g.drawString("RoundRectangle2D, negative radius", 10, 20); // w negative, h negative rrect = new RoundRectangle2D.Double(10, 30, -10, -8, -2, -2); g.draw(rrect); // w negative, h zero rrect = new RoundRectangle2D.Double(30, 30, -10, 0, -2, -2); g.draw(rrect); // w negative, h positive rrect = new RoundRectangle2D.Double(50, 30, -10, 8, -2, -2); g.draw(rrect); // w zero, h negative rrect = new RoundRectangle2D.Double(70, 30, 0, -8, -2, -2); g.draw(rrect); // w zero, h zero rrect = new RoundRectangle2D.Double(90, 30, 0, 0, -2, -2); g.draw(rrect); // w zero, h positive rrect = new RoundRectangle2D.Double(110, 30, 0, 8, -2, -2); g.draw(rrect); // w positive, h negative rrect = new RoundRectangle2D.Double(130, 30, 5, -8, -2, -2); g.draw(rrect); // w positive, h zero rrect = new RoundRectangle2D.Double(150, 30, 5, 0, -2, -2); g.draw(rrect); // w positive, h positive rrect = new RoundRectangle2D.Double(170, 30, 5, 8, -2, -2); g.draw(rrect); g.translate(0, 35); // // Circle // g.drawString("Circle", 10, 20); // w negative Ellipse2D circle = new Ellipse2D.Double(10, 30, -10, -10); g.draw(circle); // w zero, h negative circle = new Ellipse2D.Double(30, 30, 0, 0); g.draw(circle); // w positive, h negative circle = new Ellipse2D.Double(50, 30, 5, 5); g.draw(circle); g.translate(0, 35); // // Ellipse // g.drawString("Ellipse", 10, 20); // w negative, h negative Ellipse2D ellipse = new Ellipse2D.Double(10, 30, -10, -8); g.draw(ellipse); // w negative, h zero ellipse = new Ellipse2D.Double(30, 30, -10, 0); g.draw(ellipse); // w negative, h positive ellipse = new Ellipse2D.Double(50, 30, -10, 8); g.draw(ellipse); // w zero, h negative ellipse = new Ellipse2D.Double(70, 30, 0, -8); g.draw(ellipse); // w zero, h zero ellipse = new Ellipse2D.Double(90, 30, 0, 0); g.draw(ellipse); // w zero, h positive ellipse = new Ellipse2D.Double(110, 30, 0, 8); g.draw(ellipse); // w positive, h negative ellipse = new Ellipse2D.Double(130, 30, 5, -8); g.draw(ellipse); // w positive, h zero ellipse = new Ellipse2D.Double(150, 30, 5, 0); g.draw(ellipse); // w positive, h positive ellipse = new Ellipse2D.Double(170, 30, 5, 8); g.draw(ellipse); g.translate(0, 35); // 3D Rect g.drawString("fill3Drect", 10, 20); // w negative, h negative g.setColor(new Color(192, 192, 192)); g.fill3DRect(10, 30, -10, -8, true); // w negative, h zero g.fill3DRect(30, 30, -10, 0, true); // w negative, h positive g.fill3DRect(50, 30, -10, 8, true); // w zero, h negative g.fill3DRect(70, 30, 0, -8, true); // w zero, h zero g.fill3DRect(90, 30, 0, 0, true); // w zero, h positive g.fill3DRect(110, 30, 0, 8, true); // w positive, h negative g.fill3DRect(130, 30, 5, -8, true); // w positive, h zero g.fill3DRect(150, 30, 5, 0, true); // w positive, h positive g.fill3DRect(170, 30, 5, 8, true); g.translate(0, 40); // Clip rect = new Rectangle(10, 30, 10, -30); g.setPaint(Color.gray); g.fill(rect); g.setPaint(Color.black); g.clip(rect); g.drawString("Hello There", 10, 25); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Font2.java0000644000175000017500000001247013063003304023620 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; /** * This test validates the convertion of Java 2D text into * SVG Shapes, one of the options of the SVGGraphics2D constructor. * This is the same test as Font testing with regards to the * Java 2D API code, except that it validates text to shapes * convertion. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Font2.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Font2 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Set default font g.setFont(new Font("Arial", Font.BOLD, 12)); // Colors used for labels and test output Color labelColor = new Color(0x666699); Color fontColor = Color.black; // // First, font size // java.awt.geom.AffineTransform defaultTransform = g.getTransform(); Font defaultFont = new Font("Arial", Font.BOLD, 16); g.setFont(defaultFont); FontRenderContext frc = g.getFontRenderContext(); g.setPaint(labelColor); g.drawString("Font size", 10, 30); g.setPaint(fontColor); g.translate(0, 20); int[] fontSizes = { 6, 8, 10, 12, 18, 36, 48 }; for(int i=0; iVincent Hardy * @version $Id: Bug4389.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Bug4389 implements Painter { public void paint(Graphics2D g){ ImageIcon image = new ImageIcon(ClassLoader.getSystemResource("org/apache/batik/svggen/resources/vangogh.png")); g.translate(40,40); g.drawImage(image.getImage(), new AffineTransform(), null); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Color2.java0000644000175000017500000000550413063003303023767 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; /** * This test color opacity on fill and strokes, because this * is handled differently in the Java 2D API than in SVG. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Color2.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Color2 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Define Colors Color blue = Color.blue; Color green = Color.green; Color transparentBlue = new Color(0, 0, 255, 128); Color transparentGreen = new Color(0, 255, 0, 128); // Define AlphaComposites AlphaComposite srcOver = AlphaComposite.SrcOver; AlphaComposite srcOverTransparent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f); // Define rectangle Rectangle rect = new Rectangle(10, 40, 100, 50); // Define thick stroke BasicStroke thickStroke = new BasicStroke(5); // First test: Opaque Colors with AlphaComposite g.setPaint(Color.black); g.drawString("Opaque Colors, Half Transparent AlphaComposite", 10, 30); g.setComposite(srcOverTransparent); g.setStroke(thickStroke); g.setPaint(blue); g.fill(rect); g.setPaint(green); g.draw(rect); g.setPaint(Color.black); g.fill(rect); g.translate(0, 90); // Second test: transparent color, opaque Source Over g.setPaint(Color.black); g.setComposite(srcOver); g.drawString("Transparent Colors, Opaque AlphaComposite SrcOver", 10, 30); g.setPaint(transparentBlue); g.fill(rect); g.setPaint(transparentGreen); g.draw(rect); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/BEExample.java0000644000175000017500000000325313063003305024432 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; /** * This test validates the convertion of Java 2D AffineTransform into SVG * Shapes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: BEExample.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class BEExample implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Text g.setPaint(new Color(103, 103, 152)); g.fillRect(10, 10, 200, 50); g.setPaint(Color.white); g.setFont(new Font("SunSansCondensed-Heavy", Font.PLAIN, 20)); g.drawString("Hello Java 2D to SVG", 40, 40); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/GeneratorContext.java0000644000175000017500000001160413063003304026121 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Font; import java.net.URL; import java.util.Iterator; import java.util.Map; import org.w3c.dom.CDATASection; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults; import org.apache.batik.util.SVGConstants; /** * Testing customization of the SVGGeneratorContext and generation of * SVG Fonts. * * @author Christophe Jolif * @version $Id: GeneratorContext.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GeneratorContext extends SVGAccuracyTest implements SVGConstants { public static class TestIDGenerator extends SVGIDGenerator { public String generateID(String prefix) { return "test"+super.generateID(prefix); } } public static class TestStyleHandler extends DefaultStyleHandler { private CDATASection styleSheet; public TestStyleHandler(CDATASection styleSheet) { this.styleSheet = styleSheet; } public void setStyle(Element element, Map styleMap, SVGGeneratorContext generatorContext) { Iterator iter = styleMap.keySet().iterator(); // create a new class id in the style sheet String id = generatorContext.getIDGenerator().generateID("C"); styleSheet.appendData("."+id+" {"); // append each key/value pairs while (iter.hasNext()) { String key = (String)iter.next(); String value = (String)styleMap.get(key); styleSheet.appendData(key+":"+value+";"); } styleSheet.appendData("}\n"); // reference the class id of the style sheet on the element to be styled element.setAttribute("class", id); } } private Element topLevelGroup = null; public GeneratorContext(Painter painter, URL refURL) { super(painter, refURL); } protected SVGGraphics2D buildSVGGraphics2D(){ // Use Batik's DOM implementation to create a Document DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String namespaceURI = SVGDOMImplementation.SVG_NAMESPACE_URI; Document domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); // Create a default context from our Document instance SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory); // Set ID generator ctx.setIDGenerator(new TestIDGenerator()); // Extension Handler to be done // Image Handler to be done GenericImageHandler ihandler = new CachedImageHandlerBase64Encoder(); ctx.setGenericImageHandler(ihandler); // Set Style handler CDATASection styleSheet = domFactory.createCDATASection(""); ctx.setStyleHandler(new TestStyleHandler(styleSheet)); // Set the generator comment ctx.setComment("Generated by the Batik Test Framework. Test:\u00e9j"); // Turn SVG Font embedding on. ctx.setEmbeddedFontsOn(true); // Set the default font to use GraphicContextDefaults defaults = new GraphicContextDefaults(); defaults.font = new Font("Arial", Font.PLAIN, 12); ctx.setGraphicContextDefaults(defaults); // // Build SVGGraphics2D with our customized context // SVGGraphics2D g2d = new SVGGraphics2D(ctx, false); // Append our stylesheet to the top level group. topLevelGroup = g2d.getTopLevelGroup(); Element style = domFactory.createElementNS(SVG_NAMESPACE_URI, SVG_STYLE_TAG); style.setAttributeNS(null, SVG_TYPE_ATTRIBUTE, "text/css"); style.appendChild(styleSheet); topLevelGroup.appendChild(style); return g2d; } protected void configureSVGGraphics2D(SVGGraphics2D g2d) { topLevelGroup.appendChild(g2d.getTopLevelGroup()); g2d.setTopLevelGroup(topLevelGroup); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/ShowGraphics2DOutput.java0000644000175000017500000000663113063003303026641 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Dimension; import java.awt.Shape; import java.awt.geom.Ellipse2D; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGDocument; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.bridge.BaseScriptingEnvironment; import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.GVTBuilder; import org.apache.batik.bridge.UserAgentAdapter; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.TestReport; /** * Checks that the content generated from the SVGGraphics2D and to which * an event handler has been added can be processed by Batik. * * @author Vincent Hardy * @version $Id: ShowGraphics2DOutput.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ShowGraphics2DOutput extends AbstractTest { public TestReport runImpl() throws Exception { DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; SVGDocument doc = (SVGDocument)impl.createDocument(svgNS, "svg", null); SVGGraphics2D g = new SVGGraphics2D(doc); Shape circle = new Ellipse2D.Double(0,0,50,50); g.setPaint(Color.red); g.fill(circle); g.translate(60,0); g.setPaint(Color.green); g.fill(circle); g.translate(60,0); g.setPaint(Color.blue); g.fill(circle); g.setSVGCanvasSize(new Dimension(180,50)); Element root = doc.getDocumentElement(); // The following populates the document root with the // generated SVG content. g.getRoot(root); root.setAttribute("onload", "System.out.println('hello')"); // Now that the SVG file has been loaded, build // a GVT Tree from it TestUserAgent userAgent = new TestUserAgent(); GVTBuilder builder = new GVTBuilder(); BridgeContext ctx = new BridgeContext(userAgent); ctx.setDynamic(true); builder.build(ctx, doc); BaseScriptingEnvironment scriptEnvironment = new BaseScriptingEnvironment(ctx); scriptEnvironment.loadScripts(); scriptEnvironment.dispatchSVGLoadEvent(); if (!userAgent.failed) { return reportSuccess(); } else { return reportError("Got exception while processing document"); } } class TestUserAgent extends UserAgentAdapter { boolean failed; public void displayError(Exception e) { failed = true; } } } batik-1.9.orig/test-sources/org/apache/batik/svggen/TransformCollapse.java0000644000175000017500000000342413063003304026265 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; /** * This test validates that transforms are collapsed when they * should. * * @author Vincent Hardy * @version $Id: TransformCollapse.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TransformCollapse implements Painter { public void paint(Graphics2D g){ g.translate(10, 10); g.translate(20, 30); // Should see a translate(30, 40) in the output SVg g.drawString("translate collapse", 0, 0); g.scale(2, 2); g.scale(2, 4); // Should see a scale(4, 8) g.drawString("scale collapse", 10, 10); g.scale(.25, .125); g.rotate(Math.toRadians(90)); g.rotate(Math.toRadians(-60)); // Should see a rotate(30) g.drawString("rotate collapse", 0, 40); g.rotate(Math.toRadians(-30)); // Should get identity g.drawString("identity", 0, 80); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/ATransform.java0000644000175000017500000000561013063003303024701 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; /** * This test validates the convertion of Java 2D AffineTransform into SVG * Shapes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: ATransform.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ATransform implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // new Color(102, 102, 144)); int legendX = 10, legendY = 12; g.translate(0, 30); java.awt.geom.AffineTransform defaultTransform = g.getTransform(); // Define rectangle Rectangle rect = new Rectangle(10, 20, 50, 30); // Paint with default transform g.drawString("Default transform", legendX, legendY); g.fill(rect); // Paint after translate g.translate(0, 90); g.drawString("Translate applied", legendX, legendY); g.fill(rect); // Rotate rectangle about its center g.translate(0, 90); g.rotate(Math.PI/2, 35, 35); g.drawString("Rotate about center", legendX, legendY); g.fill(rect); // Restore default transform g.setTransform(defaultTransform); // Paint after scale g.translate(150, 0); g.drawString("Scale (sx=2, sy=1)", legendX, legendY); g.scale(2, 1); g.fill(rect); // Paint after shear g.setTransform(defaultTransform); g.translate(150, 90); g.drawString("Shear", legendX, legendY); g.shear(.2, 1); g.fill(rect); java.awt.geom.AffineTransform txf = g.getTransform(); g.setTransform(new java.awt.geom.AffineTransform()); Shape shearBounds = txf.createTransformedShape(rect).getBounds(); g.setPaint(new Color(0, 0, 0, 128)); g.fill(shearBounds); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Painter.java0000644000175000017500000000231013063003304024222 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; /** * Interface expected from object that can perform an arbitrary * rendering sequence. This is used to generate SVG content and * compare it to a reference. * * @author Vincent Hardy * @version $Id: Painter.java 1733420 2016-03-03 07:41:59Z gadams $ */ public interface Painter { void paint(Graphics2D g); } batik-1.9.orig/test-sources/org/apache/batik/svggen/Texture.java0000644000175000017500000000622213063003304024266 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.BufferedImage; /** * This test validates the convertion of Java 2D TexturePaints * into SVG patterns and fill and fill-opacity values * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Texture.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Texture implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Color labelColor = Color.black; BufferedImage texture = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB); Graphics2D bg = texture.createGraphics(); bg.setPaint(Color.red); bg.fillRect(0, 0, 10, 10); bg.setPaint(Color.yellow); bg.fillRect(10, 10, 10, 10); bg.dispose(); Rectangle[] anchors = { new Rectangle(0, 0, texture.getWidth(), texture.getHeight()), new Rectangle(texture.getWidth()/2, texture.getHeight()/2, texture.getWidth(), texture.getHeight()), new Rectangle(0, 0, texture.getWidth()/2, texture.getHeight()/2) }; String[] anchorDesc = { "Anchor matches texture image", "Anchor offset to texture image center", "Anchor half the size of texture" }; // Now, fill a rectangle that is 4 times the size of the texture // along each axis, once for each texture. g.translate(0, 20); for(int i=0; iVincent Hardy * @version $Id: GetRootTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GetRootTest extends AbstractTest implements SVGConstants { public static final Dimension CANVAS_SIZE = new Dimension(300, 400); public static final String ERROR_DIFFERENT_SVG_OUTPUT = "GetRootTest.error.different.svg.output"; public static final String ENTRY_KEY_NO_ARG_OUTPUT = "GetRootTest.entry.key.no.arg.output"; public static final String ENTRY_KEY_SVG_ARG_OUTPUT = "GetRootTest.entry.key.svg.arg.output"; public TestReport runImpl() throws Exception { // First, use the no-argument getRoot DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String namespaceURI = SVGConstants.SVG_NAMESPACE_URI; Document domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory); GraphicContextDefaults defaults = new GraphicContextDefaults(); defaults.font = new Font("Arial", Font.PLAIN, 12); ctx.setGraphicContextDefaults(defaults); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false); g2d.setSVGCanvasSize(CANVAS_SIZE); Painter painter = new BasicShapes(); painter.paint(g2d); StringWriter swA = new StringWriter(); g2d.stream(g2d.getRoot(), swA); // Now, use the getRoot with argument domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); ctx = SVGGeneratorContext.createDefault(domFactory); ctx.setGraphicContextDefaults(defaults); g2d = new SVGGraphics2D(ctx, false); g2d.setSVGCanvasSize(CANVAS_SIZE); painter.paint(g2d); StringWriter swB = new StringWriter(); g2d.stream(g2d.getRoot(domFactory.getDocumentElement()), swB); // Compare the two output: they should be identical if (swA.toString().equals(swB.toString())) { return reportSuccess(); } else { TestReport report = reportError(ERROR_DIFFERENT_SVG_OUTPUT); report.addDescriptionEntry(ENTRY_KEY_NO_ARG_OUTPUT, swA.toString()); report.addDescriptionEntry(ENTRY_KEY_SVG_ARG_OUTPUT, swB.toString()); return report; } } } batik-1.9.orig/test-sources/org/apache/batik/svggen/SVGGeneratorTests.java0000644000175000017500000002023413063003303026155 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.apache.batik.test.Test; import org.apache.batik.test.DefaultTestSuite; import org.apache.batik.test.svg.SVGRenderingAccuracyTest; import org.apache.batik.test.svg.ImageCompareTest; /** * This test validates that a given rendering sequence, modeled * by a Painter by doing several subtests for a * single input class: * + SVGAccuracyTest with several configurations * + SVGRenderingAccuracyTest * + ImageComparisonTest between the rendering of the generated * SVG for various configurations. * * @author Vincent Hardy * @version $Id: SVGGeneratorTests.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SVGGeneratorTests extends DefaultTestSuite { public static final String GENERATOR_REFERENCE_BASE = "test-references/org/apache/batik/svggen/"; public static final String RENDERING_DIR = "rendering"; public static final String ACCEPTED_VARIATION_DIR = "accepted-variation"; public static final String[] VARIATION_PLATFORMS = org.apache.batik.test.svg.PreconfiguredRenderingTest.DEFAULT_VARIATION_PLATFORMS; private static final String ACCEPTED_REF_DIR = "accepted-ref"; public static final String CANDIDATE_VARIATION_DIR = "candidate-variation"; public static final String CANDIDATE_REF_DIR = "candidate-ref"; public static final String RENDERING_CANDIDATE_REF_DIR = "candidate-reference"; public static final String PNG_EXTENSION = ".png"; public static final String SVG_EXTENSION = ".svg"; public static final String PLAIN_GENERATION_PREFIX = ""; public static final String CUSTOM_CONTEXT_GENERATION_PREFIX = "Context"; public SVGGeneratorTests(){ } /** * The id should be the Painter's class name * prefixed with the package name defined in * getPackageName */ public void setId(String id){ super.setId(id); String clName = getPackageName() + "." + id; Class cl = null; try{ cl = Class.forName(clName); }catch(ClassNotFoundException e){ throw new IllegalArgumentException(clName); } Object o = null; try { o = cl.newInstance(); }catch(Exception e){ throw new IllegalArgumentException(clName); } if(!(o instanceof Painter)){ throw new IllegalArgumentException(clName); } Painter painter = (Painter)o; addTest(makeSVGAccuracyTest(painter, id)); addTest(makeGeneratorContext(painter, id)); addTest(makeSVGRenderingAccuracyTest(painter, id, PLAIN_GENERATION_PREFIX)); addTest(makeSVGRenderingAccuracyTest(painter, id, CUSTOM_CONTEXT_GENERATION_PREFIX)); addTest(makeImageCompareTest(painter, id, PLAIN_GENERATION_PREFIX, CUSTOM_CONTEXT_GENERATION_PREFIX)); } /** * For the Generator test, the relevant name is the id */ public String getName(){ return "SVGGeneratorTest - " + getId(); } protected String getPackageName(){ return "org.apache.batik.svggen"; } private Test makeImageCompareTest(Painter painter, String id, String prefixA, String prefixB){ String cl = getNonQualifiedClassName(painter); String clA = prefixA + cl; String clB = prefixB + cl; String testReferenceA = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + clA + PNG_EXTENSION; String testReferenceB = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + clB + PNG_EXTENSION; ImageCompareTest t = new ImageCompareTest(testReferenceA, testReferenceB); t.setName(id + "-RenderingComparison"); t.setId(id + ".renderingComparison"); return t; } private Test makeSVGRenderingAccuracyTest(Painter painter, String id, String prefix){ String cl = prefix + getNonQualifiedClassName(painter); String testSource = GENERATOR_REFERENCE_BASE + cl + SVG_EXTENSION; String testReference = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + cl + PNG_EXTENSION; String[] variationURLs = new String[VARIATION_PLATFORMS.length + 1]; variationURLs[0] = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + ACCEPTED_VARIATION_DIR + "/" + cl + PNG_EXTENSION; for (int i = 0; i < VARIATION_PLATFORMS.length; i++) { variationURLs[i + 1] = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + ACCEPTED_VARIATION_DIR + "/" + cl + '_' + VARIATION_PLATFORMS[i] + PNG_EXTENSION; } String saveVariation = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + CANDIDATE_VARIATION_DIR + "/" + cl + PNG_EXTENSION; String candidateReference = GENERATOR_REFERENCE_BASE + RENDERING_DIR + "/" + RENDERING_CANDIDATE_REF_DIR + "/" + cl + PNG_EXTENSION; SVGRenderingAccuracyTest test = new SVGRenderingAccuracyTest(testSource, testReference); for (int i = 0; i < variationURLs.length; i++) { test.addVariationURL(variationURLs[i]); } test.setSaveVariation(new File(saveVariation)); test.setCandidateReference(new File(candidateReference)); test.setName(id + "-" + prefix + "RenderingCheck"); test.setId(id + "." + prefix + "renderingCheck"); return test; } private Test makeGeneratorContext(Painter painter, String id){ String cl = CUSTOM_CONTEXT_GENERATION_PREFIX + getNonQualifiedClassName(painter); GeneratorContext test = new GeneratorContext(painter, getReferenceURL(painter, CUSTOM_CONTEXT_GENERATION_PREFIX)); test.setSaveSVG(new File(GENERATOR_REFERENCE_BASE + CANDIDATE_REF_DIR + "/" + cl + SVG_EXTENSION)); test.setName(id + "-ConfiguredContextGeneration"); test.setId(id + ".configuredContextGeneration"); return test; } private Test makeSVGAccuracyTest(Painter painter, String id){ String cl = PLAIN_GENERATION_PREFIX + getNonQualifiedClassName(painter); SVGAccuracyTest test = new SVGAccuracyTest(painter, getReferenceURL(painter, PLAIN_GENERATION_PREFIX)); test.setSaveSVG(new File(GENERATOR_REFERENCE_BASE + CANDIDATE_REF_DIR + "/" + cl + SVG_EXTENSION)); test.setName(id + "-DefaultContextGeneration"); test.setId(id + ".defaultContextGeneration"); return test; } private String getNonQualifiedClassName(Painter painter){ String cl = painter.getClass().getName(); int n = cl.lastIndexOf('.'); return cl.substring(n+1); } private URL getReferenceURL(Painter painter, String prefix){ String suffix = prefix + getNonQualifiedClassName(painter) + SVG_EXTENSION; File acceptedReference = new File(GENERATOR_REFERENCE_BASE + ACCEPTED_REF_DIR + '/' + suffix); if (acceptedReference.exists()) { return file2URL(acceptedReference); } else { File reference = new File(GENERATOR_REFERENCE_BASE + suffix); return file2URL(reference); } } private URL file2URL(File file) { try { return file.toURI().toURL(); } catch (MalformedURLException e) { throw new RuntimeException(e); } } } batik-1.9.orig/test-sources/org/apache/batik/svggen/BasicShapes2.java0000644000175000017500000000504513063003304025077 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * This test validates the convertion of Java 2D shapes into SVG * Shapes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: BasicShapes2.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class BasicShapes2 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // Arc2D g.drawString("Arc2D", 10, 20); Arc2D arc = new Arc2D.Float(10, 30, 50, 40, 0, 270, Arc2D.PIE); g.draw(arc); g.translate(0, 90); // Ellipse g.drawString("Ellipse", 10, 20); Ellipse2D ellipse = new Ellipse2D.Double(10, 30, 100, 40); g.draw(ellipse); g.translate(150, -90); // GeneralPath lineTo g.drawString("GeneralPath, lineTo", 10, 20); GeneralPath lineToPath = new GeneralPath(); lineToPath.moveTo(10, 30); lineToPath.lineTo(60, 30); lineToPath.lineTo(60, 70); lineToPath.lineTo(10, 30); lineToPath.closePath(); g.draw(lineToPath); g.translate(0, 90); // GeneralPath curveTo g.drawString("GeneralPath, curveTo", 10, 20); GeneralPath curveToPath = new GeneralPath(); curveToPath.moveTo(10, 30); curveToPath.curveTo(35, 10, 35, 50, 60, 30); curveToPath.curveTo(80, 55, 40, 55, 60, 80); curveToPath.curveTo(35, 60, 35, 100, 10, 80); curveToPath.curveTo(-10, 55, 30, 55, 10, 30); curveToPath.closePath(); g.draw(curveToPath); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Bug4945.java0000644000175000017500000000427313063003304023675 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; import java.awt.Font; import java.awt.geom.AffineTransform; /** * This test validates fix to Bug #4945 which checks that * the generator handles Font transform. * * @author Vincent Hardy * @version $Id: Bug4945.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Bug4945 implements Painter { public void paint(Graphics2D g){ Font origFont = g.getFont(); g.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON); // 1) create scaled font Font font = origFont.deriveFont(AffineTransform.getScaleInstance(1.5, 3)); g.setFont(font); g.drawString("Scaled Font", 20, 40); // 2) create translated font font = origFont.deriveFont(AffineTransform.getTranslateInstance(50, 20)); g.setFont(font); g.drawString("Translated Font", 20, 80); g.drawLine(20, 80, 120, 80); // 3) create sheared font font = origFont.deriveFont(AffineTransform.getShearInstance(.5, .5)); g.setFont(font); g.drawString("Sheared Font", 20, 120); // 4) create rotated font font = origFont.deriveFont(AffineTransform.getRotateInstance(Math.PI/4)); g.setFont(font); g.drawString("Rotated Font", 220, 120); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/SVGAccuracyTest.java0000644000175000017500000003157613063003302025610 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults; import java.awt.Dimension; import java.awt.Font; import java.net.URL; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.PrintWriter; import org.apache.batik.util.SVGConstants; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.dom.GenericDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DOMImplementation; /** * This test validates that a given rendering sequence, modeled * by a Painter is properly converted to an SVG document * by comparing the generated SVG document to a known, valid * SVG reference. * * @author Vincent Hardy * @version $Id: SVGAccuracyTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SVGAccuracyTest extends AbstractTest implements SVGConstants{ /** * Error when an error occurs while generating SVG * with the SVGGraphics2D * {0} = painter class name if painter not null. Null otherwise * {1} = exception class name * {2} = exception message * {3} = exception stack trace. */ public static final String ERROR_CANNOT_GENERATE_SVG = "SVGAccuracyTest.error.cannot.generate.svg"; /** * Error when the reference SVG file cannot be opened * {0} = URI of the reference image * {1} = IOException message */ public static final String ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE = "SVGAccuracyTest.error.cannot.open.reference.svg.file"; /** * Error when there is an IOException while comparing the * reference SVG file with the newly generated SVG content * {0} = URI of the reference image * {1} = IOException message. */ public static final String ERROR_ERROR_WHILE_COMPARING_FILES = "SVGAccuracyTest.error.while.comparing.files"; /** * Error when the generated SVG is inaccurate */ public static final String ERROR_GENERATED_SVG_INACCURATE = "SVGAccuracyTest.error.generated.svg.inaccurate"; public static final String ENTRY_KEY_ERROR_DESCRIPTION = "SVGAccuracyTest.entry.key.error.description"; public static final String ENTRY_KEY_LINE_NUMBER = "SVGAccuracyTest.entry.key.line.number"; public static final String ENTRY_KEY_COLUMN_NUMBER = "SVGAccuracyTest.entry.key.column.number"; public static final String ENTRY_KEY_COLUMN_EXPECTED_VALUE = "SVGAccuracyTest.entry.key.column.expected.value"; public static final String ENTRY_KEY_COLUMN_FOUND_VALUE = "SVGAccuracyTest.entry.key.column.found.value"; public static final String ENTRY_KEY_REFERENCE_LINE = "SVGAccuracyTest.entry.key.reference.line"; public static final String ENTRY_KEY_NEW_LINE = "SVGAccuracyTest.entry.key.new.line"; /** * Canvas size for all tests */ public static final Dimension CANVAS_SIZE = new Dimension(300, 400); /** * Painter which performs an arbitrary rendering * sequence. */ private Painter painter; /** * Reference SVG URL */ private URL refURL; /** * File where the generated SVG might be saved */ private File saveSVG; /** * Constructor * @param painter the Painter object which will * perform an arbitrary rendering sequence. * @param refURL the location of a reference SVG which * should be exactly identical to that generated * by the painter. */ public SVGAccuracyTest(Painter painter, URL refURL){ this.painter = painter; this.refURL = refURL; } public File getSaveSVG(){ return saveSVG; } public void setSaveSVG(File saveSVG){ this.saveSVG = saveSVG; } /** * This method will only throw exceptions if some aspect * of the test's internal operation fails. */ public TestReport runImpl() throws Exception { DefaultTestReport report = new DefaultTestReport(this); SVGGraphics2D g2d = buildSVGGraphics2D(); g2d.setSVGCanvasSize(CANVAS_SIZE); // // Generate SVG content // ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(bos, "UTF-8"); try{ painter.paint(g2d); configureSVGGraphics2D(g2d); g2d.stream(osw); osw.flush(); bos.flush(); bos.close(); }catch(Exception e){ StringWriter trace = new StringWriter(); e.printStackTrace(new PrintWriter(trace)); report.setErrorCode(ERROR_CANNOT_GENERATE_SVG); report.setDescription(new TestReport.Entry[]{ new TestReport.Entry(Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage(ERROR_CANNOT_GENERATE_SVG, new String[]{painter == null? "null" : painter.getClass().getName(), e.getClass().getName(), e.getMessage(), trace.toString() })) }); report.setPassed(false); return report; } // // Compare with reference SVG // InputStream refStream = null; try { refStream = new BufferedInputStream(refURL.openStream()); }catch(Exception e){ report.setErrorCode(ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE); report.setDescription( new TestReport.Entry[]{ new TestReport.Entry(Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage(ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE, new Object[]{refURL != null? refURL.toExternalForm() : "null", e.getMessage()})) }); report.setPassed(false); save(bos.toByteArray()); return report; } InputStream newStream = new ByteArrayInputStream(bos.toByteArray()); boolean accurate = true; String refLine = null; String newLine = null; int ln = 1; try{ // accurate = compare(refStream, newStream); BufferedReader refReader = new BufferedReader(new InputStreamReader(refStream)); BufferedReader newReader = new BufferedReader(new InputStreamReader(newStream)); while((refLine = refReader.readLine()) != null){ newLine = newReader.readLine(); if(newLine == null || !refLine.equals(newLine)){ accurate = false; break; } ln++; } if(accurate){ // need to make sure newLine is null as well newLine = newReader.readLine(); if(newLine != null){ accurate = false; } } } catch(IOException e) { report.setErrorCode(ERROR_ERROR_WHILE_COMPARING_FILES); report.setDescription(new TestReport.Entry[]{ new TestReport.Entry(Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage(ERROR_ERROR_WHILE_COMPARING_FILES, new Object[]{refURL.toExternalForm(), e.getMessage()}))}); report.setPassed(false); save(bos.toByteArray()); return report; } if(!accurate){ save(bos.toByteArray()); int cn = computeColumnNumber(refLine, newLine); String expectedChar = "eol"; if(cn >= 0 && refLine != null && refLine.length() > cn){ expectedChar = (new Character(refLine.charAt(cn))).toString(); } String foundChar = "null"; if(cn >=0 && newLine != null && newLine.length() > cn){ foundChar = (new Character(newLine.charAt(cn))).toString(); } if(expectedChar.equals(" ")){ expectedChar = "' '"; } if(foundChar.equals(" ")){ foundChar = "' '"; } report.setErrorCode(ERROR_GENERATED_SVG_INACCURATE); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_LINE_NUMBER,null), new Integer(ln)); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_COLUMN_NUMBER,null), new Integer(cn)); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_COLUMN_EXPECTED_VALUE,null), expectedChar); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_COLUMN_FOUND_VALUE,null), foundChar); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_REFERENCE_LINE,null), refLine); report.addDescriptionEntry(Messages.formatMessage(ENTRY_KEY_NEW_LINE,null), newLine); report.setPassed(false); } else{ report.setPassed(true); } return report; } public int computeColumnNumber(String aStr, String bStr){ if(aStr == null || bStr == null){ return -1; } int n = aStr.length(); int i = -1; for(i=0; iSVGGraphics2D with a default * configuration. */ protected SVGGraphics2D buildSVGGraphics2D() { // CSSDocumentHandler.setParserClassName(CSS_PARSER_CLASS_NAME); DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String namespaceURI = SVGConstants.SVG_NAMESPACE_URI; Document domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory); GraphicContextDefaults defaults = new GraphicContextDefaults(); defaults.font = new Font("Arial", Font.PLAIN, 12); ctx.setGraphicContextDefaults(defaults); ctx.setPrecision(12); return new SVGGraphics2D(ctx, false); } /** * Eventually configure the SVGGraphics2D after dumping in it and just * before serializing the DOM Tree. */ protected void configureSVGGraphics2D(SVGGraphics2D g2d) {} } batik-1.9.orig/test-sources/org/apache/batik/svggen/JPainterComponent.java0000644000175000017500000000336413063003302026227 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.swing.JComponent; /** * Simple component which displays the rendering created by * a Painter. * * @author Vincent Hardy * @version $Id: JPainterComponent.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JPainterComponent extends JComponent { /** * Painter */ protected Painter painter; /** * Delegates to its Painter */ public void paint(Graphics _g){ Graphics2D g = (Graphics2D)_g; BufferedImage buf = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); painter.paint(buf.createGraphics()); g.drawImage(buf, 0, 0, null); } /** * Constructor */ public JPainterComponent(Painter painter){ this.painter = painter; } } batik-1.9.orig/test-sources/org/apache/batik/svggen/BStroke.java0000644000175000017500000001502113063003305024175 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * This test validates convertion of BasicStroke * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: BStroke.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class BStroke implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); /* * Strokes of varying width */ java.awt.BasicStroke[] strokesWidth = { new java.awt.BasicStroke(2.f), new java.awt.BasicStroke(4.f), new java.awt.BasicStroke(8.f), new java.awt.BasicStroke(16.f) }; /* * Strokes of varying termination styles */ java.awt.BasicStroke[] strokesCap = { new java.awt.BasicStroke(15.f, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_BEVEL), // No decoration new java.awt.BasicStroke(15.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_BEVEL), // Square end new java.awt.BasicStroke(15.f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_BEVEL), // Rounded end }; /* * Strokes of varying segment connection styles */ java.awt.BasicStroke[] strokesJoin = { new java.awt.BasicStroke(10.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_BEVEL), // Connected with a straight segment new java.awt.BasicStroke(10.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_MITER), // Extend outlines until they meet new java.awt.BasicStroke(10.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_ROUND), // Round of corner. }; /* * Strokes of varying miterlimits */ java.awt.BasicStroke[] strokesMiter = { new java.awt.BasicStroke(6.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_MITER, 1), // Actually cuts of all angles new java.awt.BasicStroke(6.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_MITER, 2f), // Cuts off angles less than 60degrees new java.awt.BasicStroke(6.f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_MITER, 10f), // Cuts off angles less than 11 degrees }; /* * Srokes with varying dash styles */ java.awt.BasicStroke[] strokesDash = { new java.awt.BasicStroke(8.f, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_BEVEL, 8.f, new float[]{ 6.f, 6.f }, 0.f), new java.awt.BasicStroke(8.f, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_BEVEL, 8.f, new float[]{ 10.f, 4.f }, 0.f), new java.awt.BasicStroke(8.f, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_BEVEL, 8.f, new float[]{ 4.f, 4.f, 10.f, 4.f }, 0.f), new java.awt.BasicStroke(8.f, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_BEVEL, 8.f, new float[]{ 4.f, 4.f, 10.f, 4.f }, 4.f) }; java.awt.geom.AffineTransform defaultTransform = g.getTransform(); // Varying width g.setPaint(Color.black); g.drawString("Varying width", 10, 10); for(int i=0; iVincent Hardy * @version $Id: DoubleString.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DoubleString extends AbstractTest { public TestReport runImpl() throws Exception { // Get a DOMImplementation DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); // Create an instance of org.w3c.dom.Document Document document = domImpl.createDocument(null, "svg", null); SVGGraphics2D g = new SVGGraphics2D(document); Rectangle2D r = new Rectangle2D.Float(0.5f, 0.5f, 2.33f, 2.33f); g.fill(r); return reportSuccess(); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Bug17965.java0000644000175000017500000000327313063003305023763 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; /** * This test validates fix to Bug #17965 and checks that * attributes which do not apply to given element (eg., font-family * does not apply to ) are not written out. * * @author Vincent Hardy * @version $Id: Bug17965.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Bug17965 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON); Font font = new Font("Arial", Font.PLAIN, 30); g.setFont(font); g.setPaint(Color.blue); g.fillRect(0, 0, 50, 50); font = new Font("Helvetica", Font.PLAIN, 20); g.setFont(font); g.fillRect( 50, 50, 50, 50); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Font1.java0000644000175000017500000001253613063003304023622 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; /** * This test validates the convertion of Java 2D Fonts into * SVG font attributes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Font1.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Font1 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Set default font g.setFont(new java.awt.Font("Arial", java.awt.Font.BOLD, 12)); // Colors used for labels and test output Color labelColor = new Color(0x666699); Color fontColor = Color.black; // // First, font size // java.awt.geom.AffineTransform defaultTransform = g.getTransform(); java.awt.Font defaultFont = new java.awt.Font("Arial", java.awt.Font.BOLD, 16); g.setFont(defaultFont); FontRenderContext frc = g.getFontRenderContext(); g.setPaint(labelColor); g.drawString("Font size", 10, 30); g.setPaint(fontColor); g.translate(0, 20); int[] fontSizes = { 6, 8, 10, 12, 18, 36, 48 }; for(int i=0; iChristophe Jolif * @author Vincent Hardy * @version $Id: Rescale.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Rescale implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // // Load Image // Image image = Toolkit.getDefaultToolkit().createImage("test-resources/org/apache/batik/svggen/resources/vangogh.jpg"); MediaTracker tracker = new MediaTracker(new Button("")); tracker.addImage(image, 0); try{ tracker.waitForAll(); }catch(InterruptedException e){ tracker.removeImage(image); image = null; }finally { if(image != null) tracker.removeImage(image); if(tracker.isErrorAny()) image = null; if(image != null){ if(image.getWidth(null)<0 || image.getHeight(null)<0) image = null; } } if(image == null){ throw new Error("Could not load image"); } BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D ig = bi.createGraphics(); ig.drawImage(image, 0, 0, null); java.awt.image.RescaleOp brighten = new java.awt.image.RescaleOp(1.5f, 0, null); java.awt.image.RescaleOp darken = new java.awt.image.RescaleOp(.6f, 0, null); // Simply paint the image without and with rescale filters g.setPaint(Color.black); g.drawString("Brighter / Normal / Darker", 10, 20); g.drawImage(bi, brighten, 10, 30); g.drawImage(image, 10 + bi.getWidth() + 10, 30, null); g.drawImage(bi, darken, 10 + 2*(bi.getWidth() + 10), 30); g.translate(0, bi.getHeight() + 30 + 20); g.drawString("Rescale Red / Green / Blue", 10, 20); java.awt.image.RescaleOp redStress = new java.awt.image.RescaleOp(new float[]{ 2.0f, 1.0f, 1.0f }, new float[]{ 0, 0, 0 }, null); java.awt.image.RescaleOp greenStress = new java.awt.image.RescaleOp(new float[]{ 1.0f, 2.0f, 1.0f }, new float[]{ 0, 0, 0 }, null); java.awt.image.RescaleOp blueStress = new java.awt.image.RescaleOp(new float[]{ 1.0f, 1.0f, 2.0f }, new float[]{ 0, 0, 0 }, null); g.drawImage(bi, redStress, 10, 30); g.drawImage(bi, greenStress, 10 + bi.getWidth() + 10, 30); g.drawImage(bi, blueStress, 10 + 2*(bi.getWidth() + 10), 30); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/AttributedCharacterIterator.java0000644000175000017500000001401713063003304030265 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.font.TextAttribute; import java.text.AttributedString; /** * This test validates the convertion of Java 2D AffineTransform into SVG * Shapes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: AttributedCharacterIterator.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AttributedCharacterIterator implements Painter { public void paint(Graphics2D g) { String fontName = "Arial"; int fontSize = 15; String text = "Attributed Strings are fun !"; AttributedString styledText = new AttributedString(text); // // Set font family for the whole string // Font font = new Font(fontName, Font.PLAIN, fontSize); styledText.addAttribute(TextAttribute.FAMILY, font.getFamily()); styledText.addAttribute(TextAttribute.SIZE, new Float(font.getSize())); styledText.addAttribute(TextAttribute.FOREGROUND, Color.black); // // Set font style attributes for different part of the string // // "Attributed" is in Bold styledText.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, 0, 10); // "String" is italic styledText.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, 11, 18); // fun is Bold and underlined and strike through styledText.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 23, 28); styledText.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 23, 28); // styledText.addAttribute(TextAttribute.SWAP_COLORS, // TextAttribute.SWAP_COLORS_ON); /*TextLayout aLayout = new TextLayout("A", font, frc); Shape aShape = aLayout.getOutline(null); ShapeGraphicAttribute aReplacement = new ShapeGraphicAttribute(aShape, GraphicAttribute.ROMAN_BASELINE, true); styledText.addAttribute(TextAttribute.CHAR_REPLACEMENT, aReplacement, 0, 1); // Create a BufferedImage to decorate the Shape { TextLayout aLayout = new TextLayout("A", font, frc); Shape aShape = aLayout.getOutline(null); Rectangle bounds = aShape.getBounds(); int blurWidth = 6; BufferedImage image = new BufferedImage(bounds.width + blurWidth*4, bounds.height + blurWidth*4, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = image.createGraphics(); int w = image.getWidth(), h = image.getHeight(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setPaint(Color.black); g2.translate(-bounds.x + (w - bounds.width)/2, -bounds.y + (h - bounds.height)/2); g2.fill(aShape); g2.setStroke(new BasicStroke(blurWidth/2)); g2.draw(aShape); g2.dispose(); float k[] = new float[blurWidth*blurWidth]; for(int i=0; iChristophe Jolif * @author Vincent Hardy * @version $Id: RHints.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class RHints implements Painter { public void paint(Graphics2D g) { java.awt.RenderingHints.Key antialiasKey = java.awt.RenderingHints.KEY_ANTIALIASING; Object antialiasOn= java.awt.RenderingHints.VALUE_ANTIALIAS_ON; Object antialiasOff= java.awt.RenderingHints.VALUE_ANTIALIAS_OFF; java.awt.RenderingHints.Key textAntialiasKey = java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; Object textAntialiasOn = java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON; Object textAntialiasOff = java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; java.awt.RenderingHints.Key interpolationKey = java.awt.RenderingHints.KEY_INTERPOLATION; Object interpolationBicubic = java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC; Object interpolationNeighbor = java.awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR; Font defaultFont = g.getFont(); java.awt.geom.AffineTransform defaultTransform = g.getTransform(); Font textFont = new Font("Impact", Font.PLAIN, 25); // // First, test text antialiasing // g.setPaint(Color.black); g.setRenderingHint(antialiasKey, antialiasOn); g.drawString("Text antialiasing", 10, 20); g.setRenderingHint(antialiasKey, antialiasOff); g.setRenderingHint(textAntialiasKey, textAntialiasOn); g.setFont(textFont); g.drawString("HELLO antialiased", 30, 60); g.setRenderingHint(textAntialiasKey, textAntialiasOff); g.drawString("HELLO aliased", 30, 90); // // Now, test shape antialiasing // g.translate(0, 100); g.setRenderingHint(antialiasKey, antialiasOn); g.setRenderingHint(textAntialiasKey, textAntialiasOn); g.setFont(defaultFont); g.drawString("Shape antialiasing", 10, 20); g.translate(30, 0); g.setRenderingHint(antialiasKey, antialiasOff); Ellipse2D ellipse = new Ellipse2D.Float(10, 30, 100, 30); g.fill(ellipse); g.translate(0, 40); g.setRenderingHint(antialiasKey, antialiasOn); g.fill(ellipse); g.setTransform(defaultTransform); g.translate(0, 200); // // Now, test interpolation hint // BufferedImage image = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB); Graphics2D ig = image.createGraphics(); ig.setPaint(Color.red); ig.fillRect(0, 0, 2, 2); ig.setPaint(Color.yellow); ig.fillRect(0, 0, 1, 1); ig.fillRect(1, 1, 2, 2); ig.dispose(); g.setRenderingHint(interpolationKey, interpolationNeighbor); g.drawString("Interpolation Nearest Neighbor / Bicubic", 10, 30); g.drawImage(image, 10, 50, 40, 40, null); g.setRenderingHint(interpolationKey, interpolationBicubic); g.drawImage(image, 60, 50, 40, 40, null); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Bug6535.java0000644000175000017500000000363313063003303023670 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Color; import java.awt.Font; /** * This test validates outputing font-size as a float * * @author Vincent Hardy * @version $Id: Bug6535.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Bug6535 implements Painter { public void paint(Graphics2D g){ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setPaint(Color.black); g.scale(10,10); // Set default font Font font=new Font("Arial", Font.PLAIN, 1); Font font2=font.deriveFont(1.5f); g.setFont(font); g.drawString("Hello, size 10", 4, 4); g.setFont(font2); g.drawString("Hello, size 15", 4, 8); g.scale(.1, .1); font=new Font("Arial", Font.PLAIN, 10); font2=font.deriveFont(15f); g.setFont(font); g.drawString("Hello, size 10", 160, 40); g.setFont(font2); g.drawString("Hello, size 15", 160, 80); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Color1.java0000644000175000017500000001101113063003303023754 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Font; /** * This test validates convertion of Java 2D Color into SVG fill, * stroke and opacity attributes. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Color1.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Color1 implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); java.awt.geom.AffineTransform defaultTransform = g.getTransform(); // Colors used for labels and test output java.awt.Color labelColor = java.awt.Color.black; java.awt.Color[] colorConstants = { java.awt.Color.black, java.awt.Color.blue, java.awt.Color.cyan, java.awt.Color.darkGray, java.awt.Color.gray, java.awt.Color.green, java.awt.Color.lightGray, java.awt.Color.magenta, java.awt.Color.orange, java.awt.Color.pink, java.awt.Color.red, java.awt.Color.white, java.awt.Color.yellow }; String[] colorConstantStrings = { "black", "blue", "cyan", "darkGray", "gray", "green", "lightGray", "magenta", "orange", "pink", "red", "white", "yellow" }; g.translate(20, 20); g.setPaint(labelColor); g.drawString("Color Constants", -5, 0); g.translate(0, 20); for(int i=0; iPainter, rendered in a * JPainterComponent on the left, and in a * JSVGCanvas on the right, where the SVG * displayed is the one created by the SVGGraphics2D * * @author Vincent Hardy * @version $Id: JPainterCompare.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JPainterCompare extends JPanel implements SVGConstants{ /** * Canvas size for all tests */ public static final Dimension CANVAS_SIZE = new Dimension(300, 400); public static String MESSAGES_USAGE = "JPainterCompare.messages.usage"; public static String MESSAGES_LOADING_CLASS = "JPainterCompare.messages.loading.class"; public static String MESSAGES_LOADED_CLASS = "JPainterCompare.messages.loaded.class"; public static String MESSAGES_INSTANCIATED_OBJECT = "JPainterCompare.messages.instanciated.object"; public static String ERROR_COULD_NOT_LOAD_CLASS = "JPainterCompare.error.could.not.load.class"; public static String ERROR_COULD_NOT_INSTANCIATE_OBJECT = "JPainterCompare.error.could.not.instanciate.object"; public static String ERROR_CLASS_NOT_PAINTER = "JPainterCompare.error.class.not.painter"; public static String ERROR_COULD_NOT_TRANSCODE_TO_SVG = "JPainterCompare.error.could.not.transcode.to.svg"; public static String ERROR_COULD_NOT_CONVERT_FILE_PATH_TO_URL = "JPainterCompare.error.could.not.convert.file.path.to.url"; public static String ERROR_COULD_NOT_RENDER_GENERATED_SVG = "JPainterCompare.error.could.not.render.generated.svg"; public static String CONFIG_TMP_FILE_PREFIX = "JPainterCompare.config.tmp.file.prefix"; /** * Builds an SVGGraphics2D with a default * configuration. */ protected SVGGraphics2D buildSVGGraphics2D() { DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String namespaceURI = SVGDOMImplementation.SVG_NAMESPACE_URI; Document domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); // Create a default context from our Document instance SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory); GenericImageHandler ihandler = new CachedImageHandlerBase64Encoder(); ctx.setGenericImageHandler(ihandler); return new SVGGraphics2D(ctx, false); } static class LoaderListener extends SVGDocumentLoaderAdapter{ public final String sem = "sem"; public boolean success = false; public void documentLoadingFailed(SVGDocumentLoaderEvent e){ synchronized(sem){ sem.notifyAll(); } } public void documentLoadingCompleted(SVGDocumentLoaderEvent e){ success = true; synchronized(sem){ sem.notifyAll(); } } } /** * Constructor */ public JPainterCompare(Painter painter){ // First, create the AWT reference. JPainterComponent ref = new JPainterComponent(painter); // Now, generate the SVG from this Painter SVGGraphics2D g2d = buildSVGGraphics2D(); g2d.setSVGCanvasSize(CANVAS_SIZE); // // Generate SVG content // File tmpFile = null; try{ tmpFile = File.createTempFile(CONFIG_TMP_FILE_PREFIX, ".svg"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(tmpFile), "UTF-8"); painter.paint(g2d); g2d.stream(osw); osw.flush(); }catch(Exception e){ e.printStackTrace(); throw new IllegalArgumentException (Messages.formatMessage(ERROR_COULD_NOT_TRANSCODE_TO_SVG, new Object[]{e.getClass().getName()})); } // // Now, transcode SVG to a BufferedImage // JSVGCanvas svgCanvas = new JSVGCanvas(); LoaderListener l = new LoaderListener(); svgCanvas.addSVGDocumentLoaderListener(l); try{ svgCanvas.setURI(tmpFile.toURL().toString()); synchronized(l.sem){ l.sem.wait(); } }catch(Exception e){ e.printStackTrace(); new Error (Messages.formatMessage(ERROR_COULD_NOT_CONVERT_FILE_PATH_TO_URL, new Object[]{e.getMessage()})); } if(l.success){ setLayout(new GridLayout(1,2)); add(ref); add(svgCanvas); } else{ throw new Error (Messages.formatMessage(ERROR_COULD_NOT_RENDER_GENERATED_SVG,null)); } } public Dimension getPreferredSize(){ return new Dimension(CANVAS_SIZE.width*2, CANVAS_SIZE.height); } /* * Debug application: shows the image creatd by a Painter * on the left and the image created by a JSVGComponent * from the SVG generated by SVGGraphics2D from the same * Painter on the right. * */ public static void main(String[] args){ if(args.length <= 0){ System.out.println(Messages.formatMessage (MESSAGES_USAGE, null)); System.exit(0); } // Load class. String className = args[0]; System.out.println (Messages.formatMessage(MESSAGES_LOADING_CLASS, new Object[]{className})); Class cl = null; try{ cl = Class.forName(className); System.out.println (Messages.formatMessage(MESSAGES_LOADED_CLASS, new Object[]{className})); }catch(Exception e){ System.out.println (Messages.formatMessage(ERROR_COULD_NOT_LOAD_CLASS, new Object[] {className, e.getClass().getName() })); System.exit(0); } // Instanciate object Object o = null; try{ o = cl.newInstance(); System.out.println (Messages.formatMessage(MESSAGES_INSTANCIATED_OBJECT, null)); }catch(Exception e){ System.out.println (Messages.formatMessage(ERROR_COULD_NOT_INSTANCIATE_OBJECT, new Object[] {className, e.getClass().getName()})); System.exit(0); } // Cast to Painter Painter p = null; try{ p = (Painter)o; }catch(ClassCastException e){ System.out.println (Messages.formatMessage(ERROR_CLASS_NOT_PAINTER, new Object[]{className})); System.exit(0); } // Build frame JFrame f = new JFrame(); JPainterCompare c = new JPainterCompare(p); c.setBackground(Color.white); c.setPreferredSize(new Dimension(300, 400)); f.getContentPane().add(c); f.getContentPane().setBackground(Color.white); f.pack(); f.setVisible(true); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/SVGAccuracyTestValidator.java0000644000175000017500000001341513063003303027447 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Graphics2D; import java.awt.Color; import java.net.URL; import java.io.File; import org.apache.batik.test.DefaultTestSuite; import org.apache.batik.test.Test; import org.apache.batik.test.TestReportValidator; import org.apache.batik.test.TestReport; /** * Validates the operation of the SVGAccuractyTest class * * @author Vincent Hardy * @version $Id: SVGAccuracyTestValidator.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class SVGAccuracyTestValidator extends DefaultTestSuite { /** * Checks that test fails if: * + Rendering sequence generates an exception * + There is no reference image * + Reference SVG differs from the generated SVG * Checks that test works if SVG and reference SVG * are identical */ public SVGAccuracyTestValidator(){ addTest(new NullPainter()); addTest(new PainterWithException()); addTest(new NullReferenceURL()); addTest(new InexistantReferenceURL()); addTest(new DiffWithReferenceImage()); addTest(new SameAsReferenceImage()); } static class NullPainter extends TestReportValidator { public TestReport runImpl() throws Exception { Painter painter = null; URL refURL = new URL("http", "dummyHost", "dummyFile.svg"); Test t = new SVGAccuracyTest(painter, refURL); setConfig(t, false, SVGAccuracyTest.ERROR_CANNOT_GENERATE_SVG); return super.runImpl(); } } static class PainterWithException extends TestReportValidator implements Painter { public void paint(Graphics2D g){ g.setComposite(null); // Will cause the exception g.fillRect(0, 0, 20, 20); } public TestReport runImpl() throws Exception { Painter painter = this; URL refURL = new URL("http", "dummyHost", "dummyFile.svg"); Test t = new SVGAccuracyTest(painter, refURL); setConfig(t, false, SVGAccuracyTest.ERROR_CANNOT_GENERATE_SVG); return super.runImpl(); } } static class ValidPainterTest extends TestReportValidator implements Painter{ public void paint(Graphics2D g){ g.setPaint(Color.red); g.fillRect(0, 0, 40, 40); } } static class NullReferenceURL extends ValidPainterTest { public TestReport runImpl() throws Exception { Test t = new SVGAccuracyTest(this, null); setConfig(t, false, SVGAccuracyTest.ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE); return super.runImpl(); } } static class InexistantReferenceURL extends ValidPainterTest { public TestReport runImpl() throws Exception { Test t = new SVGAccuracyTest(this, new URL("http", "dummyHost", "dummyFile.svg")); setConfig(t, false, SVGAccuracyTest.ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE); return super.runImpl(); } } static class DiffWithReferenceImage extends ValidPainterTest { public TestReport runImpl() throws Exception { File tmpFile = File.createTempFile("EmptySVGReference", null); tmpFile.deleteOnExit(); Test t = new SVGAccuracyTest(this, tmpFile.toURL()); setConfig(t, false, SVGAccuracyTest.ERROR_GENERATED_SVG_INACCURATE); return super.runImpl(); } } static class SameAsReferenceImage extends ValidPainterTest { public TestReport runImpl() throws Exception { File tmpFile = File.createTempFile("SVGReference", null); tmpFile.deleteOnExit(); SVGAccuracyTest t = new SVGAccuracyTest(this, tmpFile.toURL()); t.setSaveSVG(tmpFile); setConfig(t, false, SVGAccuracyTest.ERROR_GENERATED_SVG_INACCURATE); // This first run should fail but it should // have created the reference image in tmpFile super.runImpl(); // Second run should work because the reference // image should match setConfig(t, true, null); return super.runImpl(); } } } batik-1.9.orig/test-sources/org/apache/batik/svggen/TextSpacePreserve.java0000644000175000017500000000363313063003304026245 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; /** * This test validates that spaces are preserved correctly in drawString * calls. Validates bug #2657 fix. * * @author Vincent Hardy * @version $Id: TextSpacePreserve.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TextSpacePreserve implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); // new Color(102, 102, 144)); int legendX = 10, legendY = 12; g.translate(0, 30); // Print text with spaces. g.drawString(" space before.", legendX, legendY); g.drawString("Multiple spaces between A and B: A B", legendX, legendY + 20); g.drawString("This is a first line\n and this is a second line starting with spaces", legendX, legendY + 40); g.drawString("Should have no trailing spaces", legendX, legendY + 60); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/ShearTest.java0000644000175000017500000000350013063003303024523 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; /** * Testing shear. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: ShearTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ShearTest implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Shape Ellipse2D circle = new Ellipse2D.Float(0, 0, 50, 60); // Thick stroke BasicStroke stroke = new BasicStroke(15); g.shear(0, 1); g.translate(100, 100); g.setStroke(stroke); g.setPaint(Color.gray); g.draw(circle); java.awt.geom.AffineTransform txf = g.getTransform(); Shape ellipse = txf.createTransformedShape(circle); g.setTransform(new java.awt.geom.AffineTransform()); g.translate(0, -150); g.draw(ellipse); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/DrawImage.java0000644000175000017500000000612013063003305024464 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.*; import java.awt.geom.*; import java.awt.image.*; /** * This test validates drawImage conversions. * * @author Vincent Hardy * @version $Id: DrawImage.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DrawImage implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Create an Image BufferedImage image = new BufferedImage(100, 75, BufferedImage.TYPE_INT_ARGB); Graphics2D ig = image.createGraphics(); ig.scale(.5, .5); ig.setPaint(new Color(128,0,0)); ig.fillRect(0, 0, 100, 50); ig.setPaint(Color.orange); ig.fillRect(100, 0, 100, 50); ig.setPaint(Color.yellow); ig.fillRect(0, 50, 100, 50); ig.setPaint(Color.red); ig.fillRect(100, 50, 100, 50); ig.setPaint(new Color(255, 127, 127)); ig.fillRect(0, 100, 100, 50); ig.setPaint(Color.black); ig.draw(new Rectangle2D.Double(0.5, 0.5, 199, 149)); ig.dispose(); // drawImage(img,x,y,bgcolor,observer); g.drawImage(image, 5, 10, Color.gray, null); g.translate(150, 0); // drawImage(img,x,y,w,h,observer) g.drawImage(image, 5, 10, 50, 40, null); g.translate(-150, 80); // drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,observer); g.drawImage(image, 5, 10, 45, 40, 50, 0, 100, 25, null); g.translate(150, 0); // drawImage(img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,bgcolor,observer); g.drawImage(image, 5, 10, 45, 40, 50, 50, 100, 75, Color.gray, null); g.translate(-150, 80); // drawImage(img,xform,obs) AffineTransform at = new AffineTransform(); at.scale(.5, .3); at.translate(5, 10); g.drawImage(image, at, null); g.translate(150, 0); // drawImage(img,op,x,y); RescaleOp op = new RescaleOp(.5f, 0f, null); g.drawImage(image,op,5,10); g.translate(-150, 0); g.translate(0, 80); // drawImage(x,y,w,y,bgcolor,observer) g.drawImage(image, 5, 10, 50, 40, Color.gray, null); } } batik-1.9.orig/test-sources/org/apache/batik/svggen/Lookup.java0000644000175000017500000000626513063003304024106 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Button; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.ByteLookupTable; import java.awt.image.LookupTable; /** * This test validates the convertion of Java 2D LookupOp * into an SVG filer. * * @author Christophe Jolif * @author Vincent Hardy * @version $Id: Lookup.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Lookup implements Painter { public void paint(Graphics2D g) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // // Load Image // Image image = Toolkit.getDefaultToolkit().createImage("test-resources/org/apache/batik/svggen/resources/vangogh.png"); MediaTracker tracker = new MediaTracker(new Button("")); tracker.addImage(image, 0); try{ tracker.waitForAll(); }catch(InterruptedException e){ tracker.removeImage(image); image = null; }finally { if(image != null) tracker.removeImage(image); if(tracker.isErrorAny()) image = null; if(image != null){ if(image.getWidth(null)<0 || image.getHeight(null)<0) image = null; } } if(image == null){ throw new Error("Could not load image"); } BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D ig = bi.createGraphics(); ig.drawImage(image, 0, 0, null); byte[] lookup = new byte[256]; for(int i=0; i<256; i++) lookup[i] = (byte)(255 - i); LookupTable table = new ByteLookupTable(0, lookup); java.awt.image.LookupOp inverter = new java.awt.image.LookupOp(table, null); // Simply paint the image without and with the lookup filter g.setPaint(Color.black); g.drawString("Normal / Inverted", 10, 20); g.drawImage(image, 10, 30, null); g.drawImage(bi, inverter, 10 + bi.getWidth() + 10, 30); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/0000755000175000017500000000000013153020772022644 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/transcoder/TranscoderInputTest.java0000644000175000017500000001242013063003303027461 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.transcoder; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; import java.net.URL; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.dom.GenericDOMImplementation; import org.apache.batik.dom.util.SAXDocumentFactory; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.TestReport; import org.apache.batik.util.SVGConstants; import org.apache.batik.util.XMLResourceDescriptor; import org.xml.sax.XMLReader; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; /** * This test validates that the various configurations of TranscoderInput * are supported by the XMLAbstractTranscoder class. * * @author Vincent Hardy * @version $Id: TranscoderInputTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TranscoderInputTest extends AbstractTest { public TestReport runImpl() throws Exception { String TEST_URI = (new File("samples/anne.svg")).toURL().toString(); TestTranscoder t = new TestTranscoder(); TranscoderOutput out = new TranscoderOutput(new StringWriter()); // XMLReader { SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setValidating(false); SAXParser parser = saxFactory.newSAXParser(); XMLReader xmlReader = parser.getXMLReader(); //XMLReader xmlReader = XMLReaderFactory.createXMLReader(); TranscoderInput ti = new TranscoderInput(xmlReader); ti.setURI(TEST_URI); t.transcode(ti, out); assertTrue(t.passed); } // Input Stream { URL uri = new URL(TEST_URI); InputStream is = uri.openStream(); TranscoderInput ti = new TranscoderInput(is); ti.setURI(TEST_URI); t = new TestTranscoder(); t.transcode(ti, out); assertTrue(t.passed); } // Reader { URL uri = new URL(TEST_URI); InputStream is = uri.openStream(); Reader r = new InputStreamReader(is); TranscoderInput ti = new TranscoderInput(r); ti.setURI(TEST_URI); t = new TestTranscoder(); t.transcode(ti, out); assertTrue(t.passed); } // Document { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); Document doc = f.createDocument(TEST_URI); TranscoderInput ti = new TranscoderInput(doc); ti.setURI(TEST_URI); t = new TestTranscoder(); t.transcode(ti, out); assertTrue(t.passed); } // Generic Document { String parser = XMLResourceDescriptor.getXMLParserClassName(); DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); SAXDocumentFactory f = new SAXDocumentFactory(impl, parser); Document doc = f.createDocument(TEST_URI); TranscoderInput ti = new TranscoderInput(doc); ti.setURI(TEST_URI); t = new TestTranscoder(); t.transcode(ti, out); assertTrue(t.passed); } // URI only { TranscoderInput ti = new TranscoderInput(TEST_URI); t = new TestTranscoder(); t.transcode(ti, out); assertTrue(t.passed); } return reportSuccess(); } static class TestTranscoder extends XMLAbstractTranscoder { boolean passed = false; public TestTranscoder() { addTranscodingHint(KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI); addTranscodingHint(KEY_DOCUMENT_ELEMENT, SVGConstants.SVG_SVG_TAG); addTranscodingHint(KEY_DOM_IMPLEMENTATION, SVGDOMImplementation.getDOMImplementation()); } protected void transcode(Document document, String uri, TranscoderOutput output) { passed = (document != null); } } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/wmf/0000755000175000017500000000000013153020772023435 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/transcoder/wmf/Messages.java0000644000175000017500000000437413063003301026044 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.wmf; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * This class manages the message for the test.wmf module. * * @author Stephane Hillion * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.transcoder.wmf.resources.Messages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/wmf/WMFAccuracyTest.java0000644000175000017500000003271113063003301027235 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.wmf; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.wmf.tosvg.WMFTranscoder; import org.apache.batik.util.SVGConstants; /** * This test validates that a given WMF file is properly converted to * an SVG document by comparing the generated SVG document to a known, * valid SVG reference. * * @author Thomas DeWeese * @version $Id: WMFAccuracyTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class WMFAccuracyTest extends AbstractTest implements SVGConstants { public static final String GENERATOR_REFERENCE_BASE = "test-references/org/apache/batik/transcoder/wmf"; public static final String CANDIDATE_REF_DIR = "candidate"; public static final String WMF_EXTENSION = ".wmf"; public static final String SVG_EXTENSION = ".svg"; public static final char PATH_SEPARATOR = '/'; /** * Error when an error occurs while generating SVG * with the SVGGraphics2D * {0} = painter class name if painter not null. Null otherwise * {1} = exception class name * {2} = exception message * {3} = exception stack trace. */ public static final String ERROR_CANNOT_GENERATE_SVG = "WMFAccuracyTest.error.cannot.generate.svg"; /** * Error when the reference SVG file cannot be opened * {0} = URI of the reference image * {1} = IOException message */ public static final String ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE = "WMFAccuracyTest.error.cannot.open.reference.svg.file"; /** * Error when there is an IOException while comparing the * reference SVG file with the newly generated SVG content * {0} = URI of the reference image * {1} = IOException message. */ public static final String ERROR_ERROR_WHILE_COMPARING_FILES = "WMFAccuracyTest.error.while.comparing.files"; /** * Error when the generated SVG is inaccurate */ public static final String ERROR_GENERATED_SVG_INACCURATE = "WMFAccuracyTest.error.generated.svg.inaccurate"; public static final String ENTRY_KEY_ERROR_DESCRIPTION = "WMFAccuracyTest.entry.key.error.description"; public static final String ENTRY_KEY_LINE_NUMBER = "WMFAccuracyTest.entry.key.line.number"; public static final String ENTRY_KEY_COLUMN_NUMBER = "WMFAccuracyTest.entry.key.column.number"; public static final String ENTRY_KEY_COLUMN_EXPECTED_VALUE = "WMFAccuracyTest.entry.key.column.expected.value"; public static final String ENTRY_KEY_COLUMN_FOUND_VALUE = "WMFAccuracyTest.entry.key.column.found.value"; public static final String ENTRY_KEY_REFERENCE_LINE = "WMFAccuracyTest.entry.key.reference.line"; public static final String ENTRY_KEY_NEW_LINE = "WMFAccuracyTest.entry.key.new.line"; public static final String REF_IMAGE_PREFIX = "test-references/"; /** * Painter which performs an arbitrary rendering * sequence. */ private URL wmfURL; /** * Reference SVG URL */ private URL refURL; /** * File where the generated SVG might be saved */ private File saveSVG; protected String[] breakWMFFile(String wmfFile){ if(wmfFile == null) { throw new IllegalArgumentException("Null WMF file given"); } String [] ret = new String[3]; if (wmfFile.endsWith(WMF_EXTENSION)) { ret[2] = WMF_EXTENSION; } else { throw new IllegalArgumentException ("WMF File must end in '.wmf': " + wmfFile); } wmfFile = wmfFile.substring(0, wmfFile.length()-ret[2].length()); int fileNameStart = wmfFile.lastIndexOf(PATH_SEPARATOR); String wmfDir = ""; if(fileNameStart != -1){ if(wmfFile.length() < fileNameStart + 2){ // Nothing after PATH_SEPARATOR throw new IllegalArgumentException ("Nothing after '"+PATH_SEPARATOR+"': " + wmfFile); } wmfDir = wmfFile.substring(0, fileNameStart + 1); wmfFile = wmfFile.substring(fileNameStart + 1); } ret[0] = wmfDir; ret[1] = wmfFile; return ret; } public WMFAccuracyTest(){ } public void setId(String id){ super.setId(id); setFile(id); } public void setFile(String id) { String wmfFile = id; String[] dirNfile = breakWMFFile(wmfFile); wmfURL = resolveURL(dirNfile[0]+dirNfile[1]+dirNfile[2]); refURL = resolveURL (GENERATOR_REFERENCE_BASE+"/"+dirNfile[1] +SVG_EXTENSION); saveSVG = new File(GENERATOR_REFERENCE_BASE+"/"+CANDIDATE_REF_DIR+"/"+ dirNfile[1]+SVG_EXTENSION); // System.err.println("WMFURL: " + wmfURL); // System.err.println("REFURL: " + refURL); // System.err.println("saveSVG: " + saveSVG); } /** * Resolves the input string as follows. * + First, the string is interpreted as a file description. * If the file exists, then the file name is turned into * a URL. * + Otherwise, the string is supposed to be a URL. If it * is an invalid URL, an IllegalArgumentException is thrown. */ protected URL resolveURL(String url){ // Is url a file? File f = (new File(url)).getAbsoluteFile(); if(f.getParentFile().exists()){ try{ return f.toURL(); }catch(MalformedURLException e){ throw new IllegalArgumentException(); } } // url is not a file. It must be a regular URL... try{ return new URL(url); }catch(MalformedURLException e){ throw new IllegalArgumentException(url); } } public File getSaveSVG(){ return saveSVG; } public void setSaveSVG(File saveSVG){ this.saveSVG = saveSVG; } /** * This method will only throw exceptions if some aspect * of the test's internal operation fails. */ public TestReport runImpl() throws Exception { DefaultTestReport report = new DefaultTestReport(this); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { WMFTranscoder wmft = new WMFTranscoder(); TranscoderInput input; input = new TranscoderInput(wmfURL.toString()); OutputStreamWriter outW; outW = new OutputStreamWriter(out, "UTF-8"); TranscoderOutput output = new TranscoderOutput(outW); wmft.transcode(input, output); } catch(Exception e) { StringWriter trace = new StringWriter(); e.printStackTrace(new PrintWriter(trace)); report.setErrorCode(ERROR_CANNOT_GENERATE_SVG); String desc, msg; desc = Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null); msg = Messages.formatMessage(ERROR_CANNOT_GENERATE_SVG, new String[]{ wmfURL.toString(), e.getClass().getName(), e.getMessage(), trace.toString() }); report.setDescription(new TestReport.Entry[]{ new TestReport.Entry(desc, msg) }); report.setPassed(false); return report; } BufferedReader genReader, refReader; try { InputStream is = refURL.openStream(); Reader r = new InputStreamReader(is); refReader = new BufferedReader(r); } catch (Exception e) { report.setErrorCode(ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE); String desc, msg, refURLStr; refURLStr = (refURL != null) ? refURL.toExternalForm() : "null"; desc = Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null); msg = Messages.formatMessage(ERROR_CANNOT_OPEN_REFERENCE_SVG_FILE, new Object[]{refURLStr, e.getMessage()}); report.setDescription( new TestReport.Entry[]{ new TestReport.Entry(desc, msg) }); report.setPassed(false); save(out.toByteArray()); return report; } byte[] data = out.toByteArray(); ByteArrayInputStream gen = new ByteArrayInputStream(data); Reader r = new InputStreamReader(gen); genReader = new BufferedReader(r); try { String refStr = refReader.readLine(); String genStr = genReader.readLine(); int line=1; while ((refStr != null) && (genStr != null)) { if (!refStr.equals(genStr)) break; refStr = refReader.readLine(); genStr = genReader.readLine(); line++; } if ((refStr == null) && (genStr == null)) { report.setPassed(true); return report; } save(out.toByteArray()); int cn = computeColumnNumber(refStr, genStr); String expectedChar = ""; if ((cn >= 0) && (refStr != null) && (refStr.length() > cn)) expectedChar = refStr.substring(cn, cn+1); String foundChar = ""; if((cn >=0) && (genStr != null) && (genStr.length() > cn)) foundChar = genStr.substring(cn, cn+1); if (expectedChar.equals(" ")) expectedChar = "' '"; if (foundChar.equals(" ")) foundChar = "' '"; report.setErrorCode(ERROR_GENERATED_SVG_INACCURATE); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_LINE_NUMBER), new Integer(line)); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_COLUMN_NUMBER), new Integer(cn)); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_COLUMN_EXPECTED_VALUE), expectedChar); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_COLUMN_FOUND_VALUE), foundChar); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_REFERENCE_LINE), refStr); report.addDescriptionEntry(fmtMsg(ENTRY_KEY_NEW_LINE), genStr); report.setPassed(false); } catch (Exception e) { String desc, msg; desc = Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null); msg = Messages.formatMessage(ERROR_ERROR_WHILE_COMPARING_FILES, new Object[]{refURL.toExternalForm(), e.getMessage()}); report.setErrorCode(ERROR_ERROR_WHILE_COMPARING_FILES); report.setDescription(new TestReport.Entry[]{ new TestReport.Entry(desc, msg)}); report.setPassed(false); save(out.toByteArray()); return report; } return report; } /** * Saves the byte array in the "saveSVG" file * if that file's parent directory exists. */ protected void save(byte[] data) throws IOException{ if(saveSVG == null){ return; } FileOutputStream os = new FileOutputStream(saveSVG); os.write(data); os.close(); } public int computeColumnNumber(String aStr, String bStr){ if(aStr == null || bStr == null){ return -1; } int n = aStr.length(); int i = -1; for(i=0; iThierry Kormann * @version $Id: URITest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class URITest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** * Constructs a new URITest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image */ public URITest(String inputURI, String refImageURI) { this.inputURI = inputURI; this.refImageURI = refImageURI; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/PixelToMMTest.java0000644000175000017500000000505013063003302027235 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.HashMap; import java.util.Map; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_PIXEL_UNIT_TO_MILLIMETER * transcoding hint. * * @author Thierry Kormann * @version $Id: PixelToMMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class PixelToMMTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The pixel to mm factor. */ protected Float px2mm; /** * Constructs a new PixelToMMTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param px2mm the pixel to mm conversion factor */ public PixelToMMTest(String inputURI, String refImageURI, Float px2mm) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.px2mm = px2mm; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(3); hints.put(ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER, px2mm); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/AbstractImageTranscoderTest.java0000644000175000017500000003176013063003302032161 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.batik.ext.awt.image.spi.ImageTagRegistry; import org.apache.batik.ext.awt.image.spi.ImageWriter; import org.apache.batik.ext.awt.image.spi.ImageWriterRegistry; import org.apache.batik.ext.awt.image.renderable.Filter; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.test.svg.SVGRenderingAccuracyTest; /** * The base class for the ImageTranscoder tests. * * @author Thierry Kormann * @version $Id: AbstractImageTranscoderTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public abstract class AbstractImageTranscoderTest extends AbstractTest { /** * Error when the reference image and the generated image is different. */ public static final String ERROR_IMAGE_DIFFER = "AbstractImageTranscoderTest.error.image.differ"; /** * Tag for difference image URI. */ public static final String DIFFERENCE_IMAGE = "AbstractImageTranscoderTest.error.difference.image"; /** * Error when an exception occured while transcoding. */ public static final String ERROR_TRANSCODING = "AbstractImageTranscoderTest.error.transcoder.exception"; /** * Constructs a new AbstractImageTranscoderTest. */ public AbstractImageTranscoderTest() { } /** * Resolves the input string as follows. * + First, the string is interpreted as a file description. * If the file exists, then the file name is turned into * a URL. * + Otherwise, the string is supposed to be a URL. If it * is an invalid URL, an IllegalArgumentException is thrown. */ protected URL resolveURL(String url){ // Is url a file? File f = (new File(url)).getAbsoluteFile(); if(f.getParentFile().exists()){ try{ return f.toURL(); }catch(MalformedURLException e){ throw new IllegalArgumentException(); } } // url is not a file. It must be a regular URL... try{ return new URL(url); }catch(MalformedURLException e){ throw new IllegalArgumentException(url); } } DefaultTestReport report; /** * Runs this test. This method will only throw exceptions if some aspect of * the test's internal operation fails. */ public TestReport runImpl() throws Exception { report = new DefaultTestReport(this); try { DiffImageTranscoder transcoder = new DiffImageTranscoder(getReferenceImageData()); Map hints = createTranscodingHints(); if (hints != null) { transcoder.setTranscodingHints(hints); } TranscoderInput input = createTranscoderInput(); transcoder.transcode(input, null); } catch (Exception ex) { report.setErrorCode(ERROR_TRANSCODING); report.addDescriptionEntry(ERROR_TRANSCODING, toString(ex)); ex.printStackTrace(); report.setPassed(false); } return report; } /** * Creates the TranscoderInput. */ protected abstract TranscoderInput createTranscoderInput(); /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { return null; } /** * Returns the reference image for this test. */ protected abstract byte [] getReferenceImageData(); ////////////////////////////////////////////////////////////////////////// // Convenient methods ////////////////////////////////////////////////////////////////////////// /** * Gives the specified exception as a string. */ public static String toString(Exception ex) { StringWriter trace = new StringWriter(); ex.printStackTrace(new PrintWriter(trace)); return trace.toString(); } static String filename; /** * Loads an image from a URL */ public static byte [] createBufferedImageData(URL url) { try { filename = url.toString(); //System.out.println(url.toString()); InputStream istream = url.openStream(); byte [] imgData = null; byte [] buf = new byte[1024]; int length; while ((length = istream.read(buf, 0, buf.length)) == buf.length) { if (imgData != null) { byte [] imgDataTmp = new byte[imgData.length + length]; System.arraycopy (imgData, 0, imgDataTmp, 0, imgData.length); System.arraycopy (buf, 0, imgDataTmp, imgData.length, length); imgData = imgDataTmp; } else { imgData = new byte[length]; System.arraycopy(buf, 0, imgData, 0, length); } } if (imgData != null) { byte [] imgDataTmp = new byte[imgData.length + length]; System.arraycopy (imgData, 0, imgDataTmp, 0, imgData.length); System.arraycopy (buf, 0, imgDataTmp, imgData.length, length); imgData = imgDataTmp; } else { imgData = new byte[length]; System.arraycopy(buf, 0, imgData, 0, length); } istream.close(); return imgData; } catch (IOException ex) { return null; } } /** * A custom ImageTranscoder for testing. */ protected class DiffImageTranscoder extends ImageTranscoder { /** The result of the image comparaison. */ protected boolean state; /** The reference image. */ protected byte [] refImgData; /** * Constructs a new DiffImageTranscoder. * * @param refImgData the reference image data */ public DiffImageTranscoder(byte [] refImgData) { this.refImgData = refImgData; } /** * Creates a new image with the specified dimension. * @param w the image width in pixels * @param h the image height in pixels */ public BufferedImage createImage(int w, int h) { return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); } /** * Compares the specified image with the reference image and set the * state flag. * * @param img the image to write * @param output the output (ignored) * @throw TranscoderException if an error occured while storing the * image */ public void writeImage(BufferedImage img, TranscoderOutput output) throws TranscoderException { try { compareImage(img); } catch (IOException e) { throw new RuntimeException(e); } } protected void writeCandidateReference(byte [] imgData) { try { String s = new File(filename).getName(); s = "test-references/org/apache/batik/transcoder/image/candidate-reference/"+s; System.out.println(s); FileOutputStream ostream = new FileOutputStream(s); ostream.write(imgData, 0, imgData.length); ostream.flush(); ostream.close(); } catch (Exception ex) { } return; } protected void writeCandidateVariation(byte[] diff) { try { String s = new File(filename).getName(); s = ("test-references/org/apache/batik/transcoder/image/"+ "candidate-variation/"+s); OutputStream out = new FileOutputStream(s); IOUtils.copy(new ByteArrayInputStream(diff), out); report.addDescriptionEntry(DIFFERENCE_IMAGE,new File(s)); } catch (Exception e) { } } /** * Compares both source and result images and set the state flag. */ protected void compareImage(BufferedImage img) throws TranscoderException, IOException { // compare the resulting image with the reference image // state = true if refImg is the same than img ByteArrayOutputStream out = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(out); PNGTranscoder t = new PNGTranscoder(); t.writeImage(img, output); byte [] imgData = out.toByteArray(); if (refImgData == null) { report.setErrorCode(ERROR_IMAGE_DIFFER); report.addDescriptionEntry(ERROR_IMAGE_DIFFER, ""); report.setPassed(false); writeCandidateReference(imgData); state = false; return; } if (!Arrays.equals(refImgData, imgData)) { byte[] actualDiff = createDiffImage(img); File acceptedDiffFile = new File( "test-references/org/apache/batik/transcoder/image/accepted-variation/", new File(filename).getName()); if (!(acceptedDiffFile.exists() && dataFromFileEqual(acceptedDiffFile, actualDiff))) { report.setErrorCode(ERROR_IMAGE_DIFFER); report.addDescriptionEntry(ERROR_IMAGE_DIFFER, ""); report.setPassed(false); writeCandidateReference(imgData); writeCandidateVariation(actualDiff); return; } } state = true; } private byte[] createDiffImage(BufferedImage actualImage) throws IOException { BufferedImage referenceImage = getImage(new ByteArrayInputStream(refImgData)); BufferedImage diffImage = SVGRenderingAccuracyTest.buildDiffImage(referenceImage, actualImage); ImageWriter writer = ImageWriterRegistry.getInstance().getWriterFor("image/png"); ByteArrayOutputStream diff = new ByteArrayOutputStream(); writer.writeImage(diffImage, diff); return diff.toByteArray(); } private boolean dataFromFileEqual(File file, byte[] data) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); IOUtils.copy(new BufferedInputStream(new FileInputStream(file)), out); return Arrays.equals(out.toByteArray(), data); } /** * Returns true if the reference image is the same than the generated * image, false otherwise. */ public boolean isIdentical() { return state; } } protected BufferedImage getImage(InputStream is) throws IOException { ImageTagRegistry reg = ImageTagRegistry.getRegistry(); Filter filt = reg.readStream(is); if(filt == null) throw new IOException("Couldn't read Stream"); RenderedImage red = filt.createDefaultRendering(); if(red == null) throw new IOException("Couldn't render Stream"); BufferedImage img = new BufferedImage(red.getWidth(), red.getHeight(), BufferedImage.TYPE_INT_ARGB); red.copyData(img.getRaster()); return img; } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/DefaultFontFamilyTest.java0000644000175000017500000000522013063003302030773 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.HashMap; import java.util.Map; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_DEFAULT_FONT_FAMILY transcoding hint. * * @author Vincent Hardy * @version $Id: DefaultFontFamilyTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DefaultFontFamilyTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The default font-family to use. */ protected String defaultFontFamily; /** * Constructs a new DefaultFontFamilyTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param defaultFontFamily the default font-family to use */ public DefaultFontFamilyTest(String inputURI, String refImageURI, String defaultFontFamily) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.defaultFontFamily = defaultFontFamily; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(3); hints.put(ImageTranscoder.KEY_DEFAULT_FONT_FAMILY, defaultFontFamily); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/Messages.java0000644000175000017500000000440413063003301026327 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * This class manages the message for the test.svg module. * * @author Stephane Hillion * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.transcoder.image.resources.TestMessages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/ParametrizedDOMTest.java0000644000175000017500000000476513063003303030423 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.io.IOException; import org.w3c.dom.Document; import org.apache.batik.anim.dom.SAXSVGDocumentFactory; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.util.XMLResourceDescriptor; /** * Test the ImageTranscoder input with a DOM tree. * * @author Thierry Kormann * @version $Id: ParametrizedDOMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ParametrizedDOMTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** * Constructs a new ParametrizedDOMTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image */ public ParametrizedDOMTest(String inputURI, String refImageURI) { this.inputURI = inputURI; this.refImageURI = refImageURI; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { try { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); Document doc = f.createDocument(resolveURL(inputURI).toString()); return new TranscoderInput(doc); } catch (IOException ex) { throw new IllegalArgumentException(inputURI); } } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/DimensionTest.java0000644000175000017500000000552413063003302027352 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.HashMap; import java.util.Map; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_WIDTH and/or the KEY_HEIGHT transcoding * hint. * * @author Thierry Kormann * @version $Id: DimensionTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DimensionTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The width of the image. */ protected Float width; /** The height of the image. */ protected Float height; /** * Constructs a new DimensionTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param width the image width * @param height the image height */ public DimensionTest(String inputURI, String refImageURI, Float width, Float height) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.width = width; this.height = height; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(7); if (width.floatValue() > 0) { hints.put(ImageTranscoder.KEY_WIDTH, width); } if (height.floatValue() > 0) { hints.put(ImageTranscoder.KEY_HEIGHT, height); } return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/AOITest.java0000644000175000017500000001052513063003302026032 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.awt.geom.Rectangle2D; import java.util.Map; import java.util.HashMap; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_AOI transcoding hint. * * @author Thierry Kormann * @version $Id: AOITest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AOITest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The area of interest. */ protected Rectangle2D aoi; /** The width of the image. */ protected Float imgWidth; /** The height of the image. */ protected Float imgHeight; /** * Constructs a new AOITest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param x the x coordinate of the area of interest * @param y the y coordinate of the area of interest * @param width the width of the area of interest * @param height the height of the area of interest */ public AOITest(String inputURI, String refImageURI, Float x, Float y, Float width, Float height) { this(inputURI, refImageURI, x, y, width, height, new Float(-1), new Float(-1)); } /** * Constructs a new AOITest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param x the x coordinate of the area of interest * @param y the y coordinate of the area of interest * @param width the width of the area of interest * @param height the height of the area of interest * @param imgWidth the width of the image to generate * @param imgHeight the height of the image to generate */ public AOITest(String inputURI, String refImageURI, Float x, Float y, Float width, Float height, Float imgWidth, Float imgHeight) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.aoi = new Rectangle2D.Float(x.floatValue(), y.floatValue(), width.floatValue(), height.floatValue()); this.imgWidth = imgWidth; this.imgHeight = imgHeight; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(11); hints.put(ImageTranscoder.KEY_AOI, aoi); if (imgWidth.floatValue() > 0) { hints.put(ImageTranscoder.KEY_WIDTH, imgWidth); } if (imgHeight.floatValue() > 0) { hints.put(ImageTranscoder.KEY_HEIGHT, imgHeight); } return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/LanguageTest.java0000644000175000017500000000511513063003302027144 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.HashMap; import java.util.Map; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_LANGUAGE transcoding hint. * * @author Thierry Kormann * @version $Id: LanguageTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class LanguageTest extends AbstractImageTranscoderTest { /** * Constructs a new LanguageTest. */ /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The preferred language. */ protected String language; /** * Constructs a new LanguageTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param language the preferred language */ public LanguageTest(String inputURI, String refImageURI, String language) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.language = language; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(7); hints.put(ImageTranscoder.KEY_LANGUAGE, language); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/GenericDocumentTest.java0000644000175000017500000000560713063003302030502 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.io.IOException; import java.net.URL; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.apache.batik.dom.GenericDOMImplementation; import org.apache.batik.dom.util.SAXDocumentFactory; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.util.XMLResourceDescriptor; /** * Test the ImageTranscoder input with a GenericDocument. * * @author Thierry Kormann * @version $Id: GenericDocumentTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class GenericDocumentTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** * Constructs a new GenericDocumentTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image */ public GenericDocumentTest(String inputURI, String refImageURI) { this.inputURI = inputURI; this.refImageURI = refImageURI; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { try { URL url = resolveURL(inputURI); String parser = XMLResourceDescriptor.getXMLParserClassName(); DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); SAXDocumentFactory f = new SAXDocumentFactory(impl, parser); Document doc = f.createDocument(url.toString()); TranscoderInput input = new TranscoderInput(doc); input.setURI(url.toString()); // Needed for external resources return input; } catch (IOException ex) { ex.printStackTrace(); throw new IllegalArgumentException(inputURI); } } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/DOMTest.java0000644000175000017500000000702013063003303026036 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.DOMImplementation; /** * Test the ImageTranscoder input with a DOM tree. * * @author Thierry Kormann * @version $Id: DOMTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class DOMTest extends AbstractImageTranscoderTest { /** * Constructs a new DOMTest. */ public DOMTest() { } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document doc = impl.createDocument(svgNS, "svg", null); Element root = doc.getDocumentElement(); root.setAttributeNS(null, "width", "400"); root.setAttributeNS(null, "height", "400"); Element r = doc.createElementNS(svgNS, "rect"); r.setAttributeNS(null, "x", "0"); r.setAttributeNS(null, "y", "0"); r.setAttributeNS(null, "width", "400"); r.setAttributeNS(null, "height", "400"); r.setAttributeNS(null, "style", "fill:black"); root.appendChild(r); r = doc.createElementNS(svgNS, "rect"); r.setAttributeNS(null, "x", "100"); r.setAttributeNS(null, "y", "50"); r.setAttributeNS(null, "width", "100"); r.setAttributeNS(null, "height", "50"); r.setAttributeNS(null, "style", "stroke:red; fill:none"); root.appendChild(r); return new TranscoderInput(doc); } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { try { BufferedImage img = new BufferedImage (400, 400, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setColor(Color.black); g2d.fillRect(0, 0, 400, 400); g2d.setColor(Color.red); g2d.drawRect(100, 50, 100, 50); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); PNGTranscoder t = new PNGTranscoder(); TranscoderOutput output = new TranscoderOutput(ostream); t.writeImage(img, output); return ostream.toByteArray(); } catch (Exception ex) { throw new RuntimeException("DOMTest error"); } } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/ReaderTest.java0000644000175000017500000000463313063003303026630 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder input with a Reader. * * @author Thierry Kormann * @version $Id: ReaderTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class ReaderTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** * Constructs a new ReaderTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image */ public ReaderTest(String inputURI, String refImageURI) { this.inputURI = inputURI; this.refImageURI = refImageURI; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { try { URL url = resolveURL(inputURI); Reader reader = new InputStreamReader(url.openStream()); TranscoderInput input = new TranscoderInput(reader); input.setURI(url.toString()); // Needed for external resources return input; } catch (IOException ex) { throw new IllegalArgumentException(inputURI); } } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/InputStreamTest.java0000644000175000017500000000460713063003303027702 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder input with a InputStream. * * @author Thierry Kormann * @version $Id: InputStreamTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class InputStreamTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** * Constructs a new InputStreamTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image */ public InputStreamTest(String inputURI, String refImageURI) { this.inputURI = inputURI; this.refImageURI = refImageURI; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { try { URL url = resolveURL(inputURI); InputStream istream = url.openStream(); TranscoderInput input = new TranscoderInput(istream); input.setURI(url.toString()); // Needed for external resources return input; } catch (IOException ex) { throw new IllegalArgumentException(inputURI); } } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/MediaTest.java0000644000175000017500000000465113063003303026445 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.HashMap; import java.util.Map; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_MEDIA transcoding hint. * * @author Thierry Kormann * @version $Id: MediaTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class MediaTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The CSS media to use. */ protected String media; /** * Constructs a new MediaTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param media the CSS media */ public MediaTest(String inputURI, String refImageURI, String media) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.media = media; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(3); hints.put(ImageTranscoder.KEY_MEDIA, media); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/MaxDimensionTest.java0000644000175000017500000001052413063003302030014 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.Map; import java.util.HashMap; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_MAX_WIDTH and/or the KEY_MAX_HEIGHT * transcoding hint. * * @author Henri Ruini * @version $Id: MaxDimensionTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class MaxDimensionTest extends AbstractImageTranscoderTest { //-- Variables ----------------------------------------------------------- /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The maximum width of the image. */ protected Float maxWidth = new Float(Float.NaN); /** The maximum height of the image. */ protected Float maxHeight = new Float(Float.NaN); /** The width of the image. */ protected Float width = new Float(Float.NaN); /** The height of the image. */ protected Float height = new Float(Float.NaN); //-- Constructors -------------------------------------------------------- /** * Constructs a new MaxDimensionTest. * * @param inputURI URI of the input image. * @param refImageURI URI of the reference image. * @param maxWidth Maximum image width (KEY_MAX_WIDTH value). * @param maxHeight Maximum image height (KEY_MAX_HEIGHT value). */ public MaxDimensionTest(String inputURI, String refImageURI, Float maxWidth, Float maxHeight) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.maxWidth = maxWidth; this.maxHeight = maxHeight; } /** * Constructs a new MaxDimensionTest. * * @param inputURI URI of the input image. * @param refImageURI URI of the reference image. * @param maxWidth Maximum image width (KEY_MAX_WIDTH value). * @param maxHeight Maximum image height (KEY_MAX_HEIGHT value). * @param width Image width (KEY_WIDTH value). * @param height Image height (KEY_HEIGH value). */ public MaxDimensionTest(String inputURI, String refImageURI, Float maxWidth, Float maxHeight, Float width, Float height) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.maxWidth = maxWidth; this.maxHeight = maxHeight; this.width = width; this.height = height; } //-- Methods ------------------------------------------------------------- /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. * * @return Transcoding hint values. */ protected Map createTranscodingHints() { Map hints = new HashMap(7); if (!width.isNaN() && width.floatValue() > 0) { hints.put(ImageTranscoder.KEY_WIDTH, width); } if (!height.isNaN() && height.floatValue() > 0) { hints.put(ImageTranscoder.KEY_HEIGHT, height); } if (maxWidth.floatValue() > 0) { hints.put(ImageTranscoder.KEY_MAX_WIDTH, maxWidth); } if (maxHeight.floatValue() > 0) { hints.put(ImageTranscoder.KEY_MAX_HEIGHT, maxHeight); } return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/BackgroundColorTest.java0000644000175000017500000000712713063003302030504 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.Map; import java.util.HashMap; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.DOMImplementation; /** * Test the ImageTranscoder with the KEY_BACKGROUND_COLOR transcoding hint. * * @author Thierry Kormann * @version $Id: BackgroundColorTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class BackgroundColorTest extends AbstractImageTranscoderTest { /** * Constructs a new BackgroundColorTest. */ public BackgroundColorTest() { } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document doc = impl.createDocument(svgNS, "svg", null); Element root = doc.getDocumentElement(); root.setAttributeNS(null, "width", "400"); root.setAttributeNS(null, "height", "400"); Element r = doc.createElementNS(svgNS, "rect"); r.setAttributeNS(null, "x", "100"); r.setAttributeNS(null, "y", "50"); r.setAttributeNS(null, "width", "100"); r.setAttributeNS(null, "height", "50"); r.setAttributeNS(null, "style", "fill:red"); root.appendChild(r); return new TranscoderInput(doc); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(7); hints.put(ImageTranscoder.KEY_BACKGROUND_COLOR, Color.blue); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { try { BufferedImage img = new BufferedImage (400, 400, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setColor(Color.blue); g2d.fillRect(0, 0, 400, 400); g2d.setColor(Color.red); g2d.fillRect(100, 50, 100, 50); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); PNGTranscoder t = new PNGTranscoder(); TranscoderOutput output = new TranscoderOutput(ostream); t.writeImage(img, output); return ostream.toByteArray(); } catch (Exception ex) { throw new RuntimeException("BackgroundColorTest error"); } } } batik-1.9.orig/test-sources/org/apache/batik/transcoder/image/AlternateStylesheetTest.java0000644000175000017500000000531613063003303031416 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.transcoder.image; import java.util.Map; import java.util.HashMap; import org.apache.batik.transcoder.TranscoderInput; /** * Test the ImageTranscoder with the KEY_ALTERNATE_STYLESHEET transcoding hint. * * @author Thierry Kormann * @version $Id: AlternateStylesheetTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AlternateStylesheetTest extends AbstractImageTranscoderTest { /** The URI of the input image. */ protected String inputURI; /** The URI of the reference image. */ protected String refImageURI; /** The alternate stylesheet to use. */ protected String alternateStylesheet; /** * Constructs a new AlternateStylesheetTest. * * @param inputURI the URI of the input image * @param refImageURI the URI of the reference image * @param alternateStylesheet the alternate stylesheet CSS media */ public AlternateStylesheetTest(String inputURI, String refImageURI, String alternateStylesheet) { this.inputURI = inputURI; this.refImageURI = refImageURI; this.alternateStylesheet = alternateStylesheet; } /** * Creates the TranscoderInput. */ protected TranscoderInput createTranscoderInput() { return new TranscoderInput(resolveURL(inputURI).toString()); } /** * Creates a Map that contains additional transcoding hints. */ protected Map createTranscodingHints() { Map hints = new HashMap(3); hints.put(ImageTranscoder.KEY_ALTERNATE_STYLESHEET, alternateStylesheet); return hints; } /** * Returns the reference image for this test. */ protected byte [] getReferenceImageData() { return createBufferedImageData(resolveURL(refImageURI)); } } batik-1.9.orig/test-sources/org/apache/batik/gvt/0000755000175000017500000000000013153020772021300 5ustar mans0954mans0954batik-1.9.orig/test-sources/org/apache/batik/gvt/Messages.java0000644000175000017500000000435213063003301023703 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.gvt; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * This class manages the message for the test.svg module. * * @author Stephane Hillion * @version $Id: Messages.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class Messages { /** * This class does not need to be instantiated. */ protected Messages() { } /** * The error messages bundle class name. */ protected static final String RESOURCES = "org.apache.batik.gvt.resources.TestMessages"; /** * The localizable support for the error messages. */ protected static LocalizableSupport localizableSupport = new LocalizableSupport(RESOURCES); /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public static void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public static Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public static String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } } batik-1.9.orig/test-sources/org/apache/batik/gvt/TextSelectionTest.java0000644000175000017500000001710413063003303025567 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.batik.gvt; import java.io.PrintWriter; import java.io.StringWriter; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGTextContentElement; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.JSVGCanvasHandler; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; import org.apache.batik.test.svg.JSVGRenderingAccuracyTest; /** * This test validates that the text selection API's work properly. * * @author Thomas DeWeese * @version $Id: TextSelectionTest.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class TextSelectionTest extends JSVGRenderingAccuracyTest { /** * Directory for reference files */ public static final String REFERENCE_DIR = "test-references/org/apache/batik/gvt/"; public static final String VARIATION_DIR = "variation/"; public static final String CANDIDATE_DIR = "candidate/"; /** * Error when unable to load requested SVG file * {0} = file * {1} = exception */ public static final String ERROR_READING_SVG = "TextSelectionTest.error.reading.svg"; /** * Error id doesn't reference an element * {0} = id */ public static final String ERROR_BAD_ID = "TextSelectionTest.error.bad.id"; /** * Error id doesn't reference a text element * {0} = id * {1} = element referenced */ public static final String ERROR_ID_NOT_TEXT = "TextSelectionTest.error.id.not.text"; /** * Error couldn't get selection highlight specified. * {0} = id * {1} = start index * {2} = end index * {3} = exception */ public static final String ERROR_GETTING_SELECTION = "TextSelectionTest.error.getting.selection"; /** * Error when unable to read/open ref URL * {0} = URL * {1} = exception stack trace. */ public static final String ERROR_CANNOT_READ_REF_URL = "TextSelectionTest.error.cannot.read.ref.url"; /** * Result didn't match reference result. * {0} = first byte of mismatch */ public static final String ERROR_WRONG_RESULT = "TextSelectionTest.error.wrong.result"; /** * No Reference or Variation file to compaire with. * {0} = reference url */ public static final String ERROR_NO_REFERENCE = "TextSelectionTest.error.no.reference"; public static final String ENTRY_KEY_ERROR_DESCRIPTION = "TextSelectionTest.entry.key.error.description"; protected String textID = null; protected int start; protected int end; public void setId(String id) { this.id = id; } /** * Constructor. ref is ignored if action == ROUND. * @param textID The element to select text from (must be a element) * @param start The first character to select * @param end The last character to select * @param file The reference file. */ public TextSelectionTest(String file, String textID, Integer start, Integer end) { this.textID = textID; this.start = start.intValue(); this.end = end.intValue(); super.setFile(file); } protected String buildRefImgURL(String svgDir, String svgFile){ return getRefImagePrefix() + svgDir + getRefImageSuffix() + svgFile + '-' +textID+ '-' + start + '-' + end +PNG_EXTENSION; } public String[] buildVariationURLs(String svgDir, String svgFile){ return new String[] {getVariationPrefix() + svgDir + getVariationSuffix() + svgFile + '-' +textID+ '-' + start + '-' + end +PNG_EXTENSION}; } public String buildSaveVariationFile(String svgDir, String svgFile){ return getSaveVariationPrefix() + svgDir + getSaveVariationSuffix() + svgFile + '-' +textID+ '-' + start + '-' + end +PNG_EXTENSION; } public String buildCandidateReferenceFile(String svgDir, String svgFile){ return getCandidateReferencePrefix() + svgDir + getCandidateReferenceSuffix() + svgFile + '-' +textID+ '-' + start + '-' + end +PNG_EXTENSION; } /** * Returns this Test's name */ public String getName() { return super.getName() + '#' +textID+ '(' + start + ',' + end + ')'; } public JSVGCanvasHandler createCanvasHandler() { return new JSVGCanvasHandler(this, this) { public JSVGCanvas createCanvas() { JSVGCanvas ret = new JSVGCanvas(); ret.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); return ret; } }; } public void canvasRendered(JSVGCanvas canvas) { DefaultTestReport report = new DefaultTestReport(this); try { Element e = canvas.getSVGDocument().getElementById(textID); if (e == null) { report.setErrorCode(ERROR_BAD_ID); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage (ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage (ERROR_BAD_ID, new String[]{textID})) }); report.setPassed(false); failReport = report; return; } if (!(e instanceof SVGTextContentElement)) { report.setErrorCode(ERROR_ID_NOT_TEXT); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage (ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage (ERROR_ID_NOT_TEXT, new String[]{id, e.toString()})) }); report.setPassed(false); failReport = report; return; } SVGTextContentElement tce = (SVGTextContentElement)e; tce.selectSubString(start, end); } catch(Exception e) { StringWriter trace = new StringWriter(); e.printStackTrace(new PrintWriter(trace)); report.setErrorCode(ERROR_GETTING_SELECTION); report.setDescription(new TestReport.Entry[] { new TestReport.Entry (Messages.formatMessage(ENTRY_KEY_ERROR_DESCRIPTION, null), Messages.formatMessage (ERROR_GETTING_SELECTION, new String[]{id, String.valueOf( start ), String.valueOf( end ), trace.toString()})) }); report.setPassed(false); failReport = report; } finally { scriptDone(); } } } batik-1.9.orig/test-sources/org/apache/batik/test/0000755000175000017500000000000013063003300021443 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/0000755000175000017500000000000013153020772014605 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/0000755000175000017500000000000013063003324015366 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/0000755000175000017500000000000013063003324016312 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/0000755000175000017500000000000013063003324017233 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/org/0000755000175000017500000000000013063003324020022 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/org/apache/0000755000175000017500000000000013063003324021243 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/0000755000175000017500000000000013063003324022335 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/0000755000175000017500000000000013153020772023122 5ustar mans0954mans0954batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/ExtendedLocalizable.java0000644000175000017500000000363113063003325027665 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.i18n; import java.util.Locale; import java.util.ResourceBundle; /** * This interface provides much more control over internationalization * than the Localizable interface. * * @author Stephane Hillion * @version $Id: ExtendedLocalizable.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ExtendedLocalizable extends Localizable { /** * Sets the group to which this object belongs. */ void setLocaleGroup(LocaleGroup lg); /** * Returns the group to which this object belongs. */ LocaleGroup getLocaleGroup(); /** * Sets the default locale for all the instances of this class in * the same LocaleGroup. */ void setDefaultLocale(Locale l); /** * Gets the current default locale in the LocaleGroup. */ Locale getDefaultLocale(); /** * Returns the current resource bundle. Getting this object gives access * to the keys in the bundle, raw string resources, arrays of raw string * resources and object resources. */ ResourceBundle getResourceBundle(); } batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/Localizable.java0000644000175000017500000000424513063003325026206 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.i18n; import java.util.Locale; import java.util.MissingResourceException; /** * This interface must be implemented by the classes which must provide a * way to override the default locale. * * @author Stephane Hillion * @version $Id: Localizable.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface Localizable { /** * Provides a way to the user to specify a locale which override the * default one. If null is passed to this method, the used locale * becomes the global one. * @param l The locale to set. */ void setLocale(Locale l); /** * Returns the current locale or null if the locale currently used is * the default one. */ Locale getLocale(); /** * Creates and returns a localized message, given the key of the message * in the resource bundle and the message parameters. * The messages in the resource bundle must have the syntax described in * the java.text.MessageFormat class documentation. * @param key The key used to retreive the message from the resource * bundle. * @param args The objects that compose the message. * @exception MissingResourceException if the key is not in the bundle. */ String formatMessage(String key, Object[] args) throws MissingResourceException; } batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/LocaleGroup.java0000644000175000017500000000315213063003325026175 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.i18n; import java.util.Locale; /** * This class represents a group of ExtendedLocalizable objects which * have a shared default locale. * * @author Stephane Hillion * @version $Id: LocaleGroup.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class LocaleGroup { /** * The default group. */ public static final LocaleGroup DEFAULT = new LocaleGroup(); /** * The shared Locale. */ protected Locale locale; /** * Sets the default locale for all the instances of ExtendedLocalizable * in this group. */ public void setLocale(Locale l) { locale = l; } /** * Gets the current default locale in this group, or null. */ public Locale getLocale() { return locale; } } batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/LocalizableSupport.java0000644000175000017500000002477413063003325027614 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.i18n; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Locale; import java.util.List; import java.util.ResourceBundle; import java.util.MissingResourceException; /** * This class provides a default implementation of the Localizable interface. * You can use it as a base class or as a member field and delegates various * work to it.

* For example, to implement Localizable, the following code can be used: *

 *  package mypackage;
 *  ...
 *  public class MyClass implements Localizable {
 *      // This code fragment requires a file named
 *      // 'mypackage/resources/Messages.properties', or a
 *      // 'mypackage.resources.Messages' class which extends
 *      // java.util.ResourceBundle, accessible using the current
 *      // classpath.
 *      LocalizableSupport localizableSupport =
 *          new LocalizableSupport("mypackage.resources.Messages");
 *
 *      public void setLocale(Locale l) {
 *          localizableSupport.setLocale(l);
 *      }
 *      public Local getLocale() {
 *          return localizableSupport.getLocale();
 *      }
 *      public String formatMessage(String key, Object[] args) {
 *          return localizableSupport.formatMessage(key, args);
 *      }
 *  }
 * 
* The algorithm for the Locale lookup in a LocalizableSupport object is: *
    *
  • * if a Locale has been set by a call to setLocale(), use this Locale, * else, *
  • *
  • * if a Locale has been set by a call to the setDefaultLocale() method * of a LocalizableSupport object in the current LocaleGroup, use this * Locale, else, *
  • *
  • * use the object returned by Locale.getDefault() (and set by * Locale.setDefault()). *
  • *
* This offers the possibility to have a different Locale for each object, * a Locale for a group of object and/or a Locale for the JVM instance. *

* Note: if no group is specified a LocalizableSupport object belongs to a * default group common to each instance of LocalizableSupport. * * @author Stephane Hillion * @version $Id: LocalizableSupport.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class LocalizableSupport implements Localizable { /** * The locale group to which this object belongs. */ protected LocaleGroup localeGroup = LocaleGroup.DEFAULT; /** * The resource bundle classname. */ protected String bundleName; /** * The classloader to use to create the resource bundle. */ protected ClassLoader classLoader; /** * The current locale. */ protected Locale locale; /** * The locale in use. */ protected Locale usedLocale; /** * The resources */ List resourceBundles = new ArrayList(); Class lastResourceClass; /** * The class to lookup bundleName from. */ Class cls; /** * Same as LocalizableSupport(cls, null). */ public LocalizableSupport(String s, Class cls) { this(s, cls, null); } /** * Same as LocalizableSupport(cls, null). */ public LocalizableSupport(String s, Class cls, ClassLoader cl) { bundleName = s; this.cls = cls; classLoader = cl; } /** * Same as LocalizableSupport(s, null). */ public LocalizableSupport(String s) { this(s, (ClassLoader)null); } /** * Creates a new Localizable object. * The resource bundle class name is required allows the use of custom * classes of resource bundles. * @param s must be the name of the class to use to get the appropriate * resource bundle given the current locale. * @param cl is the classloader used to create the resource bundle, * or null. * @see java.util.ResourceBundle */ public LocalizableSupport(String s, ClassLoader cl) { bundleName = s; classLoader = cl; } /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public void setLocale(Locale l) { if (locale != l) { locale = l; resourceBundles.clear(); lastResourceClass = null; } } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public Locale getLocale() { return locale; } /** * Implements {@link * org.apache.batik.i18n.ExtendedLocalizable#setLocaleGroup(LocaleGroup)}. */ public void setLocaleGroup(LocaleGroup lg) { localeGroup = lg; } /** * Implements {@link * org.apache.batik.i18n.ExtendedLocalizable#getLocaleGroup()}. */ public LocaleGroup getLocaleGroup() { return localeGroup; } /** * Implements {@link * org.apache.batik.i18n.ExtendedLocalizable#setDefaultLocale(Locale)}. * Later invocations of the instance methods will lead to update the * resource bundle used. */ public void setDefaultLocale(Locale l) { localeGroup.setLocale(l); } /** * Implements {@link * org.apache.batik.i18n.ExtendedLocalizable#getDefaultLocale()}. */ public Locale getDefaultLocale() { return localeGroup.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public String formatMessage(String key, Object[] args) { return MessageFormat.format(getString(key), args); } protected Locale getCurrentLocale() { if (locale != null) return locale; Locale l = localeGroup.getLocale(); if (l != null) return l; return Locale.getDefault(); } /** * returns true if the locale is different from the previously * used locale. Also sets 'usedLocale' to the current locale. */ protected boolean setUsedLocale() { Locale l = getCurrentLocale(); if (usedLocale == l) return false; usedLocale = l; resourceBundles.clear(); lastResourceClass = null; return true; } /** * Here for backwards compatability */ public ResourceBundle getResourceBundle() { return getResourceBundle(0); } protected boolean hasNextResourceBundle(int i) { if (i == 0) return true; if (i < resourceBundles.size()) return true; if (lastResourceClass == null) return false; if (lastResourceClass == Object.class) return false; return true; } protected ResourceBundle lookupResourceBundle(String bundle, Class theClass){ ClassLoader cl = classLoader; ResourceBundle rb=null; if (cl != null) { try { rb = ResourceBundle.getBundle(bundle, usedLocale, cl); } catch (MissingResourceException mre) { } if (rb != null) return rb; } if (theClass != null) { try { cl = theClass.getClassLoader(); } catch (SecurityException se) { } } if (cl == null) cl = getClass().getClassLoader(); try { rb = ResourceBundle.getBundle(bundle, usedLocale, cl); } catch (MissingResourceException mre) { } return rb; } protected ResourceBundle getResourceBundle(int i) { setUsedLocale(); ResourceBundle rb=null; if (cls == null) { // Old behavour if (resourceBundles.size() == 0) { rb = lookupResourceBundle(bundleName, null); resourceBundles.add(rb); } return (ResourceBundle)resourceBundles.get(0); } while (i >= resourceBundles.size()) { if (lastResourceClass == Object.class) return null; if (lastResourceClass == null) lastResourceClass = cls; else lastResourceClass = lastResourceClass.getSuperclass(); Class cl = lastResourceClass; String bundle = (cl.getPackage().getName() + "." + bundleName); resourceBundles.add(lookupResourceBundle(bundle, cl)); } return (ResourceBundle)resourceBundles.get(i); } /** */ public String getString(String key) throws MissingResourceException { setUsedLocale(); for (int i=0; hasNextResourceBundle(i); i++) { ResourceBundle rb = getResourceBundle(i); if (rb == null) continue; try { String ret = rb.getString(key); if (ret != null) return ret; } catch (MissingResourceException mre) { } } String classStr = (cls != null)?cls.toString():bundleName; throw new MissingResourceException("Unable to find resource: " + key, classStr, key); } /** * Returns the integer mapped with the given string * @param key a key of the resource bundle * @throws MissingResourceException if key is not the name of a resource */ public int getInteger(String key) throws MissingResourceException { String i = getString(key); try { return Integer.parseInt(i); } catch (NumberFormatException e) { throw new MissingResourceException ("Malformed integer", bundleName, key); } } public int getCharacter(String key) throws MissingResourceException { String s = getString(key); if(s == null || s.length() == 0){ throw new MissingResourceException ("Malformed character", bundleName, key); } return s.charAt(0); } } batik-1.9.orig/batik-i18n/src/main/java/org/apache/batik/i18n/package.html0000644000175000017500000000073613063003325025404 0ustar mans0954mans0954 Provides utility classes for internationalization.

The responsibility of the i18n package is to provide a facade for the various internationalization utility classes of the standard Java API. The API should be used for compositing string messages in a language-neutral way.

batik-1.9.orig/batik-i18n/pom.xml0000644000175000017500000000332013063004314016112 0ustar mans0954mans0954 4.0.0 batik-i18n ${project.groupId}:${project.artifactId} Batik i18n library org.apache.xmlgraphics batik 1.9 src/main/resources ${basedir}/.. LICENSE NOTICE META-INF batik-1.9.orig/contrib/0000755000175000017500000000000013063003277014377 5ustar mans0954mans0954batik-1.9.orig/contrib/fonts/0000755000175000017500000000000013063003277015530 5ustar mans0954mans0954batik-1.9.orig/contrib/fonts/gladiator/0000755000175000017500000000000013153020772017475 5ustar mans0954mans0954batik-1.9.orig/contrib/fonts/gladiator/svg/0000755000175000017500000000000013153020772020274 5ustar mans0954mans0954batik-1.9.orig/contrib/fonts/gladiator/svg/glb12.svg0000644000175000017500000043557713063003301021736 0ustar mans0954mans0954 !"#$%&'()*+,-./0123456789:;<>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz|{}~ €‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ batik-1.9.orig/contrib/fonts/gladiator/README0000644000175000017500000000051613063003300020343 0ustar mans0954mans0954# # Author : Vincent Hardy # Version : $Id: README 1733420 2016-03-03 07:41:59Z gadams $ # Content of this directory ========================= This directory contains fonts contributed by Bert Bos to the Apache Batik project. The svg directory contains SVG fonts and the ttf directory contains the fonts in the True Type format. batik-1.9.orig/contrib/jsvg/0000755000175000017500000000000013153020772015347 5ustar mans0954mans0954batik-1.9.orig/contrib/jsvg/JSVG.java0000644000175000017500000000526713063003300016761 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.jsvg; import javax.swing.JFrame; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.svg.SVGUserAgentGUIAdapter; /** * Simplest "complete" SVG Viewer using Batik. * * This is about as simple as an SVG viewer application can get. * It shuts it's self down when all windows are closed. * It reports errors interactively, and it takes a list of URI's * to open. * * @author deweese * @version $Id: JSVG.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JSVG extends JFrame{ static int windowCount=0; public JSVG(String url) { super(url); JSVGCanvas canvas = new JSVGCanvas(new SVGUserAgentGUIAdapter(this), true, true) { /** * This method is called when the component knows the desired * size of the window (based on width/height of outermost SVG * element). We override it to immediately pack this frame. */ public void setMySize(Dimension d) { setPreferredSize(d); invalidate(); JSVG.this.pack(); } }; getContentPane().add(canvas, BorderLayout.CENTER); canvas.setURI(url); setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { windowCount--; if (windowCount == 0) System.exit(0); } }); windowCount++; } public static void main(String[] args) { for (int i=0; i * Usage: ScrollExample [svg file name] *

* @author Zach DelProposto * * * */ public class ScrollExample { /** Command-line start */ public static void main(String args[]) { if(args.length != 1) { System.out.println("No or multiple SVG files were specified."); System.out.println("Usage: ScrollExample svgFileName"); System.exit(1); } // get the file File file = new File(args[0]); if(!file.exists()) { System.out.println("File "+file+" does not exist!"); System.exit(1); } try { new ScrollExample(file.toURL()); } catch(MalformedURLException e) { System.out.println("Cannot convert file to a valid URL..."); System.out.println(e); System.exit(1); } }// main() /** Construct the Example */ private ScrollExample(URL url) { JFrame frame = new JFrame("ScrollExample: "+url.getFile()); frame.setResizable(true); frame.setSize(new Dimension(500,500)); frame.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing (java.awt.event.WindowEvent e) { System.exit(0); } }); // frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JSVGCanvas canvas = new JSVGCanvas(); JSVGScrollPane scroller = new JSVGScrollPane(canvas); // scroller.setScrollbarsAlwaysVisible(true); canvas.setURI(url.toString()); frame.getContentPane().add(scroller); frame.setVisible(true); }// ScrollExample() }// class ScrollExample batik-1.9.orig/contrib/tiledTranscoder/0000755000175000017500000000000013153020772017524 5ustar mans0954mans0954batik-1.9.orig/contrib/tiledTranscoder/TiledImageTranscoder.java0000644000175000017500000000701213063003300024404 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.tiledTranscoder; import java.awt.image.renderable.*; import java.awt.image.*; import java.io.*; import org.apache.batik.transcoder.*; import org.apache.batik.transcoder.image.*; import org.apache.batik.ext.awt.image.*; import org.apache.batik.ext.awt.image.codec.*; import org.apache.batik.ext.awt.image.codec.tiff.*; import org.apache.batik.ext.awt.image.rendered.*; import org.apache.batik.ext.awt.image.renderable.*; import org.w3c.dom.Document; public class TiledImageTranscoder extends SVGAbstractTranscoder { /** * Constructs a new ImageTranscoder. */ protected TiledImageTranscoder() { } /** * Transcodes the specified Document as an image in the specified output. * * @param document the document to transcode * @param uri the uri of the document or null if any * @param output the ouput where to transcode * @exception TranscoderException if an error occured while transcoding */ protected void transcode(Document document, String uri, TranscoderOutput output) throws TranscoderException { // Sets up root, curTxf & curAoi super.transcode(document, uri, output); Filter f = this.root.getGraphicsNodeRable(true); RenderContext rc = new RenderContext(curTxf, null, null); RenderedImage img = f.createRendering(rc); // prepare the image to be painted int w = img.getWidth(); int h = img.getHeight(); try { int bands = img.getSampleModel().getNumBands(); int [] off = new int[bands]; for (int i=0; iPossible result raster image formats are PNG, JPEG, TIFF, and PDF. * Batik {@link SVGConverter} is used to execute the conversion. You need * Batik to produce the first three raster image types and * FOP to produce PDF.

* * @see SVGConverter SVGConverter * @see org.apache.batik.apps.rasterizer.Main Main * * @author Henri Ruini * @version $Id: RasterizerTask.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class RasterizerTask extends MatchingTask { // -- Constants ---------------------------------------------------------- /** * Default quality value for JPEGs. This value is used when * the user doesn't set the quality. */ private static final float DEFAULT_QUALITY = 0.99f; /** * Magic string indicating that any JAXP conforming XML parser can * be used. */ private static final String JAXP_PARSER = "jaxp"; // -- Variables ---------------------------------------------------------- /** Result image type. The default is PNG. */ protected DestinationType resultType = DestinationType.PNG; /** Output image height. */ protected float height = Float.NaN; /** Output image width. */ protected float width = Float.NaN; /** Maximum output image height. */ protected float maxHeight = Float.NaN; /** Maximum output image width. */ protected float maxWidth = Float.NaN; /** Output image quality. */ protected float quality = Float.NaN; /** Output Area of Interest (AOI) area. */ protected String area = null; /** Output background color. */ protected String background = null; /** Media type of CSS file used to produce output images. */ protected String mediaType = null; /** Output pixel size - dots per inch. */ protected float dpi = Float.NaN; /** Output image language. */ protected String language = null; /** XML parser class currently in use. */ protected String readerClassName = XMLResourceDescriptor.getXMLParserClassName(); /** Source image path. */ protected File srcFile = null; /** Destination image path. */ protected File destFile = null; /** Source directory of images. */ protected File srcDir = null; /** Destination directory for output images. */ protected File destDir = null; /** Contents of fileset elements. */ protected Vector filesets = new Vector(); /** Converter object used to convert SVG images to raster images. */ protected SVGConverter converter; // -- Constructors ------------------------------------------------------- /** * Initializes a new rasterizer task. */ public RasterizerTask() { converter = new SVGConverter(new RasterizerTaskSVGConverterController(this)); } // -- Methods required by Ant -------------------------------------------- /** * Gets result attribute value. * *

See the documentation for valid values.

* * @param type Attribute value. */ public void setResult(ValidImageTypes type) { this.resultType = getResultType(type.getValue()); } /** * Gets height attribute value. * *

The attribute is optional.

* * @param height Attribute value. */ public void setHeight(float height) { this.height = height; } /** * Gets width attribute value. * *

The attribute is optional.

* * @param width Attribute value. */ public void setWidth(float width) { this.width = width; } /** * Gets maxheight attribute value. * *

The attribute is optional.

* * @param height Attribute value. */ public void setMaxheight(float height) { this.maxHeight = height; } /** * Gets maxwidth attribute value. * *

The attribute is optional.

* * @param width Attribute value. */ public void setMaxwidth(float width) { this.maxWidth = width; } /** * Gets quality attribute value. * *

The value have to be a float between 0 and 1 excluded. * The attribute is optional.

* * @param quality Attribute value. */ public void setQuality(float quality) { this.quality = quality; } /** * Gets area attribute value. * *

The value have to be four integers separated with whitespaces or * commas. * The attribute is optional.

* * @param area Attribute value. */ public void setArea(String area) { this.area = area; } /** * Gets bg attribute value. * *

The value have to be three or four integers separated with * whitespaces or commas. * The attribute is optional.

* * @param bg Attribute value. */ public void setBg(String bg) { this.background = bg; } /** * Gets media attribute value. * *

The value have to a media type defined in CSS2 specifications. * Only visual media group is supported.

* * @param media Attribute value. */ public void setMedia(ValidMediaTypes media) { this.mediaType = media.getValue(); } /** * Gets dpi attribute value. * *

The value have to be a positive float. * The attribute is optional.

* * @param dpi Attribute value. */ public void setDpi(float dpi) { this.dpi = dpi; } /** * Gets lang attribute value. * *

See SVG specification for valid values. * The attribute is optional.

* * @param lang Attribute value. */ public void setLang(String language) { this.language = language; } /** * Sets classname of an XML parser. * The attribute is optional. * * @param value Java classname of an XML parser. */ public void setClassname(String value) { this.readerClassName = value; } /** * Gets src attribute value. * *

One of the following have to have a value: this attribute, * srcdir attribute or fileset element.

* * @param file Attribute value. */ public void setSrc(File file) { this.srcFile = file; } /** * Gets dest attribute value. * *

The attribute have to have a value when * src attribute has a value.

* * @param file Attribute value. */ public void setDest(File file) { this.destFile = file; } /** * Gets srcdir attribute value. * *

If srcfile attribute doesn't have a value then * either this attribute have to have a value or the element have * to contain fileset elements.

* * @param dir Attribute value. */ public void setSrcdir(File dir) { this.srcDir = dir; } /** * Gets destdir attribute value. * *

This attribute have to have a value if either * srcdir attribute or fileset elements * exists.

* * @param dir Attribute value. */ public void setDestdir(File dir) { this.destDir = dir; } /** * Reads fileset elements. * *

fileset elements can be used when there are many files * to be rasterized.

* * @param set fileset elements */ public void addFileset(FileSet set) { filesets.addElement(set); } /** * Validates and sets input values and files, then starts the conversion * process. * *

See Ant documentation to find out more about the meaning of * execute in Ant task.

* * @throws BuildException Parameters are not set correctly or the conversion fails. */ public void execute() throws BuildException { String[] sources; // Array of input files. // Store default XML parser information and set user class. String defaultParser = XMLResourceDescriptor.getXMLParserClassName(); // Throws BuildException. XMLResourceDescriptor.setXMLParserClassName(getParserClassName(readerClassName)); try { // Check file and directory values. if(this.srcFile != null) { if(this.destFile == null) { throw new BuildException("dest attribute is not set."); } } else { if((this.srcDir == null) && (filesets.size() == 0)) { throw new BuildException("No input files! Either srcdir or fileset have to be set."); } if(this.destDir == null) { throw new BuildException("destdir attribute is not set!"); } } // Throws BuildException. setRasterizingParameters(); // Get and set source(s). sources = getSourceFiles(); converter.setSources(sources); // Set destination. if(this.srcFile != null) { converter.setDst(this.destFile); } else { converter.setDst(this.destDir); } // Input filenames are stored in the converter and // everything is ready for the conversion. log("Rasterizing " + sources.length + (sources.length == 1 ? " image " : " images ") + "from SVG to " + this.resultType.toString() + "."); try { converter.execute(); } catch(SVGConverterException sce) { throw new BuildException(sce.getMessage()); } } finally { // Restore default XML parser for the next execute. XMLResourceDescriptor.setXMLParserClassName(defaultParser); } } // -- Internal methods --------------------------------------------------- /** * Checks and sets parameter values to the converter. * *

Some invalid values are just swallowed and default values are * used instead. This is done when the invalid value cannot * be correctly differentiated from the default value and the default * value doesn't cause any harm. BuildException is thrown * if the invalid value is clearly recognized.

* * @throws BuildException Invalid parameter value. */ protected void setRasterizingParameters() throws BuildException { if(this.resultType != null) { converter.setDestinationType(this.resultType); } else { throw new BuildException("Unknown value in result parameter."); } // Set size values. if(!Float.isNaN(this.width)) { if(this.width < 0) { throw new BuildException("Value of width parameter must positive."); } converter.setWidth(this.width); } if(!Float.isNaN(this.height)) { if(this.height < 0) { throw new BuildException("Value of height parameter must positive."); } converter.setHeight(this.height); } // Set maximum size values. if(!Float.isNaN(this.maxWidth)) { if(this.maxWidth < 0) { throw new BuildException("Value of maxwidth parameter must positive."); } converter.setMaxWidth(this.maxWidth); } if(!Float.isNaN(this.maxHeight)) { if(this.maxHeight < 0) { throw new BuildException("Value of maxheight parameter must positive."); } converter.setMaxHeight(this.maxHeight); } // The quality is just swallowed if the result type is not correct. if(allowedToSetQuality(resultType)) { if(!Float.isNaN(this.quality)) { // Throws BuildException. converter.setQuality(getQuality(this.quality)); } else { // Set something to quiet irritating error // from JPEGTranscoder. converter.setQuality(DEFAULT_QUALITY); } } if(this.area != null) { // Throws BuildException. converter.setArea(getAreaOfInterest(this.area)); } if(this.background != null) { // Throws BuildException. converter.setBackgroundColor(getBackgroundColor(this.background)); } if(this.mediaType != null) { // Ant takes care of the correct media type values. converter.setMediaType(this.mediaType); } if(!Float.isNaN(this.dpi)) { if(this.dpi < 0) { throw new BuildException("Value of dpi parameter must positive."); } // The calculation is the same as 2.54/dpi*10 where converter.setPixelUnitToMillimeter(25.4f/this.dpi); } if(this.language != null) { converter.setLanguage(this.language); } } /** * Gets source files from the task parameters and child elements, * combines those to a one list, and returns the list. * * @return Array of source filename strings. */ protected String[] getSourceFiles() { List inputFiles = new ArrayList(); // Input files in temp list. if(this.srcFile != null) { // Only one source and destination file have been set. inputFiles.add(this.srcFile.getAbsolutePath()); } else { // Unknown number of files have to be converted. destdir // attribute and either srcdir attribute or fileset element // have been set. // Read source files from the child patterns. // The value of srcdir attribute overrides the dir attribute in // fileset element. if(this.srcDir != null) { // fileset is declared in the super class. // Scan to get all the files in srcdir directory that // should be in input files. fileset.setDir(this.srcDir); DirectoryScanner ds = fileset.getDirectoryScanner(project); String[] includedFiles = ds.getIncludedFiles(); // Add file and its path to the input file vector. for (int j = 0 ; j < includedFiles.length ; j++) { File newFile = new File(srcDir.getPath(), includedFiles[j]); inputFiles.add(newFile.getAbsolutePath()); } } // Read source files from child filesets. for (int i = 0 ; i < filesets.size() ; i++) { // Scan to get all the files in this fileset that // should be in input files. FileSet fs = (FileSet) filesets.elementAt(i); DirectoryScanner ds = fs.getDirectoryScanner(project); String[] includedFiles = ds.getIncludedFiles(); // Add file and its path to the input file vector. for (int j = 0 ; j < includedFiles.length ; j++) { File newFile = new File(fs.getDir(project).getPath(), includedFiles[j]); inputFiles.add(newFile.getAbsolutePath()); } } } // Convert List to array and return the array. return (String[])inputFiles.toArray(new String[0]); } /** * Returns the correct result image type object. * * @param type Result image type as a string. * * @return Result image type as an object or null if the parameter doesn't have corresponding object. */ protected DestinationType getResultType(String type) { if(type.equals(DestinationType.PNG_STR)) { return DestinationType.PNG; } else if(type.equals(DestinationType.JPEG_STR)) { return DestinationType.JPEG; } else if(type.equals(DestinationType.TIFF_STR)) { return DestinationType.TIFF; } else if(type.equals(DestinationType.PDF_STR)) { return DestinationType.PDF; } return null; } /** * Checks if the quality value can be set. Only result image type * is checked. * * @param type Result image type. * * @return true if the quality can be set and false otherwise. */ protected boolean allowedToSetQuality(DestinationType type) { if(!type.toString().equals(DestinationType.JPEG_STR)) { return false; } return true; } /** * Returns a valid quality value. * * @param quality Input quality value to be tested. * * @return Valid quality value. * * @throws BuildException Input quality value is not valid. */ protected float getQuality(float quality) throws BuildException { if((quality <= 0) || (quality >= 1)) { throw new BuildException("quality parameter value have to be between 0 and 1."); } return quality; } /** * Returns a valid Area of Interest (AOI) as a Rectangle2D object. * * @param area AOI input area. * * @return A valid AOI rectangle. * * @throws BuildException AOI area is invalid. */ protected Rectangle2D getAreaOfInterest(String area) throws BuildException { float x; // Upper left x point value of the area. float y; // Upper left y point value of the area. float width; // Area width value. float height; // Area height value. String token; // A token from the input string. StringTokenizer tokenizer = new StringTokenizer(area, ", \t\n\r\f"); // Input string tokenizer. if(tokenizer.countTokens() != 4) { throw new BuildException("There must be four numbers in the area parameter: x, y, width, and height."); } try { x = Float.parseFloat(tokenizer.nextToken()); y = Float.parseFloat(tokenizer.nextToken()); width = Float.parseFloat(tokenizer.nextToken()); height = Float.parseFloat(tokenizer.nextToken()); } catch(NumberFormatException nfe) { throw new BuildException("Invalid area parameter value: " + nfe.toString()); } // Negative values are not allowed. if((x < 0) || (y < 0) || (width < 0) || (height < 0)) { throw new BuildException("Negative values are not allowed in area parameter."); } return new Rectangle2D.Float(x, y, width, height); } /** * Returns a valid background color object. * * @param argb String containing color channel values. * * @return A valid background color. * * @throws BuildException Input value is invalid. */ protected Color getBackgroundColor(String argb) throws BuildException { int a; // Value of the alpha channel. int r; // Value of the red channel. int g; // Value of the green channel. int b; // Value of the blue channel. String token; // A token from the input string. StringTokenizer tokenizer = new StringTokenizer(argb, ", \t\n\r\f"); // Input string tokenizer. try { if(tokenizer.countTokens() == 3) { // Default alpha channel is opaque. a = 255; } else if(tokenizer.countTokens() == 4) { a = Integer.parseInt(tokenizer.nextToken()); } else { throw new BuildException("There must be either three or four numbers in bg parameter: (alpha,) red, green, and blue."); } r = Integer.parseInt(tokenizer.nextToken()); g = Integer.parseInt(tokenizer.nextToken()); b = Integer.parseInt(tokenizer.nextToken()); } catch(NumberFormatException nfe) { throw new BuildException("Invalid bg parameter value: " + nfe.toString()); } // Check that the values are valid. if((a < 0) ||(a > 255) || (r < 0) ||(r > 255) || (g < 0) ||(g > 255) || (b < 0) ||(b > 255)) { throw new BuildException("bg parameter value is invalid. Numbers have to be between 0 and 255."); } return new Color(r, g, b, a); } /** * Returns name of an XML parser. * Magic string {@link #JAXP_PARSER} is also accepted. * * @param className Name of the XML parser class or a magic string. * * @return Name of an XML parser. * * @throws BuildException Unable to get the name of JAXP parser. */ private String getParserClassName(final String className) { String name = className; if ((className == null) || className.equals(JAXP_PARSER)) { // Set first JAXP parser. // Throws BuildException. XMLReader reader = JAXPUtils.getXMLReader(); name = reader.getClass().getName(); } log("Using class '" + name + "' to parse SVG documents.", Project.MSG_VERBOSE); return name; } // ----------------------------------------------------------------------- // Inner classes // ----------------------------------------------------------------------- /** * Defines the valid attribute values for result parameter. * *

See the Ant documentation for more information.

* * @author Henri Ruini * @version $Id: RasterizerTask.java 1733420 2016-03-03 07:41:59Z gadams $ */ public static class ValidImageTypes extends EnumeratedAttribute { /** * Defines valid image types. * * @return Array of valid values as strings. */ public String[] getValues() { return new String[] {DestinationType.PNG_STR, DestinationType.JPEG_STR, DestinationType.TIFF_STR, DestinationType.PDF_STR}; } } /** * Defines the valid attribute values for a media parameter. * *

See the Ant documentation for more information.

* * @author Henri Ruini * @version $Id: RasterizerTask.java 1733420 2016-03-03 07:41:59Z gadams $ */ public static class ValidMediaTypes extends EnumeratedAttribute { /** * Defines valid media types. * *

The types are defined in CSS2 specification. * Only visual media group is supported.

* * @return Array of valid values as strings. */ public String[] getValues() { return new String[] {"all", "handheld", "print", "projection", "screen", "tty", "tv"}; } } } ././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootbatik-1.9.orig/contrib/rasterizertask/sources/org/apache/tools/ant/taskdefs/optional/RasterizerTaskSVGConverterController.javabatik-1.9.orig/contrib/rasterizertask/sources/org/apache/tools/ant/taskdefs/optional/RasterizerTaskS0000644000175000017500000000744513063003300033542 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.tools.ant.taskdefs.optional; // -- Batik classes ---------------------------------------------------------- import org.apache.batik.transcoder.Transcoder; import org.apache.batik.apps.rasterizer.SVGConverterController; import org.apache.batik.apps.rasterizer.SVGConverterSource; // -- Ant classes ------------------------------------------------------------ import org.apache.tools.ant.Task; // -- Java SDK classes ------------------------------------------------------- import java.io.File; import java.util.Map; import java.util.List; /** * Implements simple controller for the SVGConverter operation. * *

This is almost the same as the * {@link org.apache.batik.apps.rasterizer.DefaultSVGConverterController DefaultSVGConverterController} * except this produces error message when the conversion fails.

* *

See {@link SVGConverterController} for the method documentation.

* * @see SVGConverterController SVGConverterController * @see org.apache.batik.apps.rasterizer.DefaultSVGConverterController DefaultSVGConverterController * * @author Henri Ruini * @version $Id: RasterizerTaskSVGConverterController.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class RasterizerTaskSVGConverterController implements SVGConverterController { // -- Variables ---------------------------------------------------------- /** Ant task that is used to log messages. */ protected Task executingTask = null; // -- Constructors ------------------------------------------------------- /** * Don't allow public usage. */ protected RasterizerTaskSVGConverterController() { } /** * Sets the given Ant task to receive log messages. * * @param task Ant task. The value can be null when log messages won't be written. */ public RasterizerTaskSVGConverterController(Task task) { executingTask = task; } // -- Public interface --------------------------------------------------- public boolean proceedWithComputedTask(Transcoder transcoder, Map hints, List sources, List dest){ return true; } public boolean proceedWithSourceTranscoding(SVGConverterSource source, File dest) { return true; } public boolean proceedOnSourceTranscodingFailure(SVGConverterSource source, File dest, String errorCode){ if(executingTask != null) { executingTask.log("Unable to rasterize image '" + source.getName() + "' to '" + dest.getAbsolutePath() + "': " + errorCode); } return true; } public void onSourceTranscodingSuccess(SVGConverterSource source, File dest){ } } batik-1.9.orig/contrib/rasterizertask/build.xml0000644000175000017500000001050113063003300021255 0ustar mans0954mans0954 batik-1.9.orig/contrib/rasterizertask/README0000644000175000017500000000166513063003301020330 0ustar mans0954mans0954# # Author : Henri Ruini # Version : $Id: README 1733420 2016-03-03 07:41:59Z gadams $ # Content of this directory ========================= This directory contains rasterizer task for Ant. The task can be used to convert SVG files to raster format. This has been contributed by Henri Ruini (ruini@iki.fi). The directory contains source code for the task. To compile the code you need to compile Batik first and then compile the task by typing .\build.bat compile in this directory. Type .\build.bat help to display other available targets. In Linux and similar, replace ".\" with "./" and ".bat" with ".sh" (without the quotes). NOTE: Due the internal changes in Ant itself the rasterizer task may not work if the Ant in use is a different version from the Ant used to build the task. Use the same Ant version to build and to execute task to avoid strange problems. At least JDK 1.4 is needed to build and execute the task. batik-1.9.orig/contrib/rasterizertask/build.sh0000644000175000017500000000450613063003300021077 0ustar mans0954mans0954#!/bin/sh # ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # build.sh - Unix Build Script for Rasterizer Task # # $Id: build.sh 1733420 2016-03-03 07:41:59Z gadams $ # -------------------------------------------------------------------------- # ----- Verify and Set Required Environment Variables ------------------------- if [ "$ANT_HOME" = "" ] ; then ANT_HOME=../.. fi if [ "$JAVA_HOME" = "" ] ; then echo You must set JAVA_HOME to point at your Java Development Kit installation exit 1 fi # OS specific support. $var _must_ be set to either true or false. cygwin=false; case "`uname`" in CYGWIN*) cygwin=true ;; esac # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` fi BATIK_HOME=../.. # ----- Set up classpath --------------------------------------------------- CP=$JAVA_HOME/lib/tools.jar:$ANT_HOME/lib/build/ant-1.6.5.jar:$ANT_HOME/lib/build/ant-launcher-1.6.5.jar:$BATIK_HOME/lib/build/crimson-1.1.3.jar CP=$CP:$BATIK_HOME/classes if $cygwin; then JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` CP=`cygpath --path --windows "$CP"` fi # ----- Execute The Requested Build ------------------------------------------- TARGET=$1; if [ $# != 0 ] ; then shift 1 fi "$JAVA_HOME/bin/java" $ANT_OPTS -classpath "$CP" org.apache.tools.ant.Main -emacs -Dant.home=$ANT_HOME $TARGET -Dargs="$*" # ----- Cleanup the environment -------------------------------------------- BATIK_HOME= CP= batik-1.9.orig/contrib/rasterizertask/build.bat0000644000175000017500000000375313063003302021240 0ustar mans0954mans0954@ECHO OFF :: ---------------------------------------------------------------------------- :: :: Licensed to the Apache Software Foundation (ASF) under one or more :: contributor license agreements. See the NOTICE file distributed with :: this work for additional information regarding copyright ownership. :: The ASF licenses this file to You under the Apache License, Version 2.0 :: (the "License"); you may not use this file except in compliance with :: the License. You may obtain a copy of the License at :: :: http://www.apache.org/licenses/LICENSE-2.0 :: :: Unless required by applicable law or agreed to in writing, software :: distributed under the License is distributed on an "AS IS" BASIS, :: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. :: See the License for the specific language governing permissions and :: limitations under the License. :: :: build.bat - MS-DOS build script for rasterizer task :: :: $Id: build.bat 1733420 2016-03-03 07:41:59Z gadams $ :: -------------------------------------------------------------------------- :: ----- Verify and set required environment variables ---------------------- IF NOT "%JAVA_HOME%" == "" GOTO gotJavaHome ECHO You must set JAVA_HOME to point at your JDK installation. GOTO cleanup :gotJavaHome IF NOT "%ANT_HOME%" == "" GOTO gotAntHome SET ANT_HOME=..\.. :gotAntHome SET BATIK_HOME=.\..\.. :: ----- Set up classpath --------------------------------------------------- SET CP="%JAVA_HOME%\lib\tools.jar";"%ANT_HOME%\lib\build\ant-1.6.5.jar";"%ANT_HOME%\lib\build\ant-launcher-1.6.5.jar";"%BATIK_HOME%\lib\build\crimson-1.1.3.jar" SET CP=%CP%;%BATIK_HOME%\classes :: ----- Execute ------------------------------------------------------------ "%JAVA_HOME%\bin\java.exe" %ANT_OPTS% -classpath %CP% org.apache.tools.ant.Main -Dant.home=%ANT_HOME% %1 -Dargs="%2 %3 %4 %5 %6 %7 %8 %9" :: ----- Cleanup the environment -------------------------------------------- :cleanup SET BATIK_HOME= SET CP= batik-1.9.orig/contrib/charts/0000755000175000017500000000000013153020772015662 5ustar mans0954mans0954batik-1.9.orig/contrib/charts/README0000644000175000017500000000107113063003300016525 0ustar mans0954mans0954# # Author : Vincent Hardy # Version : $Id: README 1733420 2016-03-03 07:41:59Z gadams $ # Content of this directory ========================= This directory contains XSL stylesheets to create charts from XML data. This has been contributed by John Morrison (john.r.morrison@ntlworld.com). The directory contains stylesheets for different kinds of charts, such as bar charts and pie charts. The directory contains an example of XML document that can be processed by the XSL stylesheets. The DTD has not been contributed yet but will be added shortly. batik-1.9.orig/contrib/charts/xsl/0000755000175000017500000000000013153020772016470 5ustar mans0954mans0954batik-1.9.orig/contrib/charts/xsl/line.xsl0000644000175000017500000001333113063003301020135 0ustar mans0954mans0954 10 50 20 0 1 0 20000 0 0 M L batik-1.9.orig/contrib/charts/xsl/bar.xsl0000644000175000017500000001422013063003300017747 0ustar mans0954mans0954 10 50 20 Horizontal range max = Vertical range max = Horizontal scale = Vertical scale = Bar height = 0 20000 0 1 0 0 batik-1.9.orig/contrib/charts/xsl/column.xsl0000644000175000017500000001325013063003300020502 0ustar mans0954mans0954 10 50 20 0 1 0 20000 0 0 batik-1.9.orig/contrib/charts/xsl/pie.xsl0000644000175000017500000000747313063003300017774 0ustar mans0954mans0954 radius = 360 degrees = 1 degree = angle start = angle = angle end = , batik-1.9.orig/contrib/charts/convert.sh0000644000175000017500000000504313063003300017664 0ustar mans0954mans0954#!/bin/sh # ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: convert.sh 1733420 2016-03-03 07:41:59Z gadams $ # ---------------------------------------------------------------------------- if [ "$1" = "" ] ; then echo echo "Usage : ./convert.sh xml-filename xslt-stylesheet" echo echo "Example: ./convert.sh data bar" echo " Will convert file xml/data.xml with stylesheet xsl/bar.xsl into out/data-bar.svg" exit 1 fi if [ "$JAVA_HOME" = "" ] ; then echo "ERROR: JAVA_HOME not found in your environment." echo echo "Please, set the JAVA_HOME variable in your environment to match the" echo "location of the Java Virtual Machine you want to use." exit 1 fi LOCALCLASSPATH=. for i in ../../lib/build/xalan*.jar ; do LOCALCLASSPATH=${LOCALCLASSPATH}:$i done for i in ../../lib/build/xerces*.jar ; do LOCALCLASSPATH=${LOCALCLASSPATH}:$i done echo "Using classpath: $LOCALCLASSPATH" echo "$JAVA_HOME/bin/java -classpath $LOCALCLASSPATH -Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl org.apache.xalan.xslt.Process -IN xml/$1.xml -XSL xsl/$2.xsl -OUT out/$1-$2.svg -EDUMP" $JAVA_HOME/bin/java -classpath $LOCALCLASSPATH -Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl org.apache.xalan.xslt.Process -IN xml/$1.xml -XSL xsl/$2.xsl -OUT out/$1-$2.svg -EDUMP echo echo "have a nice day ;-)" batik-1.9.orig/contrib/charts/convert.bat0000644000175000017500000000354413063003300020024 0ustar mans0954mans0954@echo off :: ---------------------------------------------------------------------------- :: :: Licensed to the Apache Software Foundation (ASF) under one or more :: contributor license agreements. See the NOTICE file distributed with :: this work for additional information regarding copyright ownership. :: The ASF licenses this file to You under the Apache License, Version 2.0 :: (the "License"); you may not use this file except in compliance with :: the License. You may obtain a copy of the License at :: :: http://www.apache.org/licenses/LICENSE-2.0 :: :: Unless required by applicable law or agreed to in writing, software :: distributed under the License is distributed on an "AS IS" BASIS, :: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. :: See the License for the specific language governing permissions and :: limitations under the License. :: :: $Id: convert.bat 1733420 2016-03-03 07:41:59Z gadams $ :: ---------------------------------------------------------------------------- if '%1'=='' goto usage set LOCALCLASSPATH=. for %%1 in (..\..\lib\build\xalan*.jar) do call lcp.bat %%1 for %%1 in (..\..\lib\build\xerces*.jar) do call lcp.bat %%1 echo Using classpath: %LOCALCLASSPATH% java -classpath %LOCALCLASSPATH% -Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl org.apache.xalan.xslt.Process -IN xml\%1.xml -XSL xsl\%2.xsl -OUT out\%1-%2.svg -EDUMP goto end :usage echo. echo Usage: convert.bat xml-filename xslt-stylesheet echo. echo Example: convert.bat data bar echo Will convert file xml\data.xml with stylesheet xsl\bar.xsl into out\data-bar.svg :end echo. echo have a nice day ;-) batik-1.9.orig/contrib/charts/xml/0000755000175000017500000000000013153020772016462 5ustar mans0954mans0954batik-1.9.orig/contrib/charts/xml/data.xml0000644000175000017500000001021113063003301020075 0ustar mans0954mans0954 255 0 0 074778.12 176895.72 279491.88 382136.99 483806.98 585052.68 687249.84 791087.80 894992.48 997919.13 10101212.15 11103540.02 0 255 0 055073.23 156523.02 258513.11 360394.70 461359.47 562228.44 663341.27 765208.29 867718.87 968927.73 1070599.73 1172210.70 0 0 255 096667.00 199930.00 2100449.00 3114722.00 4107342.00 5105519.00 6105411.00 797556.00 8114184.00 9121402.00 10127240.00 11133445.00 200 500 200 500 500 500 200 200 Q4/97 Q1/98 Q2/98 Q3/98 Q4/98 Q1/99 Q2/99 Q3/99 Q4/99 Q1/00 Q2/00 Q3/00 Q4/97 Q1/98 Q2/98 Q3/98 Q4/98 Q1/99 Q2/99 Q3/99 Q4/99 Q1/00 Q2/00 Q3/00 batik-1.9.orig/contrib/charts/lcp.bat0000644000175000017500000000210213063003300017107 0ustar mans0954mans0954@echo off :: ---------------------------------------------------------------------------- :: :: Licensed to the Apache Software Foundation (ASF) under one or more :: contributor license agreements. See the NOTICE file distributed with :: this work for additional information regarding copyright ownership. :: The ASF licenses this file to You under the Apache License, Version 2.0 :: (the "License"); you may not use this file except in compliance with :: the License. You may obtain a copy of the License at :: :: http://www.apache.org/licenses/LICENSE-2.0 :: :: Unless required by applicable law or agreed to in writing, software :: distributed under the License is distributed on an "AS IS" BASIS, :: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. :: See the License for the specific language governing permissions and :: limitations under the License. :: :: $Id: lcp.bat 1733420 2016-03-03 07:41:59Z gadams $ :: ---------------------------------------------------------------------------- set LOCALCLASSPATH=%LOCALCLASSPATH%;%1 batik-1.9.orig/batik-svgbrowser/0000755000175000017500000000000013153020772016231 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/0000755000175000017500000000000013063003266017017 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/0000755000175000017500000000000013063003270017736 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/0000755000175000017500000000000013063003266021755 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/0000755000175000017500000000000013063003266022544 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/0000755000175000017500000000000013063003266023765 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/0000755000175000017500000000000013063003266025057 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/0000755000175000017500000000000013063003266026022 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/0000755000175000017500000000000013063003266030225 5ustar mans0954mans0954batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/0000755000175000017500000000000013153020772032240 5ustar mans0954mans0954././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-general.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-g0000644000175000017500000000217013063003270033331 0ustar mans0954mans0954PNG  IHDR szzbKGDtIME /9IDATXke?LwvFI]4S{(-1KzhĞzC/ R/ E^Ri7sf}=$;nݴ0/~?yw^C:7ow"R9lQkm`tAP<|.^ݻ-uU)<,qkqDZ ])|ߜ>}XZZ< /fff~pʕO:8-E÷_q1J2944d{iHS?/W###k-ϕRR cj333? pڵ7n4r&JZk8ѣGT*=P]`xxb c$y`˽Rc;wB\ٳg"8$bݫjlnn)Jyv [ya`I:@!" vZ=P)EPĉnWEOJ)q?X _*Zׁ\.Rjd2@ѤX,R(@:n'Ej%JQq ZbqqE^%299IZZ4Xkn߾eR0aqܭ~9VJle}(^q5^b[j ɀ)p]c`m+##L}:|a2{bwF9? "v=o}_f9y$gΜ!cRwܡj1=5EhYmi} :a 6M`{b0@XDD!"2GDX[[>/1Ԫ5(8F)4""}skyy ?#YٳgZɓ( }s/l6R*$v=NYk iwznɹun?\cmj0 (v8?,"biw.#uZk"zҥ}x $l&4IENDB`././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/element.gifbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/elemen0000644000175000017500000000024613063003270033424 0ustar mans0954mans0954GIF89aȘȘ`!,SI+8[)v֖0tՇCJNfPJ= M dj(;BhJ ҮrW~yrkn|NG;././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/squiggle.svgbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/squigg0000644000175000017500000035364113063003270033470 0ustar mans0954mans0954 squiggle BUILT WITH THE BATIK SVG TOOLKIT COMMITTERS: Thomas DeWeese, Bill Haneman, Vincent Hardy, Stephane Hillion, Dieter von Holten, Dean Jackson, Christophe Jolif, Thierry Kormann, Helder Magalhães, Cameron McCormack, Bella Robinson, Nicolas Socheleau, Emmanuel Tissandier CONTRIBUTORS: Ivan Andjelkovic, Curt Arnold, Bert Bos, James Davidson, Robert DiBlasi, Archie Cobbs, Paul Evenblij, Pier Fumagalli, Hervé Girod, Christophe Held, Tonny Kohar, Clay Leeds, Keiron Liddle, Jeremias Märki, Stefano Mazzochi, John Morisson, Andreas Neumann, Luan O’Carroll, Sheng Pei, Neeme Praks, Henri Ruini, David Schweinsberg, Eric Suen, Nicholas Talian, Andres Toussaint An Apache XML Graphics Project http://xmlgraphics.apache.org/batik/ ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/captureClick.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/captur0000644000175000017500000000137313063003273033462 0ustar mans0954mans0954PNG  IHDRw=IDATx]HSaG1xcźrtcW$EXՕ^Dt$ /+*YAdFRah5 "VMlyȍG-V8缜G2"/bytb(bWEDp5­/a`*iD E"cDĐ.!' 72_O"pH{?jz( @Ӵ--w4iayg-R""gv5ṿ8@uM&WyqzAfrsﴔ`&cqYFK+@R"ce==WRrY tw4+1sw%K+e2xT7L&Se^"Z}| R4=pXw8GP$щ3G5WbU-…f223 u;~$\Q\3o\9Y j,[e; 9&M쩌eAۖl8j:!f8$x:?J%Bƴ~m 'c4L%`oc7U

>", "read"; permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; }; grant { permission java.io.FilePermission "lib/batik-svg-dom.jar", "read"; }; ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/text.gifbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/text.g0000644000175000017500000000024113063003273033366 0ustar mans0954mans0954GIF89a!Made with GIMP! ,TH0ʹ8? 8\]HzB vjS[(6 jV^HBVHlu{b;m6ɊzFSx$;././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/document-open-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/docume0000644000175000017500000000103113063003267033432 0ustar mans0954mans0954PNG  IHDRabKGD pHYs B(xtIME 2 P IDAT8˥OSQ?/} ML7`sB#F$  6~0AG lhL&mm8iyM1~r{O=ZfS*k`M>d,,R({)0tL9<:nHiD.}9djZ8.[%ŘPCͷ=?s$[[𼋺Ů\9a8SI']5 D:ť t{rA`z~kމ% >\kWbLVg#p|vѰXkCݭqJ"eY"`DFPB-%ͤO\=XBA, ES8͜q]ORw0"Wn Z5i.~6o7fʋoqIENDB`././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/DOMViewerMessages.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/DOMVie0000644000175000017500000000614313063003270033244 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Properties for the DOM viewer # # Author: stephane@hillion.org # $Id: DOMViewerMessages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- DOMViewer.title = Document Tree DOMViewerPanel.title = DOM Viewer CDataPanel.title = CharacterData Node Value DocumentInfoPanel.title = Document Informations AttributesPanel.title = Element Attributes CSSValuesPanel.title = Element Cascaded CSS Properties SplitPane.dividerLocation = 220 EmptyDocument.text = AttributesTable.column1 = Name AttributesTable.column2 = Value CSSValuesTable.column1 = Name CSSValuesTable.column2 = Value Element.icon = resources/element.gif Comment.icon = resources/comment.gif PI.icon = resources/pi.gif Text.icon = resources/text.gif Frame.title = DOM Viewer Frame.width = 700 Frame.height = 500 CloseButton.text = Close CloseButton.mnemonic = C CloseButton.tooltip = Close the tree view frame CloseButton.action = CloseButtonAction UndoButton.text = UndoButton.tooltip = Undo UndoButton.action = UndoButtonAction UndoButton.icon = resources/undo.png UndoButton.disabledIcon = resources/disabledUndo.png RedoButton.text = RedoButton.tooltip = Redo RedoButton.action = RedoButtonAction RedoButton.icon = resources/redo.png RedoButton.disabledIcon = resources/disabledRedo.png CapturingClickButton.text = CapturingClickButton.tooltip = Click to enable canvas click node finder CapturingClickButton.disableText = Click to disable canvas click node finder CapturingClickButton.action = CapturingClickButtonAction CapturingClickButton.icon = resources/captureClick.png OverlayButton.text = OverlayButton.tooltip = Click to enable highlight of selected node OverlayButton.disableText = Click to disable highlight of selected node OverlayButton.action = OverlayButtonAction OverlayButton.icon = resources/enableOverlay.png ContextMenuItem.removeSelection = Remove selection ContextMenuItem.createNewElement = Create new element... ContextMenuItem.insertNewNode = Insert new node DOMViewerToolbar.name = DOMViewer toolbar ShowWhitespaceCheckbox.text = Show Whitespace Text Nodes ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-playback-pause-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-0000644000175000017500000000072013063003273033313 0ustar mans0954mans0954PNG  IHDRabKGD pHYs  tIME  +J`D]IDAT8͒KnA *(؊8@r HHp(;DgH0ia/J\~?_Gڻ=;-"#:kΟ=y/Y C>f_ywnyfWfps_L-{>}`t]7#7Svw)@T0sEDkv(?$д;AT@v7Zq4mC"!yt0FU_,n>&C *fO,e`n; ﻩ_dQxh 6N1-F$j\BB|9Q*Ώ몞l7D"ic#)HsJtV:mJ8IENDB`././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/process-stop.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/proces0000644000175000017500000000237013063003273033455 0ustar mans0954mans0954PNG  IHDRĴl;bKGDC pHYs  tIME +C+GIDAT8ˍ[hTGsnl jH[M f R DB)TzЇBPA (ڂsѴIۺI9sD߮޾M:!v#Ș&v6[' ]x8#JxwF ; 77{]]dB!rJ,}H|L ieejme޽BV # [lh'hB OZ3gBRڊmF8iB.źT*y!@)*lӧYq /?ihJ1p0r9R()IU*Ò*`r pz<8^"/bmc?Gxm=%tvM4FnaIF&i4 JJX|3HI0<^:v gY:EhBPs(Sĥ$C=~0i?*)HIr^ﯯwIx*+YY[_mxԭe2h08s ttiWU/dbmxX1|V}ֆ %ee/hy%!R`9< v oB B䣠os8SUyP,y@xP(0 (?dyIENDB`././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policybatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/svgbro0000644000175000017500000000442513063003273033467 0ustar mans0954mans0954// ----------------------------------------------------------------------------- // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // $Id: svgbrowser.policy 1733416 2016-03-03 07:07:13Z gadams $ // ----------------------------------------------------------------------------- grant codeBase "${app.dev.base}/classes/" { permission java.security.AllPermission; }; grant codeBase "${app.dev.base}/lib/xml-apis-1.3.04.jar" { permission java.security.AllPermission; }; grant codeBase "${app.dev.base}/lib/xml-apis-ext-1.3.04.jar" { permission java.security.AllPermission; }; grant codeBase "${app.dev.base}/lib/xerces_2_5_0.jar" { permission java.security.AllPermission; }; grant codeBase "${app.dev.base}/lib/js.jar" { permission java.lang.RuntimePermission "createClassLoader"; permission java.net.SocketPermission "*", "listen, connect, resolve, accept"; permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.util.PropertyPermission "org.mozilla.javascript.JavaAdapter", "read"; permission java.util.PropertyPermission "org.mozilla.javascript.JavaAdapterClassName", "read"; permission java.util.PropertyPermission "user.home", "read"; permission java.io.FilePermission "<>", "read"; permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; }; grant { permission java.io.FilePermission "resources/org/apache/batik/dom/svg/resources/svg10.dtd", "read"; permission java.io.FilePermission "resources/org/apache/batik/dom/svg/resources/UserAgentStyleSheet.css", "read"; }; ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-out-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-o0000644000175000017500000000151113063003270033373 0ustar mans0954mans0954PNG  IHDRabKGD pHYs B(xtIME 22dDIDAT8˥[HTQ}fΙ93qƴƮDO9ZQEXa5,(R4*$t %EXӔyKq3g=HA?,b/ַg3P1 &4׍u1@%d_a) .œztlru08r8={|p_T]uͨ H{ݗ%_OɉMxѝث49XXyCR2gGevE6k4at% ;;oNQ Be*f I#DynOc`=P/4&-Xht]Wde%N rs_]PP557}Q51uyxK/[oH)u'j6B^>ʊk@IƲMp:pY16e)Lu.߭CJ^IENDB`././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-security.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-s0000644000175000017500000000255713063003273033361 0ustar mans0954mans0954PNG  IHDR szzsBIT|d&IDATX[hTGsً1Y&݈˪xɂ VD4R%Z[郈}Xj" &` D%"ffxC%&FOaaf3ρ(#Q.e&( 9\_ao; 28>\;b8JeoOI3iaPwBW< AiqnqqJ<-ͺw|s:boG)`[QDXu5d RP4T{C((?OYJmt *+ۤAg/18#Ѐс/'.p*~8|z2ʬYhaԹs]J6ߕBt¡ PԔmm-[~?B\.WbBLIUTD&'K7 B5kx[UpwLyqՑ Nm᫤ٳsܦ)څLJJ8r8((躞ĵw/OR&M]C8 TSav G/,L8IdӉ|o^sSi#+'GSwg [`k)={xb4\$`4nɏw0 M@ k耝}@L i( p M/IENDB`././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/view-refresh-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/view-r0000644000175000017500000000162013063003273033370 0ustar mans0954mans0954PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<"IDAT8mRMlTe={3m[ 3јF7`XDa M ta1L%47!«qВF;̴Yp=''\bfHe4jՄ'¸.ؖp|t&E@O*}]gQ(V02v|g'-lzW6ÌĈdǂЉ  3EW Ŋ 5>.W f43=gOk40ĭCձž _M^l8l?3]X1/23ǕgƧg^hڷuS( wD-HU/<A2e^ۏ^,}?,az  ,Hc$UgnSui&vn{'v>Eq4Akw_?߼''k'W%߼[0j>AX-/?ԩT=eYcJ奎Go@W!'$_ԓSln\{&?3 DV%r=?JeFmXv@x\qqah=Ѿ2;}З|9r-k5tT2>hMA҄ǡ̖MD, z=*];[x 8wyIuI1MN<-I7, #?[FՕD(̗ˣRmcer-0{ W1oR ]!PՑl.UvjeIENDB`././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/GUI.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/GUI.pr0000644000175000017500000005511013063003273033226 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # The viewer's GUI resources. # # Author: stephane@hillion.org # $Id: GUI.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- ViewSource.width = 750 ViewSource.height = 500 # # Messages # Message.documentLoad = Loading document... Message.documentCancelled = Loading document cancelled. Message.documentFailed = Loading document failed. Message.documentLoadTime = Loading document completed in Message.treeBuild = Building document... Message.treeCancelled = Building document cancelled. Message.treeFailed = Building document failed. Message.treeBuildTime = Building document completed in Message.onload = Dispatching 'onload'... Message.onloadCancelled = Dispatch of 'onload' cancelled. Message.onloadFailed = Dispatch of 'onload' failed. Message.onloadTime = Dispatch of 'onload' completed in Message.treeRendering = Rendering document... Message.treeRenderingCancelled = Rendering document cancelled. Message.treeRenderingFailed = Rendering document failed. Message.treeRenderingPrep = Rendering document preparation... Message.treeRenderingPrepTime = Rendering document preparation completed in Message.treeRenderingStart = Rendering document started... Message.treeRenderingTime = Rendering document completed in Message.done = Done. Message.updateManagerStarted = Update manager started... Message.updateManagerSuspended = Update manager suspended... Message.updateManagerResumed = Update manager resumed... Message.updateManagerStopped = Update manager stopped... Message.saveAs = Saving as SVG... Message.exportAsJPG = Exporting as JPG... Message.exportAsPNG = Exporting as PNG... Message.exportAsTIFF = Exporting as TIFF... # # Dialog Titles # Open.title = Open SaveAs.title = Save as SVG ExportAsJPG.title = Export as JPG ExportAsPNG.title = Export as PNG ExportAsTIFF.title = Export as TIFF SetTransform.title = Transform # # Definition of the menu bar # MenuBar = File Edit View Processing Go Tools Help MenuBar.OSX = File Edit View Processing Go Tools # File menu ################ File = Open OpenLocation NewWindow Reload SaveAs - \ Print ExportAs - Close Exit File.OSX = Open OpenLocation NewWindow Reload SaveAs - \ Print ExportAs - Close File.type = MENU File.text = File File.mnemonic = F Open.type = ITEM Open.text = Open File... Open.icon = resources/document-open-small.png Open.icon.OSX = Open.mnemonic = O Open.action = OpenAction Open.accelerator = ctrl F Open.accelerator.OSX = meta F OpenLocation.type = ITEM OpenLocation.text = Open Location... OpenLocation.icon = resources/blank.gif OpenLocation.icon.OSX = OpenLocation.mnemonic = L OpenLocation.action = OpenLocationAction OpenLocation.accelerator = ctrl A OpenLocation.accelerator.OSX = meta A NewWindow.type = ITEM NewWindow.text = New Window NewWindow.icon = resources/window-new-small.png NewWindow.icon.OSX = NewWindow.mnemonic = N NewWindow.action = NewWindowAction NewWindow.accelerator = ctrl N NewWindow.accelerator.OSX = meta N Reload.type = ITEM Reload.text = Reload Document Reload.icon = resources/view-refresh-small.png Reload.icon.OSX = Reload.mnemonic = R Reload.action = ReloadAction Reload.accelerator = ctrl R Reload.accelerator.OSX = meta R SaveAs.type = ITEM SaveAs.text = Save SVG As... SaveAs.icon = resources/blank.gif SaveAs.icon.OSX = SaveAs.mnemonic = S SaveAs.action = SaveAsAction SaveAs.accelerator = ctrl S SaveAs.accelerator.OSX = meta S Close.type = ITEM Close.text = Close Close.icon = resources/blank.gif Close.icon.OSX = Close.mnemonic = C Close.action = CloseAction Close.accelerator = ctrl W Close.accelerator.OSX = meta W Exit.type = ITEM Exit.text = Exit Exit.icon = resources/blank.gif Exit.icon.OSX = Exit.mnemonic = E Exit.action = ExitAction Exit.accelerator = ctrl Q Print.type = ITEM Print.text = Print... Print.icon = resources/document-print-small.png Print.icon.OSX = Print.mnemonic = P Print.action = PrintAction Print.accelerator = ctrl P Print.accelerator.OSX = meta P # Export As submenu ########### ExportAs = PNG JPG TIFF ExportAs.type = MENU ExportAs.text = Export As ExportAs.icon = resources/blank.gif ExportAs.icon.OSX = ExportAs.mnemonic = E PNG.type = ITEM PNG.text = PNG... PNG.icon = resources/blank.gif PNG.icon.OSX = PNG.mnemonic = P PNG.action = ExportAsPNGAction JPG.type = ITEM JPG.text = JPEG... JPG.icon = resources/blank.gif JPG.icon.OSX = JPG.mnemonic = J JPG.action = ExportAsJPGAction TIFF.type = ITEM TIFF.text = TIFF... TIFF.icon = resources/blank.gif TIFF.icon.OSX = TIFF.mnemonic = T TIFF.action = ExportAsTIFFAction # Edit menu ################ Edit = FindDialog - Preferences Edit.OSX = FindDialog #Edit = Preferences Flush #Edit = Preferences Edit.type = MENU Edit.text = Edit Edit.mnemonic = E FindDialog.type = ITEM FindDialog.text = Find... FindDialog.icon = resources/blank.gif FindDialog.icon.OSX = FindDialog.mnemonic = F FindDialog.action = FindDialogAction FindDialog.accelerator = ctrl Z FindDialog.accelerator.OSX = meta Z Preferences.type = ITEM Preferences.text = Preferences... Preferences.icon = resources/blank.gif Preferences.icon.OSX = Preferences.mnemonic = P Preferences.action = PreferencesAction Preferences.accelerator = ctrl G Flush.type = ITEM Flush.text = Flush Cache Flush.icon = resources/blank.gif Flush.mnemonic = F Flush.action = FlushAction # View menu ################ View = ResetTransform ZoomIn ZoomOut - UseStylesheet - PreviousTransform NextTransform SetTransform - ThumbnailDialog ViewSource View.type = MENU View.text = View View.mnemonic = V ThumbnailDialog.type = ITEM ThumbnailDialog.text = Thumbnail... ThumbnailDialog.icon = resources/blank.gif ThumbnailDialog.icon.OSX = ThumbnailDialog.mnemonic = M ThumbnailDialog.action = ThumbnailDialogAction ThumbnailDialog.accelerator = ctrl Y ThumbnailDialog.accelerator.OSX = meta Y ResetTransform.type = ITEM ResetTransform.text = Initial View ResetTransform.icon = resources/blank.gif ResetTransform.icon.OSX = ResetTransform.mnemonic = T ResetTransform.action = ResetTransformAction ResetTransform.accelerator = ctrl T ResetTransform.accelerator.OSX = meta T ZoomIn.type = ITEM ZoomIn.text = Zoom In ZoomIn.icon = resources/zoom-in-small.png ZoomIn.icon.OSX = ZoomIn.mnemonic = I ZoomIn.action = ZoomInAction ZoomIn.accelerator = ctrl I ZoomIn.accelerator.OSX = meta I ZoomOut.type = ITEM ZoomOut.text = Zoom Out ZoomOut.icon = resources/zoom-out-small.png ZoomOut.icon.OSX = ZoomOut.mnemonic = O ZoomOut.action = ZoomOutAction ZoomOut.accelerator = ctrl O ZoomOut.accelerator.OSX = meta O UseStylesheet = DefaultStylesheet UseStylesheet.type = MENU UseStylesheet.text = Use Stylesheet UseStylesheet.icon = resources/blank.gif UseStylesheet.icon.OSX = UseStylesheet.action = UseStylesheetAction DefaultStylesheet.type = RADIO DefaultStylesheet.text = Default DefaultStylesheet.selected = true PreviousTransform.type = ITEM PreviousTransform.text = Previous Transform PreviousTransform.icon = resources/blank.gif PreviousTransform.icon.OSX = PreviousTransform.mnemonic = P PreviousTransform.action = PreviousTransformAction PreviousTransform.accelerator = ctrl K PreviousTransform.accelerator.OSX = meta K NextTransform.type = ITEM NextTransform.text = Next Transform NextTransform.icon = resources/blank.gif NextTransform.icon.OSX = NextTransform.mnemonic = N NextTransform.action = NextTransformAction NextTransform.accelerator = ctrl L NextTransform.accelerator.OSX = meta L SetTransform.type = ITEM SetTransform.text = Transform... SetTransform.icon = resources/blank.gif SetTransform.icon.OSX = SetTransform.mnemonic = S SetTransform.action = SetTransformAction SetTransform.accelerator = ctrl E SetTransform.accelerator.OSX = meta E ViewSource.type = ITEM ViewSource.text = View Source... ViewSource.icon = resources/edit-find-small.png ViewSource.icon.OSX = ViewSource.mnemonic = V ViewSource.action = ViewSourceAction ViewSource.accelerator = ctrl U ViewSource.accelerator.OSX = meta U # Processing menu ################ Processing = Play Pause Stop Processing.type = MENU Processing.text = Processing Processing.mnemonic = P Play.type = ITEM Play.text = Play Play.icon = resources/media-playback-start-small.png Play.icon.OSX = Play.mnemonic = P Play.action = PlayAction Play.accelerator = ctrl H Play.accelerator.OSX = meta H Pause.type = ITEM Pause.text = Pause Pause.icon = resources/media-playback-pause-small.png Pause.icon.OSX = Pause.mnemonic = A Pause.action = PauseAction Pause.accelerator = ctrl J Pause.accelerator.OSX = meta J Stop.type = ITEM Stop.text = Stop Stop.icon = resources/process-stop-small.png Stop.icon.OSX = Stop.mnemonic = S Stop.action = StopAction # Go menu ################ Go = Back Forward - HistoryMarker Go.type = MENU Go.text = Go Go.mnemonic = G Back.type = ITEM Back.text = Back Back.icon = resources/go-previous-small.png Back.icon.OSX = Back.mnemonic = B Back.action = BackAction Back.accelerator = ctrl LEFT Back.accelerator.OSX = meta LEFT Forward.type = ITEM Forward.text = Forward Forward.icon = resources/go-next-small.png Forward.icon.OSX = Forward.mnemonic = F Forward.action = ForwardAction Forward.accelerator = ctrl RIGHT Forward.accelerator.OSX = meta RIGHT HistoryMarker.type = ITEM HistoryMarker.text = @@@ # Tools menu ################ Tools = Monitor DOMViewer ScriptDebugger Tools.type = MENU Tools.text = Tools Tools.mnemonic = T Monitor.type = ITEM Monitor.text = Memory Monitor... Monitor.icon = resources/utilities-system-monitor-small.png Monitor.icon.OSX = Monitor.mnemonic = M Monitor.action = MonitorAction Monitor.accelerator = ctrl M Monitor.accelerator.OSX = meta M DOMViewer.type = ITEM DOMViewer.text = DOM Viewer... DOMViewer.icon = resources/dom-viewer-small.png DOMViewer.icon.OSX = DOMViewer.mnemonic = D DOMViewer.action = DOMViewerAction DOMViewer.accelerator = ctrl D DOMViewer.accelerator.OSX = meta D ScriptDebugger.type = ITEM ScriptDebugger.text = Script Debugger... ScriptDebugger.icon = resources/blank.gif ScriptDebugger.icon.OSX = ScriptDebugger.mnemonic = S ScriptDebugger.action = ToggleDebuggerAction # Help menu ################## Help = About Help.type = MENU Help.text = ? Help.mnemonic = ? About.type = ITEM About.text = About Batik ... About.mnemonic = A About.action = AboutAction About.accelerator = ctrl shift A # # Definition of the tool bar # ToolBar = ToolOpen - ToolReload ToolBack ToolForward - \ ToolZoomIn ToolZoomOut - ToolViewSource ToolDOMViewer - \ ToolPrint - ToolPlay ToolPause ToolStop ToolOpen.icon = resources/document-open.png ToolOpen.action = OpenAction ToolOpen.tooltip = Open a SVG file. ToolReload.icon = resources/view-refresh.png ToolReload.action = ReloadAction ToolReload.tooltip = Reload the current document. ToolBack.icon = resources/go-previous.png ToolBack.action = BackAction ToolBack.tooltip = Move back to the previous document. ToolForward.icon = resources/go-next.png ToolForward.action = ForwardAction ToolForward.tooltip = Move forward to the next document. ToolPrint.icon = resources/document-print.png ToolPrint.action = PrintAction ToolPrint.tooltip = Print the current document. ToolZoomIn.icon = resources/zoom-in.png ToolZoomIn.action = ZoomInAction ToolZoomIn.tooltip = Zoom in the current document. ToolZoomOut.icon = resources/zoom-out.png ToolZoomOut.action = ZoomOutAction ToolZoomOut.tooltip = Zoom out the current document. ToolViewSource.icon = resources/edit-find.png ToolViewSource.action = ViewSourceAction ToolViewSource.tooltip = View the source of the current document. ToolDOMViewer.icon = resources/dom-viewer.png ToolDOMViewer.action = DOMViewerAction ToolDOMViewer.tooltip = Shows the DOM Viewer. ToolPlay.icon = resources/media-playback-start.png ToolPlay.action = PlayAction ToolPlay.tooltip = Continue the Processing of the SVG Document. ToolPause.icon = resources/media-playback-pause.png ToolPause.action = PauseAction ToolPause.tooltip = Pause the Processing of the SVG Document. ToolStop.icon = resources/process-stop.png ToolStop.action = StopAction ToolStop.tooltip = Stop the Processing of the SVG Document. # # JSVGViewerFrame constants # JSVGViewerFrame.property.os.name=os.name JSVGViewerFrame.property.os.name.default=Solaris JSVGViewerFrame.property.os.windows.prefix=Windows # # PreferenceDialog parameters # PreferenceDialog.title.general = General PreferenceDialog.title.security = Security PreferenceDialog.title.language = Language PreferenceDialog.title.stylesheet = Stylesheet PreferenceDialog.title.network = Network PreferenceDialog.title.dialog = Preferences PreferenceDialog.label.rendering.options = Rendering options: PreferenceDialog.label.animation.rate.limiting = Animation rate limiting: PreferenceDialog.label.other.options = Other options: PreferenceDialog.label.enable.double.buffering = Enable double buffering PreferenceDialog.label.show.rendering = Show rendering PreferenceDialog.label.auto.adjust.window = Automatically resize window to document size PreferenceDialog.label.selection.xor.mode = Display selection overlay using XOR mode PreferenceDialog.label.animation.limit.cpu = Limit to percentage of CPU usage PreferenceDialog.label.percent = % PreferenceDialog.label.animation.limit.fps = Limit to number of frames per second PreferenceDialog.label.fps = fps PreferenceDialog.label.animation.limit.unlimited = Unlimited PreferenceDialog.label.show.debug.trace = Print debugging information to console PreferenceDialog.label.is.xml.parser.validating = Use a validating XML parser PreferenceDialog.label.grant.scripts.access.to = Grant scripts access to: PreferenceDialog.label.load.scripts = Load scripts: PreferenceDialog.label.allowed.script.origin = Allowed script origin: PreferenceDialog.label.allowed.resource.origin = Allowed resource origin: PreferenceDialog.label.enforce.secure.scripting = Enforce secure scripting PreferenceDialog.label.file.system = File system PreferenceDialog.label.all.network = All network PreferenceDialog.label.java.jar.files = Java JAR files PreferenceDialog.label.ecmascript = ECMAScript/JavaScript PreferenceDialog.label.origin.any = Any PreferenceDialog.label.origin.document = Only embedded or same host as document PreferenceDialog.label.origin.embedded = Only embedded PreferenceDialog.label.origin.none = None PreferenceDialog.label.user.stylesheet = User stylesheet file or URL: PreferenceDialog.label.css.media.types = CSS media types: PreferenceDialog.label.enable.user.stylesheet = Enable user stylesheet PreferenceDialog.label.browse = Browse PreferenceDialog.label.add = Add PreferenceDialog.label.remove = Remove PreferenceDialog.label.clear = Clear PreferenceDialog.label.http.proxy = HTTP proxy: PreferenceDialog.label.host = Host PreferenceDialog.label.port = Port PreferenceDialog.label.colon = : PreferenceDialog.label.ok = OK PreferenceDialog.label.cancel = Cancel PreferenceDialog.BrowseWindow.title = Select user stylesheet # # Authentication Requestion Dialog strings. # JAuthenticator.title = Network Authentication Requested JAuthenticator.label.ok = OK JAuthenticator.label.cancel = Cancel JAuthenticator.label.site = Site: JAuthenticator.label.req = Requests: JAuthenticator.label.userID = User ID: JAuthenticator.label.password = Password: # # Main string constants for confirmation messages # Main.message.confirm.security.manager.override = \ Your settings indicate that you want to enforce scripting security. \n \ There is already a security policy installed by an entity other \ than the Squiggle viewer. \n \ You can choose to override the installed security policy and use the \ squiggle security policy instead by clicking on the 'Yes' button. \ This is potentially risky as the Squiggle security policy may have \ been tampered with. \n \ You can chose to keep the installed security policy, but there is \ no guarantee that scripting will be run in a secure fashion. This is \ potentially risky. Click on the 'No' button if you want to use the \ already installed security policy. \n \ Finally, click on the 'Cancel' button if you do not want to override \ the existing security setting and you do not want to run with the \ existing security policy which may not enforce secure execution of \ scripts. If you select the 'Cancel' button, the application will exit. \n \ WARNING: selected the 'Cancel' is the recommended option. Other selections \ are not secure. Main.message.confirm.security.manager.override= \ Security Policy Override Main.message.confirm.alien.security.manager = \ Your settings indicate that you want to enforce scripting security. \n \ However, there is already a security policy in place which \ cannot be overridden by the Squiggle browser. \n \ You can choose to keep the installed security policy, but there is \ no guarantee that scripting will be run in a secure fashion. This is \ potentially risky. Click on the 'Yes' button if you want to use the \ already installed security policy. \n \ Click on the 'No' button if you do not want to run run with the \ existing security policy which may not enforce secure execution of \ scripts. If you select the 'No' button, the application will exit. \n \ WARNING: selected the 'No' is the recommended option. Other selections \ are not secure. Main.confirm.alien.security.manager.title= \ Use alien Security Policy Main.message.security.exception.rejected.security.manager.override = \ The user preferences indicated that secure execution of scripting should be enforced. \ However, there was a SecurityManager already installed and the user rejected \ to override that SecurityManager with that of Squiggle or use the installed \ SecurityManager. Main.message.security.exception.rejected.alien.security.manager = \ The user preferences indicated that secure execution of scripting should be enforced. \ However, there was a SecurityManager already installed which could not be \ overridden and the user rejected to use the installed SecurityManager. Main.message.security.exception.alien.security.manager = \ The user preferences indicated that secure execution of scripting should be enforced. \ However, a SecurityManager was already installed. Squiggle could not continue safely. Main.message.null.pointer.exception.no.squiggle.policy.file = \ The user preference indicated that secure script execution should be enforced. \ However, the Squiggle policy file could not be found, which causes this \ exception. # # AltFileSystemView # AltFileSystemView.exception.containing.dir.null = \ Containing directory is null AltFileSystemView.exception.directory.already.exists = \ Directory already exists: {0} AltFileSystemView.new.folder.name = New Folder AltFileSystemView.floppy.drive = A: # # SVGOptionPanel # SVGOptionPanel.dialog.title = SVG Save Options SVGOptionPanel.label = Options for saving SVG SVGOptionPanel.UseXMLBase = Add "xml:base" attribute to root. SVGOptionPanel.UseXMLBaseDefault = true SVGOptionPanel.PrettyPrint = Pretty Print XML (reformats whitespace). SVGOptionPanel.PrettyPrintDefault = false # # JPEGOptionPanel # OKButton.text = OK JPEGOptionPanel.dialog.title = JPEG Quality JPEGOptionPanel.label = Quality: # # PNGOptionPanel # OKButton.text = OK PNGOptionPanel.dialog.title = Write 256 color PNG? PNGOptionPanel.label = Reduce image to 256 color indexed PNG?: # # About Box parameters # AboutDialog.icon.batik.splash = org/apache/batik/apps/svgbrowser/resources/squiggle.png AboutDialog.label.development.build = Development Build # # XMLInputHandler messages # XMLInputHandler.error.no.xml.stylesheet.processing.instruction = The input XML file does \ not contain an processing instruction of type "text/xsl" XMLInputHandler.error.transform.output.not.svg = The result of the XSL transformation \ did not produce an SVG document with a root element. It cannot be handled by Squiggle. XMLInputHandler.error.transform.produced.no.content = The XSL transformation did \ no produce any content. XMLInputHandler.error.transform.output.wrong.ns = The result of the XSL transformation \ produced a document which is not in the SVG namespace (http://www.w3.org/2000/svg) XMLInputHandler.error.result.generated.exception = An error occured when processing the \ result of the transformation applied to your document. Check that the transformation does \ not produce an empty document and that it is a well formed SVG document. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000164�00000000000�011604� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/FindDialog.properties�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/FindDi0000644�0001750�0001750�00000003571�13063003270�033320� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # FindDialog properties file # # Author: tkormann@apache.org # $Id: FindDialog.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- Dialog.title = Batik: Find Panel.title = Search for text ShowResultPanel.title = Display FindLabel.text = Find : CaseSensitiveCheckBox.text = Case sensitive CaseSensitiveCheckBox.mnemonic = S FindButton.text = Find FindButton.mnemonic = F FindButton.action = FindButtonAction ClearButton.text = Clear ClearButton.mnemonic = C ClearButton.action = ClearButtonAction CloseButton.text = Close CloseButton.mnemonic = O CloseButton.action = CloseButtonAction Highlight.text = Highlight result Highlight.mnemonic = H HighlightAndCenter.text = Highlight and center result HighlightButtonAction.mnemonic = A HighlightCenterAndZoom.text = Highlight, center and zoom on result HighlightCenterAndZoom.mnemonic = Z End.text = End of document reached; continue from beginning. End.title = Batik: Find wrap ���������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000173�00000000000�011604� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/utilities-system-monitor.png������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/utilit0000644�0001750�0001750�00000001736�13063003270�033476� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD��� ��� pHYs�� �� ����tIME ;{��kIDAT8˭_hE1F%j"h/ڧE# "UAJQ(֊FSl !hӖ`BRKj,M.Kۤdvg~ٟ� kr=a;73b.v}ٹ) 7քA�(HԒHPϾ{lveڒl×ZI$jANdk aa#EE2zULC!м/T1NIRSlm4&H]c %X._e{HCmixuMa{HC8qe{X=&\5+p7%h3{=ɦeXKk m,? X-oںS%3ZwߧʙE~ a@ʹidOoABvumٔ}IUvסua(2|!~rga|mRsN~֮e11:*xpT 3Y{L!5Ы{wUG!DHA$R}x޵{{m=rzH�Un_~ Ų`:W.E#U:����IENDB`����������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000160�00000000000�011600� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/LICENSE.icons.txt�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/LICENS0000644�0001750�0001750�00000034720�13063003273�033143� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The following files are from the Tango Desktop Project (http://tango.freedesktop.org/): document-open.png document-open.png document-print.png edit-find.png go-next.png go-previous.png icon-general.png (originally preferences-desktop.png) icon-language.png (originally preferences-desktop-locale.png) icon-network.png (originally applications-internet.png) icon-security.png (originally dialog-warning.png) icon-stylesheet.png (originally applications-graphics.png) media-playback-pause.png media-playback-start.png process-stop.png redo.png (modified version of edit-redo.png) system-search.png text-html.png undo.png (modified version of edit-undo.png) utilities-system-monitor.png view-refresh.png window-new.png The following files are from the Pasodoble Icon Theme (http://www.jesusda.com/projects/pasodoble/): File Original filename --------------------- ------------------------------ zoom-in.png viewmag+.png zoom-out.png viewmag-.png All of these image files are licensed under the Creative Commons Attribution Share-Alike 2.5 License (http://creativecommons.org/licenses/by-sa/2.5/), which is in the LICENSE.icons.txt file. THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. c. "Licensor" means the individual or entity that offers the Work under the terms of this License. d. "Original Author" means the individual or entity who created the Work. e. "Work" means the copyrightable work of authorship offered under the terms of this License. f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. 2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; b. to create and reproduce Derivative Works; c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works. e. For the avoidance of doubt, where the work is a musical composition: i. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work. ii. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions). f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions). The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(c), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(c), as requested. b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. ������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000163�00000000000�011603� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/window-new-small.png��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/window0000644�0001750�0001750�00000001107�13063003270�033463� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���bKGD������ pHYs�� �� ����tIME  yf9���tEXtComment�Created with The GIMPd%n��IDAT8˕=kQ33uMH$bTDv"G,,%İ"6Ducwvg } X~M}~GZ~fc#3f&7Hk=Y5}6zw/ o/,\|yN1a]ׯB -sJKos= #k ̔CGU;h{@A?k3QkA=%5Dq;glvތ�j�~́h͏?9yq>A >�qjxX@J@sq"8t{P8^AU3I;^Uf00HF0�8FmUjq40 TM�,(�SNRߡ/8����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000157�00000000000�011606� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/README.icons.txt������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/README0000644�0001750�0001750�00000002234�13063003273�033116� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The following files are from the Tango Desktop Project (http://tango.freedesktop.org/): document-open.png document-open.png document-print.png edit-find.png go-next.png go-previous.png icon-general.png (originally preferences-desktop.png) icon-language.png (originally preferences-desktop-locale.png) icon-network.png (originally applications-internet.png) icon-security.png (originally dialog-warning.png) icon-stylesheet.png (originally applications-graphics.png) media-playback-pause.png media-playback-start.png process-stop.png redo.png (modified version of edit-redo.png) system-search.png text-html.png undo.png (modified version of edit-undo.png) utilities-system-monitor.png view-refresh.png window-new.png The following files are from the Pasodoble Icon Theme (http://www.jesusda.com/projects/pasodoble/): zoom-in.png (originally viewmag+.png) zoom-out.png (originally viewmag-.png) The corresponding *-dark.png and images are derived from these. All of these image files are licensed under the Creative Commons Attribution Share-Alike 2.5 License (http://creativecommons.org/licenses/by-sa/2.5/), which is in the LICENSE.icons.txt file. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000167�00000000000�011607� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-stylesheet-dark.png����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-s0000644�0001750�0001750�00000003050�13063003270�033343� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���bKGD������ pHYs�� �� ����tIME )a;��IDATXWMlE{gv318 FȄ!ĕӲ\X.{DnVZ qC ?!E BvG883Lwu!=&Ӗ~Mm{.'ϊגkV؇+m^~V H_]kvdNC%~ꎜuf-wLzK֭7y/ֶ^"@ËXn-w+dR^Mg{\ mn4_䉤 L_ϕhkP:,۵S]zU?@((1T=!dM0{i2Q 4硢�`m C%gӿ;pR݇"lWW~uͬ}GTlz>4H XJڔL )%ӇJzA V J)(@օw�iۃOi-75j@>&1hERRBJ q]wkNgP\S 9Ov+ *g@d�)8nj'TVrCq3]nh EDڍ:jkkhsF{Ru0` YXqZ( B!@Hp7cߕg;ʖF".542W5^%"h"h#6cZ!�o(Ǐ?sS޽kOWZ -&u۝Ƙ.nYg `~+( `[~X9/P&''"5B\.C`Pz/�(H}߇J)n)=HY�!ճlXygltƅ мX*zɩYֵ6@k0 !@9�to&p;v>�Zzsss! $>RJ8c 뺩 ̙3-t:WJcff!h4.-- $d__%U.!`4yLa @WL1ORJσsB(VWW0@�x&�7�m脾s �Zkd2/{t?7[в,\oA1(�'qrI2f5`��| �Y!D$hhĞDlX O,}16?0ư'rמ\w)cQJ׼cLk OH�"˳kNj ֥aJU)+]6tn,c]~/&2 APYY>wOqY9|uj:tH<AwwƉ+Ycfg8h|(na,dʂ3J;62;zmtTى7O^'cƀNB /㛁)ٚ͸nBR2N! WK�,K]$ ߋ-[103|lay0o0иc$;.tɻ%qs>\^.'DQ@ Me ZRG`fHJ`�N@(͑A-bhBF(10|0</| ͱW9tpӲAk]ן^,@�۶a_a[UNUtD2H$LeYDi/T[�lE-Cαe¬ί:9~]b ^ 4mkSsՄ2J!R{w7 `xnӶg2k׬5f0<`M&L${w7y ;?1/w5nzp+߫9,KT* Chn*Ŕ-oo%"ڰj-HOoSjW ч 77n5ViF8-dN͓]FųQu'Z^\HQ�K !z" -D"#MZ!EXdԢe� tQܐ jh%I I^7 3z,r9BrcȩKF^x�8O fQEk0Gls 5o %zgO<#fSJI|8+1՛қ!B73D(C ̪Fz(JLz}g 89%`F80&0F͌P;%0r2ʧ\Xpv;y"U]uchnth-IuZ.8]WV8 1N\һrÇ/&Kk^ϞKXflxݪEv 7g U53˦]8t~^NQ;P=snvsG?>}sKR.Uy^p;(G~t5: !c,[QQqѦoaFtuuRj\؝bU~8~࢏ gH� J 7P(::Hd] ;5߿hjKKK�_X^y$Lt=n}][9W&�ba5˲,>o{rZ53 SmJ{{{|whс>f( C}- �`炅U=^uDeL0@qxt5bݘ����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000155�00000000000�011604� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/window-new.png��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/window0000644�0001750�0001750�00000001316�13063003271�033466� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������ pHYs�� �� ����tIME  +%Q���tEXtComment�Created with The GIMPd%n��2IDAT8ՓKTQGqDm#*\D6EN붭BZB}RIX.L~\u6slH53zt)o{�+v1XɁo `xn)4IT njuh?BCQ /H !I@o,ccKk,X[cDv�hV:,ccdrɷ}9\) S K"a1ƣB\C{&KFɥ,+3Ol3.R}A:s XφRƄCG LQEN4L!3LD 㲤\$g)+>SzAԼc1qfɌ�ݐ NYd%F9dS 7O 8vOFXﱲ̙ūaW}7ϰPɁ(UQ_鹹uZ@ (]*ĝu="-m*=:NQdtxΝ`a߱JѢ*?GhSO@h\ch`SMD4vnY$̤=?d1^mf6}b2''Gw/ wqvRWmC5)cP֬hV0'g`RG.0.B,Y*q>}Ί)G1�hkt=s(.Ԧr&j>'~"Y73)<woT����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000161�00000000000�011601� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/document-print.png����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/docume0000644�0001750�0001750�00000001545�13063003270�033436� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������ pHYs�� �� ����tIME D��IDAT8˵kI?$3 Q4Ŭ1N9!]aœzCHzQ$ Iv$o9caM3ɘz$QEWէ^U_=N}̎LƃGZ7tchYr�OQJqARضM[[[ɗl`}kk+SSHR$Ia6e5 w.y^C(r^RSN"}�',k98X5xвpqH$_!^E횺3ڈmƶmoAgg'e^cϣj83x"�b�c Zkev޽{ÿ0xiTu]RsGǑ%/_vƍSkBOMOΕr{3;tI::N* Xb: c\JR  AXFk & QƊX)لֆT*E 2JaH!>J.R XM!N9ٌy M%B5--hTN$"cQ˸ tI?G_oƫ/}Q .Dwa_E5%K4!^˽ɼ@﷔ o^|:*�uh5/5@"jQ SFY^A>"o����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000162�00000000000�011602� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/edit-find-small.png���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/edit-f0000644�0001750�0001750�00000001151�13063003270�033323� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���bKGD���4g��� pHYs�� �� ����tIME %/��IDAT8˝MkQ;$MfJR ]hE Uw&o$ADtYwUM;AT(VP5G'M23EHIBRgw=GvM;N!#Lv B]wf2f_K�дkw߾J9zjmŋi+dk&nߌĢ5(4]#Ns ^R>q>sƕ]$ ORpsӶQ %#6Ko�t Kz Xd4,U~_e% EJvK0n \$[5ܪ-]pi-Nlc5ߣ-F}=kr+Bt4M¹|'+7*|\YT[z,?",+| 0p8TNVdT앬/d�ߧ>xtXtk뗧d3 ;e+D, �Xtl By9Rږv_ JMZZ@{H*Gn"")e$Q?Έ9~Ju cRdtS<`B9QI+1 m.M6b;9znn0lw̆, )w粔0𿏢ć!G�I/'[|9LUWl : P~zaL8t"SKA]Kbxܙ2z4{ܿW>?uJpb:fg*%Xm k^>H$->;/4$[�%ڣN܅vret, yS+�\lXrEH:lGc}s� Jw4YٹiSU[6e جz�K����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000164�00000000000�011604� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-network-dark.png�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-n0000644�0001750�0001750�00000004345�13063003273�033351� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��� ��� ���szz���bKGD������ pHYs�� �� ����tIME H-c��rIDATXI]G3wntnqAI$(X@"/ ";%Va"@DAI,;(8r Ӄ{{T(XH;zc<"z񽯘9Vdvmi͛2٠XeX-^y*Z(4(lň{vX6G y;wW'ZÏ>_O*{Q @+YDaDi*ASnl ,?,..:ٿN?'/?ZFI?a>VFV9.w8=wN_dbx7ͯ?#믿.}W8vP"A57%$BjP~Q`[ v2B*IqA 4Zkl5K7;/=\`Ʌ2,?aZcxRR)MbpZBa RD;+huP]Zkah8Ȃ%hv K#sul941[4vyML-ZDn�JPj8ð#˳Gh:vs8O1Y[!2P9f2, + Akm2$IexBf߉h~@ [ZK xT.c}5[ BTsDi<`ܤ߮36>yWC&}Tqq�}mv1Fvԍ_jW�@į1l[hD.$Dc)#0- 4ib:>cU-Ƙ(e.n~u ffNHgr' di`&J4;ۈ_'q"AsfgT'HSFNGu+W}T۾[Mø`x&1y.Ai v]̑Re)ɰ ] Aj6.S"Zu^8~�(yﮮexSxbX룴FH-*,E:ɩqZ; zyР[{VVчNgw߭+ ? @>^ߩZ6 G,E`a`2wI Ӭ/cא[o 1Z} 4s0h64tz{е׶*E.^ܽIg3f2D*mݰioFQh4V\ Ubf_|r~~R|KQ6ƶB %EMml-Rv?q:FҚ2P<$rOyk $ePJ98ux.<,n�d10lǼ?A'T����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000202�00000000000�011575� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/NameEditorDialogMessages.properties�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/NameEd0000644�0001750�0001750�00000002452�13063003270�033311� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: NameEditorDialogMessages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- Dialog.width = 200 Dialog.height = 125 Dialog.title = Enter element name Dialog.label = Node name: OKButton.text = OK OKButton.mnemonic = O OKButton.action = OKButtonAction CancelButton.text = Cancel CancelButton.mnemonic = C CancelButton.action = CancelButtonAction ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000153�00000000000�011602� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-out.png����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-o0000644�0001750�0001750�00000002324�13063003273�033401� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������ pHYs�� �� B(x���tIME /]$d��aIDAT8˵mlSU{۵]WF_؀@ H@ A1! _("�J~Pa?2Ën+!#tc]{;ۗ{9~KAH|''''sH6Ўm-z!"3!1.;wϾ7,l߱\>Um&yIѰ$P83tu۵t}Jw9iD@G E-nწ_Ѱ*N&ն-om%ō[[zyTjrqnt썥?ze,n޴v'�\ �s׻ U*Һ38lTb q.Y2syfYxOkLMl[/f ]bMV,-qxgՌqr;2G<>cTXN i: `% c( X2@M,+7!"AKyRHeC.; Eg �PJ 1.D9ܢE=e5Λڻ-@8aa3&X,0f#}7iN' qƑ�?wgy&i)_ENS^dq'3;'lB|6;IE&,'"њ.곞' Ã7,_@`xʊ$M{{{̘9?/xyeH¶ޡgΜrTjw-? q�q~ ]_DPSu]}d͈D"A:ߑSUp �no@CoL bW3'solm �p8|YcŠip{Kּ4R9Se +Nv,,z/ur>Y4\ZfuqMni@K ,!H u~ރ.;jMo#|�X:`hX4&#I$b>dWrX5qF'|!Vt#t'i+| 6.`"YP1_9tVE܁ҟcJ V2UB蹤ǽd&ŧeſ%ÃK_ |{AN3R 2n *( :f G HK}mhDN]̀aJs Z%T,{ugqi{%*@U/[uVٟE;-.oX}s&Ȥ3KM|2JYީ9  A^UEʛw e΄b5Ql/e< S6 ʑչ1J_1ln3Z ^ԝ1Bߩ鹻Q'hb lohZ�+rcBMS$0C *x|L#jPJiB,d\;Q (7(h)-e |F,I̕(,dIdѽ%OcD7MkVeJe EqZvze.ܳT*(G\}8Jceysxci!ȜH9W*(z'Ѽ iґ]0u*bJ^ߙ;o|2 S̬+uRU/^.^jWQHD@KPJPfEF1Wdm Ȓv%rhh p)QKF$s$vmX%y")]E[9[6S<-tC T8VA!{u2W&L1EBr:*T H SgZ+T@l6/"щAh:i^rhh r7D\T>}ErTAAZA"nm@r h%bi >Vz Kffd;gb6 Id%z,OLFR\[K h9]+q)γ`:pl1qqJP/T$(*h,pzrRDG鴾'8%8VF`+]l.2H#A }. dIAz%E.?nA2紐*vXtS PE>jeL>$7D9bOn7DoĴo3WF :ڿk2dA`캱ؚ0ZZ%}JWTYIW\To *XQ -B">K6p]+RA)o0 l %}e K( ,V2. N-2 `YVŧR|xP<1[zRs-0KaWȥԺXr E P\\v|?<.ZXX)> Tyr T E+3KEߏ,{P D胭 69Z2D3*^f2xRa qY ӏɢJ\%@̈Ś'殺XF'3󶌖e,2Gb|!esZcl/X))JbJ-T%d5=hZuY< 8HS^ل1T(hŢ xbA̤3ZJ0 װYh#QÌAb-F tZ.)ubQ 1U2s2 `YvbwQvX-AYL2/'&LEDX m}VmҀ;'X,Lt4LOPKԓwf$.=(-.u4Pi@Xi܆J6$);'cKR 5qERH);-(=Um 1tϳ2 `YvzX-F<( V^i0WEpY9Le. qWݔl+6S1pX+=֪_B.v D%5vPUMHnֶ+ RE݃zWEv-1R ܆,bsbd0&Ȣk9sg,*,w)5麴2 `YvFnFcqV(E,PfC[~`;J|;װ;P r/("KynM([]3IX*#*+=EEI(eļ&(c6FN P6W bB9)4`Spҭ+ъYX'T'ŋ’6Tlz:&;cjd{,Y R_gg:R&%RS=kދVFJ1(5oٷ<K(~Ԫ+Y4A^hev V16Kپh$ z `Ȣ7lXfŚu I\$XYf,Q(1P<  N:SgR[WTL(.Š@EY!Rd"l)*LF?vtiҢp)&\IA͐ "JZ`(Kg"7+d)A`RR,ߎ|ɟQάX}zu d,,eYiR 8v6y;fWQl֎J vObOۥx^p "PgsI@ܶ %wlS͵ zיe:vu8 ğe'i 'h''nkpJ%A) LVTPs zT&̴Mgaz9HYmӴd,#A=1+E5ZT0[?ܮe=DAYW̱Y=94*7sUb}]sg6+[ FiXdrHO gؾI, 1WZ}I5g#gѶIP.%~ظ(w` Ⳕlx6-rk p*%{u&d4Aq7e!c|=)rHPXiv%eF'^^8=lBM+< xnR.@6BUhS)>t݆$&;!'ua:Yzfyfaz!@\k\,X @GVK2 `Yf9?uH.gy& zA ';% ]+p!!=PeVn[YC@\@YVAJ\Z•5lzKQN,@?Bu?(HUe˔mذHCqPee̲3`R|O8j6cpeLKkXbAUFل6 ,b f*ѕE@ >)@YJwRdedG(ފNXBsKɳ+;(URLae̲*&qRݦ@@eZ~\O($~v8n xl49 $uۍ* mlJ>;&r3+&N,p7+M@9)'/*MHR g' W[/{P[mp\c9H!%ќo"Q@b%, y*jg.] 7 ʏ2$Kp2 `YfٹiMiiOٳU/#V;{oŘ;^7`6AЊ9$W)N&r7=c0CpJ5@h0^ SHc,H ڃfTJ%G O͢`lr jOJdAVu; 'jz:z,VnE{> KRX{t2h+,,A0[fٹdĝ g`C|Schݎ竗!%J)PuZkPBTl#%ѡ -4WZ z'uAbF1g6Δy.,z7ҴEV$R̖)d.ȂPK J6, 䕮"bvb zX<]Έ2ɆXk,Lµ>@1#D_xDn^RU/"/ (&F`7 mELZ_t#'KJK&c_H}%d㏄.mo+DI?>~8nxU !I%<&rKOA7]6)(8^Xl7u}J# hPaSJɱZ Ē,ZK=\TEhblDIr h@ÕF!,)\td2:` X:,Kf1Kb2A(w߀DDv`W٘ b",e\+1Pf&xS DSH'm<{Ozm"pu_MLT1<҉Q6` elxl77Wlv<2C*c*ɖW>Q )27gg`+"k'Bp^Ս>)\Ĵl#Spylp a\є Tߎ^pr,6!:Ҡ-J]Z juɔ@K^;'1}Z }VJe(ӳ6[YK xW!ŋ-y-[fٹBDx“- l*f|0Y#V*E$Nq_~Y˲܄лXP(Ѳc~  GurYR.pۛw:Z/G4gg.!%&kZY89|att5(7Y`JL#R hl7!:?-Wȗtu=V_X@@Iy=lW2QKp,Way#!Cqڀf?#w!H+k>@V,_I']T4m(Ţ8Ŗ4&G֕gsb:H;c2 4*;mLs%rM ؍AW bcDma,!;$PJ,ݿFCTVfOۜ|vK&H q+*CXsh~ G\o )ېvI!KfTPPi]F864-awѩ[8ЦJO@}A ^ģi|z@06lER?n蠚"*]x<5;\pV] pHRV5Ӽ*ҌSMc>4,jFJUhlCMKQeǷ$zNaQDk`r")I,$15RYvFX(CB_k 4g혟:X0YgX(+wf٤^J{vCHYq_oc?Ld*J.ecs19PX,m)5i>vܰ xSiC*6<W:&?:w{Qn2=p"&a{>#ό2hNҺЫk `t0H\sOsn9X Uy+=ꢓ \wGj|s1>N( 'e |xU5=ܟg e*c3br@)KciJ3&{;#VnPX‚b,k7aњUJ V9Ѽ؇[=x'M = ~G~_HٳKO Dui}^p=$ߏS8F..Z2-u6V<֪yEɦDbl3<\.JqB6뢝c} r=hd?0T_zyВkvf+*HAuY`]rfrWQPT> p%2/fTS:9[ޘWz.`4zZTyĮg/YS7v~tZ(*L7z$9暿K(otꝄ*TG;x(PR,UUXB ;q T*/<܃Gy_t*l[onBm~E HY-˲ncd w :;dtY=w;R)1E'*, =hr7<(R\g Mw =G݅"x_ChL-(jl:eUmdUɀ. kXDe-FǺo ~O#l-.<෿t(;/\҄mU+QS]0nMX'/YE7UA4,"rp8NPo\u}+dO^4/3@`G"Ad4[yוb8H, p`JΠЍa8T ɴ*}d@^ڰ~v=ߋtDo }F$7^&ɷEyϾ4iGTU fsJhbl(ϖ<&X%YNN盫EDzҸ )F-+NE2H2Zd4KPK+@\/MknBzHX_k*:7mġOF,K pQ^Jg2+yٰ#ˁF*#Wqrzx\&*;2w`7Uɤ)nyQ--<8o>*U-lioڄwSmEmc}a/^VFi 4Gn{xtxm m;=jUTpo*h.('i.a}ikmf$R`щ4V0{!xGCE8.g%v9X1É svHؓ]\p3TBT)F}l8mV[&QXQ dxDۦoZ#w"}/`\UI[)ٳz(=7!w6`UuL3bii_UKpd^}/^y/۳lv %Yzv<| W?2 `-{nMnhOo'aHsiŴdlt(Wx \y@ [?ؖL=/cK8xI7vYVUb*hٷV7c— \pBbPmXzXp0]Z&_(k8~p?XKolE",i$хC>ϟw{͍Фs{o rm(9\5^bNЏWtb5rm3Z:mbǓCܒƎq,:ㇷKв$Fc<<j~û#[DiPvH\ҁT 0{:ZZۆT$IBba0ršVZ2:3#,.eÕx8)mXpQs6yq^o둮Iv{021}Y!~.Yf}շ/Y|SO e;,ȝ< e3~?WBD,>Q:#BA=a^SЧT4R͟6 2i*zlc#!-{q4\gG#մjV܂5O:è6#mCط_y>+PU uCш:D ?.=g *2>G_jIB}2>i`b.ut*E% 9|lq̌شKoh;\<]Nڍ}qV_SQv 66dC\m7Ο_u9?iLF^-PW!S=8qhs(mWrM36]lg q7$"\&bpE59Gph0ﻩ2_ĮVާd;ǖOr $:n~U^|/1X ?J xMbsJen»?(ק;3Wf,^\v~l2^|,ŕhr:,$œ)9X4|5^*",#H9]E(xsVKP>?n{X}FqJn!7m(~?6B% L?Ɠ@>ie7v~ u`e5hY}wjz`i+{Itz]Gھb}-U5` ߕݠ Ewj mώrve M~ -ds{$!^))J*4`t RޚfsRC.)[B?M_HJJ+rZ.9qLArsݟ}nePk{d5hǢ5EA3@[iY)Q~ ?|>YW_{/P]r|5Jh\ЀW.DmSаV5ExGNyZrS#~ݝxs ~ϯÒO8WC|b3*|/Y]57^=.G[G01z*+Xq~L o{ X芍M#xΗ+?>%$k?'߿;C{/a (`vɊ*Tܛ} 4qw0mۮ/w/[W]z+k|[%)ۏ88W9|χspI.##Lj${xG;z5acֶa{ZU-` 'qh >ϛC_Z{_-8Y')Sj,\)սl3pi+o`eF˂jvcd`/?q_ϿOcE?dNFn_^;f'bIli:-][@UnM/?q =w`nؿx\?4m:$"zE KݰcշzyLq\ K&*X mmpݿ>1[:WҘ-\Ʈ;qe;/'W Gm/F=Kqqޖ*$0(()j>zpp7pQGs4-#`/"Mq^jP)hNv/d;Cx.l˃ȏ>oc?M/4oȗ<_ЁbD'Sx7"WNOm@W޿M +,2k}|>R4s>Pt$7yT=%\ZhA[{&S:d(aޝMsvv=Մ21tg:2xBg`_*Һ8&J"k p bqjҍ% IDAT$.x W˖/6>;~lٌm|0!SKH яړݸ狯knY[>QW 7~ udi"ɱ.%k y6*؟# `6+כ͍|_*j$6s#x{Wnj1rZkhĢUy))HQ,iYS0/CbC=>חrf&DO?d(\nkg(? u. ͌,o&v qs| S%%N#]n,Z-+:7v kClhlX]|/sW*/B}S0&DYz, mtB5?Xf,BInGoP{#j oGO orFmdz=l>ɟ!j\P9GO- Mܚn;q_ݫ7}p-6]plN["c܂9EF:Q8=A$M\?d{NFW֘nQףs5nl`0\!z5 nގǎUQw}/]1olC1Գ_L{+G/?SǥYb6}??0[ tلKy߼Ə/u犅P~$UPH~oHCnMM6 5ϚlTs{Ѿc^[$]wn@U]Q9R&+=|bcjS3ol4&} \8>4p { :rm݀?p??y߱+3s"J/**=x](ל\T6 ls?ol-ZiPgKB:vRyZ>ee쬲@\C+K%RzRsڗcFP(&cݲHODW_|{/GcX/]4mICȭWbv`tZYT7۞mvhwS[߱ 6i?\߂_9#887]^; {p.ᜳ68s;:DSo p\vN1<5jQߟcJFEZY$JBSM*6LNQ;*XX2 `YV`F9ٷ ^VI_z>6/D&Q @bFTO vЏ2ߞd3M>\/YT\.7o ?}v.rrP}|9oO}K'a?Xs. 6 ||O.{j<FP8=m@ۢ*^4KE dֆ$g2A'8#`6amfK!Io'yɓR k!V'KP}Ek%e= [:PSWQ2C':y%unfmɭFYGƸxcr2Cyb'1g^,-Ѽx:#xow,¼,eᙵ`bFe d@l* 686~uRf[4ƅAU9rCr{ IW+2٧ܵ/oW*=SP>x|,[l8^xt~"KT~1X*/ƙ.!ob8<^9L7(n~Fߛ- ն#{ׇyvu~&Fͽ=ؿD-X \U|=S\pqGѶ tkl d)߰u1weW_|8׋\UDpNÇNe骅]Հvǜɶ=*kےƢ{74c`ZTL'~߯c׫x&7n0uppq;"d],e9=0b~Z17_/ob|t /Ʉy%V}E555=Wɜ&bAΆx|%RݷϞYЯ^Ddb 77Sxi~Y[Oಉ p(gD̨RFAaf1/51~iL* 77wod$ֶF^Ǣ叞D" p]k8%e XGj"REf}^~lŚOXuxy $'w \9]}"@EEtgwq%WF5-\cc#X u -us75ehNv%e\JO! c^?#CVU50;6l^;05@_zpX"8/6/Uz 'N߇B{QY0_9|MfhY\|m+<yV4#C11'+)D֛3(KB$תV2&FS%4+%KnOߧJq*vcy{ގD,KkLJtQZE{:NjǓeN8%wr.%ث1|u| H3zLs~_{0+e">c{la;=&YK^\^3[]/m2Yӆ-8~$\a>fc-ey^GC8ܳvK s#K6MF[{_.d-`NdhO78p+qMY xev,{=0w54 0g8]1Ĩ/Ŀ}p#oothTܕLa4JT:9](˘Ŕzr}oR+ >z`LSl[/lI:4;7^,l옷~%i'M"yzUиlo{NՕm쇖N 8~joq.X wZYxs*k]֍2 `Yv[:U/Z0iwx<ѣ%5ڞ(NŒڟ@Uu/KW,DFzqqd?>wbEbH2&6g^ľ>>o4' TW"Tz`38֩ )ۛoI<C+I+*<~^bAmϜ $m{hQ $UQaiC$?-2+:awBdF1 M[x_nuPXr߾z?{ۓ̷ohpp̣Q_serO I&ivw>tam$Yf,i1pE@e n G:Ѽ7/ \p߆Y,W0GpY;:26:^x }=ۏ<;b3׿.)M3$_q t1 Qj6 2_fп$ ,}K2u,Y[3/h5"2l|(q16 ™1Uas)'y#Q2ܶwG}hҀ풎qa4 ̍<̓ܵMd$;nPWʗ2A 2`Yf,;w ,,'\N|8upU,ck]Ƶ,C?ه'{WY~x?2j8IAA%O+mIť8d$j!xJrR3 E{n(R(W-֏M$NqFQ^>';n*pP"6CXd\FC]q1ǥA'lGPxɶOLp3XfۦS)y{$Gu<sʾl^1Lυnq=kz96'1ݬSEX-e:b0X/242bЅ <'ǣ?cp`W/0.*Zhimy7aWqWaE-p^|qsPXDHlne,;]-ݜ揸ysg?9c$o_>[xO̳OScf:oCsZuSIPt"V4g{'0𺃼ߨ4=" L&1EX _"R1[b.lQo_BU *;!^MzBF.ؾEMDdͷ j,d2n M<~m%-G+Qn[*cPиٶNbeh&׊̈́N[eם1Y5zHŋn;KAmL,,y矲7 )N1U1ko{ ٓ2ۃP-µ  vrx, WU){sߵ/>PϤAџ$¬ #)\sJٴ; T]"BA?IT,Q&$o+~^v*lmdnLFv0QtEے*??ՏB`Χn>nzG$`V&h@Œf6\W\ȭ[y!zm2 `Yf6mOW^u;ZC/gh^8zn;4|QFCm+*P[A*(ZT+2k\F܄1 ``:zr\tb d˂nOqKR|Ʉ|/1y|[8"lPyx6rY}g+QTo/y5px_b{+ `.lz.j!gƇx\ڢ\1OE#AޏGyaև 7!b)޿J<㈧o!%~&PUpN,XYlDAw!;R⊛{<{_EԄIb3E@ԑ<<i;&_cQ{OaG.Ƽw10z -K 7t|&򉵪u~sa;X4IU K5am<.7~l4c}~!c.QL 6+ѓ55ڥFMVx~< ø1Qn[Ꚃpl"-ٟ 7b`?Wފu4Ek}>*gq!kYHT:T*5'xbh-Xs& ^՞SQv[/.l1O{_e,-ąW/º`:(څ{)ڛW{.Ywa+zFz\Ęcwe6ᾌX4kn^'lj +:eR̙"m[**=$Qd2)Àpw(P ~q3#q/eJdrOfLE.;n>x|j>GW`.t<6k*xgρM4f]F02֋1R߁.6pd_޸_@~𠢯2eoKVMXB619=o<3Tʈ$Ne̲QT#L&04|+fvZ}_ EH^~0_8{&%lb%1Y=ΚaOIId vޖ8F"}H\ȈXм:_ǯ_TMp[נh[!yRp{x8 ny%^y<|)2E4B8#i&f@f3K?G~/zFcVؖLXdž0<3>ꎋކq.v>Ğݞ1XFYc*V'0bMoCAc`V/|)9}޲Z+k*mde윶(`L&L@"'KA_cwϾ$7 7t)Skp^ a/—&m P5ehRIgL02<*\rmt" d`g~=.?;~ 0PTiΪ(Uh?ƶ0#/>*" '@-ߊ704NvHܒXrxMMH`$L۸mNbJgp8Q[ٌpUU,LіX4ֺ V2?Z.8:v=vcdSq$^C} evUcr*fX_s*/0oaՕ8uICkTs'/]U(^~dZf,mf9E{ITܓg6lNZJBL~l0~ß3`>L!* ڜw'霻{NխU]=QΪn9BAr^KQP2A0/éu@ ]=`)XE IDATAS?rGŽeuU,P V.UK. b:5 B˛C,>L_^va6mnJ sCHp&faaw;\Z7_an#۞3D St2ӉnBRz=^˅7)W½y ky=~:gVV·Tf)OwWMx21l6U *M(R36lcxN9Nz9Bm8z[7Muvf %eT/1nEP9|azYwZs ?oV9Z=]MRhZ Vr a9xb䔇z_n%6Z#:*ܮlL.~lxƒ6>B_Mm~Jw2rsFo+jTG|:}bXwH=6bs? Xcrލ `ac|{d:vە4{.7t|vl/~&*st R?Of;D͐QZ_kUZ|͘k*hi٠e X kY ix/-߽z opC XuC[d t0`pټ^w;V{V)%QfG ,nܧw5dSRy(kEe'<]o|A;Tm0#puǶh0T zGN7D00qr K*#.3:@vi=|k2X`rbJ"ٹ}(C/W!x]vu(ZiЮrӟpFw0LVQPDB&~(9 mAHƧ1z}tbg>>2 Gi$z+\r2(l[DJ4l˴- MO&)B[g]<ٮP}*,`X?s)=D9=XԾЀ ʀ\ Y\@"df65|扒$>7^Py˪C9nTg5 ӥ?n Aj/\oBm!57IMIPv-{!xj! >U3DP4{4I (ټ^ojy=AFuXZй8 >sf⓬ x#+WH!8طr4t.?a+Ƽr1fQYKW7a@;)U4&Qseh ҈Z(MiT"g`ld.b%wJgfa&9 "|j_IH,._ݰ AvZ޷86- jo3;o/ ⤬|cs*Xj\qjz?L`tk3ƳGr랿TD:Hv^ ݱ9QA #'}>G+oY \ zMH7mm0;,\w9pަ%dqe׳SYXwA{xaݬmc3tmy>c9n+.Jk?Ba&(aMMA>R.[,YȲ4N=d<\˯E3>: ?:kY'0GS-_]/k};azz /{[`wSg[nر*s]JՀX$ld9{Q7; kj:G,"INN>N `u {GvAk{\nx8ۆ!t<۟~8EpMk`lti`)`9mv>2 dT:N? l]wB;D/¡ډX) h?{Qn}o b +BvלgLbaM<xQ+}䒔 wh?,`/'Z:?Ƈpu <ffcQKTǓpoiRQ.G9Oh ֞@k1\up$C7,_;p|+>~ |q񿫦Y WLU8,`il;eN@e r;\J޽߃=< P Z(BHj'>w͇^&=K+@R<3/M׮|Ca~eaGOWyEls '*U+p5Z<2o .#0*.Jl~`/%.kn;.ax1u]X`c|6J a ?4ɑ8|n/o=x솙Y0:ܦa.S> ԥ0;Oj'?*\t9\cP?~dzeuP./c= 7}&Mos!蘈W'M΋6X})5-`whJ"\Jʳd% _~;ok "76JqۃД` v֛ˮ_M5 {yjo~\wi]8}BzX _'࡟wf*F.S `=aN9lO|B7L|g0/~]ʹfjq\R$%E\WeGfmm"dug 03}o*=]2pB ڡ)RLUs]]fE)J9r>7] 0;-csy ~U'u Xq1=c|Jb& *GJO:`]^R8 ;uTe𹿼֎0L_+|m h+'{S(T @6]LȞҋl}YH' wh^~(,^_KaE=nyrb/!/Cu0wmݤti й ^a9P;9v[(t/kge᨟\Y@lh.|_Bn~ v n'^v^gXT&K_wR;ټO?*.\hؑ{}Nػ?<-mͰ߿i-: Z zEݪeլ5܇ q3SoiS}pvNKO8#<$it7Awsk>jۂ=׮+U\|J 0p,ݷln,]NĒIqH2=w}b?Š_o ^O )?eRP,ޏoMll'L]tlB ˿’Uwp6Km#*W |)*—$rh݄|Oa+Xu"'X鏓,ȵ˴.m>qs,\5, RBdsӐw/\.Ν&ӫ\r@EqVo+?++@JCr*7]a)UFn|m|:n_7q;~ 4+*05PJBTu n =?>cxrIHB%? o>DP 85M ᶏ *6|S?[5WB4\ C/+'_Оa]"OoN~RXw^wΧvm;YJC.;.~mX,o"lM4%]2ɢ_WMϡf$_]s.³;_녃)nѪ; J:; `rMF;U7{?_>rg LhYval>G?"co_&Y'$w\9>s@ \NpzAL]Eae4 K 8vpx6Ekį9қ}}/d%2,mVTuw^eR1U=944/KBB]Ջ|)<jaev 5&ZZ`grn&.BNSD6qʤA:bAI@*#B#נ'A?`;DdB}8+bCk-Q(38ڍ߅4vjC!w;߁&W\r \t1ln;gqM+p01ǒ7ҹ1"L@a$~)9v: '_ ֵ"X̧ YHa;cbo響i),fг>Gl"wCna~ʵD`Y*at(F@7ȥ Й]wVbvo?O<;/ N ,^Hò4mѥBVII$I=4T47?6^ao <>-w :Rq%y홚t6N^OG遄g@O\~r亥Nzp 5y2Oӿ:GvOy#ʰ\4y2|* 8"Ďa)Gp-ݰv6]e<80N$I9grt6ެfm$B.@Tp:*Reo 0BMjy>y)@oeP1%i3r൛ cij&/ɇቇiz&tB\r dJ)la2 ^ZCYvSxKUÁ|0^PcxDus} jT "JHj`+Śo=wwS Ju$Wgu%'t˦#;NBeĩ˭c;zI)84&|pwd䠸Qp7{>O}B2B)ҦD *O `T~}l{A B>pRDB¥׭&7T #N*nsW[7/I)+}]W`C&qtlUEwէ} ,zKMW!%N9 ;*8re&?8D۰xE:н2 (?}e7ڗc)(ˠgB8Opb8ـe; `I UƮ}0`|-'nFJ\V%x]߆ \E"MJ R  bCoY.wf(υt `Ze5PW- RLWx$rg|%@;8 I}|eoȕ *IF/TD>9] D7˥u^1iIfqhSvAskb` $+Eq5LܚM(&R!.B.SJYta G[A|&P+]yb32~rQBcz*\+@63* KBXt^ʠ/e/5x$^)8]7yN*.F^S~`,ީ*vW\7fa~vz9pۯݬuqJRrj{ag֟K`;^ @ Dd#X~9> ߗ9䧕aL) Svhdq$I]!K@CcG8[AITw7V# -;`a 1 tw&]8އjDmmR-GMR-S:MbO|>\@:Os,SU/> 2rZec!_R0w )rk/\KQr Ub"S;y=n:Fzak^ۓ&oh?ct=xF:yz*vpe(L$m?8iB?-zF4CiP%B*25CzAtRTnn`lol˶w8`)#\ 1!(e~V&XyӬN.IG˕ (2BB"VQg. =_K2B\W wLUA~R,y0+%KUsQ W$;#fr @PITw ڵՖ1BSL/a78`GWtJ-T­KLʥ[h>a| uצ2Ѽ[%Up3ݬSVv%nwikgeC;_ɬ/kb12y~rLmBajQ"5 Gvo?[܋@&Um/ޫH:r+Djc4GۑN-m3}Dx>2 lo/ a^2-v~BY=\+Q p3yTزIEՅ[GM:Qm+Z. ^x>{ e X 0EdT1 T%dO2W}$n2({ k^"|a!;$*TiCu*!9AFTPx&!5tE IDAT)07" lG\CK[r%fXc3r@8C^DpʒLݪ$6I5& J 4e|eK=@MrJaJ oUe։܄NE*8 Q:ݛM'TozO^IJԋx2Td'I0mr4QYG+U ]_G 7^/+eI{0\HJoIp3Ws毨>uጻa|k>KA"|A{X缋/'xj fmoB#7^BP}›DpI{ KrƿKG &v$Vwk .I`rw>Vs/Z ^^{> Xr.4wZ0))y>J˺KҶ6ɀMI!"n]`\wg8< UbHXY 3Ɨ ?b=A6U$5{?,$C nْUr7IpS0t/Z >KXfX/m5n?]& B<\k8xWscrɆ4_Ӈ`aHa:psIV4d=l9Ѯ[N= ePUIY-,YL\V5ǐ,vPU 0.T0a_ـeiQdyBp¿%r`%Pa0tg]s:)7{l` pg@)$g7auZ0R=YI_~?`tѲi=y8!KQ*$Yw2t&Mgp+mKA߭u0'/RICn#tgU4歈HVIiz,K1PEʛ O}^+//dXV25 S095Lő>W_ l ^L.WήC Z5:G4{6l O,ل?hI+o}KLd|5ؕF'xAE48Ft" UEǷ=NVI%|. `nx/ٮGl>@4!,e3{++{\~AM|4Ƿ x<`狆if R3 45JT 1fK#cYȤdR8$B `A^'uhHƔ\AהK= [20P2k,tug; ~zhk zNK{6]MVhT 6k+I2=Z_\Rdغ9~~n- ˘S+ ?bw7p/ڮ\' Wv*4c,/GJ (M f;Zy"T*T\i~FBYpS .C vʓ8g;¾.h ,@7D !i䪨d(Jkz\$(:Q‰]d]BQ}TdָܐQRd+\JX1ηl'Ada'ӹ8վ]&*Isp3mZf`@ :0źMQXLY=2JB1kQ3sii(SA[ku- KǕi]Kpm*19'e Bv$<}W8|i}Iٲ:_E,= U*&WlqS-Ȯ J7q_Nj\Z"{Zv-BT()v a CYxU=b'cd;~U,Fɟ9fO:4A ^WAU\AJBfvsLsUqo 􄨓sWoX ULHn#Q}Q׏eKy$Y^1GMݯ2V^K' 7Zj8,_ͧ<˔@Ak6,Kŧ plwND~ԡI€! WVW,<Xwq )l{3E=I̱@MB%vl<gZb= 18h> mc-)ʗa}EyaQ@ ]ofƧ CbE/$;ێAD$L**LnAt\MuG`DIU3W7!fY4\)n\\PRjb#I("Y)XZ/ F><%B2/s$\*FI 6׺ Nz1Ͷ9tirrz ]Ň p kl0E󻅴 &נOeE\ v}: ةv/UsJ`ƶ{WX* UVmT╃ yq>m&0)pƼኽrzEjdGu~'DItTI 1+V 8 FdFTKIU?*&t(%Gb6LɸP Qs |oFexj W-RmG=voY?yh.)Uw3DXJ3׾qV7X( LkPһ%`%IIhE8R-ː''B4L=e*+M5B WNtYgp,O[g-TvjuA&8P᳆WTAeZgXoK ;[zSlp*pm:' 0MTlPo ]A-qO T ,W3a7,?8%y.[#x.FNopCbI;'b,T,YQc1:ܓ C@5'cQQp5 T CÅ$j'zמ_2?1U [ƯD K8O.!כ-X q\r * {\zU*\+z_`*!>TDEf݃vP *,N ik_6`i2rT< ,/7f Y[{P'B •V{oU#RJHP0e0Mu 10Ϋj䗠VXձ^b+WadFtK@dX!]2ZדM!XW^8 J0D^&+`Dtaꓹx8ʰݯ/kPeRdtZTt>Eryy)V{m<[_N%*^.oT$; 80).eN]: 喳^ 0q=W+DpU^;,grBC3F#FYV*6үF Y]zR"̌RAǏ%eM1òGXioBL\Y*`| zp gd~ TBr@)^j]ز݃U_v,['E##A/ MJ(YQʺ϶9uӲXv񋒕 $_̷`v;BnSv{ )qW\IzZpY n@]Z2,225g&%1qK2Z@DuS!t0Yn!&ao6e/4M^%X*]J>&1p)Sl2ŕ'3H\Uz+3 d =hi) WZTw,(UIUJ*Ha\}JLOߚG)fWxR̖ZAP"AOD|^^^nG k:x pԗRNFaT sTԬ]?3Ӌi Yh-~x,Yi An8r;hVؑ)*NN< |!"%%?<σCI![`;XbANU9|aL9r_]оvZ2hEU)&<Hb_3٪ @)Fkms ,(6:`)^'`I8U280Ih /tXcYm-.)|)Z *ag *Q%Ph<΢[`Lް돃dPr@as0)bN3XrŽPJw=C;H^Er-DAm`%z47"MahjB8`S j7+ubOMŲ0b x0'1QR1jB{o h1M,NPԎa`* -WS-\uǑ,!vhe0!IF`%{{a*VU Ǭ$Ycix*zzQӿClb I!-7 Ux>w 2ѡKtd/W:YPA /f[ktO_3D !H ["p NA4S-.FYV KT+#t).B`))ս1^ˣt%+lPpbJ5πtfsZ{]ן*T UBA2弒Mh#&{ o Cvx7tJ2j1 ]Rn=c\*TcM Rq]=ʏev!d:0H`^YSJc =twQ۶Ly@)W9=*z |Y[WNQU*NHUJx*ZhYV!KV(7-\$Պu0!/X PR*%ѹCo2xiQ;IqV/ dSEͅ7*տQA5(/ S̗%As %jnO{0MJL_UMcXt o;vny i rbUuS#˶R=0B s흠~ZߡzNrQt;v:E`#*rI+a\)hcx:™ҍ- n_N%HtcaatɩX7/elG){UX(s,- Y> ->}\24 1-$ l \b!z[aTf 'EJjY2AD#&0>Pfd\ZXT+TZHiI d`ht"r Z8ͮWU]K8cUȕl3ym6`f[,;\'U>V^RD.74OU,*6i*Vwa6f`&AB9Y i[TFUheUQͪZx7հe,Cw;<ޅ:te1. BQOm, B 2grգWUʦK7po3֠Q,en4m|ի̎[I^].hT9Hhg,l;y\pASG{*O' x}Z/u*9ž7}. How2pd,l{fb٥;q8+Q@^ݫB yזi=5n"޽I8]_!P@M ;;w۟Bs>_t`Q#}ݟC NjfXi Bu9V:}o8=VߗN652]"/Hv<Cбȧ-,*(A /fYu^;<iR ZL@ Yk9Îc3Ipyϓ[>0Q)&ؗUF dH\m S8=v- )¾f|ӕ BwtAGwRk Jز[`yM{/ nXGFal0A1ok))X_n2. d]Vn۫պ#;plwy|_l057A!_jNvi_wK0t$'nH9l-ϕ!5P ^{"J+^_Ʈ6@pݿ[EǦfl X,:ܳj_Ota}20Fcw :ǵi=pΥT's2z{uun>"Z:}ijͽR0 ( .Z6 U:5Fil DBvT2vxaц2t,M ! UN/\pm3㱰C:ֆNkR?NͰN6 E]N4R 7a9КI1 mٹ8gSsW`SS tU-Y^X"6l,edmO ^Z=tL!EX֖]lr c;8CB& V_Z =k†b=H$ lH ^<蒽N݄wumN*mX06Jbeк`]w}hQX z-ںwA7]as/o؋\ᄂvDp*VGr}~%ԂcWub} $k~;7xhbmm6`6|LKRuc~ iM^iǜbONiOX'iqS<)5Fs^ipCńsMAp+[ |RF2WcTX64X"K# m/i9k*ɤ,$”MUp^~dTÜ%k#h%oԆf M 0zP z)IS23п;up?K î ۀZgJۆ n- B>S/Ǵ-EA8+v/̣Stp[op0VjlPv ",X TX'M-(w ^rSho2M6װ[g9Y`R!6BH;& vvnYoe1ڗ#m's*.þWgi?CM../\uW'Ͻtc[EWxfЉtb]O= y_'< /I6ZfȗV\9 Z)vg] kL[ѣfmok4rз?A* vb8mnj-6Uutg^]>D5p(E fw;޽3pe3^c*ZXdzծ=QIj YH03~Þ؇4_!BXNH,*B@ې&$X?0 FoJz}AsqcѲ2;)}~0Wу J|f0E8?B ߌhuXXoŇFL+ҫȾ?fJ4:Ġ^5d4h/`rlO UIn5qȥKr]uWGvga(+}t!(lskXt_B/4>3(Yu!Ǝ!7tEX<k.F%n.({`TQb*0#.e`y5몕R'UgÞ֛ԩ֮x.BAܞac: &X&BG Y[2#Ovi&fdہ+R`R. w ʨ,PETD"rGa,<}8omS}Ge#0U,T.C[R).h;UU.߅AxnP\ Sua~# jpY B;P01CXZA˃fyp$,)k mw:>Upۧ3ց LnPX!fb ˭sYUEFѹxMimem&øo鯬^t':Ώ*yvtW{}u_1Mчx~(a8UA Sf`fJI(7``A7e.T䚢Mϙ;Ok>6?3E# 09eTTeFzJ b`5>W6+Ě8 % _|&obް@YlR2T#☴*;/f 7hJyn"szֆ*Ӂ7rK+ $ ,aSC/a2Qa:G 9KTLWޱ@ۮ{~DPfcYJQ,^ Vj+ZS\sa<]M]v 33#C* ^|aN?D7]ldG);iwkـe;pDZ[ Vo7"uر7懒 W(.7d)xN7sgπ Nsg aޠ ,sl(I̮#X*UqCNdaBV+ P `M-eY'lgu*l=sA l%ȼŸ*a[&!8sSn`,uNBhADT0uBG(^~t, )gϫ1; ;b~gK +Dlg6S̍PTa;S#; nMi]բYrvKݺ9FܢG2-r9xEҷf6EhۙSO:R' bmM:ȥMp;)X1Mw3SsZ׷Roꔆ>R|bf?y'E+ MjB!5ה(tX1$WYy>1&%r0E-`̓۵,JXT5]gh/tU*QthXSt`{(Ț:7↩0:&EU.pYb :?)1o<I1Aѿ MҁXϹf't|-Rdcչ$ɧ~Z.]4|MQ0"%CH_= .S0|ϖi޿(}<%ma#g=5ЎNM#.00\`zΜeCppAU/O`{-FPE? e3 K`mMy0h-l!ڡC/Rн$zјw}b1b`j͋?j_䧬<~ !dz2n3SʓVgaO8z,&(jA<(fL ʨIJ;k'qSҔB90E)&xitsLi$$NX{uApPNt!IЈO=0;jȅdMm>hs<p[p~g6\h/^|gdc]lbG;Jе(D#BE)D~wSچj7$*'ڨa)OVF\v<c0Ew@ꑦz0&iAw<7fCx,5P6iвsDcu*D5 ˣ%W8ғFEZ8Y @XsEucΎ('] {<9H' ۽m6`DXnުԹf\7Cf.YÜ ],ws,DIY:0I Ϛbdڿ1c!4{mf1- I86TְHR?+G#VFES; OKQHIq~RTjf`-Xw' o~>0{Z@\(YLs`T+EH_7ExCyĢ&#ClZP:' ձcB|]SSݕ>% ,&r*I'tR*Э|硹z8vX\gNE#+Rd|8 9T${s~B}D :$fsClM`z@ JN!U,WYjܺSVU#d]t}`n+>m6Pb,tb3˫Re.KdYT,frXBOsƬp9Yn ڨ3$smF1R@s@ )Y`' 6\5ZUt:jΓw`XڝgZQ de P⪖o Xqpԣ+ș/dYXV5okԉX)^{Dmک,YrC90Ic" $fsz/ׂ-3pS#3|dе'˲e|ˏV#%K2^\VPZ&XR74a!j\qJ0xl:!vjFW'^5>TQ`-(>oZـei4t{)h94uB&UDU,)xj,)t@aٴEapZxIq(!R 5Ks.Iu++Ҕ+A r=ohNGTuzZnl LT̫2n5 *Rٲ ҩk籁4+;(bG1jfm̼82-S%y&U˝A ae/˸S~2*UJ'.PrE ,bNX/ ZML>HZj~ nZqJYZհ:Q+0x\۬UQ{ec \2a+#IN$pFu, C0i%'~2̇,酝*dHlͧm6`NP$Lp niS xf4=x,sJF Շ,rՐjz@$Z͂*a-BDY–,W{N-8dNtbcYM[rBD7ƪln!@I(:ALJy}APڪs2WP\Ncn9TR vxlzxa7 G?@5_tٙJP.U`b(5 IDATE.S,0SBӵ+%C%nCI2vT"8% .:e.\k0ݍl1ւZ9p X֭cm7v-3H(ÂeI3,jC[8Tvb.@?*L xlٻx7ܙ=kE eHD!BDZTeM$!Q))d]=33gfΙ9]~Μ[ b ?PUH P;Ŭ/"+B͡\ILT,{_ =-W/9dZP̱̏p.9ɨ7ch'aG#>Uz~,B"09a*5&ƊˎeXTE4═Mx7OdDZfd#O>+}-%9J`EW k_gq&(@(/K EچlPE/MY{OSdzwbDmϒY&B5RN:tK*܃̖ RR9X$z b3%,+8Jp LIk%{fJBzϥRRVeq 7jZðBDP|ThR(F!O8d%gD 6`[;-?앻8ZJOeP/3bEXaV!(تx%@Bb9+Kp)Y>/3ǘ` l R:07@+#RTK})i,oW>YKIuu1M|줔j=VNd rZ t,J )\v2Lҭ<-OK@b!(X7p# PY䖯Җ؀ܛ 䈊g(^:/x6272",QǝP1ĜRX-'89 ȹ.ge1;ypnA/J 4Ss%eȓ3o0VtaR 5nm`L݈il:s_**f@<˛?6Fa(:bh6@d1hD/EiReΊ]9 %bŘg!cC+;(+Rjpn.r6`^GlM7Pesꌔ *9Ǻ{VL;k,UL;XRmKObJTѴ ƣFgmJbX_d׮E+U&GbbZ^& Tw&o%O=Y8(/X,juf);PyZɗ]K;$\d9JJ:jb@ӱW.`aEQ/"A0+T,f5-˪&z{ll'33R=t4S|`Am<\'Z,o2msX] p]dJ(UL< u|4\ƏrAeIms&i3j|-7@܌t,Q 6LMMs׼]cI)#"A(/ ]ih؊K eI1>LKˤx(X)DRQyJ]" =L6`}ĵiSTL^isRځ he,ť]w-ɀ9a)2Tx~ݱSlP >g VJxLʦ)r\ OMy}P*R2t jgؤ/0Yp"^+XVHU)A8&b$m+i锈T"%!ZY'r . Qw{[.f3c"G(n݄j@ ܱ/@O큶\^vt%9ci2AC \2[Z_۽DlyLoܝ-B}*A/Z =5ΧF8?&eQQkN=erV!*\ͯkx~0ʱ-,-R3¶DS`B'">(~ͳ'ET gA&ls]rg!ffϦ2Mt*jqbr1F-QǞf~&hNEsz; J<iTxvX͆}lH+o8!.I㨪H r!^OGV *A4 4 A: A#P'VfDPR d$)sbҟ\T@<Ρ,f%IGE),)_lЁø)Ďw9"<|.G+ zQ?{e~NX铗h(2BS݀"SCltKĥmR;;u-+O+G Z|g6 LBz&wѨ!<ǐdyqj"ĞIG;"5΢״6HPY ,"ޠe)PC{y$XvwBVTK2**&fܳX~\A= S\QO,grwL P`n`dT6pXڟWG&0P,_dVJf /DX"]F52M~#^ l׈3.>|a+ |GS=D[K&1O,]vZLzYhœ gR"~Nj @_v@'(&wYU z{6R3,̌wz:>{:qH\o d0^a>KMFKf|2_6&,F2膨SE犱CCES9z*=ȴ zȦq &q 7rP  \l5{re4Ch%kyF@Ova89Crܝ3V`<m6RҮ;7(񉖐+"R9鵸+Mۨ2Zgq,1_my ˍP$;[%b#l|R;,OK!6Z"2v)$Ec]vQs<~=+ໂˬ9+M̤dZlȕ׹I,{A GAtTAcBR{M{5ytv"!oxV-]N=.cWbiaVX!vUF*e5)0U#g}\L]ۅ '"jefI| +̴ M$]k\c:X l v{ر\bڽ @5Yb ƨ`> Rʑ,#*膉7.b(a~ *U\7픝KnYz iad m[2jՑ$\ 흆O `MokP26BFP3(ۦJf݂̓F%KUHFĠi+?/L3+ 0 sf\9(+Ȍ9IY g {)FlW'!W1qGeyp[Bj!&KG*@`ȧ`JAFY<ڭrJzʮ&14mhb?/x*<KʻozjVR`2aǂ V}Qʫ]8Zy4`(i8^_~Rg\nibXnHv4=ir3k% FLWv +%; l,E;}X럿ekUrԉ{3|ߩlM;on`_&:)Z]aJԠiuV] 範*20ܩ7.AL4Pb"1ԱppL!qX y,\]hB'X ( %$S iD2vN\<2тʌ 0TlQfEbw6\)٠ =N`5jUfGu% zMdl V2-%dU!ťfX"\g5l-Pl؄gVmJJ,53.L3(=2Pu3Vٙy]Vu؋&{Iy~Pz}>eEb@%h v$K/0(nt!x!6lgqz)6E(bF`2'!q+-L? IDAT`Bn\b R mʩdN:=ݜ~GLdYX5 `!n@S`! wL(cWd9x>&JMvu:~`p0.L@*,dz[6%ۨngIۀ-6ܡx!Z9)x搷2XV'JUn$v5\R{D2D {LNkLY8ڀf?쬬,F@I)pHA4lVTtAp>k޺.W)U@&"W%)!+aO?ךUQ\`F,ß샱e')c,59=1=l PpL(s_(+P ʷ@Ak- 8+Ѷv>o +mpPG2!1ȮA-B޼yY,G:vA/ٷ.JLVrnIʗp"& a4N_M,\`V,jׯjG~3^3}g90R9=vybac_A?c0Vl\A׮ݰ +8D5lpZ 5pHC%ΐL6BubndG F28}auwD@B+Gi7iN*O9!W[7Mv-^7?;([e@ߞlכ : $/vWJlaկt]_Fv60v }i :݊Ů(5;ZGj;m7&]%Y}0^%„)#f0`e3!l!; .&i0d/M4? JWp\U/_݂>ZzY6qڋ0@wJa ڗ[/8A XwL1Z3v@99~(S_[gmXsw|9)ycl}ظyAڜ+^NÛP2Q6@yF '@v>Ms g>2!(@an`jq,oxJwq0p"ݓMXK[K+d"=qVZrdE*cPI4-C#'ٲGIů|Q'g)\4S$j-)X1% *!.xxE("Zl-\]ec2_ HkQ6~D] 5AKyn,?>aG^i6?oZ&20@R|EvQ8/C rx| R El\LTI`Q|QmirsAC7Ъf:m؆u 01R`WU`3,F&&܄H6t݁^,V8\CڏСd24W HD&ic DkdUhs^}ebȎsqWy>!upZ= `,ifs* Q"yXJSwa] !@+5[  璀KeeNyjв]2p4?(79^%E^,dGZa6n*]?={J[;4bW.%KwELKi"V=ئ>gSPez<z^֤yMvsś{)9,^~ cTmFOe֌hSm˵K.žٜ9'w+|{lɷe%ɚ?R6ۼ;s+Z{쿽ǩklu߄JM{sR2?rƿ^WNa |}|Ϝ'uՒ؈wyپ]Gcj*LsE:`HD56 оy[`' 0pTǶcz >ͩz|=Zr}ԴTn}8#0hn lЬ:k`-ҿ&!vgWSUS/)*/}_}t >٫rE̺g[mhߥU?-)oڱkGT PUws+V|~Sn +UUbh+Ò?XYZva ֡k3ve2uOnc#_*,Yk=x[*v'cz/ Vw05B}<ƞR&,Fr^<捻\ex|_Bye+tTu+ hIφ=fK6gG\ F#CF7`ՍO Th+. wD8OPOT5A{ 4VbW&}٢5|뗡_`ةKO3j YV%&xdawoG(CmRTh< _UӊF7+ݷ}u/WL#MF9<'6"_ ++c%7Pe7Zu XJ VM ͯki Ӂs/I#~-)8Zu;Xc?3t 9?cdefQb._NV1wcJU$|I:c5R=j\>q^C}v% ;Os+eְ)Ko`)/ZGK6`^bT q"~+xKjjy@so/QLM&lncVX1Νv|Cc\Q{T-=4j}WBIU}o~Q5M;jzKkŹ $ѹU3/1u}h~'}fw[[%_N֥ ɬ[둪:DM Iu] c\̟Rƨz㺳g2q1\Ġ/sj}޲ͽGJ Jtٹ5 tﬓMvۈd.GT;s'ynQq0o=um5@6@ΒӴ6ä$Om|yq )u;>u:soؒ PI99u !u"D?e웅?QWG<%0|ㅏ7]dfa/މ5~&[l MRݷۼ~#XUX-K -JP0^븢7d_ԁ|) P_ĕVr)>j{.`_0+S tO"Rj=?[&x٘9h?ϺiEӬfhRdo^AmMg٤d;~Z`8`?/֯mX'&N{=pDW=ﴅCe}lpߏKwp|@B'$FBE_&_msd6}˄iؐ~S,}S4wRZP|֟mH]|J64_z j{, 1&McYq]'/S*[yQݻ0ތ;ztߞc.cc엟vQ?b[ֺ}#7)zp%)+_#+x|uc}q#t7#p/19| þ$V,[=gخ[1~Wӥ~-]w\>}_zyPHYSVyB ٥~@n7~l̶M8G=8|+٣w>}ѽ菉[%wiNQ_uُd lx-c63/dwrK!>f}8A}J +,V@;oaxF'ԳwGa?ր( |nֳ_ ¹ XӖ< g:f4 FmX; x2r{h0mo-ٝtp ŀ?}kaE2譮Tdz1Q6;z M&ݼ?v}lggou-M|?sGRtJ0[߇٨w{szΖT`xr\M8lIJ ==tFs_Mi`T`tR'L|MKE4V5pdWM f 1sǻ>mungc}vl$J]Z W\=ڍ`_~kغU\̬v+5l;_Qז " >Oa7W ݝx 4?VڴCd ,ZH 7 |whqSg[9z{t~;˓!=z(EZkHs=GY;6~߇c?|㜾ڳ~y7GݾO۱sS'D?}}]^>;#ǟƃd74a/OqҐSYL7~1/?ٮ7c-͏ˇs;#9FR/|-??GjP~']yA0q,O=0Hn F {}Ӭ{̏8ڻ*)!LXUhlܔ+cq}9b:uo ewn=V9bJb'1YC^f,ib դ/Svh:]7t|w| t <\Tʂ#N RL/8}A{t`{$姫h_<8u2XDZ-䰠7_Bl5R@`; hjWUm>cGq$l׎G_\2B8L<{[!#'=K ӵ|З>q8cogYgZ1}ǁQ]X[KaD\=xZ3{H*:'׳B^9f|;<\d5ma+DP9>h&<ވP0~z2qߴ=6b F(?U`ZBoд: P|ݭo+`k:u\,M9PÊ\-CLpÕb }l>WXمp6o]U^<;WsBl`Rqޯ%,nq8q^9zdδl`tnD Xec2t9FMgJKv$w0LEߠ]?`hLܟ7젿W|s]4Vꁀ)hxc1+ (dU(E9WBܵ1 +E XAF 1 ]K0}Օq~[X|q;fgVNoSH?kn2|*;.nc n<,LVY 3>\N`_0WZ`zv!rrc&KK_^UvSon*[#:XLrZq'?tU[Vv,-&3`wzZ BwcF}=V0W'vM({mex,1'M^zI˩'ec_^Gcݠo H q%#XD@)^@"ήXB4~0Ϡ#-spqE .#ؑ-_tEh>,9*~$|IX]aw֯ l!'ٵ =3 ֛ȳxz$YeovĻ4Ap-jd`P6ۖ|ۺoV&NEaR0#:Qq(h?5V U]Wۏ Jw4E; )+My(&:I?W-HN5&;ANi# R\1#;`zRQ^ / ݩGsb*`v3CY¨cG!vl!AJ&O^+1XM!m;5܎ \L8N2R)YS )JUq;Dϒ!KfOy? bV"EKե]V]Z]]w*q\`6W˹S#"y,$vq X6SWؓ4wVSuU# O p?{7NtЁσzHĖ)$=ʮ]q̯9t9*" [ɌH8>  \r^Pey:Pg`A,-rPRFp?7 }K{ʥ ?BA}'ˮC!ȧVVJr). l"{.J8a&<_pP\{ŢMtVZs1BJ1cc'f>ߵWt= &K (;q-Zc I *\`R,&! `l`'r5 p;.F 'Ͽc#&fc'?Ǿ_R|pVNZ0XXt#^D+>Bm W4޺o>oМXBZ'(X½ڱԾazq@QDAZ`#Fi/;Ȟ23>Dj-/%uj7{I$bWRp (NAK%+ 2 p% ~Ǽ>{έ\mE] ~j$`rƝ28 E5Q 1 (n&) I[o?P]|3bۻ||[ōZJ*^D$ZwN*~&HD37:+c[*Dq)ʸJx,p4Fk=X5J}-f53-O?G*(XZQ$]1G熽 J2og\ q4xV |+JjgjVyj@[>mqq0(0 hKb10k~vSu -@qqve)fJXTSf()ƦRX-.3P'8s`rr #ܸxΛ?Q~YWfOp7hz'vP+jq\FFZV[ۅd$ؖ|Oؓ*!c ~61m?E``_Ǿ1,iCT/^qcOӘD[1 ^xx0pώFJi/n~ğQB ׃TƇ&_ܰWH4ꍽ^oُ߸S8˪^[6ɛdr{ (y9ZtX&q&PE+vdmG2Cg7ف'5XK؍Aľ\pa̱sm]To iХx!RX$&_zX@#q_j HB<%õWzޤ'L`tzMd'b]6ߥ^ oҮ`b9Їtm+Oϭ IdR-ETK'0LC1l)i*e"W{4ǘr`E,0,p ܣ+ c7ɿ!V9k؜xpUGm 9 toavxvaƳ<ʆ(]%5P} Q-o"!D 6zØN9Kx7PS{BU^J'ZldOfO]IB&@ P@w@wsX$mDBRjվ{ŶB/.05 lzK!;ŋՂ,t`zmh/lv@LrF(? Vn];#5b& uZ~˜G;fuLyکʱM rN:11du']2ʠ41:Ưj*b2KᐶI!Q{k&|[ڳ [u"  ,*]YH 8!c88(om;q*"~Ւ͔o{bA$!xđ ^cs`8 lU- W_Ia|ZwhKoUK~M_971\.?]:[P>e2ㆭ`!V&XF9"Q(ARU#\)}eUaC!\~^y!:p5~l/~,t֣L\(?! QBy#>i]VUlϮ쁇P7%sDKd=JsЊu4zɻ\r𘮔zDqFGvG PQ^jӱUt:q1!(:E=ݚQe+*Nˎ>?)&s|4epKcSYL$^dA6i<֩TV( PLx_Vp`uٔJBj;sj7s @ٮo}2)9|SH: \`J>XXo\yU5TGŶZZ]BzUY߯JerlW7fL^AI';0v|.]Jn\EAPߍVQqfD ýZq֪}}؏"8Ʊß"WVX*娄 2l'+T?譧:g7sǾ>]D 3|.,`'_O?܊]z5<5Va5S PY.,+ˋ|3H E KL 9?aCu7pDƱM9AZɁ/bppߦc26NlFG /@M~_Oygkޝ1[y:71@>.S8CϝJ`тr8Wwc$p9'z4xg39A",0O11QN.n}"7)(dŢN `` עۼ~R rjԇtXK;\?h6p+݋J_ RHq_iu r*t-7-@V { 4@QaQ6Ĝw!gAT +ТPzH3M\&01DNBJN x\Д%?"my d(`d0ْ̟ hXq5*:\÷m! TYPSqVX9m_;fb[%E.D %W9xLYh\|0?kܢ Jh-/g}Z PSnpOUbW@3VXU 0oZo(Vv(  'F EE;!Ϛ[غ[)0w>G1< @MTvs1#``L `r>NH l~ @! [o\p,QO<!@X pޱJGhlZ wPP}΍2s } AXUF|SB6=Z$APsY@C!d/$':XXOeY4bV`PXEꊊwZ8{2 `*@Y~`B3`g!(] 怞XJxjSԾsX<ұ1cP˜ٚ/>Y)閣gp5 Y9b˿ɭ-R$j5Ƽ"l%X"`mauXC?= 6MKZpviv  q_0IX*uR]Y9.Cgn k0$@iբ W|=ܗvr`QQC.X?Gڜo-El7e,yU֙=x#z&J|Ʋ (\%~1mR)bhG @ ,\չX pMUNKܠЭGpf.ӧܗ1gJ]$q6 %b:$ ,ƢHJ*-`Ť@n>9[t6u,"J0pz5i#i55 2JEE7(# 1?dSvwS&~"^{G+T*{T3\"BP`W}|fˁʱ VE[[)cؐ`+F?80S Lt-JA!'?|r[Q@'E5>}믃l9X`=er#ň3ay*+ K)lyaPZ8 褣OA jЉO+T`Ԕ u=:)xzj&-mQU#QVG7 781d\O:VRq!zPzŖ/bȈsk>ՇE_c59T=a)C46cr6>l.RR^F @a6ED+AQ۝Q;\A 6@)~Xy XjwW凸-ջb _s9n 37RxQpc /Ws`W`$ XpQun# ` {&Ķ\9{rv qh/^ PIzz,gA;8(TBcpZF@V  τyxތ2;Y[eϳpuu֥CW+bf/.? p#` !7ݧv,6N^4\v9ew: 1i Aڑ,)٫H lwЃ_B5k[n-E/ yu 1E_0]&)PF0>=VKc_3GhBJV5A%g}XNCx%;`0U(tsF:@q'e)Gv ugh@r#E`N? `^Rh<2HDP?$PHyPlr04rbw"cx,ok|>>V(0f$&п0dk0A {:owXmǻYsW ,%)CKy YΗ0ia;fE6e`:RZ%G`yMzk.1Zx:>ݜ#UJ X%7G ߝ+}t%倉]5?⊩@$:N ^FB$t'P*`$&?((b&L'VQ\%'{?CZzAgK-g g_nG[lHrlfz=%eT5a]sgrdzL1d@Vr8:ڵ*.rRt9zr;/'S3"*#O؈y^Ī86$$Z8Ȳ: -T3"6:ib54n"v/uM"tR^֬mzp;C*.( %Zs lfi a}b"pEw\ؼ QOC Y $eub 憴 ߘպg7mC;J00.W.5ټ㙰Zޞ3^.)&b6!; `}G5j%AZŬHcPU$ &F*pF.2*O DT"Z c!>j= vU!zҒ@m`asܙ 'qgN!Omh#=1)b(#\+66^VJc !v8}ZY-V C朆qMU)"dr=]_wu TB&<ވx~@o$maĎ(oajhY%y 3##jJQ 1qZHNYR\QfQ-Hbr=t .-}2kM}٢aT3?Nd`Gτ֧5'6#9*>VĕCw׽pFȃ!|WP`3!95` n<8Bɗٟ~Nhx .DMZyOrB=TSP=qV΂*jjcF>7S~hQXFF6Y (TsJ[YBa/1c.&sS;ڝ-2~q\JYECNB}dǸXiܼd.]Vz۪a~@ vsy,)5,\bcAw;,7 7|(wq;ybQ{CmAe>vd7:)K8,*UKP1w+"g6/^#ZlʼYap3)s_}("07ZM]05ȍ3Ӽ(YJ)6Q:x. RI5߀ &(c" Ł.A(eTY>TRh'3\&Y%]7j.BYf!R`^vG[/pY9E=6 (xBozݿ'ه7. ~ Z ` pOY<;' Ŝ/;DNݛ`lרݨh`6lV>zom[WZL 3xjōڳ3Kn cy=P|m欘'ۦS#j}!ks1Ag^lKm⑺4KTHgǡ۟$={hK%UsyyX|DCs m؀aOQhs/yg؛p(s{*<s`|UVb dv+m7]17Ʊc<s[b!cѿFAz^n˶=0oo@ڲHn V_DЄOl^]&!l'&N{ M6>_2.}fB?}X{3?]D*aZP#y{ Kt" )[@p5f Z Yl<%dy+cf011Ċ . ibRF 5L  ,&ӡTK.S(nHĻ^6躣M'3xK=ޣۼwC}?{=x|^6{NQı@vߟc[~I륶Ę /ױ0:7Eϰ+ =1 ]+X# 1`۽ J s@LJ@:Jr8i|UB#Lp-LԾ\ʀ8sW3 c a*ƊȐ]ωN=?Ԑgڬ;_~ 饯M<$[4\KI kIjEsێ͟V*"9QYDz(3^|-QxΦY}Ț{ *}`Rsw4|effʄa k"xmw'3m]|K5O&",TjotVx K2c b<ӖgU]w&<<{*~,څPܻv8=?[ך 9 fݛ I.el<Vbi ZCCifr;,|@|o?7\׋>{Xum9sgoiA?pzAd{Osڝ%&_xV^VoOpűL$i ySmAC- oXx bp6,^[% ~ȵȗ"K%X2*ijc♒DN;'{^G:fyóZMoM9^s]kO⥭#;T1H!d'2wh Yu8l({N*`/VT )@c5rHm}sW=~&J! K c OÎPZ\ , b& Ibgp€d N( L[9|CZ1q'X (9q"_M1N'd[:c:9ùLY#~jBz$Q(Ov3Y"/>JIuӖWhVKZ(֥s7zDq_JM|r()v_/UR~H_IZڢ#h;ϊ+ 8?7: AÎ_K}VeF#d|3$3/(<(ck`Ex K!(})~CNû4_O߫jȸNչSj椕jGs82(_B550[d<ͫޙ䜣X:\I.xaCqe(. @)9/ޓ 3Eppmnϝ H"T6 u|V9%NXkxo3 ]^A`CKdW]`zE%CuL\^ I1]I\wg爔?KEP!wG[$ŧ]EF)PZqP{ X?" __^2uW}_,`7uLIˀ+xl=On Ü7$]"5q,4gA+kHX#,R^}@_k{{-n⼒x⌂羱p溞= $TWƛs@Apw\]7FvUV3s/S8Hf]eo/)|Y=]x1'09A'e8%C^ %u34rX[S0kgh=׍u.<"B{/yKy&WgorN;xԩӒ )ٍSԳV)˺3֬CcY+䣲&Y/w{[tnoy9ze΍GlO9#&y]j8wGflYv! xd* }`&wxyh%\>@Z#{{:Ȭmvs>Jប~hWU]͞S,N gRsBΪٽӏRs~ 9MrJ5V}YzPD^?s5e5:s*[)o" O `<Ĥuc5CngSP s Ak IDAT.TW]+@q.7:ѩYehK2{R6JW$0˴Ђ+NJ#w0+ҕ&"E 29sG|ݢTm Xʙ3Z%;BkZW@v/ _x0v} 2VY݂ͪPLLTPxz6j& Gw0L-0njq>6M @("22,!66AED3ԠIuI5MÑПqЧ19cY`3_E"Ș>^[\xU(LbUdV%L2Li,)Ti<*)yܙxkZFi~ghDded$}NMr!kDjY/kcKS*g%! +w(+wtX9ÁUNp>{7xzO֯K^j ?!2FzV*E#gtZ>{#%\„AjyVGcEgcKBim@f*;om}]!c&ijYpE0O-'`>$|cwnVγ ʙ+Z;:#,eidR}vBjSyAfr(+OArȼY$?˓bç(bddDG&fnp)5̑`5 y6#2y4Y4iSUM sOX)QYhN!""'$"NJ1ÆG"EOLaL_"^, f'9f2ybYVZ\/_<5WH/ X&$$yW$taph6X Di!2)&s,ROE{~RfU:m%\M|_[k62q8ZebJKg^=Fπ ^vqjΥ+PgO!MO.Փx ݮ{ \%Xڍ*vz}vuEԁoIvlyՉ'6Po-X_R^wIڗ߉3cVbLW\O99; bknttTR!!LBXa ZEE<%eSWG3ⲍL@ ? K9d (}yr'F="yD9j׎olduT `=6H4mEOvu+ޗco|֪ꝉ}sjԔ.E8_vjܲ M]m?x:5g`u_j廊oKULv?NxpjИGT?ݱO=vdjd*5˪;BW>eLP_}ڴvgZ4& år':jTLIxM.IcɁ"(ruɦ'SʁWC eLB(U,^v/Ԯϻ.t 3evA5:ϙ3Ty}{ױ6VQIv'B80/EL{yA86?_&V - bųnj$< [@T07)gzߥQ-ڳDD7tp(DIņm-a\ax"a 1 &*r*gONzĄ(zn`޳H`'NJl_%HTdRQ%{J~7[ؕy\1Q) ϥsY$wMYGDppI pVvL**p'=]4lOlDseޫdrNG$Ⰲ+ٳ5g +X:Gv˳ TVE{MP'%? (;-pÉrz$' ZfD~V(.>1s9wbDDDXϛgV˳ t1Z%$[(2L)pYN4 "* ٔ Udģjeµ "{Bmat2U&<0uk)p.B ]HM`R=Ppӵ^jN> ڤXzU+B/W:U{;msr?GhvD}達/dJ+`Qu-_؞u꾦]sRO: 0k&rR'-uVɝNJg՟nk-綾{Ovz\ ꁶ5U&wIG!<KfmŝWdS߰TXԱլMMUmꚂq"}w7Wx8_UUUTQJ(uT!s,z x@柿WI봾^5 _uܣͩ3>v)м-9\ V?T{XK Q L* #Цވ>04TFYi7t.ţwz"SKiHmj>QOa+ P ׌T#* 단^[K^ r hjPIPʣ{(ֹsuUVUE J[s~CL\h]gUkPԭf(XUUTY@x?_5jJ J fmjȚ{R$5%{C*jտCztt*SVx(yVuߥFO}ԧܸO5\oVE=3r;"S λo5RUVyDY1%S+sgZyl HJLrD`'?-k{+ۀ(?5z1e*r &'yE*4yOE6+pXv s`=yҼԦ;iXZ*tUyv?pףm&K rn gj.SțG} nEqQDsA3 )R̝†x+z<8II"ivy~ӕ3VzfE|w~j%*ϥmϪp͟!7S'$JVd8dĿz\/7Vκ t^6H^1ӻ:^m'V9r~zB5ߙn:'ڵ<.φųIYس_wV+ߺ}>&ΣVK[} }C-V7Ϟ:cm'cu)̆#X9 oٞ\{ܾl8w4KhaP”ho=9̮*{ZMWl'='s?`-ՀӅ, ᶯ԰>e|Ё/$>V|z[VaI(/`d-宗@ MQ=ߜT|K`} ,+gA8?J] .:zv/aKmSV_z0VlvlR 0ҿT9wUU =6vم$ο@ETu)_WoOPf^yq|܂"4A}~=RD(99"o-⾸>.~,TvksW|=<(C@8 غk& ^_yj:Q~'uU{A8%>PoߩB{uxˡUREqd?8<6S2k.`EgSG*nt̕D[^eX䙗׃m# "{7?&oi=DfM[ip9=z2VKS;_5MSX>̵$o;m)td0H {u`xlAVsF|[PAImeCc{oq)&. CBwެMz(9ӚvCkEתPQ3{>g:{ghB<*AZ袼M[~ʧ9-}|w&iQ]5sǃxIȖ?U+W椯Az]nZ1UMGG Xo& }J{rȸ.u ➬k']n ;z[ܸWy/~{ʜh󌬧3zHj@]BPW?62ISxmhY[OO?[zڶr"+/OӀW%g} 3e5rrd?yeY3Wzu"lZS0 V^^s)mB0:tUp",|VR5,+p ƂģUr)B+QK&q(QΏb`UV1ΘRd,S^cfhXյ 1d>F/(i@mXC9,nW UD;{~w`=e]{`B~VL#qZ[5D" @8;~}zyByZ0 ׹ yR}HE-wrX>ΜkZƌBd&Z*6|P p^B?w\?5ڢwdi&[>t S|jD~CϮ1@חn7]vynC$7½+գZ{-Wgnc8xm^+$fxOYDYb( ( hVoC48VxE>![l Sjl%~-; \Ox'7'_loL_ w_N;-!wMB<淖/q~Sx9 7X?b%dU#?;n"Fkys6QȐ|pԀJ&ڍb " 2CPL.+w=4~fOɍb ȢRt.  rj5.^y`{T.eIF#t7˙`zQCuP?XC! lύ#,_3ɦQ.Rÿ>>oƩgv-q_:_Ex= IDATcP-׹=)_r߈@ϙ ֨=|eSe}'e4'NaJNF fnP %EVZƪ B!0=o?\Wޖ 8GEvԶ( ? o /yKhR[7|"ރ[kp,4}!mV(Ojz #_Hr>? Sk-T.361_) BzWQ_}vPU 1\g"_ a¾Cڨ[^/ƕ PkguZB~D }w$5b# eK "Uc<="V"ȼ?[ p5/yW{Vz6~y_ˡ^uቚj<^LfxiPgս_sGTZT!Ӭ;'99 uB–Þ,F zm05[ߵ]w9)<&vcb[ ԗ'[dc; r J| rhZQrOC ߭P)tdv""RイzثO -xu2~NsԗЖ#N,5ġP >\,R'^/Czns'V/M[ 7;ͥ.ZPЂ񓾆5(]̮kVUNQg>)6=!ܗk߿ջ?F~K?;&{{k/,k,_Y#DxZ2Za+r9vX9}2ݠ*]VG)9PUWH}Տ0+VJ6-9;n֊]7'N4`+/}nu")RJX.=W6Z(-n}R?voQn;n'*V*9ڲSw|ը{W.r%9o4ϑ7SL/s)9s+wd7N>+_~\gDߗ_z~Õ8-NnsCGA^·|ibŪBW_!U+!%?vqd>y`;sxnܯa0Lyv}Gl=/9%7ϗP C=uoWsKP%ф[8zr0?!OK!rKB)x W柏4/|l4S2,58PVr➪,'7Wpc!LB2ܧcʙ+F v#x=o *O/snB刎Vu@*bY )zAx(DƆΓ7xD1ħ[Μ: J 2\PxBcϿw|YDʅg_{vs9FpW9M!S+'2^oM>I }t0y| ٽӊXx("YTJ)k+Gh8;hzq`tXѓv"W 'eCBMy0lտSB|iޑ!9u;`%x\k6 CY&{LI#aKST׀VWNRKpK0L"8{ o7zn~> vsz+`/ٵ`M.^'_{d6b>B غO22b#=rvXxWcWv df6`e.C A7Ϊr \ZALlwփeØƃ%JS"y8>uaQ*%9|*̔{EA!foƹ3Z..( $oL~}iE,ϥ1k2/J'pdycƇ,@Tk])zpfV!nd5,T Πx"< C,op-UafirMR!E / Vt3w:{|H@y6XgRhĚ G seS&8GFZ$)\[#| و O в*7qu1 -lqq -dkA,UD @/3wuMXG:xӏ>92ɏROPOƩ`XۄmQy@+]LD@si"-us1RE".>MiHŲd%I{bzfS%S!1j7u}[ ;"b;eyURPunTv[`$Rz,lMSR a۵Ŷro;0r7AUBI*ܲU|\wXQR*JɄ8q] P\^W;Z[Æ|PZYı;'UdWqYyԥ,B DtS@ gOǺ%}]#5D5J2P";FeB-xѠy5)QlzOY9b/MgNc΂?%Z(@-&ʷb1hNhS 2|!#V)¸|u;`e5f!wYdyվvrVG|Rz}3&dd?|fܱbigx8S"vG[3 Y6A;ߪ{5(חk=Z:n~fj ٳԵŮԖ2ʋԇLBN<ȳu/<ר߬T-3hT9x 68rDD8,.Jxd=VJjƄR~ӪR z{lv~WZ0fz-}- - 9rb uک\xmH [ b=&uR/,կo!n~3Uv ;€ť[l9^|:U7kSC].݈! e^41Ԕ ؀ ޖPjJ,JzVמNp>nQw%Զ{}w_j5#VTtDȚJ+4ݎ[r[ʦ%@ԙSqnDӎ|Nv3k#U@=aA<~b\{u;WJp6ΐhbQЂ0dcA(\Q\4eZ|w`540ܺSK WzH̓K[<Φȴ6#ԫVlWG||C#`5PCuLA8I,v늰5i" U5{\`l諾{~Eƕ-x.eyr[0PruvXiBt@_w TZ+sWY 5\-0Jcc_4j/`P!/z)Z׋Ľ(&&x ?gLx(ve 6H[( /TÁgv=q?" YQB zY=w Ǻ_=&-'曦a̺NWc#CPy#O#SyX#guo A~1&qV+SV <N4` +_٪>h!\@>^I3C ӏ8|y1뚰mU&d5VׁE ȳ >Vae> < ,)n {d%WʹP~\Ц[OPq}7˸i׾hHf k:42& Hx v<7扗])#FƐ@ۚ2=G7G0\Þso۸[hVapr A:o1~ zcC#E>YI׾%eZNqjA/@Ti x[ykԡF K(rΞ<VO%:GOXsQ6sP-$J).賧¦Jq+ms d&bҷ.\ Qqy1yjoܭhI@g;*ZѤn(>;k9Ypv!G1Z Byԃ niaD9xnXt[Ӂlؐatxp!~ ۾[B25ifoLd ۆ\He~e>#Z$oC炅9-"t}Nza|^IyE0vi9NA<9 Ψ7V~?|<;z{. I$N0 $-鄞@vPݩٸdJ"iq#qD9'~D̐5en?ȝ4bKx /xxGS vz BSK Țev7_b) ðl1=߄ iZ?Ó:x'7>=w>y=@N W>8A:l﬌$ +KnLxYJc=ۂa;"Ԝ3gmShM;[ Pl 5R:-Gc~dX톕)n-'Ӓ ȭ"'x8`Zv0:xng͛>L1 BbY2.s--4I/If!K,ku trF~[]<` {o~'EɫX&U*X"Hxi&w|:tZ9TREzvZ2w$'9 OY{?@B)X|V2 IDATQ"VfY7CdGy`"XNr.6!@%K]#|lYBVGl`^ eCNn"pPڡfR]e4^5iv_U|w%6"w[;S/d XhS5&$TF9B|,9ʇ/xo2G!h賝dq>p_z7?OHx40&2r[h StK0;BGSU%A]"dw0c}m)r4$ a!K qa}H¨qݨ6LH:dy r:FN am6ӵظ zȰ:}dZce qZ|>F>vG[Tר ?^Mn9rF \^dR39NO2IșxEu'"ح%gb.9W<87Fb#R~x 8kYwoz# /Zs"g`=?~Ubw#QʒV|$ l%gݡG#խx5o:kP+ͱ2xGSVv\$ٓfxu%ٓ$?S+"$#5nRaB"5I$[e! /]ȹЎc#ky$o uq[D #Y*Z8l>"ユM#(yQ^Y&#!r>k979hSƀ5wx^ _S@`jg߶LCjw0y/˝L0<>N9sF+b<_8RO?JeΣ"sW+`&\8 9ʨ5n+9A(pzq `+%?eiq_ ؊̩: bG}6D=/ OU(GU*@J/f&&tsi_J$@.X"|_s'B؊PaG?Bj#r,[1_Oaʑ#Z8TO*4KTs{z R-7BO3CCf@j*R@mߴۧZ"t)F<#Q:cEL x0Hَӧ 鄳*6<$'US3!!&thHhy|LVbnP.KƸ-߬ҏT3Z9BEbH8$ "ZD瑿ٔTq Oz^tUd:dy6# %d툋#`y@փ68U@c|B?S[E{\lBz;f'TtT.'[xK)m „KeUf)Ҟa$d&g8"~LBr<3\eF`Ş?Z7 8UZF]|Kab"k9>vQ Kngv̘-dhi,'.y^3aCx$rl>|cu`{#vYc'c|mh hJ;ItrBP*5 Hd[u6WpOqdͥKx:,T@YgϟJqb$^`F$eb<9ysG-۴KFҦu;}),b8iC;R7 !c@ 'FR{ꥥ% [iEsXh\jm |P#]b]e;bN[gix)Rؒ^kDZ/5 |Iՙr~Wa[x%GNo߳>ze-y&F!;6s1oyHsޛ8!kN'ĝVGrmĽl):#ڨ+?I}!ԂޟWI$;ZiOdmcGƋեwS5zڣ"xv}|G"95N8=F7jQ]g=GNT+'3!y9aʴKWg4̤fXN/q 16Fn@-<7Zl:s,X[^Vl!&͓FX둢k껍[VӞq{7iY]ݨ4eqх~ׇ-W7i_)+!~` Uvha3};W+P;+N9keh)VH} w:b|Tb޻?ZB8/'U/9ZTcg,T86| VE\õ]MBޢij+lݠ*z}aQ0y[P[k>r+6,%ƬԠ%}O2*y>VpoZ0{4PT[U Oe*7 Ojx(# /RKBmJxscXTU^zν mxT4h\xt1U/w4RQ*s nۺ: ٣s"s3Nu87Wmj&kgVxno;u%\]:wM敐Fpyak^uvDTyIUF(UܭmM5oa1gF?"LWg3E H_D+{s=CGExdw{k97\-w:AI=!Y_RltwywX~KYW~χyk})9wzڵ[7+}<:EzmЗԳ]RS `!KZc[ޭnzoWwjAdՅowv GR^jֽS*r|׷jsg<5n-_RxO:揇;7j79*U-n:Xw +BYLgFXAEono6#][NBu+d55%wf.$i0;oSDࢯΠ V&fƅPc^?􏤟"-̄lZ8xob.wTj^_P>5yn GR~(`P5 b0s0 a[sP8S=" _D/^[K+%ԄzKQs5n8POk>xOyz<정wGjI2w\L=3n̟ד&;?ZEPPe<{.12OלCĈbJI mxDЀ*>r*ZCW XcqsKG+|zf\\ʿ޸DT#B;=Y1^WP{Tq5?ٯWAyOɱ4V df{>RoZEupAk"r'$h㦣sޒ\  Xz@.--]1^-^zcL>toZH9UO?6]ծ_E(OQ/Z5iqR \X][.̌r,hʕ3Z~TwmT]{p,CTkZRT-Z/9X,Tsb5<ӰIOq\4 ЃBhZ D) >S\tL0k& X ,&mw$^,x|y@qONcؤN"Np(㗋G !|8H z@~51=* yQ@IaBNH-H:ǰ[[&v4{jXUшW{oX{ xXU]Zb_=\{p1aZ껎p4rEqBª)y 2ֵU~O롧eM- ؖy6ڧ1xeFѮ)+L1x]x"LpӦp Ҟz(dR1jJw ' O:8= x"x/r{wK^O^OgTK{,625_UuwYsoZ-c܅aੀu׷Tc pbBلƿCd/^/%xG"'._@Ä&c52V(;(s M 2Ɠm%<, /uo  t>Αlrr'6s` gm <3Bzvmh 8's{\wڮtw`-@mÛLNF{r@%Nyghn; r?K?5~dh9\AvL'$o̓<_mp aBbƻ[x|L(_?kHeݵPOTɛS==uYkW#Jdo`+_4ʡ.T!kL6:19 9HKT82K=`&i ?>Q~,yL?&V Ԙ O*(eƉcl . 7OQS+ê5yͻ pKmz;[^,75 !4I[KtfFy:5jկ$vј9ޒ\^( ϋ"_gNIN odƞ3o3R'A hyw=wޫrO9 ᫊oIs5P@,,}D薐b x8,wFmN@/:&#G>۵clhGuix@aZjBәl|#ڱ#jKo 8ute|j_VL19#pj֊hܲ'Ǵc#Sq?E Uoo]ʩݚWϜyyr9rN7e*o޼F[׫;2AȜ*2Ljd6"T\q*6@:Fə IXI^\{$F \$ww5!rٓ<}LTוJ,2 zu$Ym x{zinTe#PFXEF:!Dp۝n c Ty$HY_b;E^Ŧgb]{<斄z^5ߘkvIs)=N@I1&ߐ[hفn~A)J@a>Žb{dN 9"=/O2c'H+.s}oIky+/(׳5:xxIoo~ "dGl_Xit7{=|a}_vJҹ7{ W(54Mś¨H;ΚZ+ڃ X+.#+xcW"5F-Сu9-IȄ:ye;>ȕfnݾ̻x"^@7X>6{@Xr!2 2jMP=%Y< o6?۹鹌 D:<\\R=ZQ_7whQH^;5HA-1[Q5UrkWQz:i{UTV]V@tknOX* EEP VʕSZJ+vʗR r`<ҭrU/&0nv;wH*F9m־?I6|f$"iKkST^ 0rkccvԪ]m ;γ#QS t8 CDz|ufXAp+Ĉ@ҷK[q{`Ը{dW b;8r %GPmY{: _^=\`Uтx]幓SB4]Ԩ V\>(<f!G'ں+]RfgY<ܽW*svQh__><^y\;Nb59\U^UK`mQR)fEQbBR2HR9EIjeff:B^9ۓ Vg&;љjԨnbE0!ܹ}"e29l0ƒGpYoAڇYp[PGHӑm^iVuiS2MY)QgΘ~̣1ؤY]ߌAtM6>1^` XZ!NI?U_igqjB׸I;DXx]٭lfq9Yӥw˥JDC% Vhq3L[=r })؂Ch ^-5IdJnDnhu)q&>t֕ޜfU .)\ ?M4f{>Nz|U㪌#={ ?Xȩ]V5$E7RrYۊp !gfԊXXg є 2E(|V4'1Β*+Ϝk`-9uM5G*H`(k0*T,MMoXS7rr _蘭m|{/ZQJ4l|OjԬVކ)VaN{N, 2XeRjfSA})\}]26)!av$HIHQJږ,%lDR>$󃱔'x%A}(T]uzM $V!0GU&ZLeJp¹M I;Q9#`kXeceGQkb`F&4;rRRuc~cWM*,\G{J1ߎ~6.\E[*Y!/چhJ5jԮ#ѩfVʢ}9 ʿCA$G=:L`m J&=1J%{;ZSPz|($2I0axv)<FI$E-{iKz2!ΓW3 1Bߍy@I'%ENL8qZ2>YW>5o4q=,W.d%ɨ=b@D[6ި?>,?nHJHɲENl&KyЃ. wv2|ROQ|iyDfoLvp7?^^*Hk7u?\6NDiH_0tjr5;zQ]QIPv:M[֧ۏ0{@^Ljo@.;ɖ]P.X(#&~3EG=#,l"勞\|8>,j efdQZZ4ʨ@ \ܴKf ;B-XxPIEY& e ƕ <.P^{([_=1o`-43/g"d_'0 ;NXf͵voStdC&}̅Ch⭪A4^2;UX 5d$VmV8z€UO|(GO@sar{hrIb_ K5&@&Mf5\EpH3[360Nvh\;7I0l6X V2\8J S\aIKRk]zv' py|"B=>jczwBP0Y>0ya[jyM&Z;u=׿xo_IҷE4>@gժJzT ǿV11v,>8Vpoz9H(Dz}P簺6 l{p[Z@\cbo3ȴa%a#e!Zφ/`C;jK/TCbL̑7 Mjѻ;Ҟjd g M[>՛Zc^XLaOm[( 0 }}ɞ !wZ6^e̽kV|!x)x"LuF?f%Dd0FESr8(@%?ArWUp/\|캂ϕB4 .bpu+6=(>4dx~C7Nf@A6z|vy8 ]ReqiZ*ko6{`dL ڪHRMP#G|!&:܀Z03h~.csi5|$ӆ}Wz%O;lуUpd{sT݅Qw[?k0"Er`H^[.Ҏ]r%Ugq1aBڤ{d;"zgS,TD 3(. {;pc{'+\cu.x0:r @8Yz賏gs7 =#ncx+J%&ںi?=tNϐHP,)^4s/ma4{`X7qјSD@Q4sptBԺ$ , <5 ǣPR1^c36$*&K"1e0GL ,;Ok|rVFhUjH;Sqzp?㶰}g?wdyZ~"5y}7_@Uz[bH,]l(||ƨ` 4 R`1&S@ w=Uu %W* 9*bD|vo9ɮhq0$pTR4&VpK.1{c1H \z[|رNIfi%ԔJfA;qT+r~q)j 9NՀF +`Qw#߆6Lsa|m~cP`z4mR/!C CXR ݕfI_<YOT;R{ct-9&;5u9r,UYAXw?W#hW+h8vӘiF"k#Qߏ:5b&PF5lyLf\O>+C"O`v <\ " s a&]_FCsSYtupzE⼇QI4zdޞ@1hzCuXqS?[ IDAT(WXB5q N <]aH(?)[lܭHv%l]J`mbv}/]ah\VTV#(-rUa%Ii * ~fH^=awn:B?Yu8%V/85AJr*r6S05R iqF~ii|Mm)[ޟ'm'[*L?( #(\`k"x>vDI.okK VpC`u9սstr@x$1r -%)|j.U /L؟+?t.",vwW'-&+vQtjuvp\:wStL[礿޳'BꎟHY#; q#Wr"sJǣqrf?8ۚ S%a&|b8}-]ω_+mGUHml`\8 ;Wc\ji*T/6^~7[,3%rpYڽNzxd`ؖKVMvTD?RfgY4CGгViCSR|rf',V̝BB9S~XMJH-$M .B.lݒ3u?O1f],4Klxl.TŔVg ըQ<=囮-@AAM!̚eg\Tq/ Cb`~ $$@ x6gQ q>()AKl4:h\֭w+*TۇZHxV]WP~I9$E~יPwnu IGQ>9@3 ͂qP_{L}` CC¥Lq (o^Zu;tqZ\OWrLCҤymjցz@y- Ԩ]1W'T:u enZz^b'cҶ wM"횁ȵ[vѐ#}Df5937r}tPfpQS!9V25mkoywedQ8+CPxtwq@Ol j>Gv׫8LUHM?oo/ ˂K2Tr>Un.E.iRP ќ'9E@/h[҇=fpBLcc荷R*p|ڔs<XP x1}oe}}щLBݛ ŗu ~ig%w:4/Bq?l)7KjR~W(L;к{(]_{43ZPV֚*rz /VݥNL*֏`夵MuH񽘧+*^UH7zn^Xrjw$ErO pO4T@i)JT%ayU1wO*Xk0vڌl_\igSSU>8S?/P.-y]W9zz:efēo\j; MX#'{1|Ff\%@ &d{8JH{w( `HŚuR$E<]slaƬodR{ rQkJV^ߗl3qS (H>-TmSO`l{9;sevL"ܥ0KNJIK+ùMr=nFC. =4yKcgu&>*>ǢvΓO@1) קB$”d Ak'o_.0t^`̩Y6$.dچ@s(/JGi0rD~!ݧmP)MYSveRf$WZ3]d ޳T.5U#ѥ;;t>CФ3ߠ|_6->6`[]PI⤖f0T@+VPp8v 2&f[8,)k 2*S\tUa/b4v S*B#Wʗ&?ſO7P}`jh[l '>=Q+s%1 F奀ΟN]x_),nN*FdIMnx ^)-ݙDT<G1F7W3+ƃxrPf2oj0ժds R/ Ys&{6op;=2._m.NP ~"(pe -LHgf-ry37\f`+oXD:HMMG.%;@ ҭXn?&RUZ4"vUҬ\*c \:&/>2~G`P{nLOˤmg`4eϜ-wyG#xfy9# #P/e|\; V(͙RV % B]QSa? T,9 D?@ mF6m&XT5QAg˾D'TMJ({*<" 2Zm9k'}ucBIazǞ'iԕ|oϠeXGsEgfrdLk\B̭h@05[ͮ;BHcB `jqJH-xRqSA+ډgXxN m&چϾ[98F/jSߛJYJ;JqUP cl=̄AP«;Z_ڿj%~ߏSH9=Tݚoؚ,Ze}ؼ ~|_1F :nbOޤ@\h?5Wo}Gc|6]`*T 3/ C͞V4Ksi~USUcx:z]>u j ;Kl?8hDOnQ8]ŋɩ䢴%& 9É? N:qy5O?KA:_,aP|}d"_}a;ӯ>v'g1}u>-&G93ز llñء[sX>;b%0J2m k2)Gv5u]t;M}fHa0sA33Ro1n+p7F/cN燯QunKղ]}6B({#\'X ֘\3r0Q~r-Ʊ+&#uII|! "ܬC8l7ˇsmC0( 3QOuܯYۇv=W@7ܦKJp HX,5Šґv @N&#j=}zYG }.Ngπ߭F'5FQ(Wf0. =g$5fZ8-dp,؜)+dq@=i1 CaCh{ ?;]z _܏~% BFM~G9 hT䜺\+0ǵzdP̑#.R7T mcsƶJUL_5L=AcNJN3 ~i'C0JdJd!m|ǟu?}3|#?޾dc9'L [qةݿ#3kfbϦ+~c9 |mx^|d1u\Rǯmۀcf$JA.AU~KWitt:;3/$m媁4j,^,s}`8tV^}Vh9b<)))#O>){ Ɠ"V+G־ˣ FFl`$Cx+ Ν|d+]ң_D~E&1b`b0/W,™fܽ$VN5PFL@ 7Doc XSMLD05Z{` .@}iy0ЁAC1 &X }k1q5 PCĂBVh?8ĕ "BG0ADt7n::s*3IНRc/=D|BC5L3Ķ`r+;mUŏq=|WfQbr{Aٽ5s#v (RV яs1sV X߻}-ջ3=-c<1A $xHh'&dLfh9ruf׽O :S oy.eaN0>qut.$89a *ͥ_ii*}~,&z$U-t#kE@&oK7S<9TB޼PF`g(:+?]E, /[=!7X"覶.\F/=`|˕#r{Ȼ.tv^j%څS\n̼_,]7gqw м$7zn=fP>@\Rm{\Ts}g lVP]9Qw£-*Ran1XFҗ(^ EMۙ=m fXaIZ 5HԴU]. @%nU1с9@`U$MÉ~d&dhV_׊2Ej6tm+VfM\A) /ՠ60PN V C>+˾'^^5[rQE6ybya3uf^~snc/\P.v jޯTx>w{jJ.GKZ׾V~ʟ Al $%Т+N:8#IZ _+G gY3%%B觵x1ݶyG~\W9%v$)WA1FVm{Vf@6k' ⰰ5gΛ4d3}φf(X?!>Y.>g;7X7d d\hgv4׿ђ96(nKhWW2cRIHm"@Cu[Er7A ؤM}76dTzUkTU[~0CecAhJgʎ#ӂ_Geגx՚KIȒ޿.vn@L( %~l. ?p7MEaNM:L,]m3 ;:8 h =SFrysLcd,֪+S{jqjZ|Ν oZf: I)B{Jkꨟ8wZp]g5_ ]h3W=kgx02 #]p.k!+ q2/܄ר*fZ[BXV$+cy'ߋ ѐ9n{*_џq('_7k?̠ltRҩaӚߚj*^I;w?|]{)xlG@5sr!p.'>`0=@0ʟd4@dXp#}"n= pz`v1mpgԯLc}g1*nn.՘`;/@l!9,|f$4o]FDp ,&:np,^;c>޶b ,JU w1]Ëb2jq6kT6ջE,OBcxWd{QK.<&NHc-Фa0 Sh6F`렟p%&Ƨ) ` W9@nDXO,!Hb _ ׯ Xǃ__KvMps]mÙ˖_nܦoO|Fh⛁l;61 j^@v<)™0 ~FN'lj]lF,W#Go@NBsʅt0t{Ă[`^Q@ڱQwϾmf=^t%6j]681uuSI c9 ZS\\9)ލ?]Nd%``q<lFP,&]acA{77(Xy𧋋#x.N'%a$HI@A,@ q I+󠁻I#=b`̐]rY`vn4=$]>Øj9Z H,'0\^r`aC}'j.c I[T/.Dzbe>_*5J br;+ J7 IDAT`L74gH3:2ud(9)ێ61Ii6rBo.Uʕ:\'F2!vJmz ;6O _]`g;ϖHUg]z5V'\Ԍ\,IڭSa>&8,I<bT˄{$';+ŻA#{Iv8W^; #.>v%OLrĻm\nynϝ.Bif.c0quĻO]l2i1v膘 ?8\{U|]3 ?#2{ .ˋ,ǂi {`o⧋Ę)N v_Gmqąb!t-^ E_Dr&6 ׇkbVgvYp w,b/10EѼ۵Ԯ@ы]덩soV?ŅyPοMk p,cҙDKoЀȇ-E9l5t2&*Nǘd[7tj۱)5h\BUs6B"y0I׫M[O/aos|@yBEoYݙ׸H3vB#*C,_xЃ4uX_RSF59#˱efۏ3oTΝJO\+#1omcLQ&ĸtfx7;ŕ||L/aZbR{L9lW-IVa{`~Zct34 |ݜ`NFE5Qfl|ڝ_w2RӔ"Z8JÌܟeO#>zĬ* da<[h V>m^YΜ>9@>8QU>ԟ={샗S4U<_18)\*S@gWy물jK'ٻew,΄(͂I~Y0Q\a),bk&+*-,6BˆX`B @[S=oM!!^I Bz Z5Ka%mJ`l$V(M>V8jiWY^2eQ}ijXqT9Hžh' d̩x;sf<.Y:уroXV26˲~!,3& ?,JJL2P(33 2d>*݋*bP١م'd>+{e D `1ezhưq1ͺ{~Yc s.'6J.`*W0x lː2+4:ĖA`ssYnHm}sۙb!RBnܸr;р> ös $䂢(,2"-4mhblZo l pjYkJB3\| 27Cd[P_7:8I}+j f(c~]2*vPZlmcִ1W:AVU lCѸ$?F%@n.TqztjJ/ޣщwwwJ~DâAty#Gft`"2n~P'̿`AMLvN0x;:ItjXۓH\]]_ 3?0j*Rw-oJ[ ¦QK ҥbAiXC3A#)F%K'/ 0nG݈h*)>؏b]Ǜ2]?қ{>pj^ʔH5ʷ`Y w,š;+#[{+?&28ٻSjvI#GsX")iJj2HN˘Yp}g($'еkޑV y@}}>7ځEf/*NR2R,5m]^y-jWtiTmۿy,/%ES͸*V$Ա9>y(LY+[|m_?O(:mh׮Գt'4RFIM[եcSZ[xyy~>XOR-TCDRX|D'X:O%.GQm^t .HiiNIQi0:^hZߌn=8G?/֯_/w5z`o {a ̄S‹Kaƕۦbkw\z4{ݎ68-էoW;6:7u™|Mi8:{]Uۿ W7g:x֋ԩԡ[3'n޸gPyzk%Ϡ7ءO= 1boQR&iU4r^e`5w\ ͡eBpU+1vޜm/ ^uT6Џ6 .a0c+$R̚<`]:Gs\ҿ8$SbB הtZ4/4}ھ5m@,԰Y/ "l *WޟԯL;77YwM?Psf_myu/6CJkx4mmA<4!{HLs_)ft$/b0eG4bR/ڳDw!WQR⚩8g@it|x.Χw/b WwT}> 1n<)Ӎ+f-Y =d]XH15& bL?ay+I22+τXz^.|^nTXUQrn sW淓=5.=I'z'qɤ_x7ոC|!Sd7]wpIٔIbuY*P~ZvgLԯT^jCsT׺|F'a{—S՚yB޴͚"Pٲuݒ@hYZuS` /XV,*_A9N׸V?k`7 K#eɸ|?OͣWƃd½ Л6zZGwaY?xFחhn`7UY`Y2\78 PϾY6BߛOnR@_;~LvjBc6'3Sxm!\N..w8c'dMb+:0e3Â4;'(R%Q,RP7q,0W \A:ճYr' ϕ'W$ x*%a`F;Q.35F> %m)D'ZZ"Z U-ڑ{ PIvJt}t9.䟪gNS'(6*JKL'/^:uDoJݥ?4P5u ^th$&ߍn7X4c fe9Ǥn߈Od&&I͊(Xqg/CL/?e0;uG^_ҠQ]5C3U.hXi8BUkܟӡy@¯ѷ g_vhZ\_lO/ߵU24Rtx9 PR= 0Oh'{_A C\w+G1㗝3C|׮Sce_ں0}3}5R M{f-֬G7@UAo许If5iߐX4*NYpAډ %VLk$  cwbBaNV.? h$] $ "@/ 7Sa5L)r=2 8./2&,Q.ďFvcq>ܕ2]<.HIN刚!&rǽfibnsn3{'g|Rj}n:Ct#Y Pg`$ m&=\}|b~ֳ (Kn1%Y9d03 d {WpL&)ɩt 1W9*2Sie^T@VLS =\dr Iqwqbo*CI|GcORBI%v,FSi%8fQTR;.+Ƞ4D{ifyǯ2a)g1Ue*Sxw`Ab&P&\.72>d\]vUk{ (oXX)opBڄjϕkD};SؕyR1 =1N}̖4Lҕd 3~ r:wG\8[ҙdP@+mnygopdr WJKtz v;GER]:K TӛjLJFIa1wח?2eɯd ztΟIiV˫db {ш LX{{*V)aD04@w  @螭'z*W ;N?@Ry!3tfc?ߝ4,n?I?Ì=p܆W.FPA,ӭHvkI .@98wF{jӡ!_Rp7~|o\p'-^+] چzDJ!eh|aF4F6>wzc8O W7G~{wbxw!vweqzUkTy LOϢ0|bT)H(gVqJzk:c *J XA[҃Ѓ*S`?-BgS ݣS+ꥈڔv;(.\0ɡdنԵ;MWҨE}S֞erTLbXyDzӍ.$WNٹP}7rǺSfŎ1nD*OӁܲBBK [/R)] G0]x3҄ĤY"B'?nѸR׊cL#]JR%Pիhۀ23Z+Le*!Xyg]CZ)@d9^ w|т;l4n{nنUh٥ w#v Ȝ>v]$~Q2t_o '>rkQ ߦ%&g6ppR<Uohƿy&m#Zi\"h֢̔L[m_sw8N[p޴ߩ {_M\ӷ1`դ'@DDѢ?ƳXO=# ӳ -p[no1eV+(?c8iYMԵ—=>%&mJ pSU*ЍNQJ:q`/A1R(U KJitJ *F3蘋+HV΍J$dPGZ^ў>HK:RF;eyxChz>΁dS TV"%`,Q)]O.GNjS)z q ~)X UqwfV#J-yByd'Q6Վ$?RD|>|H+,%>4t|s:v d%KӅx*(.Ȉ[WP7ź‰ IDAT*} ̢=k|^CIS&@"{AisKMI8k#&P'OLEOL+t(4~ %K ZpeŃ1su%[Аd#G"<_y:~^TI05jV)-+ܝ/e7(\:xKeSɅΜHD'vťњnt:J3ˍ$Y*ގq"锯']7 w{ u T.nvpә"oۏb!v諔DTljVUϮ@3_UHN2ϊZYY@3=~|m>sBDp09UU+W EG>,ȿ/|Ԟ4ݒn lJ~+*.]/xfmR\0 y :܀߭_ v`]k?kV8-3$be吃<.6ɲVF+jgϱ@3Y2DRJXDt#+E!(!s B'Bĕ6 y{45KJ/AOq' v駲vTV)ZEҪJNT'B8gJ#:iO9v%9$);Gʈ(%ۅXJt4,Q/ٔb]!&{RV`9DxR&9*s]&KYw)Ł3;'f9b9]/E=T;=Х3;ȬZvX6Ou'zbmFe0SKn'1n*SO\- d9_VCȲ+#̕ΥBekJn匌Tt.|l.BnTBIΎGi!74ȈQt%zED[?DO*)KQVh' FɏKEǨ\v(W,Yn(F{{U>RH"Q RsQdYˢذ,ذ`A |( @BK Ln$̝8/O 3s=y{/VCn2#-$?՗TWB/ΰSbS=8}`ClqJ *_TTğERHFކQvrP40V/'|D=RrAX,fCU )^04!`EьzR<31XO+L*C56އE4/ WAv@,[(JSS A$@ض9RyIxf)B>JmSwN;*i@sJLqb-^7Jiu4jĘ^8')6ߝZxb<3wt9zX4@s&-DʹvEq'vʦ qqq~3'5ٳ/ s,z!̧P.bxfqՄp(>"BP%W {*Qj2h`PD㔆ïGE\s>?47Ȯy+qfN]IAJH4nEz8L*MAuE4 F.juX1H_ 4TWCcI 0Ɍ2F2|V`B;?8 YS|`+(- 8x:y'|1[E s(Hym`\8y~F 2~scuL<}l{tr#S7x%Fl6111ny,g1+z`dldAOb< 1_(mŽ_ѯO(E^zQDa!Jj)΄TT!1*-8 jQw)T* A-@[4!)@Pt9r1þWD-zU^%t:Zbx7!D_|#G08`¸|se(2ؐ􉓡)`9ը? sTxȋAzklRdMa$ט䆩-9Y>*m<(je wq]퇛CމI*+I7 Fv|H5q֠E&*!Rw$I@œ@B.9@yfײL4J;*{{ TNJ|Ah-ﳥhmK[Zޣ(NuEbrӯ"ed3;I?mޣvӞMV/>f}3LVmJ @ R4r쎆tO $bYexRE.=9NWt]/ Ei&\9r~cJQUGea*"Nǡ|j]njDQ^ۋ-EDAf;T঺:[.#~Jp69AL|6,Q@Q8&9.Ҁ&@8#ZW Fo9N\_uP3nL3GcF#JS"B2a:\9sgJFr/8ZKQ6P-|}lݼs_77)#vgDŽE>?IÊr.*d!,?j+' KW_1ۮέp1Ao^7V;f"t]{/o%;S޽-둑Ɛ~Pko[>m#!Z~v ʿ]r!1 ig Sz1 1=g2Sa2?pbctb辳>ݍ޽P앃KFe/XP'7s,IE"'`o<$0:wYu=8~I o$%O4RF+ Ŋ65agξ}U[Xx{1j5'Y24=0e}n&db=UIKc fiNXsGkL.LV{B` 4L54`K.As!Kdy;Wd0I"C޽bwG*2!6^+ǧ@-±Z 2{atg%FHñ%SHq^49O,szlz`QD"΃)M'%ނ?ؗ(ǽ (Qs9J+faMqWP ~; kB[oT"sJ,yza0wqI>fKkBα b̫wяcH}}׶jNjDO#66Ƴu9̞|-]?QY,mʚx<8w9ﳔ80X's=-aiɌʫ9`;Djj<?5)()Sc9iX;Xf{VK61J᜷ϮIF|U,- `G2hX_t/[~[Ht+q3>ߋ+ ))x;pèG[M n59M8[ǜNcNJ^@{ ̸~>Cr`}M/?=}ꊇQ*L>[^Va}K4E`Fx ziw"bsfxp9„ O?ڶ^WwͰ-EBRh'B||Bͅ2}k~@3#+{EgIMɐE'= Xԁv|jL9, dHʔ=zTajdu%TaL+cc J( 1OU .5Vq S+L!G))J{ K8n:[O1@5f{ƂJk䘒CVReR*0;* ̌rMdž¬atޑOQk[TjVb }ުzDrYb?sT396PA r)P3`SnGz<żrili~'bU|vY>l;iyRPBb,[\"̀头5CTj|a/{q尛nEPlhw"71Xl??8F@Yx5Kplu VVmccj0ng"F*WׄhzioE{e5y6K[ O}QRjZV?%?:-- ɓDzb[ H hsox M6skRђulK0.z_iK2y6m` x-:yI ԝnUinNyDzހܳ[4؎>Y)9Xp6f5+t&n v;dyjtؚE< {yE'`:gns-HX~!؝lDBO%5Xw:9!YYK^g3& !*S!=0hP\42lLU`\_]*S :4+M@e p01 1)zը1B.ڡ娩gYe:Z,\ ֽ]$glۓR㙰,ЀGp@-! @F i- :/o|۪@|SfEHKzYb}Xђ{md'#{!@лlՏ[A 7ڶIImm-Ny5Vݢٿ;\(SRܣE"ܑRd%*A e8֮%O⏒FO@)I #u*k{p#XLh4>_v7߅4f E*k% %6$cwG~gd6Cbl^8鹶Cuɏ܏-KX=ѽ "Y`-z.A?T=z\ø¥vE;r|H.;<{G&K[h+%ujm9{=w۝y Gl9x׶̣DeLiDdq w E!/[G7k#M5PaFXf;kss tT 2{Vme[y!|yi Ӳâ+#m0;vm׷5BO_@VRnnp.͔Y叁^1yc;ׄXA *Zn)H5%{v*<#G N2&a֫7Po, pCe>44X|KSC hIjώ 5 tId#܅6aK,\Ǻu^E;{l]ϻb[c if>>u.5ZUN) 7@OqHN6摸ZCKlW]7_ǡ952l+Dx5{Kzo3pZs+Q yrȣD@E6I(#wZ/X>t%,:ồof))}*'Cq[$̣ )]XQ`KY P zU6g.:Wb3 B' '-6<ްhyrͣ׮F`]/ U:76v 붾W(@;'"'Kv \ٟxuYJx1V9dԨ-[$'˃Jfy3R;2ke4R>js4zHm 4p-7[I󞼢 n U~ޙ ApNyԥKhFfSw~:fxVjWNwڢʒ Kɑ=ԧ7GAl#!/!y;h\!AnpZ3 +}.q;yCU B]H_pQćYg%=qzޛ%6xg$y|ZhԴ zbnz4'\yg|k2?6P͹cHjpCڝV? Zjt-ڂ+b6 .8;3gu+V`&#BGĥT5)3 }`3V8l *);s6b~w"~\^7kOrkyMVlwaqUZE;~ ؊2lQj V9jc.*ᬁw$֧A2Mٽ*\Sx' }cJ[X^6VrA]ϹVARu;zmz9}_ ERIz0/Vco"h9puhJ^ ZЃՙh3fj 8ga`^+W$ݠTm\N v 2OibqzPBeC'ŷZWgg-.I&&a6 3L'\Z9 ;++޹Br`;$R}šX&wtZF3~3$u&%"(JּJp'(98=næb9H# %E_qC} $59. _ս\\;J LF1 &pQr8;L~Vv]&]nm E>/vd|7YK LJY +zUR^ ¬o̙>G8+/J([x,+62kI/HUv q&Yd83gSB}QRZCpɬ49|d!a*2=0踞Kޣ@]pBUW-l}K˂o15!fL(|a'a_ƹ-AKBwZhyB e[W uFU4xd#5 h.J9J`'zVળYIK+[3-IKR [)}qƁ/IDAT5IDAT5IENDB`././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy.refbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/svgbro0000644000175000017500000001101413063003270033454 0ustar mans0954mans0954// ----------------------------------------------------------------------------- // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // $Id: svgbrowser.policy.ref 1733416 2016-03-03 07:07:13Z gadams $ // ----------------------------------------------------------------------------- grant codeBase "${app.jar.base}/@jarsLibDir@xml-apis-1.3.04.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@xml-apis-ext-1.3.04.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@xalan-2.7.0.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@xerces_2_5_0.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/batik-squiggle-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-ext-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-dom-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-css-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-svg-dom-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-gvt-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-parser-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-script-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-bridge-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-swing-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-transcoder-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-gui-util-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-awt-util-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-util-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-xml-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@xmlgraphics-commons-@xgcVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-anim-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-codec-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-extension-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@batik-svggen-@batikVersion@.jar" { permission java.security.AllPermission; }; grant codeBase "${app.jar.base}/@jarsLibDir@js.jar" { permission java.lang.RuntimePermission "createClassLoader"; permission java.net.SocketPermission "*", "listen, connect, resolve, accept"; permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.util.PropertyPermission "org.mozilla.javascript.JavaAdapter", "read"; permission java.util.PropertyPermission "org.mozilla.javascript.JavaAdapterClassName", "read"; permission java.io.FilePermission "<>", "read"; }; grant { permission java.io.FilePermission "${app.jar.base}/@jarsLibDir@batik-dom-@batikVersion@.jar","read"; }; ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/go-previous.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/go-pre0000644000175000017500000000167313063003270033355 0ustar mans0954mans0954PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<MIDAT8Mh\Us͟R#4Ƙ,(]H+k..L7buQ"B-"*(AXӈ6idfs1w1c\9{{UJ,sE?ŽmԨFkv7~SFlZ 'X^voq{Xҵiy`XZsƻoݚѦka6矗v{G]NNAR^p?0Zs#4ܶ6`'>$Mxa[F :9[n321 F,|1y##k,ADoyq`ߺ7W)~>{k H5%Mq`2I(8?oxf Xoi BE<ƠUxYy1e_$cPTih EWG'߽tӆn/ .XZ-Qk4R\~cׇt>DBC*| jqXAs˼(D$7=UO;r'01j*0LDz/nZϵZMB4>7ԤʥOSL4-kuhpf.^x06 Îx""@0Sx}LQ*̝d t 6x=>褃bxuhEFo͎0,kf,BoZ;5e>Y& x' Fi4['l;rW,JߍV]6#Q E/>)֦fn+/K)Ŵms^8p@7~yqzq͕~r ܬiK\kDT-rSO4Y^^jկժ~Z {L.'NÊ#vt,]+̄M2##[lٺ۶eȳ=-/So{N3-|@g/ >DG\* >[kIP]_7?wTtRE\Z]HB!WȟJ 1MKf^!7Tl:VE.}?=`؎4JI!>" C'h('ϣ3M|&֟h"lxG$7 jvg0y;%IB5 &Ic%L;e{9}hP?/>@;)Gz}( 4&&p%saVСcCFO.M̷aȍ(Zq#I@)$Z1kQ(q52,\BPabqU&1\nfEylf/慄p/CkzB QėAZ8*!)H-XӺsl kZk3XW~8 n31ji!,;{7O'>>Q~yq7}``?7n^蓻fv@\DW00BL{u8RX(3g7bJdN$_Y5NQlc0pG=LS]l."ma߳@]2OvMS2}0>*3Q;w2͉:_d]Judmyntc!f$E$^jWnT9Ge`M,3UVҶvS%wxK~sjVfF˥do+x!$z$ov`$I, B ߏdӥ㓓7ggg#)f^1߹+#lo-wۚvB6]#B vF)yʕy-V}y|Jl۶}hs٬ܙ廳9OeRE'xvJ',qjV(̪׫qj;wX{pIENDB`././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-stylesheet.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-s0000644000175000017500000000317213063003273033353 0ustar mans0954mans0954PNG  IHDR szzbKGDtIME /9IDATXkl\s߯}ka Q"jՄ$P)`Diڨ JMP ZI $ćVJDZ9@JI%$E(!:q`MusZ7vpԑΜs~h.0CJ9toxGפ|rGR˝7|;ͳ/7i_]D[5aYTeo2}*6SwI˥ jKG0vJ0 >v5?r>_W])s2]i*eZ*yF=2q10pJUSn9 ќwm.TȐ$  L$2'޼U~ޓk81 ebݼ<pV{"䤭P=^@t'1Q!KIcؘ>=`݋Wow IC:?U4@ɣp}>Ƕc1UӴ;鹪l!فQއ6G([6*DGepWe ;oӰt }+a M"v鄂E V/K`Vܴ7fSHPUM6 cQgj]vي&[wy:Z-ȊLwo!r"Rgg;8`aR Z4 J!)*_{IJ^ܸΫ9 g}Vm?zǶB0 9GZEV3˄,K>3SO~`M2" T~=nt$O|R1J%!4 ,0+'ڵk,\nD~rXͣrg$)tbbsX!VbDb.rJ+VlVxͷ:=˝0!$*2pa^  @,fg'9gt:X,W?\.WY)BHBQ۶aYLӄauAQPJH$[Z hTj*,4 I 9@ͦ7}ڞ X)8pt]$I}#1X~M6-˚.0遦0D*|RzFid bHc, *JdgC=rl4ϺbjMOO ~IuUF1R={BȖ4z(Zg9Dg#C EmxȚG@(Z0f̌O2DA((IENDB`././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-in-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-i0000644000175000017500000000153213063003270033370 0ustar mans0954mans0954PNG  IHDRabKGD pHYs B(xtIME 2I(7IDAT8}[HaA93Deir!X`^ITDQdQtct3 fEhss}ov)K0OLB2JczҁH5[. xTN+S}>25ZJLv{s'Gaے[P[4n+qPı#}ftt*qBA" FhxUKIK$J#TZDZRTs*S0}`bx~L"cJF(L$YE%T :[;n&-Qz5<)L[$>R6Ht(sX_zܹ{[#e1RAR`EtYD__omúGCĒS`{tg@?0> Crf[\lܛn;-y:зzDiRa2*hW6u\z#a jjjnSú ѨpYrjY 8{.gzn߯թoͼ ܓ63ۂDIENDB`././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/process-stop-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/proces0000644000175000017500000000146413063003270033455 0ustar mans0954mans0954PNG  IHDRabKGD pHYs  tIME - kIDAT8mOSasm%@+xij 6X\:8iL q1P$(Ji;&_M{Ua==1DUv \Be3?k.]vͭhRJiY|x23^(X5*FN><}j&1}QPȑ|8v728emZ:M W,JgZg&xccw6ǪG Df8޻w$_r<֍TD"̻w Ծ>Ԗu~ ڷEJJ.hϟ( %BaՑppq]Qpz<8;wu@ y%%}]pzXb1mc6 ;Rww(8vԅB*,e_)D V[Z޺e=gutǃ=<혹Ʒoȕt)冚a ,6\Uxqx4рԝ:iբ)+@[VJ$(~MOnޤP^\$k$oF4|~?%r^S'[AW*gX-kSH c:`C6"Orbizi~inU|^L= 1mv?x.ElBZVO$֧lvƆ(,nƭ"zvWiEay3MR׆IENDB`././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/NodePickerPanelMessages.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/NodePi0000644000175000017500000000323113063003267033340 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: NodePickerPanelMessages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- AttributesTable.column1 = Name AttributesTable.column2 = Value AttributesTable.name = Attributes: InputPanelLabel.name = XML representation: IsWellFormedLabel.wellFormed = XML well formed. IsWellFormedLabel.notWellFormed = XML not well formed. ConfirmDialog.message = Save changes? ApplyButton.text = Apply ApplyButton.mnemonic = A ApplyButton.action = ApplyButtonAction ResetButton.text = Reset ResetButton.mnemonic = R ResetButton.action = ResetButtonAction AddButton.text = Add AddButton.mnemonic = d AddButton.action = AddButtonAction RemoveButton.text = Remove RemoveButton.mnemonic = m RemoveButton.action = RemoveButtonAction ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/squiggleIcon.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/squigg0000644000175000017500000000146013063003270033455 0ustar mans0954mans0954PNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb`?q &X.qTH p b MIZ-5œy X~j)Q 7 tC"Ax /ĂzdC,. _Fbb1?4qxǁB ,<Eƀ'd rB d@1!%6B|G@Ny@P' >:#Ar ѡ@L@ Xd= " %hnEZ Ӝ-8B À Ĉ ˯BO@(aPI@LH.)og9L l &hb* d9#bn$^G<F,=l1 \&*'k sZK Xp\ XH* `\L<(.b(#p@iZx8[W9q>_C-'!Y 5 tFSh9 ({":Xht   PH DBJx-%:t@,dFhP0:ǢIENDB`././@LongLink0000644000000000000000000000020100000000000011574 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/utilities-system-monitor-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/utilit0000644000175000017500000000114313063003270033466 0ustar mans0954mans0954PNG  IHDRabKGD pHYs  tIME :4$gIDAT8˥=hAݙݽ"Ka BH!`as`$jRXF.1VHXB*AD=I 4 w;11!'J|eg&(sl#iJoj93T*zF;ORG p Er%cg.C2 <6r>dDi١:J& i.E%)"$ ֘k*F$1={s #B vA(Fk˥]SH$1Qq՟ N,A0ǟPߍ,Som7?5;Xcz x(UX !?pY# . `uG9.=hmVcqZg po&>J4Mbhdv[:p i<==I*RZlL&Wg"zi6nYqeWTl3N0D4V///|p8(ժ C @D8::BD, ]NkIJEF@UU)>B܃] ~7NNNR*6eǸ\.7MDj5Q?NN%VIENDB`././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-in.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/zoom-i0000644000175000017500000000233613063003271033374 0ustar mans0954mans0954PNG  IHDRĴl;bKGD pHYs B(xtIME . 6xkIDAT8˵klTEs*햶Kh$J-hJD Ĥ)/`hH+4BY6~FZmcWvwlZK!&|9333UUUsSCSY5@RF !RJv{h݀Ʀ՛Mٹ$`"O8dɱȋa_{/wˣh]/җ$!e٬銢$vYdqZ_P!R=I@PPsO) m7)czB5ˁӥ{_{w7l{v`P^VԨ$q}}XLH)(eVQO-6ӄrZKR~ R//+nhyhiSiC'`qI"Y|%l p-\kT2s:(Ej\J15x(5V f@`,ӓ~ xA?/REA9ƎyW a ȉ `E4CUUR zɠr\nDK]%X2 a LfsDª,7u4ƨT*Ub}i>X4 >>11.^:PKo6- KsCuU"_gΟWQ{f@ɖJkSн(tƆ\oo/$IR6D"r|6۷e 4*-'Ão8v  IJf9PT#c .\Sp%]1_^45a8\VZͽy˦EbSr@G,lxff~GNa6Yw/ N=WY)TԞQ[*.kG׸\.! ^H{{ nܸqUa;,p:hyا-f|qz<gK^^K,?tvv?q nv999It42aYJJJ>Y&F04-mi=fsGgP29c?tjۚL{^; v=fb 9/IENDB`././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-playback-pause.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-0000644000175000017500000000121713063003270033312 0ustar mans0954mans0954PNG  IHDRĴl;bKGD pHYs B(xtIME !IDAT8UˊA=+ݩ+71,2 nD$A0?B%HRq.TĝUus={ ^{08K!Dr|r\JyGK)}ws!'Qcf%Zbx:=%|BiJh9tzVӦ֚9v-f@t;M:fGw̯ 55C$I\*i0MS@Ǽ82&"a1oSˢiT0oA~bEe\*2) sx\h*EQ%Yht)QS#cv A,ͬ_RΊvrjP*(jzKw:V} kCNjZxV(A"`0?Yvm`4٭EW'B=yytt񘭵?>_+v̍jc*!GQdh cLZ*(8 %-cۚ!!IENDB`batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/pi.gif0000644000175000017500000000027413063003273033337 0ustar mans0954mans0954GIF89a`````!,iI850Ta*$f$,(h܌[ q,a;QA VuPe1.1=R6p֜yWq~%U;././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-security-dark.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-s0000644000175000017500000000256013063003273033353 0ustar mans0954mans0954PNG  IHDR szz pHYs  tIME5EOoIDATXKhTW߹Inlj3N1A3h(ADpcm4ZRW,.KE+DpT<4f&Ӆ86&suׇzߎ_I{࿪.[7|auU*E}dOݰaqR$}ܹ# Mjag~iiIRvDk+n~~I*1!:t<"XX3gֳCߤ(0O5H=zu+$;;R)̞|3)!SmQQa%.]B͞YUYYzXhnN /v{H`o 2-QF"phB 4LuwͳW`.\`"`Νt)7ZbۍͰhdq͛gJ/PYhD3gyx(B왤p6mB,5p!77D)ro'ۋ307lcWXJ`̚|pyM-cw*+Ivt0=1ͽ{! rfZE'y1Nή]Ph 8@MM V¶3vٳð>'ߨ@3MFDk+fy9F,6.8c8rȸ"UZԃ={#mDax2Rj\LnZ#O(*md)0.`UUaՍq b jkk."(ExPk+Y/]3kC[dqtiϴH)"jk8}1~y(PDk+Y4n0h<;sfի2Myy葌0 Ylk?v%I,i6ɹMȶ ~~~~{~>8(F=!P[<|w ( rFqwY)w"YyW zP;o>i,|~ٹX'CC 'AtXdb|p$L_/'y|>G> 5H=~X]Pv8NZ=PTJ;VB,PJam;LgROC" ϿH6_ (n1H=¶D?fNid^ypd6e9:j]Gݕ6p;z<9c?\f(U+1Pǎ@\T=#ruh0*e0ͮV=IeR?[ ;օѱ$Q]v(mM_3@a}lDғ#1`iЇ,U`[7O*_a[ڳeRa%UrОX?fX,~ &+7DǢɾfE&&o@r*5'z̪މ浾[gM4:uxtۺhU#RߦFcs"`6kSSEv[fS8@w)ݚ`[K)_9d^IENDB`././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-playback-start.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/media-0000644000175000017500000000170113063003270033310 0ustar mans0954mans0954PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<SIDAT8kW﹓.*mMK*B!l ZcԂ A.k[jbZ&IVmA+S)Mdv̎s|}{;xQVeѲ9;+5Numy}--jxC8OLm|;Ύ?4}1 k6n{fLxm :M[Ů6)n彔GzoƄ?*kV)M4ے U2Mw}7caMn !F(ŸdšPɏ%IJ`f(1}.YOv7mlzm^LfAQ A'lk*sSiYX ۶8fE`i6[>4 20;Bp2 ! @DQ~ِe*##GL̀2HB@ BdY5g[cZ 6o*HWj, $A.=7<}{v E \UUUA%d<|D"$]ֲӆ!ର( =Bki#cMݡ={`y _*Ggԓ,Yr;:^"~?X8'({7Dcc ٢HX @`jirva?8;R*MIENDB`././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/ThumbnailDialog.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/Thumbn0000644000175000017500000000215713063003273033422 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # ThumbnailDialog properties file # # Author: tkormann@apache.org # $Id: ThumbnailDialog.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- Dialog.title = Thumbnail ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/dom-viewer-small.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/dom-vi0000644000175000017500000000054513063003270033354 0ustar mans0954mans0954PNG  IHDRabKGD pHYs  tIME J tEXtCommentCreated with The GIMPd%nIDAT8Œ1 @EhE bB@Hov[x뭄'0}la/(2#.#„n(&]#x6k18Yq%.'l%2nFp=1d"2za[ELCKZbZuvkN@U?In7yu -lsFxޚU>{IIENDB`././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-language-dark.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-l0000644000175000017500000000327613063003273033351 0ustar mans0954mans0954PNG  IHDR szzbKGD pHYs  tIME J KIDATXo]W={td ¥Њ(%$BUx?C_j_xA[ o-HT-UZ$&qHblj{xq[ZZhko}Zg[?N8!V_,~Y#t&58c~-sY}Oϔ_̜D}ɠ8^ il2\]FN98PFstֲ,7|K3‹Rʕ#G*K'?fgg͝zsf=2r96ĽM-,{&jپ}hx{?qҋ$҃Kh&c(BѴXnXKn8OZ㽽 W^:DBZgH1=CPɔbP`= Yz֒COXnh2徧%;R8 >J1Y0S|y@.P7Sb kʧ( Z`@KO\v,pIfxSsX!/ԢCyO=grXҥf^wK1n ]PPOwo~|csN>Fy W?2j8o R@ sa,5`UQ)e}fc*;01DyT:09aGX<_gh.f$ bKoZA-R># 4㦥κ&iK.1v ēyteCVnB;|,@ V53LNUxO&3E,kÓ]zCM/ >5+5nmJ_;$ nB8,!Xd1 CH `"wĴUtyh*K1C!vò)B0cK`e)N,MZ.j\귊Ԥx iNl.HH01HK97rŢ.jHc,ҎGH^V@s>⪦1ǸqFO;Jkdl9ƀnL)@VZPv>,}\Gyd\5Bi^߉ հNITɰHll͜3nӖ)?FU4/],a}@8qܝ01kr08Đȁ-=])nJXb\d"CUzm)c5;_ft/EĴyϋW 3tǾg'NƐ֐8'k+z"0g4C5&8߱im˺,7`"0/M.R]MG e/$"0Ƥ FﺸqQʝ%իOMQ2ScaC0L ]qC=81raa"gu~s=}5)++ZZp:UFLߟ}6uE$ }͛ /PDFn%! !F\GPѢ1&́D a7oEcD0Ț)i\r`IENDB`././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/init.svgbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/init.s0000644000175000017500000001367713063003273033402 0ustar mans0954mans0954 batik SVG ././@LongLink0000644000000000000000000000017300000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/StatusBarMessages.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/Status0000644000175000017500000000232413063003273033444 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # The status bar resources. # # Author: stephane@hillion.org # $Id: StatusBarMessages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- Panel.default_message = Batik SVG Browser - xmlgraphics.apache.org/batik Position.width_letters = w: Position.height_letters = h: ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/go-next.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/go-nex0000644000175000017500000000164213063003270033355 0ustar mans0954mans0954PNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<4IDAT8[hU5bE))('o탅 5ЂVAE"R|iII `Q>EPKiCZ )bK4&*54KԤӓe^>9u6чt̆5ڋ٢\ &ձym-76v/)`/Ty5oo&}?k6kMeb&hhQwYu#sN7lZlU}mʖӯȕ=2'Aա(N]Cwi`l|jZ{]NԞAőYRVw7{L),>u 1JDDdKiHdC4"ICb!-';Yq궆=AӢ`JI1.ҟHBH*Nb \ah nzp|p1dx[r?>S3>')jSDnXh40<#x,)gMv>끪LՕ&R宕O}˟>.PfYK!}9^K#fIwp)#~5CgsYn)ξ˫ U"B"g&MGZA*(AۀTH΁sK.S)SMR-'4IENDB`././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/dom-viewer.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/dom-vi0000644000175000017500000000110013063003273033343 0ustar mans0954mans0954PNG  IHDRĴl;bKGD pHYs  tIME(tEXtCommentCreated with The GIMPd%nIDAT8͔K@?'YE*\Dp^)(t; K?Qŭ \􇗚_8=޽}'A Ǭ(P}kp|i#k)q(Eր$d877i(GwSy*;(@3OXOR)f-vc/T+j^uBDݔkI6 ޠOme;oRY]YR8yM:[;* YW"X -Gxfp:n3OZb*ŰV|`,ΑIENDB`././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/blank.gifbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/blank.0000644000175000017500000000007513063003271033325 0ustar mans0954mans0954GIF89a!,ڋ>;././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/disabledUndo.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/disabl0000644000175000017500000000116213063003270033413 0ustar mans0954mans0954PNG  IHDRw=sRGBbKGD pHYs  tIME ;" IDATHϫiQǿtI"2:Rfa"efh` IQJ PF%7幷w |j^^{3"Oy s$Il?ȲLbfv{"P2JBDD~RID*nT,az1 `2Q* *a_(T.` jb4a:"NCEeA6bbrAvn|FV{JO84 F#zjL&x! "ݸP\F` vۄjz ^ӉzjED7xzxp8JZtpiD"20 PTnl68ocǃt:^=2 ɲ FAqnNZ-0k=d2 `|>CEB!t[e5IIENDB`././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-general-dark.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-g0000644000175000017500000000204413063003270033331 0ustar mans0954mans0954PNG  IHDR szzbKGD pHYs  tIME M7gIDATXWO,U=7sgfgB'ogƄИXQZ(͆Xi, $R 0ą13{,vw\XENu3ssϹ73?zՏ~ۻyXc͞)0!:3ǏE."Z7ƨ+ҌR꫙/KɧZ*oY^^D%3#wV0 u!ڗ1:/FGG#,{lV^@D3g A$N!yLMM!"|};CA)qhō17FBDp]̌0 q[3aA'.P(q+ww9e"⭶5@ "$I#A"AjE iyk-8@Dnȃ" "cP.|ށ@ZZbkk+ Ee([_]˓D8iw!S/ef(߇tɂ R Ƙ/?fϛ MNRQ DnU{WSrkF x^" C$63,R (4ΣA.4`ۃz5'y=p<~.yhDZ6_@CjTgLh$4 0I@)AJ9pA^ʰo@oO_MTi=Q`fj jP"rn5 €S"o섍F>7֮5ƸZ:"B}"8R[""}ccǧ'\ǟüHq IENDB`././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-network.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/icon-n0000644000175000017500000000451613063003270033346 0ustar mans0954mans0954PNG  IHDR szzbKGDtIME /9IDATXYl\gw;3wl'9iݤISeQ[(Q (* >RAUh"Dx ip&4vw{}=sρwwÉoJ<<,+J@l@DS ڥ?z/c?a7nSӓRON(*NdiݴX,. '_ty7Ʈ]Gw>|{[cymhrb!TFXMbMMf[:/+ojxoi!1}w];N̕\]4%MR z͛:3K6Kr ߚƕ+oɯ~hT 3gfLʊ08o+,1+bbX1rx"O&ejtW_?H!-YEמ-i@!Bvt+  IYؐnfqo\JTan6O92> )μ{dgWGtUANh:VL%ih$,TƳK,,Hl$[[;Sέ 0olkS_Q5UI% LCc6_a`"UHFL[F-Β);7\qaȲ"%33?͇!h)6k\d._JmF*ItXv@~b;#ܝXHW]<ā6^~ ;wljd(7ΤԧLvl?+N` GTr-JY8~6k#37:8Ȗj$I<ql_S%b-TeP}ng! #R$$[2)~npȏ^|#_ŋ&O? )($5 QD >5ǧw,BT(aa1dIfj_;b < s}ן?H)47&iu C\?@D!VVz$82 oӔI)rsdW%ڤ[RyTla;>b ֈ~9!/q-R(}@RB0C$$TE"@<"(ʨLPQDW>x DB"i4TBgX1l}/x!w* 4c@DP!~0V͘ ?QTa{:I&Dъ D7u?Ϗ]CD G` :7pD|74u/ll=ò$?,8rGdc1Hz!a4TD] >2 SMrySsYߑ~:=}5x.5^ڲ|󶶎lf^e.M` |sƸ36e%hO!~EejFD#D]sI')D]qƯ\9n)ތrٟc2s倡< 2p4dU/~똺B]\#ex-,&Z *P. RhYiRxGıN3I:. wofnARHg*,+$m!Ēm3#N @gMFU: j^;p'dRL}CaA]-ӔVk%( lvٳZ/, $WW|MnBVi5I畁 |P]WV!j@u3Ӈlm!_d8nIENDB`././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/enableOverlay.pngbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/enable0000644000175000017500000000101513063003270033400 0ustar mans0954mans0954PNG  IHDRw=IDATx핿A&U`EJ),%9Ii#Zz+׋) A!VALHv2)&p* 2|JBN{'OΉr=/e'{յFrqMȼxdb2n[˫kK%4 KT%r~Sqzӝ=n p^u޽~vϷ/|DQ Lf0_;s/a:NIRy*ϛ5 {ǏH$eY4 J^OErY$I> UUvt:j{?21 hl6cXb`eYZ-5@tJXzp~\Nj!6>`lVr <~nqD4z~nA!i'TUɲ,Bp MQIENDB`././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/Main.propertiesbatik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/Main.p0000644000175000017500000000316213063003267033307 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # The application-wide resources. # # Author: stephane@hillion.org # $Id: Main.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- # # Frame configuration. # Frame.width = 800 Frame.height = 600 Frame.icon = resources/squiggleIcon.png Frame.title = Squiggle # # Command-line options. # Command.header = \ \n\ \tSquiggle SVG browser - (C) Apache Software Foundation \n\ \t\thttp://xmlgraphics.apache.org/batik\n Command.syntax = \ Syntax:\n\ \tsquiggle [options] Command.options = \ Available Options: Command.font-size = \ -font-size \n\ \tSets the user interface default font size. Error.skipping.file = \ Cannot read file. File will not be loaded. \n ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000644�0000000�0000000�00000000167�00000000000�011607� L����������������������������������������������������������������������������������������������������ustar �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/document-print-small.png����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/resources/org/apache/batik/apps/svgbrowser/resources/docume0000644�0001750�0001750�00000001040�13063003270�033424� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a���bKGD������ pHYs�� �� d_���tIME  /텊��IDAT8˥͊A{3@v Y&DŸwg@tD}IFFlLVw*:$N\hDGR|UK~.!;fq_|>+װ֢a(�6)$5Tw5"`0 c690d:2L&F#!V_>g3X,Df3|' C�$IcBxPUvr zFEְ6{1\Hic ݄ V+p-f)7",3x_3ԁ1|tSSRƣqwp5Xb55�Thierry Kormann * @version $Id: JPEGOptionPanel.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class JPEGOptionPanel extends OptionPanel { /** * The jpeg encoding quality. */ protected JSlider quality; /** * Creates a new panel. */ public JPEGOptionPanel() { super(new GridBagLayout()); ExtendedGridBagConstraints constraints = new ExtendedGridBagConstraints(); constraints.insets = new Insets(5, 5, 5, 5); constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.NONE; constraints.setGridBounds(0, 0, 1, 1); add(new JLabel(resources.getString("JPEGOptionPanel.label")), constraints); quality = new JSlider(); quality.setMinimum(0); quality.setMaximum(100); quality.setMajorTickSpacing(10); quality.setMinorTickSpacing(5); quality.setPaintTicks(true); quality.setPaintLabels(true); quality.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); Hashtable labels = new Hashtable(); for (int i=0; i < 100; i+=10) { labels.put(new Integer(i), new JLabel("0."+i/10)); } labels.put(new Integer(100), new JLabel("1")); quality.setLabelTable(labels); Dimension dim = quality.getPreferredSize(); quality.setPreferredSize(new Dimension(350, dim.height)); constraints.weightx = 1.0; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.setGridBounds(1, 0, 1, 1); add(quality, constraints); } /** * Returns the jpeg quality. */ public float getQuality() { return quality.getValue()/100f; } /** * Shows a dialog to choose the jpeg encoding quality and return * the quality as a float. */ public static float showDialog(Component parent) { String title = resources.getString("JPEGOptionPanel.dialog.title"); JPEGOptionPanel panel = new JPEGOptionPanel(); Dialog dialog = new Dialog(parent, title, panel); dialog.pack(); dialog.setVisible(true); return panel.getQuality(); } } ������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/ResourceOrigin.java��0000644�0001750�0001750�00000002502�13063003273�032733� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; /** * This interface defines constants for the possible resource * origins. * * @author Vincent Hardy * @version $Id: ResourceOrigin.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ResourceOrigin { /** * Any origin */ int ANY = 1; /** * Same as document */ int DOCUMENT = 2; /** * Embeded into the document */ int EMBEDED = 4; /** * No origin is ok */ int NONE = 8; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/AboutDialog.java�����0000644�0001750�0001750�00000011554�13063003273�032175� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import java.awt.Color; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.URL; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JWindow; import javax.swing.border.BevelBorder; import org.apache.batik.Version; /** * A dialog showing the revision of the Batik viewer as well * as the list of contributors. * The dialog can be dismissed by click or by escaping. * * @author Vincent Hardy * @version $Id: AboutDialog.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class AboutDialog extends JWindow { public static final String ICON_BATIK_SPLASH = "AboutDialog.icon.batik.splash"; /** * Creates a new AboutDialog. */ public AboutDialog() { buildGUI(); } /** * Creates a new AboutDialog with a given owner. */ public AboutDialog(Frame owner) { super(owner); buildGUI(); addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ if(e.getKeyCode() == KeyEvent.VK_ESCAPE){ setVisible(false); dispose(); } } }); addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ setVisible(false); dispose(); } }); } public void setLocationRelativeTo(Frame f) { Dimension invokerSize = f.getSize(); Point loc = f.getLocation(); Point invokerScreenLocation = new Point(loc.x, loc.y); Rectangle bounds = getBounds(); int dx = invokerScreenLocation.x+((invokerSize.width-bounds.width)/2); int dy = invokerScreenLocation.y+((invokerSize.height - bounds.height)/2); Dimension screenSize = getToolkit().getScreenSize(); if (dy+bounds.height>screenSize.height) { dy = screenSize.height-bounds.height; dx = invokerScreenLocation.x<(screenSize.width>>1) ? invokerScreenLocation.x+invokerSize.width : invokerScreenLocation.x-bounds.width; } if (dx+bounds.width>screenSize.width) { dx = screenSize.width-bounds.width; } if (dx<0) dx = 0; if (dy<0) dy = 0; setLocation(dx, dy); } /** * Populates this window. */ protected void buildGUI() { getContentPane().setBackground(Color.white); ClassLoader cl = this.getClass().getClassLoader(); URL url = cl.getResource(Resources.getString(ICON_BATIK_SPLASH)); ImageIcon icon = new ImageIcon(url); int w = icon.getIconWidth(); int h = icon.getIconHeight(); JLayeredPane p = new JLayeredPane(); p.setSize(600, 425); getContentPane().add(p); JLabel l = new JLabel(icon); l.setBounds(0, 0, w, h); p.add(l, new Integer(0)); JLabel l2 = new JLabel("Batik " + Version.getVersion()); l2.setForeground(new Color(232, 232, 232, 255)); l2.setOpaque(false); l2.setBackground(new Color(0, 0, 0, 0)); l2.setHorizontalAlignment(JLabel.RIGHT); l2.setVerticalAlignment(JLabel.BOTTOM); l2.setBounds(w - 320, h - 117, 300, 100); p.add(l2, new Integer(2)); ((JComponent)getContentPane()).setBorder (BorderFactory.createCompoundBorder (BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.gray, Color.black), BorderFactory.createCompoundBorder (BorderFactory.createCompoundBorder (BorderFactory.createEmptyBorder(3, 3, 3, 3), BorderFactory.createLineBorder(Color.black)), BorderFactory.createEmptyBorder(10, 10, 10, 10)))); } } ����������������������������������������������������������������������������������������������������������������������������������������������������batik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/TransformHistory.java0000644�0001750�0001750�00000005065�13063003273�033340� 0����������������������������������������������������������������������������������������������������ustar �mans0954������������������������mans0954���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import java.awt.geom.AffineTransform; import java.util.ArrayList; import java.util.List; /** * This class implements a transform history mechanism. * * @author Stephane Hillion * @version $Id: TransformHistory.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class TransformHistory { /** * The transform stack. */ protected List transforms = new ArrayList(); /** * The current position in the stack. */ protected int position = -1; /** * Goes back of one position in the history. * Assumes that canGoBack() is true. */ public void back() { position -= 2; } /** * Whether it is possible to go back. */ public boolean canGoBack() { return position > 0; } /** * Goes forward of one position in the history. * Assumes that canGoForward() is true. */ public void forward() { } /** * Whether it is possible to go forward. */ public boolean canGoForward() { return position < transforms.size() - 1; } /** * Returns the current transform. */ public AffineTransform currentTransform() { return (AffineTransform)transforms.get(position + 1); } /** * Adds a transform to the history. */ public void update(AffineTransform at) { if (position < -1) { position = -1; } if (++position < transforms.size()) { if (!transforms.get(position).equals(at)) { transforms = transforms.subList(0, position + 1); } transforms.set(position, at); } else { transforms.add(at); } } } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/AbstractCompoundCommand.javabatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/AbstractCompoundComma0000644000175000017500000000564413063003274033314 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import java.util.ArrayList; /** * Abstract compound command. Supports the execute / undo / redo of more than * one command * * @version $Id: AbstractCompoundCommand.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class AbstractCompoundCommand extends AbstractUndoableCommand { /** * The atom UndoableCommand command list. */ protected ArrayList atomCommands; /** * Constructor. */ public AbstractCompoundCommand() { this.atomCommands = new ArrayList(); } /** * Adds the given command to the atomCommand list. * * @param command * The given command */ public void addCommand(UndoableCommand command) { if (command.shouldExecute()) { atomCommands.add(command); } } public void execute() { int n = atomCommands.size(); for (int i = 0; i < n; i++) { UndoableCommand cmd = (UndoableCommand) atomCommands.get(i); cmd.execute(); } } public void undo() { int size = atomCommands.size(); for (int i = size - 1; i >= 0; i--) { UndoableCommand command = (UndoableCommand) atomCommands.get(i); command.undo(); } } public void redo() { int n = atomCommands.size(); for (int i = 0; i < n; i++) { UndoableCommand cmd = (UndoableCommand) atomCommands.get(i); cmd.redo(); } } public boolean shouldExecute() { boolean shouldExecute = true; if (atomCommands.size() == 0) { shouldExecute = false; } int n = atomCommands.size(); for (int i = 0; i < n && shouldExecute; i++) { UndoableCommand command = (UndoableCommand) atomCommands.get(i); shouldExecute = command.shouldExecute() && shouldExecute; } return shouldExecute; } /** * Returns the command number that this compound command contains. * * @return The atom command number */ public int getCommandNumber() { return atomCommands.size(); } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/DOMViewerController.javabatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/DOMViewerController.j0000644000175000017500000000431513063003273033155 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import org.apache.batik.swing.gvt.Overlay; import org.w3c.dom.Document; import org.w3c.dom.Node; /** * Provides the information needed for the DOMViewer to show and edit the * document. * * @version $Id: DOMViewerController.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface DOMViewerController { /** * Performs the document update. * * @param r The runnable that contains the update */ void performUpdate(Runnable r); /** * Creates the ElementSelectionManager to manage the selection overlay on * the canvas. * * @return ElementSelectionManager */ ElementOverlayManager createSelectionManager(); /** * Removes the given selection overlay from the canvas. * * @param selectionOverlay * The given selection overlay */ void removeSelectionOverlay(Overlay selectionOverlay); /** * Gets the document for the DOMViewer to show. * * @return the document */ Document getDocument(); /** * Selects the given node in the DOMViewer's document tree. * * @param node * The node to select */ void selectNode(Node node); /** * Checks whether the DOMViewer should be allowed to edit the document. * * @return True for non static documents, when UpdateManager is available */ boolean canEdit(); } batik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/OptionPanel.java0000644000175000017500000000646513063003274032241 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.apache.batik.util.resources.ResourceManager; /** * This class represents a panel to present users with options. * * @author Thomas DeWeese * @version $Id: OptionPanel.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class OptionPanel extends JPanel { /** * The gui resources file name */ public static final String RESOURCES = "org.apache.batik.apps.svgbrowser.resources.GUI"; /** * The resource bundle */ protected static ResourceBundle bundle; /** * The resource manager */ protected static ResourceManager resources; static { bundle = ResourceBundle.getBundle(RESOURCES, Locale.getDefault()); resources = new ResourceManager(bundle); } /** * Creates a new panel. */ public OptionPanel(LayoutManager layout) { super(layout); } /** * This class is modal dialog to choose the jpeg encoding quality. */ public static class Dialog extends JDialog { /** * The 'ok' button. */ protected JButton ok; /** * The 'ok' button. */ protected JPanel panel; public Dialog(Component parent, String title, JPanel panel) { super(JOptionPane.getFrameForComponent(parent), title); setModal(true); this.panel = panel; getContentPane().add(panel, BorderLayout.CENTER); getContentPane().add(createButtonPanel(), BorderLayout.SOUTH); } /** * Creates the button panel. */ protected JPanel createButtonPanel() { JPanel panel = new JPanel(new FlowLayout()); ok = new JButton(resources.getString("OKButton.text")); ok.addActionListener(new OKButtonAction()); panel.add(ok); return panel; } /** * The action associated to the 'ok' button. */ protected class OKButtonAction extends AbstractAction { public void actionPerformed(ActionEvent evt) { dispose(); } } } } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootbatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/AbstractUndoableCommand.javabatik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/AbstractUndoableComma0000644000175000017500000000305013063003273033245 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; /** * Represents abstract undoable/redoable command. Concrete commands should * extend this class * * @version $Id: AbstractUndoableCommand.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class AbstractUndoableCommand implements UndoableCommand { /** * The command name. */ protected String name; public void execute() { } public void undo() { } public void redo() { } public String getName() { return name; } /** * Sets the command name. * * @param name * Name to set */ public void setName(String name) { this.name = name; } public boolean shouldExecute() { return true; } } batik-1.9.orig/batik-svgbrowser/src/main/java/org/apache/batik/apps/svgbrowser/NodeTemplates.java0000644000175000017500000013204213063003274032544 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.svgbrowser; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Node; /** * Provides basic xml representation and description for most commonly used * nodes. * * @version $Id: NodeTemplates.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class NodeTemplates { // Node template descriptions provide basic information on node properties, // such as: xml represenation (suffix "Value"), element name // (suffix "Name"), element type (suffix "Type"), element category // (suffix "Category"), element description (suffix "Description"). // Base node name on which these suffixes are appended is read from the // class members ending with "MemberName". // Example: // public static String rectMemberName = "rectElement"; // Other class members that describe this node should be declared as: // rectElementValue = "...", rectElementType = "...", rectElementName = // "...", rectElementCategory = "..." and rectElementDescription = "..." // Suffixes public static final String VALUE = "Value"; public static final String NAME = "Name"; public static final String TYPE = "Type"; public static final String DESCRIPTION = "Description"; public static final String CATEGORY = "Category"; // Categories public static final String BASIC_SHAPES = "Basic Shapes"; public static final String LINKING = "Linking"; public static final String TEXT = "Text"; public static final String ANIMATION = "Animation"; public static final String CLIP_MASK_COMPOSITE = "Clipping, Masking and Compositing"; public static final String COLOR = "Color"; public static final String INTERACTIVITY = "Interactivity"; public static final String FONTS = "Fonts"; public static final String DOCUMENT_STRUCTURE = "Document Structure"; public static final String FILTER_EFFECTS = "Filter Effects"; public static final String EXTENSIBILITY = "Extensibility"; public static final String GRADIENTS_AND_PATTERNS = "Gradients and Patterns"; public static final String PAINTING = "Painting: Filling, Stroking and Marker Symbols"; public static final String METADATA = "Metadata"; public static final String PATHS = "Paths"; public static final String SCRIPTING = "Scripting"; public static final String STYLING = "Styling"; // Maps /** * Map with node template wrappers. */ private Map nodeTemplatesMap = new HashMap(); /** * List with all node categories. */ private ArrayList categoriesList = new ArrayList(); // Rect element public static String rectMemberName = "rectElement"; public static String rectElementValue = ""; public static String rectElementName = SVGConstants.SVG_RECT_TAG; public static short rectElementType = Node.ELEMENT_NODE; public static String rectElementCategory = BASIC_SHAPES; public static String rectElementDescription = "Rect"; // Circle element public static String circleMemberName = "circleElement"; public static String circleElementValue = ""; public static String circleElementName = SVGConstants.SVG_CIRCLE_TAG; public short circleElementType = Node.ELEMENT_NODE; public static String circleElementCategory = BASIC_SHAPES; public static String circleElementDescription = "Circle"; // Line element public static String lineElementMemberName = "lineElement"; public static String lineElementName = SVGConstants.SVG_LINE_TAG; public static String lineElementValue = ""; public static short lineElementType = Node.ELEMENT_NODE; public static String lineElementCategory = BASIC_SHAPES; public static String lineElementDescription = "Text"; // Path element public static String pathElementMemberName = "pathElement"; public static String pathElementName = SVGConstants.SVG_PATH_TAG; public static String pathElementValue = ""; public static short pathElementType = Node.ELEMENT_NODE; public static String pathElementCategory = PATHS; public static String pathElementDescription = "Path"; // G element public static String groupElementMemberName = "groupElement"; public static String groupElementName = SVGConstants.SVG_G_TAG; public static String groupElementValue = ""; public static short groupElementType = Node.ELEMENT_NODE; public static String groupElementCategory = DOCUMENT_STRUCTURE; public static String groupElementDescription = "Group"; // Ellipse element public static String ellipseElementMemberName = "ellipseElement"; public static String ellipseElementName = SVGConstants.SVG_ELLIPSE_TAG; public static String ellipseElementValue = ""; public static short ellipseElementType = Node.ELEMENT_NODE; public static String ellipseElementCategory = BASIC_SHAPES; public static String ellipseElementDescription = "Ellipse"; // Image element public static String imageElementMemberName = "imageElement"; public static String imageElementName = SVGConstants.SVG_IMAGE_TAG; public static String imageElementValue = ""; public static short imageElementType = Node.ELEMENT_NODE; public static String imageElementCategory = DOCUMENT_STRUCTURE; public static String imageElementDescription = "Image"; // Polygon element public static String polygonElementMemberName = "polygonElement"; public static String polygonElementName = SVGConstants.SVG_POLYGON_TAG; public static String polygonElementValue = ""; public static short polygonElementType = Node.ELEMENT_NODE; public static String polygonElementCategory = BASIC_SHAPES; public static String polygonElementDescription = "Polygon"; // Polyline element public static String polylineElementMemberName = "polylineElement"; public static String polylineElementName = SVGConstants.SVG_POLYLINE_TAG; public static String polylineElementValue = ""; public static short polylineElementType = Node.ELEMENT_NODE; public static String polylineElementCategory = BASIC_SHAPES; public static String polylineElementDescription = "Polyline"; // Text element public static String textElementMemberName = "textElement"; public static String textElementName = SVGConstants.SVG_TEXT_TAG; public static String textElementValue = " "; public static short textElementType = Node.ELEMENT_NODE; public static String textElementCategory = TEXT; public static String textElementDescription = "Text"; // TRef element public static String tRefElementMemberName = "tRefElement"; public static String tRefElementName = SVGConstants.SVG_TREF_TAG; public static String tRefElementValue = ""; public static short tRefElementType = Node.ELEMENT_NODE; public static String tRefElementCategory = TEXT; public static String tRefElementDescription = "TRef"; // TSpan element public static String tspanElementMemberName = "tspanElement"; public static String tspanElementName = SVGConstants.SVG_TSPAN_TAG; public static String tspanElementValue = ""; public static short tspanElementType = Node.ELEMENT_NODE; public static String tspanElementCategory = TEXT; public static String tspanElementDescription = "TSpan"; // TextPath element public static String textPathElementMemberName = "textPathElement"; public static String textPathElementName = SVGConstants.SVG_TEXT_PATH_TAG; public static String textPathElementValue = ""; public static short textPathElementType = Node.ELEMENT_NODE; public static String textPathElementCategory = TEXT; public static String textPathElementDescription = "TextPath"; // Svg element public static String svgElementMemberName = "svgElement"; public static String svgElementName = SVGConstants.SVG_SVG_TAG; public static String svgElementValue = ""; public static short svgElementType = Node.ELEMENT_NODE; public static String svgElementCategory = DOCUMENT_STRUCTURE; public static String svgElementDescription = "svg"; // FeBlend element public static String feBlendElementMemberName = "feBlendElement"; public static String feBlendElementName = SVGConstants.SVG_FE_BLEND_TAG; public static String feBlendElementValue = ""; public static short feBlendElementType = Node.ELEMENT_NODE; public static String feBlendElementCategory = FILTER_EFFECTS; public static String feBlendElementDescription = "FeBlend"; // FeColorMatrix element public static String feColorMatrixElementMemberName = "feColorMatrixElement"; public static String feColorMatrixElementName = SVGConstants.SVG_FE_COLOR_MATRIX_TAG; public static String feColorMatrixElementValue = ""; public static short feColorMatrixElementType = Node.ELEMENT_NODE; public static String feColorMatrixElementCategory = FILTER_EFFECTS; public static String feColorMatrixElementDescription = "FeColorMatrix"; // FeComponentTransfer element public static String feComponentTransferElementMemberName = "feComponentTransferElement"; public static String feComponentTransferElementName = SVGConstants.SVG_FE_COMPONENT_TRANSFER_TAG; public static String feComponentTransferElementValue = ""; public static short feComponentTransferElementType = Node.ELEMENT_NODE; public static String feComponentTransferElementCategory = FILTER_EFFECTS; public static String feComponentTransferElementDescription = "FeComponentTransfer"; // FeComposite element public static String feCompositeElementMemberName = "feCompositeElement"; public static String feCompositeElementName = SVGConstants.SVG_FE_COMPOSITE_TAG; public static String feCompositeElementValue = ""; public static short feCompositeElementType = Node.ELEMENT_NODE; public static String feCompositeElementCategory = FILTER_EFFECTS; public static String feCompositeElementDescription = "FeComposite"; // FeConvolveMatrix element public static String feConvolveMatrixElementMemberName = "feConvolveMatrixElement"; public static String feConvolveMatrixElementName = SVGConstants.SVG_FE_CONVOLVE_MATRIX_TAG; public static String feConvolveMatrixElementValue = ""; public static short feConvolveMatrixElementType = Node.ELEMENT_NODE; public static String feConvolveMatrixElementCategory = FILTER_EFFECTS; public static String feConvolveMatrixElementDescription = "FeConvolveMatrix"; // FeDiffuseLighting element public static String feDiffuseLightingElementMemberName = "feDiffuseLightingElement"; public static String feDiffuseLightingElementName = SVGConstants.SVG_FE_DIFFUSE_LIGHTING_TAG; public static String feDiffuseLightingElementValue = ""; public static short feDiffuseLightingElementType = Node.ELEMENT_NODE; public static String feDiffuseLightingElementCategory = FILTER_EFFECTS; public static String feDiffuseLightingElementDescription = "FeDiffuseLighting"; // FeDisplacementMap element public static String feDisplacementMapElementMemberName = "feDisplacementMapElement"; public static String feDisplacementMapElementName = SVGConstants.SVG_FE_DISPLACEMENT_MAP_TAG; public static String feDisplacementMapElementValue = ""; public static short feDisplacementMapElementType = Node.ELEMENT_NODE; public static String feDisplacementMapElementCategory = FILTER_EFFECTS; public static String feDisplacementMapElementDescription = "FeDisplacementMap"; // FeDistantLight element public static String feDistantLightElementMemberName = "feDistantLightElement"; public static String feDistantLightElementName = SVGConstants.SVG_FE_DISTANT_LIGHT_TAG; public static String feDistantLightElementValue = ""; public static short feDistantLightElementType = Node.ELEMENT_NODE; public static String feDistantLightElementCategory = FILTER_EFFECTS; public static String feDistantLightElementDescription = "FeDistantLight"; // FeFlood element public static String feFloodElementMemberName = "feFloodElement"; public static String feFloodElementName = SVGConstants.SVG_FE_FLOOD_TAG; public static String feFloodElementValue = ""; public static short feFloodElementType = Node.ELEMENT_NODE; public static String feFloodElementCategory = FILTER_EFFECTS; public static String feFloodElementDescription = "FeFlood"; // FeFuncA element public static String feFuncAElementMemberName = "feFuncAElement"; public static String feFuncAElementName = SVGConstants.SVG_FE_FUNC_A_TAG; public static String feFuncAElementValue = ""; public static short feFuncAElementType = Node.ELEMENT_NODE; public static String feFuncAElementCategory = FILTER_EFFECTS; public static String feFuncAElementDescription = "FeFuncA"; // FeFuncB element public static String feFuncBElementMemberName = "feFuncBElement"; public static String feFuncBElementName = SVGConstants.SVG_FE_FUNC_B_TAG; public static String feFuncBElementValue = ""; public static short feFuncBElementType = Node.ELEMENT_NODE; public static String feFuncBElementCategory = FILTER_EFFECTS; public static String feFuncBElementDescription = "FeFuncB"; // FeFuncG element public static String feFuncGElementMemberName = "feFuncGElement"; public static String feFuncGElementName = SVGConstants.SVG_FE_FUNC_G_TAG; public static String feFuncGElementValue = ""; public static short feFuncGElementType = Node.ELEMENT_NODE; public static String feFuncGElementCategory = FILTER_EFFECTS; public static String feFuncGElementDescription = "FeFuncG"; // FeFuncR element public static String feFuncRElementMemberName = "feFuncRElement"; public static String feFuncRElementName = SVGConstants.SVG_FE_FUNC_R_TAG; public static String feFuncRElementValue = ""; public static short feFuncRElementType = Node.ELEMENT_NODE; public static String feFuncRElementCategory = FILTER_EFFECTS; public static String feFuncRElementDescription = "FeFuncR"; // FeGaussianBlur element public static String feGaussianBlurElementMemberName = "feGaussianBlurElement"; public static String feGaussianBlurElementName = SVGConstants.SVG_FE_GAUSSIAN_BLUR_TAG; public static String feGaussianBlurElementValue = ""; public static short feGaussianBlurElementType = Node.ELEMENT_NODE; public static String feGaussianBlurElementCategory = FILTER_EFFECTS; public static String feGaussianBlurElementDescription = "FeGaussianBlur"; // FeImage element public static String feImageElementMemberName = "feImageElement"; public static String feImageElementName = SVGConstants.SVG_FE_IMAGE_TAG; public static String feImageElementValue = ""; public static short feImageElementType = Node.ELEMENT_NODE; public static String feImageElementCategory = FILTER_EFFECTS; public static String feImageElementDescription = "FeImage"; // FeMerge element public static String feMergeElementMemberName = "feImageElement"; public static String feMergeElementName = SVGConstants.SVG_FE_MERGE_TAG; public static String feMergeElementValue = ""; public static short feMergeElementType = Node.ELEMENT_NODE; public static String feMergeElementCategory = FILTER_EFFECTS; public static String feMergeElementDescription = "FeMerge"; // FeMergeNode element public static String feMergeNodeElementMemberName = "feMergeNodeElement"; public static String feMergeNodeElementName = SVGConstants.SVG_FE_MERGE_NODE_TAG; public static String feMergeNodeElementValue = ""; public static short feMergeNodeElementType = Node.ELEMENT_NODE; public static String feMergeNodeElementCategory = FILTER_EFFECTS; public static String feMergeNodeElementDescription = "FeMergeNode"; // FeMorphology element public static String feMorphologyElementMemberName = "feMorphologyElement"; public static String feMorphologyElementName = SVGConstants.SVG_FE_MORPHOLOGY_TAG; public static String feMorphologyElementValue = ""; public static short feMorphologyElementType = Node.ELEMENT_NODE; public static String feMorphologyElementCategory = FILTER_EFFECTS; public static String feMorphologyElementDescription = "FeMorphology"; // FeOffset element public static String feOffsetElementMemberName = "feMorphologyElement"; public static String feOffsetElementName = SVGConstants.SVG_FE_OFFSET_TAG; public static String feOffsetElementValue = ""; public static short feOffsetElementType = Node.ELEMENT_NODE; public static String feOffsetElementCategory = FILTER_EFFECTS; public static String feOffsetElementDescription = "FeOffset"; // FePointLight element public static String fePointLightElementMemberName = "fePointLightElement"; public static String fePointLightElementName = SVGConstants.SVG_FE_POINT_LIGHT_TAG; public static String fePointLightElementValue = ""; public static short fePointLightElementType = Node.ELEMENT_NODE; public static String fePointLightElementCategory = FILTER_EFFECTS; public static String fePointLightElementDescription = "FePointLight"; // FeSpecularLighting element public static String feSpecularLightingElementMemberName = "fePointLightElement"; public static String feSpecularLightingElementName = SVGConstants.SVG_FE_SPECULAR_LIGHTING_TAG; public static String feSpecularLightingElementValue = ""; public static short feSpecularLightingElementType = Node.ELEMENT_NODE; public static String feSpecularLightingElementCategory = FILTER_EFFECTS; public static String feSpecularLightingElementDescription = "FeSpecularLighting"; // FeSpotLight element public static String feSpotLightElementMemberName = "feSpotLightElement"; public static String feSpotLightElementName = SVGConstants.SVG_FE_SPOT_LIGHT_TAG; public static String feSpotLightElementValue = ""; public static short feSpotLightElementType = Node.ELEMENT_NODE; public static String feSpotLightElementCategory = FILTER_EFFECTS; public static String feSpotLightElementDescription = "FeSpotLight"; // FeTile element public static String feTileElementMemberName = "feTileElement"; public static String feTileElementName = SVGConstants.SVG_FE_TILE_TAG; public static String feTileElementValue = ""; public static short feTileElementType = Node.ELEMENT_NODE; public static String feTileElementCategory = FILTER_EFFECTS; public static String feTileElementDescription = "FeTile"; // FeTurbulence element public static String feTurbulenceElementMemberName = "feTurbulenceElement"; public static String feTurbulenceElementName = SVGConstants.SVG_FE_TURBULENCE_TAG; public static String feTurbulenceElementValue = ""; public static short feTurbulenceElementType = Node.ELEMENT_NODE; public static String feTurbulenceElementCategory = FILTER_EFFECTS; public static String feTurbulenceElementDescription = "FeTurbulence"; // Filter element public static String filterElementMemberName = "filterElement"; public static String filterElementName = SVGConstants.SVG_FILTER_TAG; public static String filterElementValue = ""; public static short filterElementType = Node.ELEMENT_NODE; public static String filterElementCategory = FILTER_EFFECTS; public static String filterElementDescription = "Filter"; // // Text node // public static String textNodeMemberName = "textNode"; // // public static String textNodeName = "textNode"; // // public static String textNodeValue = " "; // // public static short textNodeType = Node.TEXT_NODE; // // public static String textNodeCategory = METADATA; // // public static String textNodeDescription = "Text node"; // // // CDataSection node // public static String cdataSectionNodeMemberName = "cdataSectionNode"; // // public static String cdataSectionNodeName = "cdataSectionNode"; // // public static String cdataSectionNodeValue = " "; // // public static short cdataSectionNodeType = Node.CDATA_SECTION_NODE; // // public static String cdataSectionNodeCategory = METADATA; // // public static String cdataSectionNodeDescription = "CDataSection"; // // // Comment node // public static String commentNodeMemberName = "commentNode"; // // public static String commentNodeName = "commentNode"; // // public static String commentNodeValue = " "; // // public static short commentNodeType = Node.COMMENT_NODE; // // public static String commentNodeCategory = METADATA; // // public static String commentNodeDescription = "CommentNode"; // A element public static String aElementMemberName = "aElement"; public static String aElementName = SVGConstants.SVG_A_TAG; public static String aElementValue = ""; public static short aElementType = Node.ELEMENT_NODE; public static String aElementCategory = LINKING; public static String aElementDescription = "A"; // AltGlyph element public static String altGlyphElementMemberName = "altGlyphElement"; public static String altGlyphElementName = SVGConstants.SVG_ALT_GLYPH_TAG; public static String altGlyphElementValue = ""; public static short altGlyphElementType = Node.ELEMENT_NODE; public static String altGlyphElementCategory = TEXT; public static String altGlyphElementDescription = "AltGlyph"; // AltGlyphDef element public static String altGlyphDefElementMemberName = "altGlyphDefElement"; public static String altGlyphDefElementName = SVGConstants.SVG_ALT_GLYPH_DEF_TAG; public static String altGlyphDefElementValue = ""; public static short altGlyphDefElementType = Node.ELEMENT_NODE; public static String altGlyphDefElementCategory = TEXT; public static String altGlyphDefElementDescription = "AltGlyphDef"; // AltGlyphItem element public static String altGlyphItemElementMemberName = "altGlyphItemElement"; public static String altGlyphItemElementName = SVGConstants.SVG_ALT_GLYPH_ITEM_TAG; public static String altGlyphItemElementValue = ""; public static short altGlyphItemElementType = Node.ELEMENT_NODE; public static String altGlyphItemElementCategory = TEXT; public static String altGlyphItemElementDescription = "AltGlyphItem"; // ClipPath element public static String clipPathElementMemberName = "clipPathElement"; public static String clipPathElementName = SVGConstants.SVG_CLIP_PATH_TAG; public static String clipPathElementValue = ""; public static short clipPathElementType = Node.ELEMENT_NODE; public static String clipPathElementCategory = CLIP_MASK_COMPOSITE; public static String clipPathElementDescription = "ClipPath"; // ColorProfile element public static String colorProfileElementMemberName = "colorProfileElement"; public static String colorProfileElementName = SVGConstants.SVG_COLOR_PROFILE_TAG; public static String colorProfileElementValue = ""; public static short colorProfileElementType = Node.ELEMENT_NODE; public static String colorProfileElementCategory = COLOR; public static String colorProfileElementDescription = "ColorProfile"; // Cursor element public static String cursorElementMemberName = "cursorElement"; public static String cursorElementName = SVGConstants.SVG_CURSOR_TAG; public static String cursorElementValue = ""; public static short cursorElementType = Node.ELEMENT_NODE; public static String cursorElementCategory = INTERACTIVITY; public static String cursorElementDescription = "Cursor"; // DefinitionSrc element public static String definitionSrcElementMemberName = "definitionSrcElement"; public static String definitionSrcElementName = SVGConstants.SVG_DEFINITION_SRC_TAG; public static String definitionSrcElementValue = ""; public static short definitionSrcElementType = Node.ELEMENT_NODE; public static String definitionSrcElementCategory = FONTS; public static String definitionSrcElementDescription = "DefinitionSrc"; // Defs element public static String defsElementMemberName = "defsElement"; public static String defsElementName = SVGConstants.SVG_DEFS_TAG; public static String defsElementValue = ""; public static short defsElementType = Node.ELEMENT_NODE; public static String defsElementCategory = DOCUMENT_STRUCTURE; public static String defsElementDescription = "Defs"; // Desc element public static String descElementMemberName = "descElement"; public static String descElementName = SVGConstants.SVG_DESC_TAG; public static String descElementValue = ""; public static short descElementType = Node.ELEMENT_NODE; public static String descElementCategory = DOCUMENT_STRUCTURE; public static String descElementDescription = "Desc"; // ForeignObject element public static String foreignObjectElementMemberName = "foreignObjectElement"; public static String foreignObjectElementName = SVGConstants.SVG_FOREIGN_OBJECT_TAG; public static String foreignObjectElementValue = ""; public static short foreignObjectElementType = Node.ELEMENT_NODE; public static String foreignObjectElementCategory = EXTENSIBILITY; public static String foreignObjectElementDescription = "ForeignObject"; // Glyph element public static String glyphElementMemberName = "glyphElement"; public static String glyphElementName = SVGConstants.SVG_GLYPH_TAG; public static String glyphElementValue = ""; public static short glyphElementType = Node.ELEMENT_NODE; public static String glyphElementCategory = FONTS; public static String glyphElementDescription = "Glyph"; // GlyphRef element public static String glyphRefElementMemberName = "glyphRefElement"; public static String glyphRefElementName = SVGConstants.SVG_GLYPH_REF_TAG; public static String glyphRefElementValue = ""; public static short glyphRefElementType = Node.ELEMENT_NODE; public static String glyphRefElementCategory = TEXT; public static String glyphRefElementDescription = "GlyphRef"; // Hkern element public static String hkernElementMemberName = "hkernElement"; public static String hkernElementName = SVGConstants.SVG_HKERN_TAG; public static String hkernElementValue = ""; public static short hkernElementType = Node.ELEMENT_NODE; public static String hkernElementCategory = FONTS; public static String hkernElementDescription = "Hkern"; // LinearGradient element public static String linearGradientElementMemberName = "linearGradientElement"; public static String linearGradientElementName = SVGConstants.SVG_LINEAR_GRADIENT_TAG; public static String linearGradientElementValue = ""; public static short linearGradientElementType = Node.ELEMENT_NODE; public static String linearGradientElementCategory = GRADIENTS_AND_PATTERNS; public static String linearGradientElementDescription = "LinearGradient"; // Marker element public static String markerElementMemberName = "markerElement"; public static String markerElementName = SVGConstants.SVG_MARKER_TAG; public static String markerElementValue = ""; public static short markerElementType = Node.ELEMENT_NODE; public static String markerElementCategory = PAINTING; public static String markerElementDescription = "Marker"; // Mask element public static String maskElementMemberName = "maskElement"; public static String maskElementName = SVGConstants.SVG_MASK_TAG; public static String maskElementValue = ""; public static short maskElementType = Node.ELEMENT_NODE; public static String maskElementCategory = CLIP_MASK_COMPOSITE; public static String maskElementDescription = "Mask"; // Metadata element public static String metadataElementMemberName = "metadataElement"; public static String metadataElementName = SVGConstants.SVG_METADATA_TAG; public static String metadataElementValue = ""; public static short metadataElementType = Node.ELEMENT_NODE; public static String metadataElementCategory = METADATA; public static String metadataElementDescription = "Metadata"; // MissingGlyph element public static String missingGlyphElementMemberName = "missingGlyphElement"; public static String missingGlyphElementName = SVGConstants.SVG_MISSING_GLYPH_TAG; public static String missingGlyphElementValue = ""; public static short missingGlyphElementType = Node.ELEMENT_NODE; public static String missingGlyphElementCategory = FONTS; public static String missingGlyphElementDescription = "MissingGlyph"; // Mpath element public static String mpathElementMemberName = "mpathElement"; public static String mpathElementName = SVGConstants.SVG_MPATH_TAG; public static String mpathElementValue = ""; public static short mpathElementType = Node.ELEMENT_NODE; public static String mpathElementCategory = ANIMATION; public static String mpathElementDescription = "Mpath"; // Pattern element public static String patternElementMemberName = "patternElement"; public static String patternElementName = SVGConstants.SVG_PATTERN_TAG; public static String patternElementValue = ""; public static short patternElementType = Node.ELEMENT_NODE; public static String patternElementCategory = GRADIENTS_AND_PATTERNS; public static String patternElementDescription = "Pattern"; // RadialGradient element public static String radialGradientElementMemberName = "radialGradientElement"; public static String radialGradientElementName = SVGConstants.SVG_RADIAL_GRADIENT_TAG; public static String radialGradientElementValue = ""; public static short radialGradientElementType = Node.ELEMENT_NODE; public static String radialGradientElementCategory = GRADIENTS_AND_PATTERNS; public static String radialGradientElementDescription = "RadialGradient"; // Script element public static String scriptElementMemberName = "scriptElement"; public static String scriptElementName = SVGConstants.SVG_SCRIPT_TAG; public static String scriptElementValue = " batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckPermissionsGranted.svg0000644000175000017500000000327513063003262030261 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/IWasLoadedToo.java0000644000175000017500000000250013063003262025554 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */package org.apache.batik.bridge; import org.w3c.dom.*; /** * If this script is loaded by jarCheckLoad.svg, it will mark * the test result as passed. * * @author Vincent Hardy * @version $Id: IWasLoadedToo.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class IWasLoadedToo implements ScriptHandler { public void run(final Document document, final Window win){ Element result = document.getElementById("testResult"); result.setAttributeNS(null, "result", "passed"); } } batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckLoad.svg0000644000175000017500000000344513063003262025450 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/function.js0000644000175000017500000000164513063003263024450 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var f = new Function("alert('I was able to evaluate a Function')"); document.documentElement.addEventListener('SVGLoad', f, false); batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoLoad2.svg0000644000175000017500000000367513063003262026034 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/embedData.svg0000644000175000017500000004716113063003262024656 0ustar mans0954mans0954 Data Protocol dataProtocol test Initial JPEG, encoded as PNG, data protocol batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckLoadEmbed.svg0000644000175000017500000000363113063003262026402 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckLoadSameAsDocument.svg0000644000175000017500000000346313063003262030241 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckNoLoad.svg0000644000175000017500000000324113063003262025606 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckLoadEmbedAttr.svg0000644000175000017500000000350413063003262027234 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/iWasLoadedToo.js0000644000175000017500000000220413063003262025310 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /** * If this script is loaded by ecmaCheckLoad.svg, it will mark * the test result as passed. * * @author Vincent Hardy * @version $Id: iWasLoadedToo.js 1733420 2016-03-03 07:41:59Z gadams $ */ var result = document.getElementById("testResult"); result.setAttributeNS(null, "result", "passed"); batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsDeniedEval.svg0000644000175000017500000003146513063003262031030 0ustar mans0954mans0954 Check Security Settings on Load ECMA Script Security Check - Function() usage not run importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } nGranted = 0; permissions[nGranted++] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[nGranted++] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[nGranted++] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; permissions[nGranted++] = ["RuntimePermission stopThread", new RuntimePermission("stopThread")]; for (var i=0; i<basePermissions.length; i++){ permissions[nGranted+i] = basePermissions[i]; } } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedGrants = new Array(); var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; var unexpectedGrantsCnt = 0; if (sm == null){ for (var i=0; i<nGranted; i++) { successCnt++; } for (var i=nGranted; i<permissions.length; i++) { unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } } else { for (var i=0; i<nGranted; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } for (var i=nGranted; i<permissions.length; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } catch (se){ successCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials"); var unexpectedGrantsString = ""; var unexpectedDenialString = ""; for (var i=0; i<unexpectedGrantsCnt; i++) { unexpectedGrantsString += unexpectedGrants[i]; } for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } System.out.println("unexpected.grants : " + unexpectedGrantsString); var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.grants.count"); entry.setAttributeNS(null, "value", "" + unexpectedGrantsCnt); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.grants"); entry.setAttributeNS(null, "value", unexpectedGrantsString); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoLoad.svg0000644000175000017500000000335213063003262025742 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsGrantedScript.svg0000644000175000017500000002477713063003262031611 0ustar mans0954mans0954 importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission stopThread", new RuntimePermission("stopThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[1] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[2] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; // permissions.concat(basePermissions); for (var i=0; i<basePermissions.length; i++){ permissions[3+i] = basePermissions[i]; } nGranted = 3; } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; if (sm == null){ for (var i=0; i<permissions.length; i++) { successCnt++; } } else { for (var i=0; i<permissions.length; i++) { var p = permissions[i][1]; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.denials"); var unexpectedDenialString = ""; for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckPermissionsDenied.svg0000644000175000017500000000337613063003262030067 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoLoadEmbedAttr.svg0000644000175000017500000000346013063003262027532 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/externalResourcesAccess.svg0000644000175000017500000004633513063003263027652 0ustar mans0954mans0954 Text on a Path a bc de fg ab c d efg Batik Click on one of the following buttons to test unsecure content insertion <image> <use> <feImage> <tref> <textPath> <color-profile> <linearGradientA> <linearGradientB> <altGlyph> <radialGradientA> <radialGradientB> <patternA> <patternB> <filterA> <filterB> <font-face-uri> <glyphRef> batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsGranted.svg0000644000175000017500000002454113063003263030412 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/JarCheckPermissionsGranted.java0000644000175000017500000003056713063003262030347 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.AWTPermission; import java.io.FilePermission; import java.io.SerializablePermission; import java.lang.reflect.ReflectPermission; import java.net.NetPermission; import java.net.SocketPermission; import java.security.AllPermission; import java.security.Permission; import java.sql.SQLPermission; import java.util.PropertyPermission; import java.util.Vector; import javax.sound.sampled.AudioPermission; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.util.ParsedURL; /** * @author Vincent Hardy * @version $Id: JarCheckPermissionsGranted.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JarCheckPermissionsGranted implements ScriptHandler { public static final String svgNS = "http://www.w3.org/2000/svg"; public static final String testNS = "http://xml.apache.org/batik/test"; /** * Path for the file tested with FilePermission */ public static final String testedPath = "build.sh"; /** * Host which is used for testing */ public static final String testedHost = "nagoya.apache.org:8080"; /** * Table of Permissions which will be tested. */ protected static Object[][] basePermissions = { {"AllPermission", new AllPermission()}, {"FilePermission read", new FilePermission(testedPath, "read")}, {"FilePermission write", new FilePermission(testedPath, "write")}, {"FilePermission execute", new FilePermission(testedPath, "execute")}, {"FilePermission delete", new FilePermission(testedPath, "delete")}, // 1.4 {"ServicePermission", new ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate")}, {"SocketPermission accept", new SocketPermission(testedHost, "accept")}, {"SocketPermission connect", new SocketPermission(testedHost, "connect")}, {"SocketPermission listen", new SocketPermission(testedHost, "listen")}, {"SocketPermission resolve", new SocketPermission(testedHost, "resolve")}, {"AudioPermission play", new AudioPermission("play")}, {"AudioPermission record", new AudioPermission("record")}, {"AWTPermission accessClipboard", new AWTPermission("accessClipboard")}, {"AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")}, {"AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")}, {"AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")}, {"AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")}, {"AWTPermission createRobot", new AWTPermission("createRobot")}, {"AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")}, // 1.4 {"DelegationPermission", new DelegationPermission()}, // 1.4 {"LoggingPermission", new LoggingPermission("control")}, {"NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")}, {"NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")}, {"NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")}, {"PropertyPermission java.home read", new PropertyPermission("java.home", "read")}, {"PropertyPermission java.home write", new PropertyPermission("java.home", "write")}, {"ReflectPermission", new ReflectPermission("suppressAccessChecks")}, {"RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")}, {"RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")}, {"RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")}, {"RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")}, {"RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")}, {"RuntimePermission exitVM", new RuntimePermission("exitVM")}, {"RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")}, {"RuntimePermission setFactory", new RuntimePermission("setFactory")}, {"RuntimePermission setIO", new RuntimePermission("setIO")}, {"RuntimePermission modifyThread", new RuntimePermission("modifyThread")}, {"RuntimePermission stopThread", new RuntimePermission("stopThread")}, {"RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")}, {"RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")}, {"RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")}, {"RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")}, {"RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")}, {"RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")}, {"RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")}, {"RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")}, {"RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")}, {"SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")}, {"SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")}, {"SecurityPermission getPolicy", new SerializablePermission("getPolicy")}, {"SecurityPermission setPolicy", new SerializablePermission("setPolicy")}, {"SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")}, {"SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")}, {"SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")}, {"SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")}, {"SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")}, {"SecurityPermission printIdentity", new SerializablePermission("printIdentity")}, {"SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")}, {"SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")}, {"SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")}, {"SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")}, {"SQLPermission", new SQLPermission("setLog")}, // 1.4 {"SSLPermission setHostnameVerifier", new SSLPermission("setHostnameVerifier")} // 1.4{"SSLPermission getSSLSessionContext", new SSLPermission("getSSLSessionContext")} }; /** * Set of Permissions to test. One is added if the Document is loaded from a host */ private Object[][] permissions; /** * Runs this handler. * @param document The current document. * @param win An object which represents the current viewer. */ public void run(final Document document, final Window win){ // // If the document is loaded over the network, check that the // class has permission to access the server // ParsedURL docURL = ((SVGOMDocument)document).getParsedURL(); if (docURL != null && docURL.getHost() != null && !"".equals(docURL.getHost())) { permissions = new Object[basePermissions.length + 3][2]; System.arraycopy(basePermissions, 0, permissions, 3, basePermissions.length); String docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0][0] = "SocketPermission accept " + docHost; permissions[0][1] = new SocketPermission(docHost, "accept"); permissions[1][0] = "SocketPermission connect " + docHost; permissions[1][1] = new SocketPermission(docHost, "connect"); permissions[2][0] = "SocketPermission resolve " + docHost; permissions[2][1] = new SocketPermission(docHost, "resolve"); } else { permissions = basePermissions; } EventTarget root = (EventTarget)document.getDocumentElement(); root.addEventListener("SVGLoad", new EventListener() { public void handleEvent(Event evt){ SecurityManager sm = System.getSecurityManager(); int successCnt = 0; Vector unexpectedDenial = new Vector(); int unexpectedDenialCnt = 0; int unexpectedGrantsCnt = 0; if (sm == null){ for (int i=0; i batik-1.9.orig/test-resources/org/apache/batik/bridge/unitTesting.xml0000644000175000017500000007650713063003262025334 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/IWasLoadedToo.mf0000644000175000017500000000011413063003262025234 0ustar mans0954mans0954Manifest-Version: 1.0 Script-Handler: org.apache.batik.bridge.IWasLoadedToo batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaScriptSecurity.svg0000644000175000017500000002727313063003262026634 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckLoadSameAsDocument.svg0000644000175000017500000000334513063003262030107 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckLoad.svg0000644000175000017500000000332713063003262025316 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckNoConstrain.svg0000644000175000017500000000347413063003262026677 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsGrantedEval.svg0000644000175000017500000002477213063003262031227 0ustar mans0954mans0954 importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission stopThread", new RuntimePermission("stopThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[1] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[2] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; // permissions.concat(basePermissions); for (var i=0; i<basePermissions.length; i++){ permissions[3+i] = basePermissions[i]; } nGranted = 3; } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; if (sm == null){ for (var i=0; i<permissions.length; i++) { successCnt++; } } else { for (var i=0; i<permissions.length; i++) { var p = permissions[i][1]; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.denials"); var unexpectedDenialString = ""; for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); batik-1.9.orig/test-resources/org/apache/batik/bridge/JarCheckPermissionsDenied.java0000644000175000017500000003515113063003262030145 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.AWTPermission; import java.io.FilePermission; import java.io.SerializablePermission; import java.lang.reflect.ReflectPermission; import java.net.NetPermission; import java.net.SocketPermission; import java.security.AllPermission; import java.security.Permission; import java.sql.SQLPermission; import java.util.PropertyPermission; import java.util.Vector; import javax.sound.sampled.AudioPermission; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.util.ParsedURL; /** * @author Vincent Hardy * @version $Id: JarCheckPermissionsDenied.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class JarCheckPermissionsDenied implements ScriptHandler { public static final String svgNS = "http://www.w3.org/2000/svg"; public static final String testNS = "http://xml.apache.org/batik/test"; /** * Path for the file tested with FilePermission */ public static final String testedPath = "build.sh"; /** * Host which is used for testing */ public static final String testedHost = "nagoya.apache.org:8080"; /** * Table of Permissions which will be tested. */ protected static Object[][] basePermissions = { {"AllPermission", new AllPermission()}, {"FilePermission read", new FilePermission(testedPath, "read")}, {"FilePermission write", new FilePermission(testedPath, "write")}, {"FilePermission execute", new FilePermission(testedPath, "execute")}, {"FilePermission delete", new FilePermission(testedPath, "delete")}, // 1.4 {"ServicePermission", new ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate")}, {"SocketPermission accept", new SocketPermission(testedHost, "accept")}, {"SocketPermission connect", new SocketPermission(testedHost, "connect")}, {"SocketPermission listen", new SocketPermission(testedHost, "listen")}, {"SocketPermission resolve", new SocketPermission(testedHost, "resolve")}, {"AudioPermission play", new AudioPermission("play")}, {"AudioPermission record", new AudioPermission("record")}, {"AWTPermission accessClipboard", new AWTPermission("accessClipboard")}, {"AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")}, {"AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")}, {"AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")}, {"AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")}, {"AWTPermission createRobot", new AWTPermission("createRobot")}, {"AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")}, // 1.4 {"DelegationPermission", new DelegationPermission()}, // 1.4 {"LoggingPermission", new LoggingPermission("control")}, {"NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")}, {"NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")}, {"NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")}, {"PropertyPermission java.home read", new PropertyPermission("java.home", "read")}, {"PropertyPermission java.home write", new PropertyPermission("java.home", "write")}, {"ReflectPermission", new ReflectPermission("suppressAccessChecks")}, {"RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")}, {"RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")}, {"RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")}, {"RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")}, {"RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")}, {"RuntimePermission exitVM", new RuntimePermission("exitVM")}, {"RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")}, {"RuntimePermission setFactory", new RuntimePermission("setFactory")}, {"RuntimePermission setIO", new RuntimePermission("setIO")}, {"RuntimePermission modifyThread", new RuntimePermission("modifyThread")}, {"RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")}, {"RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")}, {"RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")}, {"RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")}, {"RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")}, {"RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")}, {"RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")}, {"RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")}, {"RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")}, {"SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")}, {"SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")}, {"SecurityPermission getPolicy", new SerializablePermission("getPolicy")}, {"SecurityPermission setPolicy", new SerializablePermission("setPolicy")}, {"SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")}, {"SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")}, {"SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")}, {"SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")}, {"SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")}, {"SecurityPermission printIdentity", new SerializablePermission("printIdentity")}, {"SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")}, {"SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")}, {"SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")}, {"SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")}, {"SQLPermission", new SQLPermission("setLog")}, // 1.4 {"SSLPermission setHostnameVerifier", new SSLPermission("setHostnameVerifier")} // 1.4{"SSLPermission getSSLSessionContext", new SSLPermission("getSSLSessionContext")} }; /** * Set of Permissions to test. One is added if the Document is loaded from a host */ private Object[][] permissions; /** * Runs this handler. * @param document The current document. * @param win An object which represents the current viewer. */ public void run(final Document document, final Window win){ int nGrantedTmp = 0; // // If the document is loaded over the network, check that the // class has permission to access the server // ParsedURL docURL = ((SVGOMDocument)document).getParsedURL(); if ((docURL != null) && (docURL.getHost() != null) && (!"".equals(docURL.getHost()))) { permissions = new Object[basePermissions.length + 4][2]; String docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } int i=0; permissions[i][0] = "SocketPermission accept " + docHost; permissions[i][1] = new SocketPermission(docHost, "accept"); i++; permissions[i][0] = "SocketPermission connect " + docHost; permissions[i][1] = new SocketPermission(docHost, "connect"); i++; permissions[i][0] = "SocketPermission resolve " + docHost; permissions[i][1] = new SocketPermission(docHost, "resolve"); i++; permissions[i][0] = "RuntimePermission stopThread"; permissions[i][1] = new RuntimePermission("stopThread"); i++; nGrantedTmp = i; System.arraycopy(basePermissions, 0, permissions, i, basePermissions.length); } else { permissions = basePermissions; } final int nGranted = nGrantedTmp; EventTarget root = (EventTarget)document.getDocumentElement(); root.addEventListener("SVGLoad", new EventListener() { public void handleEvent(Event evt){ SecurityManager sm = System.getSecurityManager(); int successCnt = 0; Vector unexpectedGrants = new Vector(); Vector unexpectedDenial = new Vector(); int unexpectedDenialCnt = 0; int unexpectedGrantsCnt = 0; if (sm == null){ for (int i=0; i>>> Permision : " + p + " was granted"); successCnt++; } catch (SecurityException se){ unexpectedDenial.add(permissions[i][0]); unexpectedDenialCnt++; } } for (int i=nGranted; i>>> Permision : " + p + " was granted"); unexpectedGrants.add(permissions[i][0]); unexpectedGrantsCnt++; } catch (SecurityException se){ successCnt++; } } } // Update the test's metadata Element result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials"); String unexpectedGrantsString = ""; String unexpectedDenialString = ""; for (int i=0; i batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsDenied.svg0000644000175000017500000002744413063003262030222 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckConstrain.svg0000644000175000017500000000357413063003262026534 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/IWasLoaded.java0000644000175000017500000000263413063003262025102 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */package org.apache.batik.bridge; import org.w3c.dom.*; /** * If this script is loaded by jarCheckNoLoad.svg, it will mark * the test result as failed. * * @author Vincent Hardy * @version $Id: IWasLoaded.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class IWasLoaded implements ScriptHandler { public void run(final Document document, final Window win){ Element result = document.getElementById("testResult"); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "IWasLoaded.jar should not have been loaded"); } } batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaScriptSecurity2.svg0000644000175000017500000002446613063003262026717 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/JarCheckPermissionsDenied.mf0000644000175000017500000000013013063003262027613 0ustar mans0954mans0954Manifest-Version: 1.0 Script-Handler: org.apache.batik.bridge.JarCheckPermissionsDenied batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsDenied2.svg0000644000175000017500000003271013063003262030274 0ustar mans0954mans0954 Check Security Settings on Load ECMA Script Security Check - Function() usage not run importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } nGranted = 0; permissions[nGranted++] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[nGranted++] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[nGranted++] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; permissions[nGranted++] = ["RuntimePermission stopThread", new RuntimePermission("stopThread")]; for (var i=0; i<basePermissions.length; i++){ permissions[nGranted+i] = basePermissions[i]; } } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedGrants = new Array(); var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; var unexpectedGrantsCnt = 0; if (sm == null){ for (var i=0; i<nGranted; i++) { successCnt++; } for (var i=nGranted; i<permissions.length; i++) { unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } } else { for (var i=0; i<nGranted; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } for (var i=nGranted; i<permissions.length; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } catch (se){ successCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials"); var unexpectedGrantsString = ""; var unexpectedDenialString = ""; for (var i=0; i<unexpectedGrantsCnt; i++) { unexpectedGrantsString += unexpectedGrants[i]; } for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } System.out.println("unexpected.grants : " + unexpectedGrantsString); var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.grants.count"); entry.setAttributeNS(null, "value", "" + unexpectedGrantsCnt); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.grants"); entry.setAttributeNS(null, "value", unexpectedGrantsString); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); /* var successRatioString = "Test Result: " + successCnt + " / " + permissions.length; System.err.println("Success Ratio : " + successRatioString); var successRatio = document.getElementById("successRatio"); if (successRatio == null) { alert("Error : no 'successRatio' element"); } else { if (successCnt == permissions.length) { successRatio.firstChild.data = "Success: " + successRatioString; } else { successRatio.firstChild.data = "Failed: " + successRatioString; } } */ batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckNoLoadEmbed.svg0000644000175000017500000001024113063003262026541 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/getURLException.svg0000644000175000017500000000414413063003262026023 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/scriptPermissions.svg0000644000175000017500000001152013063003262026536 0ustar mans0954mans0954 Click on one of the following buttons to test unsecure content insertion (the result depends on the security settings) Network Access File System Access Internal Use batik-1.9.orig/test-resources/org/apache/batik/bridge/scriptPermissions2.svg0000644000175000017500000007416613063003262026637 0ustar mans0954mans0954 This is my text Text on a Path a bc de fg ab c d efg Batik Click on one of the following buttons to test unsecure content insertion <use> <feImage> <tref> <textPath> <linearGradientA> <linearGradientB> <altGlyph> <radialGradientA> <radialGradientB> <patternA> <patternB> <filterA> <filterB> <font-face-uri> <glyphRef> batik-1.9.orig/test-resources/org/apache/batik/bridge/IWasLoaded.mf0000644000175000017500000000011113063003262024547 0ustar mans0954mans0954Manifest-Version: 1.0 Script-Handler: org.apache.batik.bridge.IWasLoaded batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoEmbed.svg0000644000175000017500000000404613063003263026101 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/JarCheckPermissionsGranted.mf0000644000175000017500000000013113063003262030010 0ustar mans0954mans0954Manifest-Version: 1.0 Script-Handler: org.apache.batik.bridge.JarCheckPermissionsGranted batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoLoadAny.svg0000644000175000017500000000366713063003262026423 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckLoadAny.svg0000644000175000017500000000363713063003262026123 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsGrantedFunction.svg0000644000175000017500000002512413063003262032115 0ustar mans0954mans0954 importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission stopThread", new RuntimePermission("stopThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[1] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[2] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; // permissions.concat(basePermissions); for (var i=0; i<basePermissions.length; i++){ permissions[3+i] = basePermissions[i]; } nGranted = 3; } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; if (sm == null){ for (var i=0; i<permissions.length; i++) { successCnt++; } } else { for (var i=0; i<permissions.length; i++) { var p = permissions[i][1]; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.denials"); var unexpectedDenialString = ""; for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckLoadEmbed.svg0000644000175000017500000000673013063003262026254 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsDeniedScript.svg0000644000175000017500000003147113063003262031402 0ustar mans0954mans0954 Check Security Settings on Load ECMA Script Security Check - Function() usage not run importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission stopThread", new RuntimePermission("stopThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[1] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[2] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; // permissions.concat(basePermissions); for (var i=0; i<basePermissions.length; i++){ permissions[3+i] = basePermissions[i]; } nGranted = 3; } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedGrants = new Array(); var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; var unexpectedGrantsCnt = 0; if (sm == null){ for (var i=0; i<nGranted; i++) { successCnt++; } for (var i=nGranted; i<permissions.length; i++) { unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } } else { for (var i=0; i<nGranted; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } for (var i=nGranted; i<permissions.length; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } catch (se){ successCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials"); var unexpectedGrantsString = ""; var unexpectedDenialString = ""; for (var i=0; i<unexpectedGrantsCnt; i++) { unexpectedGrantsString += unexpectedGrants[i]; } for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } System.out.println("unexpected.grants : " + unexpectedGrantsString); var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.grants.count"); entry.setAttributeNS(null, "value", "" + unexpectedGrantsCnt); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.grants"); entry.setAttributeNS(null, "value", unexpectedGrantsString); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); batik-1.9.orig/test-resources/org/apache/batik/bridge/error/0000755000175000017500000000000013153020772023414 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feComponentTransfert-type-invalid.svg0000644000175000017500000001011713063003262032701 0ustar mans0954mans0954 Error: attribute "type" on <feComponentTransfert> subelement is invalid Error: attribute "type" on <feComponentTransfert> subelement is invalid A filtered rectangle using <feComponentTransfert> A filtered rectangle using <feComponentTranfert>. The attribute "type" of a subelement is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feDisplacementMap-in2-missing.svg0000644000175000017500000001101013063003262031637 0ustar mans0954mans0954 Error: attribute "in2" on <feDisplacementMap> is missing Error: attribute "in2" on <feDisplacementMap> is missing A filtered rectangle using <feDisplacementMap> A filtered rectangle using <feDisplacementMap>. The attribute "in2" of <feDisplacementMap> is missing batik-1.9.orig/test-resources/org/apache/batik/bridge/error/pattern-patternUnits-invalid.svg0000644000175000017500000000637513063003262031742 0ustar mans0954mans0954 Error: "patternUnits" on <pattern> is invalid Error: "patternUnits" on <pattern> is invalid A rectangle filled with a <pattern> A rectangle filled with a <pattern> "patternUnits" on <pattern> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-empty.svg0000644000175000017500000000601513063003262026553 0ustar mans0954mans0954 Default: <filter> has no filter primitive Default: <filter> has no filter primitive A filtered rectangle A filtered rectangle <filter> has no filter primitive batik-1.9.orig/test-resources/org/apache/batik/bridge/error/ellipse-negative-rx.svg0000644000175000017500000000514313063003262030017 0ustar mans0954mans0954 Error: attribute "rx" is negative on <ellipse> Error: attribute "rx" is negative on <ellipse> A green <ellipse> element A red <ellipse> element with a negative "rx" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-uri-illegal.svg0000644000175000017500000000577413063003262027636 0ustar mans0954mans0954 Error: "filter" references an invalid element Error: "filter" references an invalid element A filtered rectangle A filtered rectangle "filter" references an invalid element batik-1.9.orig/test-resources/org/apache/batik/bridge/error/path-invalid-d.svg0000644000175000017500000000732713063003262026742 0ustar mans0954mans0954 Error: attribute "d" is invalid on <path> Error: attribute "d" is invalid on <path> A <path> element An <path> element with an invalid "d" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/ellipse-negative-ry.svg0000644000175000017500000000514213063003262030017 0ustar mans0954mans0954 Error: attribute "ry" is negative on <ellipse> Error: attribute "ry" is negative on <ellipse> A green <ellipse> element A red <ellipse> element with a negative "ry" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/mask-maskUnits-invalid.svg0000644000175000017500000000722013063003262030464 0ustar mans0954mans0954 Error: "maskUnits" on <mask> is invalid Error: "maskUnits" on <mask> is invalid A masked rectangle A masked rectangle "maskUnits" on <mask> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/clipPath-clipPathUnits-invalid.svg0000644000175000017500000000607713063003262032117 0ustar mans0954mans0954 Error: "clipPathUnits" on <clipPath> is invalid Error: "clipPathUnits" on <clipPath> is invalid A cliped rectangle A cliped rectangle "clipPathUnits" on <clipPath> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-filterUnits-invalid.svg0000644000175000017500000000615613063003262031357 0ustar mans0954mans0954 Error: "filterUnits" on <filter> is invalid Error: "filterUnits" on <filter> is invalid A filtered rectangle A filtered rectangle "filterUnits" on <filter> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feGaussianBlur-stdDeviationX-invalid.svg0000644000175000017500000000620613063003262033255 0ustar mans0954mans0954 Error: first value of "stdDeviation" on <feGaussianBlur> is invalid Error: The first value of "stdDeviation" on <feGaussianBlur> is invalid A filtered rectangle using <feGaussianBlur> A filtered rectangle using <feGaussianBlur>. The first value of the attribute "stdDeviation" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/image-negative-width.svg0000644000175000017500000000522413063003262030132 0ustar mans0954mans0954 Error: attribute "width" is negative on <image> Error: attribute "width" is negative on <image> An <image> element An <image> element with a negative "width" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/mask-empty.svg0000644000175000017500000000654013063003262026224 0ustar mans0954mans0954 Default: <mask> has no subelement Default: <mask> has no subelement A masked rectangle A masked rectangle <mask> has no subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/clipPath-subelement-invalid.svg0000644000175000017500000000603213063003262031462 0ustar mans0954mans0954 Error: <clipPath> has an invalid subelement Error: <clipPath> has an invalid subelement A cliped rectangle A cliped rectangle <clipPath> has an invalid subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feComposite-in2-missing.svg0000644000175000017500000000723113063003262030545 0ustar mans0954mans0954 Error: attribute "in2" on <feComposite> is missing Error: attribute "in2" on <feComposite> is missing A filtered rectangle using <feComposite> A filtered rectangle using <feComposite>. The attribute "in2" of <feComposite> is missing batik-1.9.orig/test-resources/org/apache/batik/bridge/error/image-negative-height.svg0000644000175000017500000000523013063003262030260 0ustar mans0954mans0954 Error: attribute "height" is negative on <image> Error: attribute "height" is negative on <image> An <image> element An <image> element with a negative "height" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/clipPath-uri-illegal.svg0000644000175000017500000000566613063003262030115 0ustar mans0954mans0954 Error: "clip-path" references an invalid element Error: "clip-path" references an invalid element A cliped rectangle A cliped rectangle "clip-path" references an invalid element batik-1.9.orig/test-resources/org/apache/batik/bridge/error/ellipse-missing-rx.svg0000644000175000017500000000513213063003262027664 0ustar mans0954mans0954 Error: attribute "rx" is missing on <ellipse> Error: attribute "rx" is missing on <ellipse> A green <ellipse> element A red <ellipse> element without the "rx" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feColorMatrix-values-invalid.svg0000644000175000017500000000664013063003262031635 0ustar mans0954mans0954 Error: attribute "values" on <feColorMatrix> is invalid Error: attribute "values" on <feColorMatrix> is invalid A rectangle with a <feColorMatrix> filter A filtered rectangle using <feColorMatrix>. The attribute "values" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/linearGradient-gradientUnits-invalid.svg0000644000175000017500000000640713063003262033331 0ustar mans0954mans0954 Error: "gradientUnits" on <radialGradient> is invalid Error: "gradientUnits" on <radialGradient> is invalid A <radialGradient> A <radialGradient> with an invalid "gradientUnits" batik-1.9.orig/test-resources/org/apache/batik/bridge/error/batikMark.svg0000644000175000017500000002124113063003262026035 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/error/css-invalid.svg0000644000175000017500000000517713063003262026356 0ustar mans0954mans0954 Error: "fill" has an invalid value Error: CSS property "fill" has an invalid value A green <rect> element A <rect> element. The CSS property "fill" has an invalid value batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-r-zero.svg0000644000175000017500000000613313063003262030261 0ustar mans0954mans0954 Default: attribute "r" on <radialGradient> is equal to zero Default: attribute "r" on <radialGradient> is equal to zero A <radialGradient> A <radialGradient> with "r" equals to zero batik-1.9.orig/test-resources/org/apache/batik/bridge/error/svg.svg0000644000175000017500000001413213063003262024730 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/error/image-badurl.svg0000644000175000017500000000521413063003262026463 0ustar mans0954mans0954 Error: attribute "xlink:href" on <image> has a bad URI Error: attribute "xlink:href" on <image> has a bad URI An <image> element An <image> element with an invalid URI batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feTurbulence-type-invalid.svg0000644000175000017500000000634313063003262031164 0ustar mans0954mans0954 Error: attribute "type" on <feTurbulence> is invalid Error: attribute "type" on <feTurbulence> is invalid A filtered rectangle using <feTurbulence> A filtered rectangle using <feTurbulence> The attribute "type" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/transform.svg0000644000175000017500000000513013063003262026142 0ustar mans0954mans0954 Error on transform attribute Error on the "transform" attribute A green <rect> element A red <rect> element with an invalid "transform" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feMorphology-radiusY-negative.svg0000644000175000017500000000660213063003262032024 0ustar mans0954mans0954 Error: second value of "radius" on <feMorphology> is invalid Error: The second value of "radius" on <feMorphology> is invalid A filtered rectangle using <feMorphology> A filtered rectangle using <feMorphology> The second value of the attribute "radius" is negative batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feTurbulence-stitchTiles.invalid.svg0000644000175000017500000000645113063003262032503 0ustar mans0954mans0954 Error: attribute "stitchTiles" on <feTurbulence> is invalid Error: attribute "stitchTiles" on <feTurbulence> is invalid A filtered rectangle using <feTurbulence> A filtered rectangle using <feTurbulence> The attribute "stitchTiles" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-negative-ry.svg0000644000175000017500000000521313063003262027316 0ustar mans0954mans0954 Error: attribute "ry" is negative on <rect> Error: attribute "ry" is negative on <rect> A green rounded <rect> element A red rounded <rect> element with a negative "ry" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-spreadMethod-invalid.svg0000644000175000017500000000623713063003262033113 0ustar mans0954mans0954 Error: attribute "spreadMethod" is invalid on <radialGradient> Error: attribute "spreadMethod" is invalid on <radialGradient> A <radialGradient> A <radialGradient> with an invalid "spreadMethod" batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-negative-rx.svg0000644000175000017500000000521013063003262027312 0ustar mans0954mans0954 Error: attribute "rx" is negative on <rect> Error: attribute "rx" is negative on <rect> A green rounded <rect> element A red rounded <rect> element with a negative "rx" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/image-missing-width.svg0000644000175000017500000000521313063003262027777 0ustar mans0954mans0954 Error: attribute "width" is missing on <image> Error: attribute "width" is missing on <image> An <image> element An <image> element without the "width" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/linearGradient-empty.svg0000644000175000017500000000602213063003262030214 0ustar mans0954mans0954 Default: <linearGradient> has no <stop> Default: <linearGradient> has no <stop> A rectangle filled with a <linearGradient> A rectangle filled with a <linearGradient> <linearGradient> has no <stop> batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feComposite-operator-invalid.svg0000644000175000017500000000727313063003262031673 0ustar mans0954mans0954 Error: attribute "operator" on <feComposite> is invalid Error: attribute "operator" on <feComposite> is invalid A filtered rectangle using <feComposite> A filtered rectangle using <feComposite>. The attribute "operator" of <feComposite> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/pattern-empty.svg0000644000175000017500000000600313063003262026740 0ustar mans0954mans0954 Default: <pattern> has no subelement Default: <pattern> has no subelement A rectangle filled with a <pattern> A rectangle filled with a <pattern> <pattern> has no subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feMorphology-radiusX-negative.svg0000644000175000017500000000657713063003262032036 0ustar mans0954mans0954 Error: first value of "radius" on <feMorphology> is invalid Error: The first value of "radius" on <feMorphology> is invalid A filtered rectangle using <feMorphology> A filtered rectangle using <feMorphology> The first value of the attribute "radius" is negative batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-gradientUnits-invalid.svg0000644000175000017500000000633113063003262033307 0ustar mans0954mans0954 Error: "gradientUnits" on <radialGradient> is invalid Error: "gradientUnits" on <radialGradient> is invalid A <radialGradient> A <radialGradient> with an invalid "gradientUnits" batik-1.9.orig/test-resources/org/apache/batik/bridge/error/test.css0000644000175000017500000000171413063003262025103 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .title { font-family: Arial, Helvetica; font-size: 16; text-anchor: middle; } .legend { font-family: Arial, Helvetica; font-size: 12; text-anchor: middle; } batik-1.9.orig/test-resources/org/apache/batik/bridge/error/linearGradient-missing-offset.svg0000644000175000017500000000611113063003262032012 0ustar mans0954mans0954 Error: attribute "offset" is missing on <stop> Error: attribute "offset" is missing on <stop> A <linearGradient> A <linearGradient> without an "offset" on its <stop> batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-missing-offset.svg0000644000175000017500000000603613063003262032002 0ustar mans0954mans0954 Error: attribute "offset" is missing on <stop> Error: attribute "offset" is missing on <stop> A <radialGradient> A <radialGradient> without an "offset" on its <stop> batik-1.9.orig/test-resources/org/apache/batik/bridge/error/ellipse-missing-ry.svg0000644000175000017500000000513213063003262027665 0ustar mans0954mans0954 Error: attribute "ry" is missing on <ellipse> Error: attribute "ry" is missing on <ellipse> A green <ellipse> element A red <ellipse> element without the "ry" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/linearGradient-uri-invalid.svg0000644000175000017500000000602113063003262031300 0ustar mans0954mans0954 Error: "fill" references an invalid element Error: "fill" references an invalid element A rectangle filled with a <linearGradient> A rectangle filled with a <linearGradient> "fill" references an invalid element batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-r-negative.svg0000644000175000017500000000611713063003262031106 0ustar mans0954mans0954 Error: attribute "r" on <radialGradient> is negative Error: attribute "r" on <radialGradient> is negative A <radialGradient> A <radialGradient> with a negative "r" batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-filterResY-negative.svg0000644000175000017500000000637613063003262031317 0ustar mans0954mans0954 Error: first value of "filterRes" on <filter> is invalid Error: The second value of the attribute "filterRes" on <filter> is invalid A filtered rectangle A filtered rectangle The second value of "filterRes" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feComponentTransfert-value-invalid.svg0000644000175000017500000001010713063003262033033 0ustar mans0954mans0954 Error: attribute "type" on <feComponentTransfert> subelement is missing Error: attribute "tableValues" on <feComponentTransfert> subelement is missing A filtered rectangle using <feComponentTransfert> A filtered rectangle using <feComponentTranfert>. The attribute "tableValues" of a subelement contains an invalid number batik-1.9.orig/test-resources/org/apache/batik/bridge/error/mask-subelement-invalid.svg0000644000175000017500000000715413063003262030657 0ustar mans0954mans0954 Error: <mask> has an invalid subelement Error: <mask> has an invalid subelement A masked rectangle A masked rectangle <mask> has an invalid subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/polyline-invalid-points.svg0000644000175000017500000000544513063003262030731 0ustar mans0954mans0954 Error: attribute "points" is invalid on <polyline> Error: attribute "points" is invalid on <polyline> A green <polyline> element A red <polyline> element with an invalid "points" attribute ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootbatik-1.9.orig/test-resources/org/apache/batik/bridge/error/feDisplacementMap-channelSelector-invalid.svgbatik-1.9.orig/test-resources/org/apache/batik/bridge/error/feDisplacementMap-channelSelector-invali0000644000175000017500000001110313063003262033276 0ustar mans0954mans0954 Error: attribute "channelSelector" on <feDisplacementMap> is invalid Error: attribute "channelSelector" on <feDisplacementMap> is invalid A filtered rectangle using <feDisplacementMap> A filtered rectangle using <feDisplacementMap>. The attribute "channelSelector" of <feDisplacementMap> is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-negative-height.svg0000644000175000017500000000515413063003262030140 0ustar mans0954mans0954 Error: attribute "height" is negative on <rect> Error: attribute "height" is negative on <rect> A green <rect> element A red <rect> element with a negative "height" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/linearGradient-spreadMethod-invalid.svg0000644000175000017500000000624413063003262033127 0ustar mans0954mans0954 Error: attribute "spreadMethod" is invalid on <linearGradient> Error: attribute "spreadMethod" is invalid on <linearGradient> A <linearGradient> A <linearGradient> with an invalid "spreadMethod" batik-1.9.orig/test-resources/org/apache/batik/bridge/error/image-missing-height.svg0000644000175000017500000000521713063003262030134 0ustar mans0954mans0954 Error: attribute "height" is missing on <image> Error: attribute "height" is missing on <image> An <image> element An <image> element without the "height" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-missing-width.svg0000644000175000017500000000513113063003262027651 0ustar mans0954mans0954 Error: attribute "width" missing on <rect> Error: attribute "width" missing on <rect> A green <rect> element A red <rect> element without the "width" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feMorphology-operator-invalid.svg0000644000175000017500000000656413063003262032072 0ustar mans0954mans0954 Error: attribute "operator" on <feMorphology> is invalid Error: The attribute "operator" on <feMorphology> is invalid A filtered rectangle using <feMorphology> A filtered rectangle using <feMorphology> The value of the attribute "operator" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/clipPath-empty.svg0000644000175000017500000000564213063003262027037 0ustar mans0954mans0954 Default: <clipPath> has no subelement Default: <clipPath> has no subelement A cliped rectangle A cliped rectangle <clipPath> has no subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-filterPrimitive-invalid.svg0000644000175000017500000000635113063003262032222 0ustar mans0954mans0954 Error: <filter> has an invalid filter primitive Error: <filter> has an invalid filter primitive A filtered rectangle A filtered rectangle <filter> has an invalid filter primitive batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-missing-height.svg0000644000175000017500000000513113063003262030002 0ustar mans0954mans0954 Error: attribute "height" missing on <rect> Error: attribute "height" missing on <rect> A green <rect> element A red <rect> element without the "height" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/rect-negative-width.svg0000644000175000017500000000514413063003262030006 0ustar mans0954mans0954 Error: attribute "width" is negative on <rect> Error: attribute "width" is negative on <rect> A green <rect> element A red <rect> element with a negative "width" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/filter-filterResX-negative.svg0000644000175000017500000000622113063003262031303 0ustar mans0954mans0954 Error: "filter" references an invalid element Error: "filter" references an invalid element A filtered rectangle A filtered rectangle "filter" references an invalid element batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feGaussianBlur-stdDeviationY-invalid.svg0000644000175000017500000000621113063003262033252 0ustar mans0954mans0954 Error: first second of "stdDeviation" on <feGaussianBlur> is invalid Error: The second value of "stdDeviation" on <feGaussianBlur> is invalid A filtered rectangle using <feGaussianBlur> A filtered rectangle using <feGaussianBlur>. The second value of the attribute "stdDeviation" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/polygon-invalid-points.svg0000644000175000017500000000543613063003262030565 0ustar mans0954mans0954 Error: attribute "points" is invalid on <polygon> Error: attribute "points" is invalid on <polygon> A green <polygon> element A red <polygon> element with an invalid "points" attribute batik-1.9.orig/test-resources/org/apache/batik/bridge/error/mask-uri-illegal.svg0000644000175000017500000000654513063003262027301 0ustar mans0954mans0954 Error: "mask" references an invalid element Error: "mask" references an invalid element A masked rectangle A masked rectangle "mask" references an invalid element batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feColorMatrix-value-invalid.svg0000644000175000017500000000711013063003262031443 0ustar mans0954mans0954 Error: attribute "values" of <feColorMatrix>contains an invalid number Error: attribute "values" on <feColorMatrix> contains an invalid number A filtered rectangle using <feColorMatrix> A filtered rectangle using <feColorMatrix>. The attribute "values" contains an invalid number batik-1.9.orig/test-resources/org/apache/batik/bridge/error/xml-invalid.svg0000644000175000017500000000420713063003263026360 0ustar mans0954mans0954 XML bad structure batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feComponentTransfert-type-missing.svg0000644000175000017500000001011613063003262032723 0ustar mans0954mans0954 Error: attribute "type" on <feComponentTransfert> subelement is missing Error: attribute "type" on <feComponentTransfert> subelement is missing A filtered rectangle using <feComponentTransfert> A filtered rectangle using <feComponentTranfert>. The attribute "type" of a subelement is missing batik-1.9.orig/test-resources/org/apache/batik/bridge/error/pattern-subelement-invalid.svg0000644000175000017500000000621213063003262031373 0ustar mans0954mans0954 Error: <pattern> has an invalid subelement Error: <pattern> has an invalid subelement A rectangle filled with a <pattern> A rectangle filled with a <pattern> <pattern> has an invalid subelement batik-1.9.orig/test-resources/org/apache/batik/bridge/error/radialGradient-empty.svg0000644000175000017500000000574413063003262030210 0ustar mans0954mans0954 Default: <radialGradient> has no <stop> Default: <radialGradient> has no <stop> A rectangle filled with a <radialGradient> A rectangle filled with a <radialGradient> <radialGradient> has no <stop> batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feImage-badurl.svg0000644000175000017500000000625513063003262026744 0ustar mans0954mans0954 Error: The URI on <feImage> is invalid Error: The URI on <feImage> is invalid A filtered rectangle using <feImage> A filtered rectangle using <feImage>. The URI is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feMerge-feMergeNode-invalid.svg0000644000175000017500000000717113063003262031312 0ustar mans0954mans0954 Error: A subelement of <feMerge> is invalid Error: a subelement of <feMerge> is invalid A filtered rectangle using <feMerge> A filtered rectangle using <feMerge>. A subelement is not an <feMergeNode> batik-1.9.orig/test-resources/org/apache/batik/bridge/error/feColorMatrix-type-invalid.svg0000644000175000017500000000664513063003262031324 0ustar mans0954mans0954 Error: attribute "type" is invalid on <feColorMatrix> Error: attribute "type" on <feColorMatrix> is invalid A filtered rectangle using <feColorMatrix> A filtered rectangle using <feColorMatrix>. The attribute "type" is invalid batik-1.9.orig/test-resources/org/apache/batik/bridge/iWasLoaded.js0000644000175000017500000000233513063003262024633 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /** * If this script is loaded by ecmaCheckNoLoad.svg, it will mark * the test result as failed. * * @author Vincent Hardy * @version $Id: iWasLoaded.js 1733420 2016-03-03 07:41:59Z gadams $ */ var result = document.getElementById("testResult"); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "iWasLoaded.js should not have been loaded"); batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckNoLoadSameAsDocument.svg0000644000175000017500000000351313063003262030532 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckLoadAny.svg0000644000175000017500000000347013063003262025765 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckConstrain.svg0000644000175000017500000000340313063003262026372 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/jarCheckNoLoadSameAsDocument.svg0000644000175000017500000000325713063003262030406 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/bridge/ecmaCheckPermissionsDeniedFunction.svg0000644000175000017500000003161713063003262031725 0ustar mans0954mans0954 Check Security Settings on Load ECMA Script Security Check - Function() usage not run importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testNS = "http://xml.apache.org/batik/test"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } nGranted = 0; permissions[nGranted++] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[nGranted++] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[nGranted++] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; permissions[nGranted++] = ["RuntimePermission stopThread", new RuntimePermission("stopThread")]; for (var i=0; i<basePermissions.length; i++){ permissions[nGranted+i] = basePermissions[i]; } } else { permissions = basePermissions; } } init(); function runTest(){ var sm = System.getSecurityManager(); var successCnt = 0; var unexpectedGrants = new Array(); var unexpectedDenial = new Array(); var unexpectedDenialCnt = 0; var unexpectedGrantsCnt = 0; if (sm == null){ for (var i=0; i<nGranted; i++) { successCnt++; } for (var i=nGranted; i<permissions.length; i++) { unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } } else { for (var i=0; i<nGranted; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); successCnt++; } catch (se){ unexpectedDenial[unexpectedDenialCnt] = permissions[i][0]; unexpectedDenialCnt++; } } for (var i=nGranted; i<permissions.length; i++) { var p = permissions[i][1]; var success = true; try { sm.checkPermission(p); unexpectedGrants[unexpectedGrantsCnt] = permissions[i][0]; unexpectedGrantsCnt++; } catch (se){ successCnt++; } } } // Update the test's metadata var result = document.getElementById("testResult"); if ( successCnt == permissions.length ) { result.setAttributeNS(null, "result", "passed"); } else { System.out.println("test failed: " + unexpectedGrantsCnt + " / " + unexpectedDenialCnt); result.setAttributeNS(null, "result", "failed"); result.setAttributeNS(null, "errorCode", "unexpected.grants.or.denials"); var unexpectedGrantsString = ""; var unexpectedDenialString = ""; for (var i=0; i<unexpectedGrantsCnt; i++) { unexpectedGrantsString += unexpectedGrants[i]; } for (var i=0; i<unexpectedDenialCnt; i++) { unexpectedDenialString += unexpectedDenial[i]; } System.out.println("unexpected.grants : " + unexpectedGrantsString); var entry = null; entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.grants.count"); entry.setAttributeNS(null, "value", "" + unexpectedGrantsCnt); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.grants"); entry.setAttributeNS(null, "value", unexpectedGrantsString); result.appendChild(entry); entry = document.createElementNS(testNS, "errorDescriptiongEntry"); entry.setAttributeNS(null, "id", "unexpected.denials.count"); entry.setAttributeNS(null, "value", "" + unexpectedDenialCnt); result.appendChild(entry); System.out.println("unexpected.denials : " + unexpectedDenialString); entry = document.createElementNS(testNS, "errorDescriptionEntry"); entry.setAttributeNS(null, "id", "unexpected.denials"); entry.setAttributeNS(null, "value", unexpectedDenialString); result.appendChild(entry); } } runTest(); batik-1.9.orig/test-resources/org/apache/batik/apps/0000755000175000017500000000000013063003254021766 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/0000755000175000017500000000000013153020772024164 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/notReadable.svg0000644000175000017500000000163013063003255027122 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/invalidSVG.svg0000644000175000017500000000161113063003255026707 0ustar mans0954mans0954 SVG pretty-printer - (C) Apache Software Foundation http://xml.apache.org/batik Syntax: svgpp [options] [] Available Options: -no-format Disables any formatting. Useful for doctype modifications, newline conversion, ... -xml-decl The value to set to the XML declaraction. -system-id The value to set to the system ID of the doctype. -doc-width Sets the document preferred number of columns. The default is 80. -tab-width Sets the tabulation width. The default is 4. -public-id The value to set to the public ID of the doctype. -newline (cr | cr-lf | lf) Specifies the type of newline to output. Possible values are: cr (mac), cr-lf (dos), lf (unix - the default). -doctype (change | remove) Removes or changes the DOCTYPE declaration. change is used in conjonction with the -public-id and -system-id options. batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/unitTesting.xml0000644000175000017500000000257413063003255027230 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/readOnly.png0000644000175000017500000000000013063003255026432 0ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/apps/rasterizer/readOnly.svg0000644000175000017500000000162713063003255026465 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/script/0000755000175000017500000000000013063003254022327 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/script/rhino/0000755000175000017500000000000013153020772023452 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/script/rhino/eval.svg0000644000175000017500000000443313063003255025123 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/script/rhino/unitTesting.xml0000644000175000017500000000335513063003255026514 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/parser/0000755000175000017500000000000013153020772022323 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/parser/unitTesting.xml0000644000175000017500000004563313063003262025370 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/0000755000175000017500000000000013153020772021606 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/dom/bug20332.svg0000644000175000017500000000721413063003264023477 0ustar mans0954mans0954 This string is red if test failed, green otherwise batik-1.9.orig/test-resources/org/apache/batik/dom/dummyXML3.xml0000644000175000017500000000163313063003263024126 0ustar mans0954mans0954 Content batik-1.9.orig/test-resources/org/apache/batik/dom/svg/0000755000175000017500000000000013153020772022405 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/dom/svg/bug30580_image.png0000644000175000017500000005177013063003264025441 0ustar mans0954mans0954PNG  IHDR,dcgAMAG cHRMz%u._:oi+SIDATxb? F(P@ Q0 F:L8 F̈́` 0L8 F̈́` 0L8 F̈́` 0L8 F̈́`8`]D˄eQPd=4UDA6#"#|4}; ʚ_f2zy2RH, F\&7w2{  Lb^dDdDyRs倿D~ ^&54T1fBP>$(Ȅ3LH W$%bZ[{_qS?ϫg@{`O$̈́u]kKbdW߮lPsῨ&0j[0p̄>FFQ>a] G8=&(ER<߸#6DB{ׂњ=V^{߮%;ykjFs u&?|P?0׹gwfFv٬Zg"YZuӹ+`-g44/?OdBys#پ`?v؝;cwxbrIgO2}  Nā@I0'4AGV+ODKpP-+~o]8Xsf6 ?,h_F (~/v0'xr#^ eB܁p}bGFIAБ2zǬ^0>0|c\Ⅸd' 3@<5_(`j>3 #4GcBFdg3Na)P7@[ rDN@@(xA ?;i('@wb1lY>yF [{} f%µ 󧂫@k]0`Ƴ{&`d/a6lwf f@d)}_~x&99 x\MBL #$7'h&LgpJ2\Y 2S'0̗7yW^! A20q03(AR3reb'az/1bT tF.ʦΏ`ӧϟ?2fK d֦ԝJTx3u nxZxǬY%=eyȤQSˍJr@fBzFwWҕJ`n7o?{Ɋzp8Ng 5WɃO>z'O_>}ICS{f X )VCf#`j LW52ncPZ ?A*Axi}۫W^~͛o߾{Ç !~"FZsOfC`~f/lou0+`# 3&'L2XeҺqQ4ڥ"{0+Hτ`2bTG/y틗_Oo'e 23df0[ R{-{ֽ[޽`6x=0ArD2aO -7p Tg{ɤ .1j`TɠA~lD*ЂƇ>zɓ'O>}0OI|,o_V B|zH3(0 ]=ay i"yI5&L'Վ071{L(hQL|@8,aT~s۞z ߽|E P2a%p,Nc Uavk.߼zlK`9<# Q ӷ)'@u&h5FM`EAy=BY`{AxϞ=֍DLZ>zXa!@ L&yf(dB`*la*)oMJy$ X6+C ߗWu uNokנ=h޻ 1*8T As9\ |z zp3O-&Xv"h&ė '3H[M *Kb2n޼ ,ݡ/^ 7!%rQ320f1LKVJ2`AȄ 3`_ gvn}\9nFT+0G14D%Xbׯ]v4 l:.(T#`Tבls\}7#ݹP6ADNr<Kpi jWu6  ҝ|*GlF1hV^7/j̈́jB`X!F=Νz*))/v`AP +8!&eC`]t K^gBop&uۢ%IS(&J`l`7 *$z޼y .\t)0+nڴ !] CX*[dB`+ubpD΁/PIm&\P1Qp3"H8(sB)$tO!w1*mePw%xA[@ݹs׍Рn>˄aSSϙZiw  pL+h5<2 \$t\)tmSF Rgٷeۑ]{N8t Ȱ0C`XgEFh-xFBFA^_| m? 0@:fRD&ʘ[}ou3EX G: N1(, = ͰLX>u3f̝;w|R`Ape`+ӧzerp+2jvM~0N0$g`,&~0dT9 ʖȹJd}ƠAa<ЙZ$o3gV/  B]?2aLڶznyjA`C`$mCeBH>fNF9=|a6ڹ Xr[PbX f&6 5!0şcfE XBE>}}}'N>}:0C`?pd`KׯCFE-!@fB2aԊ6Xsƃv 6P ^T3ڌn\r-,'x :2Lx a=.XF2{tvv!>Km:l@!U1"n_? l,185xa-&-x0 $naPNaYzzE5^X\ $dlQ[^vq`X|Hq̈́fB JfM]5e+v KHO 2p&W) B˪͜zkmxRApeB`s0ͷ!] X"=p1>|L0(_}J rPH+;R ΁gQ۟FM3Zpq929 Z An%8Ί!UaXJ 4Ma- [6 `sAXܸX:+KaLHB&Lg6^0mJ`kp `$ K`LnCe JDULl|`R A$] ]}ہɓ̙lٲM6߿-+Z v%dRCr _ UZC*KeVPuAX_-g 2dfy 2 d3s Zq;JXpI>A kD[m+vfPE*̴S`FZ "`KegfX ɇMȬ,|20pȄ% " "9 @ \ ,ĀYA0A(A: {!#;w7!2a=H)pH{֭[B`,!u2dǎ ʄY. ---]]]L8k,H&ܻw/$+ax&P!hK.RCgfgL:wA#1x ́Og5Pf>XcblV `%6A Fj֜[Ap'30_)5##$ ܻ W\ Je@!CMJd$BbJf1*fB`&NMəyk׮ݱc5ͭg#2ah5HPVuv ,ϟ?!ӆ_gB/jdB`p„ X3!R`&FfȜ!xu$BGaW`94G2[eNPnTP2LQ`!0&p~ l|P@[7 _lrh"Ȭ,| 2$;GpȄHTЅr% *+Ԩ>CL  LF6 i-Y~0!ǏtW:`eHL R kMWX,u2d( R&<677̄Cǀc\as{N[H92sbRoVtR * 6HM4t4C 5`"i tf g`// L ^'`wɒ%vlkP2 `2tUYU[fw(ɄFo@jMlRcb:dťX!05"E B {͚5ʄ6ɄT@GKT BL:wD'axJ] :]*찥r`Eq rD_`F1aj+ ; Ge`F0e1c- lTw`5ڬŚFք@o3!dydm**BVK2K5`tM!wA|Hq& ewVSLv/_}p\CLɇe b^ >z2QZd·@Aj737V ~A`  n"* ρȵ$Azf`9=`7V@Cb"l]kJZi Ar F̙3!Q`>F h8d8LɁ" =9y#g]ğ~fDH&tVŋS?0;T[tȄS2dt6Ԫ`rټy3dҥKOgBOؾ!4ʄ_+6g&A/tb,W{Mic#xj os r {<M)`L!K*ҩ6=&F`~kZnЃSNݍkP4ǟ h8dB`? !9,+!E1޹'}9 Ʉn~}}} Hwξ"O&D·d$T-ZϜ9`.L:?1$b&~ԶOOtn1i^E |Sn؎jA apl" r~0sa`Τ)@GΘ19 Z9 !=L*؄l;(08Fʕ+Q֮L n҂) } 2 yY;s35P&|DLnFAۢ=.(x8(4ۢʐ(|c3hۤh4D!u $ld`?0;k lTf ̥@@- r+$'3*<~ pժUܳgÇ6. C0Q4MF>% s[igϚ~úoPj/GI&v`0&M1d!%0τ@{d;k&Xx/9V1ti'0Ck0l3 _< :J:A}W@Gڀ N: OH W:`;0_3 0Xl`tE-`:Z*WaȆFyM;wܿ?+xiș:Mh+)τ42a>$<`5,&M8sƌ ܫHtJ2ah RɄAD, l8P{jꍤޯ|tʄ6LNvsSäuD- BAn2{h9Xs¦էk_Jj~=VV;9}d꾑y5rR󅄆squgbjNEU<QA@6P(~.||+R[of0IQke7l 2!@ L؅ !mഩSΙlR`|W /L Z&%( L3{ g™ r4AArS\ew~KO&Pt>C7l ڸqnFM#mfÎ`ME d,h5 w/ _tt ʅB9PrGEAOT_'{z/[|*/ȇ42a%x&,ft 0oL7,XֺtBк~J2a20E3!0Y3!]L8 0!Q:SqgNY=_y yO/ ;T;Hȣ2@BťH"h8EjlvaXvVnn]zr oPor %Y5x]}8mi2({V?o @ Lxl͌ 4qvWD쮊:| (E*X$%`/ =aFFhB`PBF b(A]IP3( jV}}){lPY61*"#Kn` rYujlOr'2B;o -{ O< ̈́|۱t $j&BΕitB!]A`m_xqFq d1\털/"( 29 Kk!!Ȯh瓝h8dzW'f cA@[)˄ ar& Ⱥ6% hbV;s'U]yTƨ r&+!lʄ3!r5L<{lGZf5gB%6`w6! 7fC(b1\ΨX !ˌR-go%]P`Rȍ U" C&ƬY.G0^-5z0< τ'lpd½F+68eylTgH2!|Fd-:z,a`1WY [p^jՉ;6A/@z %UV ~+UFc`PZ >YDݻwqpOƦ o2b1bp?pozq/2!h p^`kudf£X sl5<'LLLQ/HL8f]6,Bf! d%;6PCv- (I5 Q{ >{ ^*]๓๓:p#hfqЧׯ_y;w߿~\7ygpɄ,Lx7_p> *fB`K)ZZ-ҢOʁL*e&Yt;'0fNU !OAG}O g ^h9Zovtt@J\r֭'_~,73hu0;=^>*\`xIx& FܒӧO#ߊsm٤g" hfBd6Zvhf,zɤ2i"sHNŅ r(A(<TW֖ŗ Ma C3Γ5]%ftI}5 tI ]uX 0!#4S%^r ACL |-ܙp?R& 'C2!^~]WCbWr>&L-7@!Of+J؅0rߊ̊|.jh&$ !90 CE+ |MyA㢠K ?g҇z )y@KV'-Y^3Be&[q""%c=@fBea&Xy~!djBc9p"8b ɄUlF& Bvրm> Atl yc.+Iة@ELx rN]Bwu /bKgBNsf`{w޳gϰ_MEȄ2^p6,z FFC`(v Wb+|>4 OXѩt w@` 2ed>(2[ V(Q"D]oͿF ?3DT8Ǥ.s4 V&|78 X;2!|*&< Cwu ;1D ^ndݹDet2i]BʁAmkB/N MAgM531h)x9k88d䅜=?y"y5!@_&@`B̄o3ht5Ȟz`5NޕLʰA,A2= nǏ7o30柃:ςoܕ .rWXB!Iq:|6D}` X%9XBN|EL@_&D΁nh ;z/_yf`cg*d L\ Wf`hpfgKw/[eBn \G"ѭ2vÀ}WL)sĉ{s7y̬w~;t={`z l~qb&TݑLB#Wf#`}HL8 | e0&01ʪۡecM3/,1y9/f@FhS}{ݰg`T / &3gE 2[h1VBЩ Fy`w9x6 ԅƚ GN!ON4O Q !WSAХ:PQ jp 6Ar}km@Rͭ4p+-(Aͺ܆-!òvF2bY]BSFM&eB`&HȄ,=|ÅMo>\mPz&H"Bzy ]* lfqJW!I LÇ޽{5`cW>P8?6zhqcdBm9Ha,FQqxsOH @LX= | &` 9%B`?>t`5{-3aS^9Et/Jz4jtvp ~<YR:}mG ݻ (x`^}f7@oVrk"_v %x\X !ȁ74iON(@Ll##`KaOQɖւf? *d?H+R"?r&,YGLτ9-Őjpol၄I49 A711LT&f> @-a&3HwILW;#!EA,K.vQ/ӫ wE+:Xz4bfGG΂2!R-^ABj'O]j _Y W2Ƌ ˒`HK@`6ߨ]_?6#A%R u>|^(cvf~{x90q)@LX"rd0QQ`xqPANY3;yҤ3fdȩ۶mF`@L#<_|$xz̈́)LP{{ڥ{Ai)3N1K[ >` U0^]b @3%?B v rcxbj0|z#$"OҠ͚\rX!%&GȄaCɎUBEEQqT<&%QU^2jlh&`~@?'MgϞp˗Xs H` Wo& Ly+Vͤ3ys0i c0]43!,F'$''T$BP]Q Q[k+Q6;@X8LvW޸q#s | 0iz&fO|ނuV3glV@+ɄL N/΀vXc&?Vsmp2Oh/ I33>/EjBWjr1$"Olٲ2?=zED~B0 )f"r`lby\0U%WdԤf֦e5WQKEVV\O3^_Tf`&5ʕ+qٳ7oC6S%&f ]3'LZ0}6XI糲qWp&4 {L3h;Z& Zqg(=[yFsiO.`J:l@GڂCsYOA o B́;1+a8WB1Cvu@֬]p!{hhXeB`dBPX\ {u @ԔU]GSL6u*M6mf<`\f͆ VǏ|>Cl@H9pƬ o^ *TM6Lx6Y qۑ?Ϩ~ &65Ofu&x(dv\N! m?drrG*&:@@%`FFh;w3(#& d -^QY |6/mKxrw0lQ+:`~[n`:`O`̙3v8tYw''B˄ (|bIrZYjFef t3ylu{?R2Buh?怮q YݸC;>0#LxRF)Ō' .eR(+CN+>=p+M_kQo&_НkD!߼y6ZL@*g3!dy'$4,9 ̀`l lZlVzyX?~r:i2!0.H8B@|"d\wx[2ClDE I&рT9&u&`f3`i^ѣG ,wIșv \` Q$A7AQΙe&LA9pҒ'Ll3!dB`} 3!J\V6} ȸ(L-mQ22!@ L +rfϞ @s kVf9`N-`Np o G޸q;$9`(o @>&LOLθ3%O,>mʄ_w"`>eB|τ02!JN J sм ;7 b8"ulX <S  "_N ^ "YJ(ɄhuN>tkXx ؎ߝ;w{ ~9`,瀡L"Vp&M^&L A`|9cɄ >$!}Bؾ>k'si ."ZVZ~\֦"/T`RWv-NXSa9r/"l(W22$iCV,2:Πdʄ$ZQo -H=x dfX:O>`d;n]>`;t9 ؙ~XAr0%A20dy~虐LED&uڣ;=x!Y'崡E&" "%CԷ _?~[?КhBsYh*] GHmTVw+u‹d2Lecl& r d8kC~X=`ok5HB8 2auf.0O py lI=\x6VF̈́A9(Ʉx3.9{5`5i S%%3a6hL+7^T?)n&C\w[;2(ng (() dcIdl"_ /! ټ|;V >49 !۽B`5 ]`7 =<)X&gB_Zg»oH ;<Co2łҋP[U]`r:s _j!̈́>Lӓ>?>)h ",NeH夔eBLOs/ P>tHILIn&hZfXeHLx@.zV}Kgk Sc0&(XL7cTFFk0LxP&R/MJ+OɨAK!Kl!C-Lv9xxC^S ]&7GNs9|3rぼ4rJLd><sǁ?n>HL ˄-X3!|K+|Hd L*:|aܺc۸h ͤg¹Jg2Tp7}?H~i)"s`CC|r` Ç@@ %LX ̄*Ivݺu$'RSL+[vgJ2a,{9x|: :ɇT̄C0Lχ@]W;.+hz~0I2!r>X`er~k7Zz%[f̝>5dS{^SNf&вfv !]`ԂD ^t*M@x  0M[j6:r |U|l* c&̄Vnf5&U$ A(Xk J*ڪjXY@ɶKbj#[)!S@Ɲ)7&^XyugD`ef^oȇH D~0F;KV RA+;KD ЩA{卺 e :%uۄ:dYdژۙ@[oA[!rIE*8e8d #xƃ=H=@`C&(_f5k ;rw9>P%gB fS⁙pwT`&ljjc{H `-0@A %e> _.i/!6Ͼ: pwLnZ]a|TO dVȸ0$ZȊKșaS]MzYG:Z9Q 2G `9?j=@`B6cǎ={X rZ)LɇL3'rG$NVPɇ&FvLvR`GM]W]Cs+p^x*A.8HOaτs}"gy=̇5Q+>@pe*2 Y~S!VX>2@A Y"jc d2jY9m;Lf>w80^ݹ–|,$yQ`|عQ*qY)$" !L؄>^@@le@*@`  C:BZȁ@@ ,Z&\0/ vot0`Ro !0Ř:Q)*3sihml&։S;W[nTBEOeIK:TO}n&#$(+CPw (H;!ڣu#8  jOtxz>O:h|ȵ]/m۽2:0`I".qmt}(3~\??bta`4NC+[^l)W9Dx7:b}A[M&&)[Mm,c;?}%q (R9J2eQK36@Hs3$k-A @I$ey6ɼ&"S3B&>tP_/㛄uϢ+&9"P"Tg:X5斋o8Ter|SwK"b ^b %9iքxі6@@1JMK{598l ?1<`m J; 0%|)6zQ#'b#0.2"7 1ⵟbXK*F+UʷzѼ+P6(5[I3rHZf0-dDId')G.6%/,BH'sZ,]Ir0ƒ/5<_%h!q t명uh@_ƭg&ܮrqѹU+XwYNnC!Ð矜|mz#QtL?3vcBJ6:qRG4,H @BX Qм Mr %4|Q/a{@ @ݝ@$p# VTbJK ­M]gf`l4^JF6Ո4VlZw3oD.\`݂K %>,,ˁZ5 qU$iQli685Tr$&S(c,YXe$˱3d;H(z3z|(E(hQV4$N!.v.Б`XXXWf y@mAEa}$ߨH~w~m, ${4?4UXz4,U@@HN:Pd|=O3sI5B Զk?t&]~/uvۨL1&n(=WNTwG OF]n{D+ 8qCk`@N=Ҭu ˄\Ó 0 )r8x&yM'ҡeOuOQ#M> 1TKa 9VpsVb6>G$c 2,Dh? 4:@Zx<O tC^%Ʃ ,yU:@*m⏱ĕ E&Dx@.vdS҆(rJBvHJͩhVpI*FnD3c, Y$IENDB`batik-1.9.orig/test-resources/org/apache/batik/dom/svg/presentationAttrRemovalTest.svg0000644000175000017500000000730113063003264030660 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/svg/bug30580.svg0000644000175000017500000001053013063003264024277 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/svg/test.svg0000644000175000017500000000152713063003264024107 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/svg/unitTesting.xml0000644000175000017500000000620613063003263025444 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/svg/locatableTest.svg0000644000175000017500000001144413063003263025714 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/svg/lengthTest.svg0000644000175000017500000001177013063003264025252 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/bug20331.svg0000644000175000017500000000733413063003263023500 0ustar mans0954mans0954 This string is red if test failed, green otherwise batik-1.9.orig/test-resources/org/apache/batik/dom/unitTesting.xml0000644000175000017500000002416713063003263024653 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/dummyXML2.xml0000644000175000017500000000156413063003264024131 0ustar mans0954mans0954 Content batik-1.9.orig/test-resources/org/apache/batik/dom/dummyXML.xml0000644000175000017500000000147013063003263024042 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/dom/dummyXML4.xml0000644000175000017500000000165013063003263024126 0ustar mans0954mans0954 Content batik-1.9.orig/test-resources/org/apache/batik/dom/bug18143.svg0000644000175000017500000000472413063003263023510 0ustar mans0954mans0954 This string is red if test failed, green otherwise batik-1.9.orig/test-resources/org/apache/batik/css/0000755000175000017500000000000013063003254021613 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/css/dom/0000755000175000017500000000000013153020772022376 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/css/dom/bug9740.svg0000644000175000017500000000655713063003256024233 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/rgbPresentationTest.svg0000644000175000017500000001461213063003256027127 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/bug11670.svg0000644000175000017500000000624113063003256024274 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/rgbTest.svg0000644000175000017500000001145013063003256024530 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/unitTesting.xml0000644000175000017500000000300513063003256025431 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/bug9779.svg0000644000175000017500000000407113063003256024234 0ustar mans0954mans0954 normal wider batik-1.9.orig/test-resources/org/apache/batik/css/dom/bug9740-1.css0000644000175000017500000000004113063003256024340 0ustar mans0954mans0954rect.redBackground { fill: red;} batik-1.9.orig/test-resources/org/apache/batik/css/dom/rgbUpdateTest.svg0000644000175000017500000001266513063003256025704 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/css/dom/bug9740-2.css0000644000175000017500000000004513063003256024345 0ustar mans0954mans0954rect {stroke: white; fill: #a0a0a0;} batik-1.9.orig/test-resources/org/apache/batik/css/engine/0000755000175000017500000000000013063003254023060 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/css/engine/value/0000755000175000017500000000000013153020772024200 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/css/engine/value/unitTesting.xml0000644000175000017500000006555613063003256027256 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/util/0000755000175000017500000000000013153020772022004 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/util/regParsedURL.xml0000644000175000017500000002114313063003263025022 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/util/unitTesting.xml0000644000175000017500000005443113063003262025045 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/util/regBase64.xml0000644000175000017500000001745413063003263024257 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/util/resources/0000755000175000017500000000000013153020772024016 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/util/resources/TestMessages.properties0000644000175000017500000000355613063003263030550 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Error Message values for ParsedURL Tests # # $Id: TestMessages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- ParsedURLTest.error.cannot.parse.url = \ Error while Parsing URL: \ Base URL {0} \ Sub URL {1} \ Got stack trace {2} ParsedURLTest.error.wrong.result = \ Expected Result : {1} \ Got Result : {0} # # Error Message values for Base64 Tests # Base64Test.error.bad.action.string = \ Error bad action string for test: \ Action string: {0} Base64Test.error.cannot.read.in.url = \ Error while trying to read source URL: \ Source URL: {0} \ Stack trace: {1} Base64Test.error.cannot.read.ref.url = \ Error while trying to read reference URL: \ Reference URL: {0} \ Stack trace: {1} Base64Test.error.wrong.result = \ Computed answer differed from reference at byte {0} # # Entry Keys # ParsedURLTest.entry.key.error.description = Error Description. Base64Test.entry.key.error.description = \ Error Description. batik-1.9.orig/test-resources/org/apache/batik/ext/0000755000175000017500000000000013063003263021623 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/0000755000175000017500000000000013063003263022416 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/geom/0000755000175000017500000000000013153020772023351 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/geom/unitTesting.xml0000644000175000017500000000520513063003264026407 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/ext/awt/geom/resources/0000755000175000017500000000000013153020772025363 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/geom/resources/TestMessages.properties0000644000175000017500000000310113063003264032100 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Error Message values for Text Selection Tests # # $Id: TestMessages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- RectListManagerTest.error.reading.rects =\ Error while read Rects file at line {0}: \n\ Rects URL: "{1}" \n\ Got stack trace {2} RectListManagerTest.error.cannot.read.ref.url =\ Error while reading reference file: \n\ URL: "{0}" \n\ Stack Trace {1} RectListManagerTest.error.wrong.result =\ Error result doesn''t match, starting at byte: {0} RectListManagerTest.error.no.reference =\ Reference file doesn''t exist: {0} # # Entry Keys # RectListManagerTest.entry.key.error.description = \ Error Description. batik-1.9.orig/test-resources/org/apache/batik/ext/awt/image/0000755000175000017500000000000013063003263023500 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/image/codec/0000755000175000017500000000000013153020772024561 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/image/codec/unitTesting.xml0000644000175000017500000000330513063003266027620 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/ext/awt/image/codec/resources/0000755000175000017500000000000013153020772026573 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/ext/awt/image/codec/resources/Messages.properties0000644000175000017500000000244013063003264032455 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Error Message values for org.apache.batik.ext.awt.image.codec Tests # # $Id: Messages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- PNGEncoderTest.error.cannot.encode.image = \ Error while encoding BufferedImage : \ Got exception : {0} PNGEncoderTest.error.cannot.decode.image = \ Error while decoding PNG image. \ Got exception : {0} batik-1.9.orig/test-resources/org/apache/batik/svggen/0000755000175000017500000000000013153020772022320 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/svggen/resources/0000755000175000017500000000000013153020772024332 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/svggen/resources/vangogh.jpg0000644000175000017500000001772613153020772026502 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2 lPhotoshop 3.08BIM{x01997 Adobe Systems Incorporated Self Portrait DourImage SemblanceAspectAttitudeLookFrown SteadfastStonyBrowFurrowedFurrow IntensityIntenseFace ExpressionHarshSternStare Unrelenting GloweringGlareShirtVestSuitArtist DepictionTorsoBlueVerticalVan GoghGrayPost-Impressionism PortraiturePaintingPost-ImpressionistsVincent WillemFine Art (1853-1890) Impressionism Impressionist1889Van Gogh 09 high.jpgCircaART:VanGogh8BIMxHH(FG(HH(d'`8BIMHH8BIM x8BIM8BIM 8BIM .http://www.digimarc.com/cgi-bin/ci.pl?1+8024028BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM 2?%hyJFIFHH&File written by Adobe Photoshop 5.2Adobed            ?2"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?OJ8͗8I'>;lqy$,ܞk:p-s4;L*ukk'kQ<`kS[጑wN TV44! =g7m1cgr^HsSGZXc&+餤[8'N#IGkht{Hu?8+q\̟Zf3?֐mp ,gՏ~EO w"@h?H]JaDg9fNTH=SD5@q.;OPݱtƮ[4\#E>IKg^=V>Nwi F0Ook7X2dg!qm8'BߝuGkvͬ=ZbX?OcK0s_Mqqkl;ox?Oe  H&{3ZօVX#,dkۣ7!Fzz`XKǷY?dʣS67!Zj%u: űm۠?`)?IVsS_Ȋ\4E>$.u ˤ,*{o~l٥5۬a/$mo}=Cat1yqv[uOy}&nVkk j{UYGsZ\+O4۬!M}&OVpX<:CZ G'F[% ?d=:?8BIMCC?2 -!"1#2ABQ $3=!"12ABQRabq#r3$S ?z9ȧv݆c٩am<bm2S'rf31_G380 $Z+^20 -zT F%2?W*_wv'jVFlm>͵WĚϏi\o DH^`w*RR EdiK)*Ro[q'sAt1}0 :g]`+ 0"2#أ1addFF4jDd"X/?0ǪQ{?m],M|`/UkKl^EnSk:ZKdj }υ˒y\eOL\ݦEO!exѮCKA/SoђZtڸgz!ϕծ i9ώik8<&K1fPRf]u_{[Fvg2v=V5j!7LJ\Z&.?ۣ61"t RU%cĻW86I?C.><8k[lݡA?LWD.|<d/@S,󘈅_|>)AkңZxWpAMȩSZ5)m |RʌVC^5Lcz]³ܺvtZnD(ƌ U*]}!]ٷR-sc\}_/q|C#4%~X2Y[;WՏw;]m׵voG:օէ4*pU#4Y%64UrFŤZ$Tr }q,{4fI1s7}m%Y0#Zomu,)KE)b[Y~s*op\ѷy\BY/ֳ:9FD-[`g{ 4H!8{f;hg-H(qUp͟˰wm)oPlVuYEz|gW^>nWe_SFW9zk_Be. 90uA}5(p׋otypVa²SVHdo5}.a6 Xz&Sv|X kJ&bDǙnFTkE.y{]N+bFc6bYʮKکkA,bTeۼ~g~#ÒP%Y)&>> P1zt|l\ڣLTخr<"+rCifxw"(22>6T)ƃ]ʬzlM=, ycSّ#% f?H~>}Yc@4%mn̸%}O?˄W|g߫Kwn?">y|ZåŰ˙Fu +%*4G {sS{M}lO17˦].SCRP*.d5xs>O &beEQe]LHr>;LjnΪy;s,^ ?Zz]߅Wk1d?S$\5vk6V>8ّ*Qub@j/}߫ r[\""1hgF]e v)ǩ+rzt+܍ [bX;h::qOi#[+!K,#]&ei̸ףm[7639~ەhUP³D/]X`@ĔJ|$H;xcl]o~UZ\9VJ֟_5ؖT[&۩-/HXqZrrøw>#hfjsSxcCeI_c[f[.fِsF2km:ְN=mwx)DE=E٨xSVY[ʹXߚfD7n >)3a]&h4)lqU0-"@0f#ʶ 3=Z|eƔ"긯};֞uǨ|󡖫g-[|;"9f^EWu*XUaG*gլ>G&}{/qf%{a7fص.]]YA8/ I>Q,urP ^|NaR&'~@zVxBf"brCjkKd_9$9,t),'bfu5^>н|XerH\_*A$G-7h:O(_ׇSGZ{'[J`TV1ukܮ֍֢%A/3(S-|7&6ĉeg7Rℕ=$&jb?Է[u7'[>E^ "əd ?o?rӴ$S b.3(aUV+{+VIm2l@ILf??UHy@px13PRF\RֵB=Fr zO$]0*kv3K -V_R޴/:*́1r ~d͞=ӎp2sUP|(mj;Ke? 4<9rYylvrֲ٭Q.Zoo E*OvpFYQ[]_ ,n}г.Av6gh,nd٠M&T`D!!/3VhNT ioOM>? {]ڕBǒ}M5:*YdK U§ˌC+f$UGbgjGrn^7qė"NYy@Cw(ī~;-ege?ZY}ʷWGT QnN\20[C*e}Zk: p.X͠3A}unEsuR]f]c3#п'cFW?PBf2\"e s0 ֵlbI#6].F߅~k7:vI(Uk&!PǑ"Fpof?d^ne-LCBG%!ROuY֬rǺkWFfvZٽDWQ0:^g貟&>4qY_f9\Yy]% di+)ͺRTwc,bE il3o֖_M(}Wr7)ʣajvYCld v|c'>1TOz*:47]NQO@ e Yrc1"rت4fo]w`iZc,:Fc@&RȘv/D҄Qt?bPHO8IzZ16 |&VYGm|>c>]E1ceU#B-s AY`ЫQhjҝ+@.|KTe~;bӞ64CLäiv?f_-6hn% PJymA78A^ZU҅٭.Qq4h0O-G:ofTK'!;h,>vo0loݺ1[)k'9Y#B#+M p_ m% ůX!m5:W  ۝K W?U:SW jȔLo'nHq !ajAoPiS雃-1t+]# :@:hkZ:*T5>47B~' [ Z , 0 2qF#Gh~(?]ԺQC]~e9.QP?@u]zzbatik-1.9.orig/test-resources/org/apache/batik/svggen/resources/vangogh.png0000644000175000017500000002330413063003256026471 0ustar mans0954mans0954PNG  IHDR2?- 8gAMAXG cHRMz%u._:oi+&OIDATxaB@_ȌFxM8:˝Jm<} \A=ɜ<0hf&Թ8TP9dĥZ#KP.C9z|&ݚN>-(tg̩hT칤+e x[A=YlmKyNs!JУ9KPrH󓝀Ed37]~TV_mz#fL-^9 3y-4Q%#g0;b~'megY/s  sFjO(nz:pVN|vpR4A0HU;TĥnKHNQ[ @l W6p;!4Zll(W2 Stט/}ngb,|Wػ[  rjsiK)Dbfkk]֣|eNa8F*PFd.6o0R  Tk ICʅͫWE®W܊Fxv&j+TĊ'S_b?a(jbpPD@ZZZ >0$D8t%v&w*|eF̝ K}eQiZ$0"N׌ ͋kPbnYlY KMdxGQ 8A/z F H*Pk 312>{*PR:\oeXC,`(4E@ 0PvlCPEKH׌;]u<9\~"iuw~e{>Vky~ /d . ՜֊L7usSQt^=K | M_: -7\l6z/(2:"bKKU &'X]qC0,]},PN95t9ñw .o?a0Ѩ*UyDwL&-fM57^^2_]1ɽNY>Ap{(wU%V*1ZKP81VPX|% }~a hº½ãǢǨŰѥͥʮЫΨӦhudowl֩͢ÞƦʜūѭϦȥɯγϰԲնީhġ÷ǿåȫӟΥʩȀzTP5II/B9*NC1m`=zZ¯ϥěŔǞ£ŪϰԯƜɴްݴذޛhšĥ½ƭӣo}l]aJVQ4WM4bW;liF}J\_Zop`Ţř¤ʟͭͳί²ϰڮԫݻ؜hÚũĨŢäơɢ|~iQQ-HB*iW?bS6sB[[Zdckh=|vР¥ΫЩͳׯТƮѯέ֢ʰܮܵ꥽hžǥêƢ£ã—ȪeofbT1|g:lkLgc@rf@dv}hk^vwMNWD{˨ҨϩԬЩңέبӰڬ੾ٱ׮߹hȪȨè̪̦çžĚǢŬˋAC5ui?LYVhќþǐf]ZYnGguRը̩׬ӡ˩ش⮿ݷ᰿߸ݰݭߥhķ ѩͮɰѬԚ˶ʧƝɐKM?dkImsv͙јjjdcuKp`ҳݮ٥͞Ϣϰޮݭ۷hŤίզĦ˨˩ͨƺäɫ҆jqP~ɠΫ֬㾲tmZv|Pްͦͦҫ֯ૻܪݫܷhȥŸˮҭɫͨӭ̩ɛƲӨȦĤȫ{{rǤΪԳ߹–o``b{ydڱҥά׭ӯۭޤթݰhϩƧŨѩҫϤȦ§өجѫҲذԶѮӖ|pēɦ̢Ҫܿ߿޿Ðxqd__ڭڢ̦ϲޫҮݮ֭۬hҪ˦ҧ˪̣̬ӦѨԫӥй޵ۮбӯՈsɘɞӮܺԲײܽÍuslbc׬٭թұװܮܲܪ֯ܵhğŘǥșɱЪϮҢִͯܨϢȬׇnϣ̲ٸѹѲۺׯxmhqmJeeI֦שթةԩܰ㦺Ӱ۸h̫дبɤťɮЭϪХ̰ҷ۟ơʨˁ}|\jЗܼڭ΢~wuwPXV=٢ӡўЦѦ٭䪹دެhɬ̟ү֯вժ̦ʷױЩε䧹qYn}Rd}tc~_fƘ۵ؽuqmljCvԯ٦ԟѢը֧ܴ֮ߢӺ᩿hѴעț¹Ƕڹ۳ױӮͷ٤ǨѵxzWqTDUEk~bontjWiO}oխԧجgu`uQmݮ֨թڢֵͫ᫿פضتhۮө̰̮˯չظۻײϩͪզͰչlvii\٬oӝϔӤszc˨̶ӥԬبխڬ۳ݢϮꦾhدծ˭Ϧʩ͸ٺܻب̴ܭܪг״ӛē}oĔذʝ|ʛթڦҥǣģԡϩֱܫذ߱ި̦гhޱڨөīʴʶδвִ௿زؼڠ~Оר׫ɖǒԤܨ߯էҨàƭӯиŹ֦ӫتׯٲ޴۪Ȥϥӻh޴תҪз۾صѶײծٲ۵۾栶ܥթԭԡʎʔɒʗΟ˝jͰůתӫӥүױ۰٪ϥ̰ԸhܲϴհвӸܽڼس۵ܽݷ̑uəڮ̠ϫ̤ΕΒ˒ɊjSMվӪקϥЪηڰְִحؤ٫ۺhߪͤƧγ׽ݷٺޱжԹ޻嚙q—ȩʢҟ̔[NH|Lռݣȡɧͮػ޳ڵپߧݩhݽାԱگڵ޹ٻڹӮ͵ּꛗnF~Z~HRTȤ͞xRLWXHtʠk߯ͧĩүۻܹhڼ˯ֵռضָܸ۽㘙}_=yQ|OKw@xy8b1xKڟ͛ɿί΀έϨӴګШȹ߻ۯޮ߰hפΣ̴ծ˥ɲջޮԭӰҳש٫ӯֱиسԃp{sW+d-w8C>m:aÎїǖҷʭ”Ϯͯϫɹ۷ۯګڰۭݴh׫ɞƷө̱׷۲פŬάդˢ̪αҮВr{k[X?]/v6k7W̗͒ɏȻڭÌϫԣǬϷخ۱h֨ʩӢȩΨҲ޳ӜΦХǦ̭қÛ~xnbjœÍҪğ˖ʤŧdzӸٰز߯ްhưϯح˧ijМȬٹ۪¨ȪΩ׫ϕͿĒȢɵŠլƁǦ¥͛«ʭη׷h̽кޯиμݭΠʯ٫Ȫʫӣ͖Ljz¾㪵Ϣϰ͇ʵʡ̩صhϩռݺۿޭЩʨɪʨЖ›ɿͺԴϴ–Ķǥgx˵ˠȩݬhȦǢ̺ܶڲͨDZЮ̜ýÜɩǂXa˾԰߬hڹʧſЯʦޞ€|Ƞn~s˿ȼ|]|oŭh˴ɫɿˢˊ{Ĺߟ{~tưÛӱhӫĮ̢Ĩʗw|ִ}Ź˧˽ʸùʲ͏0\n+^z"/i,1in-3DI!ip3j.~8K"X# dn$koA%!O .x/-t@82O݈ RDC&\dFʃLʐ>MhmyY/1L& hШ̨̣ëǠą}yp{}uiҡ¹çħβؔhƠıʤĒ}}Vdq_rpa|ws}Ƒn~q¼īȨМhѶʾǰŭʜ}yfyh|}ozvdyroyj}phwŬëΠh·ʭȩƫ¦ė}myygyu|nrqGd_\dvp^namqxŮƛhǶ˾¦ä~`qs`vslYzivP]S`}r®Ůǧhðũ|ooezPjavudsav|dxǫhǠzzccvkuPhlqe~x~{oc}tuvhtwa{\zutMZjPaq\u|f~k{{savWrr®þhǸ]wqc}|QphiowReap}Qmqmd|ovf|wtNbWy}ha{q~uiUtnfuM]mb~rrmvqxul~gdy@QXlv}h¼|d}ysexVwnevqOgiplj~si{{vwhwylSZObqm|hzb||uqZuFahhfoG`epc~Ul~ter~yrp`vaw~xlhveswnnZrvFbnXzckFe]zJepicv~xi~wixuYuevn|hnyk{tpmSlpRqtWda{|FncqrDUiwri~|ciyrrenjQf\lS``|~}h~k|qtz\z|QxwS~n\zrdxb|SwmNbzqk^Rv`ljxr^rHZ~rpL\~g}]qTmz~yhth{yxZVSzVzp{Eal_}Y~vijhajtpFX # # Entry Keys # SVGAccuracyTest.entry.key.error.description = \ Error Description. SVGAccuracyTest.entry.key.line.number = \ Line number SVGAccuracyTest.entry.key.column.number = \ Column number SVGAccuracyTest.entry.key.column.expected.value = \ Expected column value SVGAccuracyTest.entry.key.column.found.value = \ Found column value SVGAccuracyTest.entry.key.reference.line = \ Reference line SVGAccuracyTest.entry.key.new.line = \ New line batik-1.9.orig/test-resources/org/apache/batik/svggen/regsvggen.xml0000644000175000017500000000564513063003256025041 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/transcoder/0000755000175000017500000000000013153020772023173 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/transcoder/unitTesting.xml0000644000175000017500000000403713063003256026234 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/transcoder/wmf/0000755000175000017500000000000013063003254023760 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/transcoder/wmf/resources/0000755000175000017500000000000013153020772025776 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/transcoder/wmf/resources/Messages.properties0000644000175000017500000000375013063003255031665 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Error Messages values # # $Id: Messages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- WMFAccuracyTest.error.cannot.generate.svg = \ Error while generating SVG with Painter : {0} \ Got exception {1} with message {2} \ and stack trace {3} WMFAccuracyTest.error.cannot.open.reference.svg.file = \ Cannot open reference SVG file : {0} \ Got IOException with message : {1} WMFAccuracyTest.error.while.comparing.files = \ Error while comparing generated SVG and reference SVG {0}. \ Got IOException with message : {1} WMFAccuracyTest.error.generated.svg.inaccurate = \ Generated SVG is inaccurate. # # Entry Keys # WMFAccuracyTest.entry.key.error.description = \ Error Description. WMFAccuracyTest.entry.key.line.number = \ Line number WMFAccuracyTest.entry.key.column.number = \ Column number WMFAccuracyTest.entry.key.column.expected.value = \ Expected column value WMFAccuracyTest.entry.key.column.found.value = \ Found column value WMFAccuracyTest.entry.key.reference.line = \ Reference line WMFAccuracyTest.entry.key.new.line = \ New line batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/0000755000175000017500000000000013153020772024255 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/unitTesting.xml0000644000175000017500000007056713063003256027331 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/resources/0000755000175000017500000000000013153020772026267 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/resources/px2mm.svg0000644000175000017500000000226413063003256030055 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/resources/language.svg0000644000175000017500000000256113063003256030575 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/transcoder/image/resources/butterfly.svg0000644000175000017500000007640013063003256031035 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/gvt/0000755000175000017500000000000013153020772021627 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/gvt/unitTesting.xml0000644000175000017500000001754213063003266024676 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/gvt/resources/0000755000175000017500000000000013153020772023641 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/gvt/resources/TestMessages.properties0000644000175000017500000000355413063003265030373 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Error Message values for Text Selection Tests # # $Id: TestMessages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- TextSelectionTest.error.reading.svg =\ Error while read SVG file: \n\ SVG URL: "{0}" \n\ Got stack trace {1} TextSelectionTest.error.bad.id =\ Given ID doesn''t reference an element:\n\ ID: "{0}" TextSelectionTest.error.id.not.text =\ Given ID doesn''t reference a text element:\n\ ID: "{0}"\n\ Element: {1} TextSelectionTest.error.getting.selection =\ Error while getting text selection: \n\ ID:"{0}" ({1}->{2}) \n\ Stack Trace {3} TextSelectionTest.error.cannot.read.ref.url =\ Error while reading reference file: \n\ URL: "{0}" \n\ Stack Trace {1} TextSelectionTest.error.wrong.result =\ Error result doesn''t match, starting at byte: {0} TextSelectionTest.error.no.reference =\ Reference file doesn''t exist: {0} # # Entry Keys # TextSelectionTest.entry.key.error.description = \ Error Description. batik-1.9.orig/test-resources/org/apache/batik/test/0000755000175000017500000000000013153020772022006 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/samplesRendering.xml0000644000175000017500000006237613063003266026047 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/0000755000175000017500000000000013153020772022605 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/svg/unexpectedResultValue.svg0000644000175000017500000000426113063003263027665 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/processingError.svg0000644000175000017500000000365313063003264026520 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/invalidTestResultElementsNumber.svg0000644000175000017500000000420413063003263031655 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/success.svg0000644000175000017500000000407613063003264025002 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/getComputedTextLength.js0000644000175000017500000000520613063003263027431 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var svgns = "http://www.w3.org/2000/svg"; function show(evt,parent){ var doc = evt.target.getOwnerDocument(); var parent = doc.getElementById(parent); processChildren(parent); } function processChildren(parent){ var child = parent.getFirstChild(); while ( child != null ){ if ( child.getNodeType() == child.ELEMENT_NODE ){ if ( child.getLocalName() == "text" ){ addAllCharactersTextLength(child) } else{ if ( child.getLocalName() != "defs" ){ processChildren(child); } } } child = child.getNextSibling(); } } function addAllCharactersTextLength(textElement){ var doc = textElement.getOwnerDocument(); var bboxgroup = doc.getElementById("bboxes"); if ( bboxgroup == null ){ bboxgroup = doc.createElementNS(svgns,"g"); bboxgroup.setAttributeNS(null,"id","bboxes"); bboxgroup.setAttributeNS(null,"style","fill:none;stroke:red;stroke-width:0.2%"); doc.getDocumentElement().appendChild(bboxgroup); } var newLine = doc.createElementNS(textElement.SVG_NAMESPACE_URI,textElement.SVG_LINE_TAG); var length = textElement.getComputedTextLength(); var point1 = textElement.getStartPositionOfChar(0); newLine.setAttributeNS(null,"transform","translate("+point1.getX()+","+point1.getY()+")"); newLine.setAttributeNS(null,newLine.SVG_X1_ATTRIBUTE,"0"); newLine.setAttributeNS(null,newLine.SVG_Y1_ATTRIBUTE,"0"); newLine.setAttributeNS(null,newLine.SVG_X2_ATTRIBUTE,length); newLine.setAttributeNS(null,newLine.SVG_Y1_ATTRIBUTE,"0"); bboxgroup.appendChild(newLine); } batik-1.9.orig/test-resources/org/apache/batik/test/svg/bug19363.svg0000644000175000017500000000234513063003264024512 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/missingOrEmptyErrorCode.svg0000644000175000017500000000424113063003264030122 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/0000755000175000017500000000000013153020772024617 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/style/0000755000175000017500000000000013153020772025757 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/style/style.css0000644000175000017500000000525213063003264027632 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ body { margin: 2em 1em 2em 70px; font-family: serif; font-size: 10px; color: black; background: white; background-position: top left; background-attachment: fixed; background-repeat: no-repeat; background-color: white; } :link { color: #00C; background: transparent } :visited { color: #609; background: transparent } :active { color: #C00; background: transparent } th, tr, td { /* ns 4 */ font-family: sans-serif; font-size: 10px; } table tr td { font-family: sans-serif; } ol li { font-size: 10px; } p,ol,ul,li { font-family: sans-serif;} h1, h2, h3, h4, h5, h6 { text-align: left } h1, h2, h3 { color: #444; background: white; } h1 { font: 27px serif; } h2 { font: 18px serif } h3 { font: 16px serif } h4 { font: bold 12px serif } h5 { font: italic 12px serif } h6 { font: small-caps 12px serif } h7 { font-family: serif; } .titlefailed { font-family: Arial; font-weight: bolder; font-size: 12;} .titlepassed {} .reportDate { text-align: right; font-family: sans-serif; } div.head { margin-bottom: 1em } div.head h1 { margin-top: 2em; clear: both } div.head table { margin-left: 2em; margin-top: 2em } div.head img { color: white; border: none } /* remove border from top image */ .margin0 { background: red;} p.copyright { font-size: small } p.copyright small { font-size: small } @media screen { /* hide from IE3 */ a:hover { background: #ffa } } pre { color: #99F; } dt, dd { margin-top: 0; margin-bottom: 0 } /* opera 3.50 */ dt { font-weight: bold } tt, pre, code { font-family: monospace } /* navigator 4 requires this */ ul.toc { list-style: disc; /* Mac NS has problem with 'none' */ list-style: none; } @media aural { h1, h2, h3 { stress: 20; richness: 90 } .hide { speak: none } p.copyright { volume: x-soft; speech-rate: x-fast } dt { pause-before: 20% } pre { speak-punctuation: code } } table { font-size: 10; font-family: sans-serif; } batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/Configuration.properties0000644000175000017500000000233413063003264031543 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: Configuration.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- # Prefix for temp files temp.file.prefix = SVGRenderingAccuracyTest # Extension for temp files temp.file.suffix = .png # Parser used for validation validating.parser=org.apache.xerces.parsers.SAXParser batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/images/0000755000175000017500000000000013153020772026064 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/images/deco.png0000644000175000017500000000074613063003263027507 0ustar mans0954mans0954PNG  IHDRh6gAMAXG cHRMz%u._:oi+qIDATxb` 'E۷׮ŦB4BåKa63j8Z~Fq12߼ ZZĀ$&o!tT%YH@Ϟ @P ӧ"Cpq'OC  ߾9|%(8ф9f|q/RTϝvf|HrBE锲?>5J<|)m3&@CӞN\@hEOՓ'5\Uw~f ewҮU]r/ 7 HNKD206;ǡOIENDB`batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/images/background.png0000644000175000017500000001354313063003264030714 0ustar mans0954mans0954PNG  IHDR<ӴgAMAXG cHRMz%u._:oi+IDATxb`8,@ q4@ i!h b-PabMe4GZ ߿DB  bm]VǏ_|A;w<} '4(}ԩׯ}AC]tիWD: 8p @C4$ @CDMG?`x,.^a'/ǐZx3-VZ$#~HG&X0GqA^ &#Ȳ.ĉ7nx߿q4@Qz 1 d Äi#+n;ˇ%2(`Ģ惦 ?7` GuNJ=s(cîN'?~DsG,,,(D|C@Q"Hz.LuSd|$B@Qxq/V|&@@q4jWDG8p"DG3Ɓ((t4@Q j1:&i~j.pxq&n< hڥܙ>|8@ Gعݻڑ OYlxǏ8 \vܹgϞS1Ac+Hs4@ IGАt4@ IG}^CYuyuL{Z7DoL5ӧO\@q4IDG ibkG#k:ƕDC>|U`Gu 2 8G9M zIJD)]48hqS襥-:tK"{L^tm8u0 Ž*z捧'1Mf9|fzewrdccc`>}͛^"~ r4L8Ȥ^le24aΖ۶߿\SSS`1wŁ Hp49s(B@oocǎ?~I9Փ'OOi/_DFFb`p zǏ[F dGCܹsyxx::::> ,> l;;;CK'@h r务!\%JՒ|C~E(8Vei1?2~v5޶D w4C+##jDYw`$@QhXv-0QѐQӪ E-G[ 8h45-Q_\4H D[p0wF*u4]ڲ2hP;zk=01jO],n>&Œ,Is{* 62Ƈ60 @Ts400>,KU%{]km R@> h֤OJ˜~fl>|[DCMM @ݿViha t1e` 7 V,tK0"hVxJ|afgHhJ=8{ۨ X}E}!u@h6v<_5QO?{,ӊU͕=zIt#GyK[@$8TTT Q+33H=Fw+ *LGC "```LpG t!\xEІ"4z ^ "; t48::;N$Mog )!)d;bK=̋%Ф:aM@(# ZlGYWcI9).[@q_+'<cʞvXQ ; h`umǖ",$0ˁMzع Ck3u LmJq/ Zj`>wk$<~m h`HkgGu$G.666>pxw[UZ|W+dk˗/њDGv >H{m NdtlO;djj l*Om 7n[vlZ}6Gv4@Qpw"OlrrՊ+ܵKǏ;w ^!L@W (,&]u3@QwCh ݻw-` :`zjoo*`:z=|s, hAӷE~5R o+ GE0P0e XRKАD|懲.~1]X. j;_ىXKELq4w>̀ ߿Ƈ*e% '6E> 1ޱIr7@Qѿ{Zͷȣ(݅O^5 Zyt悔Z4t!&dÆ ћE$" @RBq5 eQg8|Vvj bF3qG`#>*"r:q9Aby[:D\m|li h̥M K*w-Ĥ ;hTn<2(z< 40YFGG5""" ͵P ‚Bp.ֵ]]][1MzB\N ;ks ~D@ngğ"ųwܻͯׯxũ .!b$[n$ 80@vJ ϟ?s; @sW@rƌBk(َD 85mllP0tp1~g4- 8iZ@q4sh"Bi` a7lGGSz@*26 m± /C 'o긙~џ7IZn @Ts4;deJY" @яLf %1DJJ}iF`X&pU+ ="NhP84(M[!h&5MsiTsr=aTb4Tݽ h`l;&0Ǹ$P1P E DG}իǏ? {d rD5GC(/`= a5?@TsdBo5M*pqq!O#@ IGАt4@Zf A#j9 G!h JHH jh": @C4$ @I!D4/ɮhH: hH: hH: hH: hH: hH:  1o1Ǐ7nܸ{.e@CCɓ'XKjj*|Q05[SS!|8rГk!Gz@ IGАt4@p4je@p9shg7 A@ l$PסȠ<D@pE$kMM H/\dlGzs IА6ɕ+WMyʕDjV(pwWϝ;BGHҥKI o.___M!%% ma^`F3K1+(is0h"s>d$<4`# , 4`}d; Fh Ȟt1y O]xcXev4@s4Ο$GM6 V[d; p:~Gxfl\0N4GEp)60 DPdo#n8Ύ 0a*R *`<)t4@ dBhH: hH: hH: hH: hH: hH: EI?N (зge IENDB`batik-1.9.orig/test-resources/org/apache/batik/test/svg/resources/Messages.properties0000644000175000017500000000555313063003264030511 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: Messages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- # # Keys in the generated TestReport Entries # SVGRenderingAccuracyTest.entry.key.error.description = \ Error description SVGRenderingAccuracyTest.entry.key.difference.image = \ Difference SVGRenderingAccuracyTest.entry.key.reference.generated.image.file = \ Reference/Generated image SVGRenderingAccuracyTest.entry.key.internal.error = \ Internal test error while generating error description # # Error Messages values # SVGRenderingAccuracyTest.error.cannot.create.temp.file = \ Error while creating temporary file. \ Got IOException: \ {0} SVGRenderingAccuracyTest.error.cannot.create.temp.file.stream = \ Error while writing into temporary file : {0} \ Got IOException: \ {1} SVGRenderingAccuracyTest.error.cannot.transcode.svg = \ Error while transcoding SVG file: {0} \ Got exception: {1} \ with message: {2} \ and stack trace: {3} SVGRenderingAccuracyTest.error.cannot.open.reference.image = \ Error while opening reference image: \ {0} Got IOException: \ {1} SVGRenderingAccuracyTest.error.cannot.open.generated.image = \ Error when opening generated image: \ {0} Got IOException: \ {1} SVGRenderingAccuracyTest.error.error.while.comparing.files = \ Error while comparing reference file: \ {0} with generated image: \ {1} Got IOException: \ {2} SVGRenderingAccuracyTest.error.svg.rendering.not.accurate = \ Differences between the reference image and the generated image SVGRenderingAccuracyTest.message.warning.could.not.open.variation.url = \ Could not open variation url : {0} SVGRenderingAccuracyTest.message.error.could.not.generate.comparison.images = \ Error while creating comparison images: \ Got exception: {0} \ with message: {1} \ and stack trace: {2} SVGRenderingAccuracyTest.message.error.could.not.load.image = \ Could not load image {0} JSVGRenderingAccuracyTest.message.error.save.failed = \ Save of new image failed: '{0}' \n\ I/O Exception: {1} batik-1.9.orig/test-resources/org/apache/batik/test/svg/errorAndEntries.svg0000644000175000017500000000542013063003264026432 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/HTMLReport.xsl0000644000175000017500000002443513063003264025302 0ustar mans0954mans0954

Regard Test Report -- /


 

Report Details

Failed Leaf Tests


  1. #
  title   ()  () --   /

batik-1.9.orig/test-resources/org/apache/batik/test/svg/getExtentOfChar.js0000644000175000017500000000520113063003263026167 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var svgns = "http://www.w3.org/2000/svg"; function show(evt,parent){ var doc = evt.target.getOwnerDocument(); var parent = doc.getElementById(parent); processChildren(parent); } function processChildren(parent){ var child = parent.getFirstChild(); while ( child != null ){ if ( child.getNodeType() == child.ELEMENT_NODE ){ if ( child.getLocalName() == "text" ){ addAllCharactersBBox(child) } else{ if ( child.getLocalName() != "defs" ){ processChildren(child); } } } child = child.getNextSibling(); } } function addAllCharactersBBox(textElement){ var doc = textElement.getOwnerDocument(); var bboxgroup = doc.getElementById("bboxes"); if ( bboxgroup == null ){ bboxgroup = doc.createElementNS(svgns,"g"); bboxgroup.setAttributeNS(null,"id","bboxes"); bboxgroup.setAttributeNS(null,"style","fill:none;stroke:red;stroke-width:0.2%"); doc.getDocumentElement().appendChild(bboxgroup); } count = textElement.getNumberOfChars(); for( i = 0 ; i < count ; i++ ){ var newRect = doc.createElementNS(textElement.SVG_NAMESPACE_URI,textElement.SVG_RECT_TAG); var characterRect = textElement.getExtentOfChar(i); newRect.setAttributeNS(null,newRect.SVG_X_ATTRIBUTE,characterRect.getX()); newRect.setAttributeNS(null,newRect.SVG_Y_ATTRIBUTE,characterRect.getY()); newRect.setAttributeNS(null,newRect.SVG_WIDTH_ATTRIBUTE,characterRect.getWidth()); newRect.setAttributeNS(null,newRect.SVG_HEIGHT_ATTRIBUTE,characterRect.getHeight()); bboxgroup.appendChild(newRect); } } batik-1.9.orig/test-resources/org/apache/batik/test/svg/error.svg0000644000175000017500000000415213063003264024456 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/svg/getCharacterRotation.js0000644000175000017500000000707313063003264027263 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // // // var svgns = "http://www.w3.org/2000/svg"; function show(evt,parent){ var doc = evt.target.getOwnerDocument(); var parent = doc.getElementById(parent); var bboxgroup = doc.getElementById("bboxGroup"); if ( bboxgroup == null ){ bboxgroup = doc.createElementNS(svgns,"g"); bboxgroup.setAttributeNS(null,"id","bboxGroup"); bboxgroup.setAttributeNS(null,"style","fill:none;stroke-opacity:0.5;stroke-width:0.6%"); doc.getDocumentElement().appendChild(bboxgroup); } //create the arrow var defs = doc.createElementNS(svgns,"defs"); var line = doc.createElementNS(svgns,"line"); //line stroke-width="3" id="line" x1="-5" y1="0" x2="5" y2="0" line.setAttributeNS(null,"id","line"); line.setAttributeNS(null,"x1","-1%"); line.setAttributeNS(null,"x2","1%"); line.setAttributeNS(null,"y1","0"); line.setAttributeNS(null,"y2","0"); defs.appendChild(line); doc.getDocumentElement().insertBefore(defs,doc.getDocumentElement().getFirstChild()); processChildren(parent); } function processChildren(parent){ var child = parent.getFirstChild(); while ( child != null ){ if ( child.getNodeType() == child.ELEMENT_NODE ){ if ( child.getLocalName() == "text" ){ addAllCharactersPosition(child) } else{ if ( child.getLocalName() != "defs" ){ processChildren(child); } } } child = child.getNextSibling(); } } function addAllCharactersPosition(textElement){ count = textElement.getNumberOfChars(); for( i = 0 ; i < count ; i++ ){ showRotationAngle(textElement,i); } } function showRotationAngle(elt, index) { var doc = elt.getOwnerDocument(); var angle = elt.getRotationOfChar(index); var group = doc.getElementById('bboxGroup'); var u = doc.createElementNS("http://www.w3.org/2000/svg","use"); var point1 = elt.getStartPositionOfChar(index); var point2 = elt.getEndPositionOfChar(index); x = ( point1.getX() + point2.getX() )/2; y = ( point1.getY() + point2.getY() )/2; u.setAttributeNS(null,"transform","translate("+x+","+y+") rotate("+angle+") "); u.setAttributeNS("http://www.w3.org/1999/xlink","href","#line"); u.setAttributeNS(null,"stroke","green"); group.appendChild(u); } batik-1.9.orig/test-resources/org/apache/batik/test/svg/getCharacterPosition.js0000644000175000017500000001041613063003264027263 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // // // var svgns = "http://www.w3.org/2000/svg"; function show(evt,parent,pos){ var doc = evt.target.getOwnerDocument(); var parent = doc.getElementById(parent); var bboxgroup = doc.getElementById("bboxGroup"); if ( bboxgroup == null ){ bboxgroup = doc.createElementNS(svgns,"g"); bboxgroup.setAttributeNS(null,"id","bboxGroup"); bboxgroup.setAttributeNS(null,"style","fill:none;stroke-opacity:0.5;stroke-width:0.2%"); doc.getDocumentElement().appendChild(bboxgroup); } //create the arrow var defs = doc.createElementNS(svgns,"defs"); var path = doc.createElementNS(svgns,"path"); path.setAttributeNS(null,"id","arrow"); path.setAttributeNS(null,"d","M-5 0 L 5 0 M 0 -5 L 0 5z"); defs.appendChild(path); doc.getDocumentElement().insertBefore(defs,doc.getDocumentElement().getFirstChild()); processChildren(parent,pos); } function processChildren(parent,pos){ var child = parent.getFirstChild(); while ( child != null ){ if ( child.getNodeType() == child.ELEMENT_NODE ){ if ( child.getLocalName() == "text" ){ addAllCharactersPosition(child,pos) } else{ if ( child.getLocalName() != "defs" ){ processChildren(child,pos); } } } child = child.getNextSibling(); } } function addAllCharactersPosition(textElement,pos){ count = textElement.getNumberOfChars(); for( i = 0 ; i < count ; i++ ){ if ( pos == "start" ){ showCharactersStartPosition(textElement,i); } else{ showCharactersEndPosition(textElement,i); } } } function showCharactersStartPosition(elt, index) { var doc = elt.getOwnerDocument(); var group = doc.getElementById('bboxGroup'); //while (group.hasChildNodes() ){ // group.removeChild(group.getFirstChild()); //} var u = doc.createElementNS("http://www.w3.org/2000/svg","use"); var point = elt.getStartPositionOfChar(index); u.setAttributeNS(null,"transform","translate("+point.getX()+","+point.getY()+")"); u.setAttributeNS("http://www.w3.org/1999/xlink","href","#arrow"); u.setAttributeNS(null,"stroke","green"); group.appendChild(u); } function showCharactersEndPosition(elt, index) { var doc = elt.getOwnerDocument(); var group = doc.getElementById('bboxGroup'); //while (group.hasChildNodes() ){ // group.removeChild(group.getFirstChild()); //} var u = doc.createElementNS("http://www.w3.org/2000/svg","use"); var point = elt.getEndPositionOfChar(index); u.setAttributeNS(null,"transform","translate("+point.getX()+","+point.getY()+")"); u.setAttributeNS("http://www.w3.org/1999/xlink","href","#arrow"); u.setAttributeNS(null,"stroke","blue"); group.appendChild(u); } batik-1.9.orig/test-resources/org/apache/batik/test/regard.xml0000644000175000017500000001056013063003264023773 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/regardManual.xml0000644000175000017500000000454513063003264025137 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/unitTesting.xml0000644000175000017500000001172413063003264025047 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/xml/0000755000175000017500000000000013153020772022606 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/xml/testSuiteA.xml0000644000175000017500000000313513063003264025421 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/xml/resources/0000755000175000017500000000000013153020772024620 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/xml/resources/Messages.properties0000644000175000017500000000467013063003264030511 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # XMLTestReportProcessor configuration # # $Id: Messages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- XMLTestReportProcessor.config.xml.test.report.default.directory = \ test-reports XMLTestReportProcessor.xml.report.directory = \ xml XMLTestReportProcessor.xml.resources.directory = \ resources XMLTestReportProcessor.config.xml.test.report.name = \ report.xml # # Messages # XMLTestSuiteRunner.messages.unmatched.test.ids = \ WARNING: There are no test or testSuite matching the following id(s): {0} XMLTestSuiteRunner.messages.error.usage = \ This application takes an argument which can be either a file name or a URL: \ (ant) build runTestSuite -Dargs=" <[testId | testSuiteId]*>" \ (command-line) java org.apache.batik.test.xml.XMLTestSuiteRunner <[testId | testSuiteId]*>" XMLTestSuiteRunner.messages.error.not.a.file.try.uri = \ The argument: {0} is not a valid file name. \ Trying to use it as a URL... XMLTestSuiteRunner.messages.error.could.not.convert.file.name = \ Error: could not convert file name "{0}" to a URI. XMLTestSuiteRunner.messages.error.invalid.uri = \ Invalid URI : {0} XMLTestSuiteRunner.messages.error.invalid.document = \ {0} is an invalid document. Got the following exception while parsing it: \ {1} with error message "{2}". XMLTestSuiteRunner.messages.error.running.test.suite = \ Error while running test suite : {0} xml.XMLReflect.error.no.matching.constructor = \ Could not find a constructor of class {0} with arguments of type {1} batik-1.9.orig/test-resources/org/apache/batik/test/xml/testSuiteB.xml0000644000175000017500000000272013063003264025421 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/xml/dummyTestRun.xml0000644000175000017500000000310513063003263026003 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/resources/0000755000175000017500000000000013153020772024020 5ustar mans0954mans0954batik-1.9.orig/test-resources/org/apache/batik/test/resources/Messages.properties0000644000175000017500000001222713063003264027706 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: Messages.properties 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- # # Keys in the generated TestReport Entries # TestReport.entry.key.error.description = \ Error description DefaultTestSuiteReport.entry.key.failed.child.test.report = \ Child Report DefaultTestSuiteReport.entry.key.passed.child.test.report = \ Child Report TestReport.entry.key.internal.test.failure.exception.class = \ Internal test exception class TestReport.entry.key.internal.test.failure.exception.message = \ Internal test exception message TestReport.entry.key.internal.test.failure.exception.stack.trace = \ Internal test exception stack trace TestReport.entry.key.reported.test.failure.exception.class = \ Reported test exception class TestReport.entry.key.reported.test.failure.exception.message = \ Reported test exception message TestReport.entry.key.reported.test.failure.exception.stack.trace = \ Reported test exception stack trace TestReportValidator.entry.key.expected.error.code = \ Expected error code TestReportValidator.entry.key.expected.status = \ Expected tests status TestReportValidator.entry.key.received.error.code = \ Received error code TestReportValidator.entry.key.received.status = \ Received status # # Error codes for TestReportProcessor # TestReportProcessor.error.code.internal.error = \ TestReportProcessor internal error \ Got exception of class : {0} with messages {1} \ and stack trace : {2} # # XMLTestSuiteLoader and XMLTestSuiteRunner error codes # xml.XMLTestSuiteLoader.error.cannot.create.test = \ Cannot build Test instance of class : {0}. \ Got exception of class : {1} with messages {2} \ and stack trace : {3} xml.XMLTestSuiteRunner.error.cannot.create.test.report.processor = \ Cannot build TestReportProcessor instance of class : {0}. \ Got exception of class : {1} with messages {2} \ and stack trace : {3} xml.XMLTestSuiteLoader.error.test.suite.loading.exception = \ Got exception while loading test suite {0} \ Got exception of class : {1} with messages {2} \ and stack trace : {3} xml.XMLTestSuiteRunner.error.test.suite.exception = \ Got exception while running test suite {0} \ of class : {1} Got exception of class : {2} with messages {3} \ and stack trace : {4} xml.XMLTestSuiteRunner.error.test.report.processing.exception = \ Got exception while running test report processor of \ class {0}. \ Got exception of class : {1} with messages {2} \ and stack trace : {3} # # Errors for XMLTestReportProcessor # xml.XMLTestReportProcessor.error.report.directory.unusable = \ Report directory "{0}" specified in resource file org.apache.batik.test.xml.Messages.properties \ cannot be used. Check that it exists. xml.XMLTestReportProcessor.error.report.resources.directory.unusable = \ Report resources directory "{0}" specified in resource file org.apache.batik.test.xml.Messages.properties \ cannot be used. Check that it exists. # # Errors for XSLXMLReportConsumer # xml.XSLXMLReportConsumer.error.output.directory.unusable = \ Report directory "{0}" specified in resource file org.apache.batik.test.xml.Messages.properties \ cannot be used. Check that it exists. # # Regular messages # SimpleTestReportProcessor.messages.test.suite.status = \ Test suite : {0} \ Status : {1} SimpleTestReportProcessor.messages.test.suite.status.testPassed = \ Test passed SimpleTestReportProcessor.messages.test.suite.status.testFailed = \ Test failed SimpleTestReportProcessor.messages.test.suite.error.code = \ Error code : {0} SimpleTestRunner.messages.usage = \ USAGE : build runtest -Dargs="[testClassName]" SimpleTestRunner.messages.error.class.not.found = \ Class not found : {0}. \ Got exception : {1} with message {2} SimpleTestRunner.messages.error.class.cast = \ Class {0} is not a Test extension. \ Got exception : {1} with message {2} SimpleTestRunner.messages.error.instantiation = \ Exception while instantiating : {0} \ Got exception : {1} with message {2} SimpleTestRunner.messages.error.illegal.access = \ Cannot access default constructor for {0}. Check that the class is public and that its default, no argument constructor is public. \ Got exception : {1} with message {2} TestReportMailer.messages.email.report.subject = \ Test Report for : {0} MemoryLeakTest.message.error.objs.not.cleared = \ Not all registered objects cleared: {0} batik-1.9.orig/test-resources/org/apache/batik/test/beSuite.xml0000644000175000017500000003136313063003264024133 0ustar mans0954mans0954 batik-1.9.orig/test-resources/org/apache/batik/test/interactiveSamples.xml0000644000175000017500000000626213063003264026375 0ustar mans0954mans0954 batik-1.9.orig/batik-bridge/0000755000175000017500000000000013153020772015262 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/0000755000175000017500000000000013063003352016044 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/0000755000175000017500000000000013063003343016770 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/0000755000175000017500000000000013063003343021002 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/0000755000175000017500000000000013063003343021571 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/apache/0000755000175000017500000000000013063003343023012 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/0000755000175000017500000000000013063003343024104 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/bridge/0000755000175000017500000000000013063003343025340 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/bridge/resources/0000755000175000017500000000000013153020772027357 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/bridge/resources/help.gif0000644000175000017500000000166313063003350030775 0ustar mans0954mans0954GIF89a(  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,wH\… #&$CIXCAN`D'Irŗ5PˏCڼi$E74qeϙ/vI(G )ԏ4jR^KY;batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/bridge/resources/move.gif0000644000175000017500000000164213063003343031012 0ustar mans0954mans0954GIF89a(  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with The GIMP! ,f H*\ȰC=4!Zaō=QbGMLcD$/&Ɠiڬ3gI.[ ʒI#=)fF2Bd*իO;batik-1.9.orig/batik-bridge/src/main/resources/org/apache/batik/bridge/resources/Messages.properties0000644000175000017500000001221513063003346033243 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # $Id: Messages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- attribute.missing = \ {0}:{1}\n\ The attribute "{3}" of the element <{2}> is required attribute.malformed = \ {0}:{1}\n\ The attribute "{3}" of the element <{2}> is invalid attribute.not.animatable = \ {0}:{1}\n\ The attribute "{4}" of the element <{3}> is not animatable type.not.animatable = \ {0}:{1}\n\ The attribute "{4}" of the element <{3}> cannot be animated with the \ <{5}> element length.negative = \ {0}:{1}\n\ The attribute "{3}" of the element <{2}> cannot be negative css.length.negative = \ {0}:{1}\n\ The CSS property "{3}" found on the element <{2}> cannot be negative css.uri.badTarget = \ {0}:{1}\n\ The URI "{3}"\n\ for a CSS property found on the element <{2}> is invalid xlink.href.circularDependencies = \ {0}:{1}\n\ A circular dependency has been detected on the element <{2}> for the URI:\n\ "{3}" uri.malformed = \ {0}:{1}\n\ The URI "{3}"\n\ specified on the element <{2}> is invalid uri.badTarget = \ {0}:{1}\n\ Cannot find the referenced element:\n\ "{3}"\n\ specified on the element <{2}> - may be a problem of ''id'' uri.io = \ {0}:{1}\n\ An I/O error occured while processing the URI:\n\ "{3}"\n\ specified on the element <{2}> uri.unsecure = \ {0}:{1}\n\ A security exception occured while processing the URI:\n\ "{3}"\n\ specified on the element <{2}> uri.referenceDocument = \ {0}:{1}\n\ The URI "{3}"\n\ specified on the element <{2}> references an entire document. \n\ This is illegal: The element <{2}> must reference an element\n\ inside a document. uri.image.invalid = \ {0}:{1}\n\ The URI "{3}"\n\ specified on the element <{2}> is invalid uri.image.broken = \ {0}:{1}\n\ The URI "{3}"\n\ on element <{2}> can''t be opened because:\n\ {4} uri.image.error = \ The URI can''t be opened:\n\ {0} ########################################################################## # Messages for DefaultScriptSecurity ########################################################################## DefaultScriptSecurity.error.cannot.access.document.url = \ Could not access the current document URL when trying to load script file {0}. Script will not be loaded as it is not possible to verify it comes from the same location as the document. DefaultScriptSecurity.error.script.from.different.url = \ The document references a script file ({0}) which comes from different location than the document itself. This is not allowed with the current security settings and that script will not be loaded. EmbededScriptSecurity.error.script.not.embeded = \ The document references a script file ({0}) which is not embeded in the document. This is not allowed with the current security settings and that script will not be loaded. EmbededExternalResourceSecurity.error.external.resource.not.embeded = \ The document references a resource ({0}) which is not embeded in the document. This is not allowed with the current security settings and that resource cannot be loaded. NoLoadScriptSecurity.error.no.script.of.type.allowed = \ Scripts of type ({0}) cannot be loaded and executed with the current security settings. DefaultExternalResourceSecurity.error.cannot.access.document.url = \ Could not access the current document URL when trying to load an external resource {0}. The external resource will not be loaded as it is not possible to verify it comes from the same location as the document. DefaultExternalResourceSecurity.error.external.resource.from.different.url = \ The document references a external resource ({0}) which comes from different location than the document itself. This is not allowed for security reasons and that resource will not be loaded. NoLoadExternalResourceSecurity.error.no.external.resource.allowed = \ The security settings do not allow any external resources to be referenced from the document ########################################################################## # Messages for BaseScriptingEnvironment ########################################################################## BaseScriptingEnvironment.constant.inline.script.description = \ Inline {1} {0}:{2} BaseScriptingEnvironment.constant.event.script.description = \ Event attribute {0}:{2} {1} SVG12ScriptingEnvironment.constant.handler.script.description = \ Handler {0}:{3} {1} {2} batik-1.9.orig/batik-bridge/src/main/java/0000755000175000017500000000000013063003343017711 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/java/org/0000755000175000017500000000000013063003343020500 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/java/org/apache/0000755000175000017500000000000013063003343021721 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/0000755000175000017500000000000013063003343023013 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/0000755000175000017500000000000013153020772024254 5ustar mans0954mans0954batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/FlowTextPainter.java0000644000175000017500000004662013063003352030221 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.font.FontRenderContext; import java.awt.font.TextAttribute; import java.text.AttributedCharacterIterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.Arrays; import org.apache.batik.gvt.flow.BlockInfo; import org.apache.batik.gvt.flow.FlowRegions; import org.apache.batik.gvt.flow.GlyphGroupInfo; import org.apache.batik.gvt.flow.LineInfo; import org.apache.batik.gvt.flow.RegionInfo; import org.apache.batik.gvt.flow.TextLineBreaks; import org.apache.batik.gvt.flow.WordInfo; import org.apache.batik.gvt.font.GVTFont; import org.apache.batik.gvt.font.GVTGlyphVector; import org.apache.batik.gvt.font.GVTLineMetrics; import org.apache.batik.gvt.font.MultiGlyphVector; import org.apache.batik.gvt.text.GVTAttributedCharacterIterator; /** * One line Class Desc * * Complete Class Desc * * @author deweese * @version $Id: FlowTextPainter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class FlowTextPainter extends StrokingTextPainter { /** * A unique instance of this class. */ protected static TextPainter singleton = new FlowTextPainter(); /** * Returns a unique instance of this class. */ public static TextPainter getInstance() { return singleton; } public List getTextRuns(TextNode node, AttributedCharacterIterator aci) { List textRuns = node.getTextRuns(); if (textRuns != null) { return textRuns; } AttributedCharacterIterator[] chunkACIs = getTextChunkACIs(aci); textRuns = computeTextRuns(node, aci, chunkACIs); aci.first(); List rgns = (List)aci.getAttribute(FLOW_REGIONS); if (rgns != null) { Iterator i = textRuns.iterator(); List chunkLayouts = new ArrayList(); TextRun tr = (TextRun)i.next(); List layouts = new ArrayList(); chunkLayouts.add(layouts); layouts.add(tr.getLayout()); while (i.hasNext()) { tr = (TextRun)i.next(); if (tr.isFirstRunInChunk()) { layouts = new ArrayList(); chunkLayouts.add(layouts); } layouts.add(tr.getLayout()); } textWrap(chunkACIs, chunkLayouts, rgns, fontRenderContext); } node.setTextRuns(textRuns); return node.getTextRuns(); } public static final char SOFT_HYPHEN = 0x00AD; public static final char ZERO_WIDTH_SPACE = 0x200B; public static final char ZERO_WIDTH_JOINER = 0x200D; public static final char SPACE = ' '; public static final AttributedCharacterIterator.Attribute WORD_LIMIT = TextLineBreaks.WORD_LIMIT; public static final AttributedCharacterIterator.Attribute FLOW_REGIONS = GVTAttributedCharacterIterator.TextAttribute.FLOW_REGIONS; public static final AttributedCharacterIterator.Attribute FLOW_LINE_BREAK = GVTAttributedCharacterIterator.TextAttribute.FLOW_LINE_BREAK; public static final AttributedCharacterIterator.Attribute LINE_HEIGHT = GVTAttributedCharacterIterator.TextAttribute.LINE_HEIGHT; public static final AttributedCharacterIterator.Attribute GVT_FONT = GVTAttributedCharacterIterator.TextAttribute.GVT_FONT; protected static Set szAtts = new HashSet(); static { szAtts.add(TextAttribute.SIZE); szAtts.add(GVT_FONT); szAtts.add(LINE_HEIGHT); } public static boolean textWrap(AttributedCharacterIterator [] acis, List chunkLayouts, List flowRects, FontRenderContext frc) { // System.out.println("Len: " + acis.length + " Size: " + // chunkLayouts.size()); // Make a list of the GlyphVectors so we can construct a // multiGlyphVector that makes them all look like one big // glyphVector // GVTGlyphVector [] gvs = new GVTGlyphVector[acis.length]; // todo - not used? WordInfo [][] wordInfos = new WordInfo[acis.length][]; Iterator clIter = chunkLayouts.iterator(); float prevBotMargin = 0; int numWords = 0; BlockInfo [] blockInfos = new BlockInfo[acis.length]; float [] topSkip = new float[acis.length]; for (int chunk=0; clIter.hasNext(); chunk++) { // System.err.print("Chunk: " + chunk + " Str: '"); AttributedCharacterIterator aci = acis[chunk]; List gvl = new LinkedList(); List layouts = (List)clIter.next(); Iterator iter = layouts.iterator(); while (iter.hasNext()) { GlyphLayout gl = (GlyphLayout)iter.next(); gvl.add(gl.getGlyphVector()); } GVTGlyphVector gv = new MultiGlyphVector(gvl); // gvs[chunk] = gv; wordInfos[chunk] = doWordAnalysis(gv, aci, numWords, frc); aci.first(); BlockInfo bi = (BlockInfo)aci.getAttribute(FLOW_PARAGRAPH); bi.initLineInfo(frc); blockInfos[chunk] = bi; if (prevBotMargin > bi.getTopMargin()) topSkip[chunk] = prevBotMargin; else topSkip[chunk] = bi.getTopMargin(); prevBotMargin = bi.getBottomMargin(); numWords += wordInfos[chunk].length; } Iterator frIter = flowRects.iterator(); RegionInfo currentRegion = null; int currWord = 0; int chunk = 0; List lineInfos = new LinkedList(); while(frIter.hasNext()) { currentRegion = (RegionInfo) frIter.next(); FlowRegions fr = new FlowRegions(currentRegion.getShape()); while (chunk < wordInfos.length) { WordInfo [] chunkInfo = wordInfos[chunk]; BlockInfo bi = blockInfos[chunk]; WordInfo wi = chunkInfo[currWord]; Object flowLine = wi.getFlowLine(); double lh = Math.max(wi.getLineHeight(),bi.getLineHeight()); LineInfo li = new LineInfo(fr, bi, true); double newY = li.getCurrentY()+topSkip[chunk]; topSkip[chunk] = 0; if (li.gotoY(newY)) break; while (!li.addWord(wi)) { // step down 1/10 of a line height and try again. newY = li.getCurrentY() + (lh * 0.1); if (li.gotoY(newY)) break; } if (fr.done()) break; currWord++; for (;currWord < chunkInfo.length;currWord++) { wi = chunkInfo[currWord]; if ((wi.getFlowLine() == flowLine) && (li.addWord(wi))) continue; // Word didn't fit or we hit end of flowLine elem, // go to a new line. li.layout(); lineInfos.add(li); li = null; flowLine = wi.getFlowLine(); lh = Math.max(wi.getLineHeight(),bi.getLineHeight()); if (!fr.newLine(lh)) break; // region is done li = new LineInfo(fr, bi, false); while (!li.addWord(wi)) { newY =li.getCurrentY() + (lh * 0.1); if (li.gotoY(newY)) break; } if (fr.done()) break; } if (li != null) { li.setParaEnd(true); li.layout(); } if (fr.done()) break; chunk++; currWord = 0; if (bi.isFlowRegionBreak()) break; if (!fr.newLine(lh)) // Region is done. break; } if (chunk == wordInfos.length) break; } boolean overflow = (chunk < wordInfos.length); while (chunk < wordInfos.length) { WordInfo [] chunkInfo = wordInfos[chunk]; while (currWord < chunkInfo.length) { WordInfo wi = chunkInfo[currWord]; int numGG = wi.getNumGlyphGroups(); for (int gg=0; gg maxWord) { maxWord = minWord; wordMap = allocWordMap(wordMap, maxWord+1); } aciIdx++; for (int c=1; c maxWord) { maxWord = cWord; wordMap = allocWordMap(wordMap, maxWord+1); } // We always want to use the min word as the main // index for the new composite word. if (cWord < minWord) { wordMap[minWord] = cWord; minWord = cWord; } else if (cWord > minWord) { wordMap[cWord] = minWord; } aciIdx++; } glyphWords[i] = minWord; } int words=0; WordInfo [] cWordMap = new WordInfo[maxWord+1]; for (int i=0; i<=maxWord; i++) { int nw = wordMap[i]; if (nw == -1) { // new word so give it a number. cWordMap[i] = new WordInfo(words++); } else { int word = nw; nw = wordMap[i]; while (nw != -1) { word = nw; nw = wordMap[word]; } wordMap[i] = word; // help the next guy out cWordMap[i] = cWordMap[word]; } } wordMap = null; WordInfo [] wordInfos = new WordInfo[words]; for (int i=0; i<=maxWord; i++) { WordInfo wi = cWordMap[i]; wordInfos[wi.getIndex()] = cWordMap[i]; } aciIdx = aci.getBeginIndex(); int aciEnd = aci.getEndIndex(); char ch = aci.setIndex(aciIdx); int aciWordStart = aciIdx; GVTFont gvtFont = (GVTFont)aci.getAttribute(GVT_FONT); float lineHeight = 1.0f; Float lineHeightFloat = (Float)aci.getAttribute(LINE_HEIGHT); if (lineHeightFloat != null) lineHeight = lineHeightFloat.floatValue(); int runLimit = aci.getRunLimit(szAtts); WordInfo prevWI = null; float [] lastAdvAdj = new float [numGlyphs]; float [] advAdj = new float [numGlyphs]; boolean [] hideLast = new boolean[numGlyphs]; boolean [] hide = new boolean[numGlyphs]; boolean [] space = new boolean[numGlyphs]; float [] glyphPos = gv.getGlyphPositions(0, numGlyphs+1, null); for (int i=0; i runLimit) && (aciIdx < aciEnd)) { // Possible font size/style change so record current // line metrics and start fresh. GVTLineMetrics lm = gvtFont.getLineMetrics (aci,aciWordStart, runLimit, frc); prevWI.addLineMetrics(gvtFont, lm); prevWI.addLineHeight(lineHeight); prevWI = null; aciWordStart = aciIdx; aci.setIndex(aciIdx); gvtFont = (GVTFont)aci.getAttribute(GVT_FONT); Float f = (Float)aci.getAttribute(LINE_HEIGHT); lineHeight = f.floatValue(); runLimit = aci.getRunLimit(szAtts); } } GVTLineMetrics lm = gvtFont.getLineMetrics (aci,aciWordStart, runLimit, frc); prevWI.addLineMetrics(gvtFont, lm); prevWI.addLineHeight(lineHeight); int [] wordGlyphCounts = new int[words]; // Build a mapping from words to glyphs. for (int i=0; iCameron McCormack * @version $Id: SVGAnimationElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class SVGAnimationElementBridge extends AbstractSVGBridge implements GenericBridge, BridgeUpdateHandler, SVGAnimationContext, AnimatableElement { /** * The animation element. */ protected SVGOMElement element; /** * The BridgeContext to be used. */ protected BridgeContext ctx; /** * The AnimationEngine that manages all of the animations in the document. */ protected SVGAnimationEngine eng; /** * The TimedElement object that provides the timing for the animation. */ protected TimedElement timedElement; /** * The animation object that provides the values for the animation. */ protected AbstractAnimation animation; /** * The namespace URI of the attribute being animated. */ protected String attributeNamespaceURI; /** * The local name of the attribute or the name of the property being * animated. */ protected String attributeLocalName; /** * The animation type. Must be one of the ANIM_TYPE_* * constants defined in {@link AnimationEngine}. */ protected short animationType; /** * The target element of the animation. */ protected SVGOMElement targetElement; /** * The AnimationTarget the provides a context to the animation engine. */ protected AnimationTarget animationTarget; /** * Returns the TimedElement for the animation. */ public TimedElement getTimedElement() { return timedElement; } // AnimatableElement ///////////////////////////////////////////////////// /** * Returns the underlying value of the animated attribute. Used for * composition of additive animations. This should be overridden in * descendant classes that are for 'other' animations. */ public AnimatableValue getUnderlyingValue() { if (animationType == AnimationEngine.ANIM_TYPE_XML) { return animationTarget.getUnderlyingValue(attributeNamespaceURI, attributeLocalName); } else { return eng.getUnderlyingCSSValue(element, animationTarget, attributeLocalName); } } // GenericBridge ///////////////////////////////////////////////////////// /** * Handles this animation element. * * @param ctx the bridge context to use * @param e the element being handled */ public void handleElement(BridgeContext ctx, Element e) { if (ctx.isDynamic() && BridgeContext.getSVGContext(e) == null) { SVGAnimationElementBridge b = (SVGAnimationElementBridge) getInstance(); b.element = (SVGOMElement) e; b.ctx = ctx; b.eng = ctx.getAnimationEngine(); b.element.setSVGContext(b); if (b.eng.hasStarted()) { b.initializeAnimation(); b.initializeTimedElement(); } else { b.eng.addInitialBridge(b); } } } /** * Parses the animation element's target attributes and adds it to the * document's AnimationEngine. */ protected void initializeAnimation() { // Determine the target element. String uri = XLinkSupport.getXLinkHref(element); Node t; if (uri.length() == 0) { t = element.getParentNode(); } else { t = ctx.getReferencedElement(element, uri); if (t.getOwnerDocument() != element.getOwnerDocument()) { throw new BridgeException (ctx, element, ErrorConstants.ERR_URI_BAD_TARGET, new Object[] { uri }); } } animationTarget = null; if (t instanceof SVGOMElement) { targetElement = (SVGOMElement) t; animationTarget = targetElement; } if (animationTarget == null) { throw new BridgeException (ctx, element, ErrorConstants.ERR_URI_BAD_TARGET, new Object[] { uri }); } // Get the attribute/property name. String an = element.getAttributeNS(null, SVG_ATTRIBUTE_NAME_ATTRIBUTE); int ci = an.indexOf(':'); if (ci == -1) { if (element.hasProperty(an)) { animationType = AnimationEngine.ANIM_TYPE_CSS; attributeLocalName = an; } else { animationType = AnimationEngine.ANIM_TYPE_XML; attributeLocalName = an; } } else { animationType = AnimationEngine.ANIM_TYPE_XML; String prefix = an.substring(0, ci); attributeNamespaceURI = element.lookupNamespaceURI(prefix); attributeLocalName = an.substring(ci + 1); } if (animationType == AnimationEngine.ANIM_TYPE_CSS && !targetElement.isPropertyAnimatable(attributeLocalName) || animationType == AnimationEngine.ANIM_TYPE_XML && !targetElement.isAttributeAnimatable(attributeNamespaceURI, attributeLocalName)) { throw new BridgeException (ctx, element, "attribute.not.animatable", new Object[] { targetElement.getNodeName(), an }); } // Check that the attribute/property is animatable with this // animation element. int type; if (animationType == AnimationEngine.ANIM_TYPE_CSS) { type = targetElement.getPropertyType(attributeLocalName); } else { type = targetElement.getAttributeType(attributeNamespaceURI, attributeLocalName); } if (!canAnimateType(type)) { throw new BridgeException (ctx, element, "type.not.animatable", new Object[] { targetElement.getNodeName(), an, element.getNodeName() }); } // Add the animation. timedElement = createTimedElement(); animation = createAnimation(animationTarget); eng.addAnimation(animationTarget, animationType, attributeNamespaceURI, attributeLocalName, animation); } /** * Returns whether the animation element being handled by this bridge can * animate attributes of the specified type. * @param type one of the TYPE_ constants defined in {@link SVGTypes}. */ protected abstract boolean canAnimateType(int type); /** * Returns whether the specified {@link AnimatableValue} is of a type allowed * by this animation. */ protected boolean checkValueType(AnimatableValue v) { return true; } /** * Parses the animation element's timing attributes and initializes the * {@link TimedElement} object. */ protected void initializeTimedElement() { initializeTimedElement(timedElement); timedElement.initialize(); } /** * Creates a TimedElement for the animation element. */ protected TimedElement createTimedElement() { return new SVGTimedElement(); } /** * Creates the animation object for the animation element. */ protected abstract AbstractAnimation createAnimation(AnimationTarget t); /** * Parses an attribute as an AnimatableValue. */ protected AnimatableValue parseAnimatableValue(String an) { if (!element.hasAttributeNS(null, an)) { return null; } String s = element.getAttributeNS(null, an); AnimatableValue val = eng.parseAnimatableValue (element, animationTarget, attributeNamespaceURI, attributeLocalName, animationType == AnimationEngine.ANIM_TYPE_CSS, s); if (!checkValueType(val)) { throw new BridgeException (ctx, element, ErrorConstants.ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] { an, s }); } return val; } /** * Initializes the timing attributes of the timed element. */ protected void initializeTimedElement(TimedElement timedElement) { timedElement.parseAttributes (element.getAttributeNS(null, "begin"), element.getAttributeNS(null, "dur"), element.getAttributeNS(null, "end"), element.getAttributeNS(null, "min"), element.getAttributeNS(null, "max"), element.getAttributeNS(null, "repeatCount"), element.getAttributeNS(null, "repeatDur"), element.getAttributeNS(null, "fill"), element.getAttributeNS(null, "restart")); } // BridgeUpdateHandler /////////////////////////////////////////////////// /** * Invoked when an MutationEvent of type 'DOMAttrModified' is fired. */ public void handleDOMAttrModifiedEvent(MutationEvent evt) { } /** * Invoked when an MutationEvent of type 'DOMNodeInserted' is fired. */ public void handleDOMNodeInsertedEvent(MutationEvent evt) { } /** * Invoked when an MutationEvent of type 'DOMNodeRemoved' is fired. */ public void handleDOMNodeRemovedEvent(MutationEvent evt) { element.setSVGContext(null); dispose(); } /** * Invoked when an MutationEvent of type 'DOMCharacterDataModified' * is fired. */ public void handleDOMCharacterDataModified(MutationEvent evt) { } /** * Invoked when an CSSEngineEvent is fired. */ public void handleCSSEngineEvent(CSSEngineEvent evt) { } /** * Invoked when the animated value of an animatable attribute has changed. */ public void handleAnimatedAttributeChanged (AnimatedLiveAttributeValue alav) { } /** * Invoked when an 'other' animation value has changed. */ public void handleOtherAnimationChanged(String type) { } /** * Disposes this BridgeUpdateHandler and releases all resources. */ public void dispose() { if (element.getSVGContext() == null) { // Only remove the animation if this is not part of a rebuild. eng.removeAnimation(animation); timedElement.deinitialize(); timedElement = null; element = null; } } // SVGContext /////////////////////////////////////////////////////////// /** * Returns the size of a px CSS unit in millimeters. */ public float getPixelUnitToMillimeter() { return ctx.getUserAgent().getPixelUnitToMillimeter(); } /** * Returns the size of a px CSS unit in millimeters. * This will be removed after next release. * @see #getPixelUnitToMillimeter() */ public float getPixelToMM() { return getPixelUnitToMillimeter(); } public Rectangle2D getBBox() { return null; } public AffineTransform getScreenTransform() { return ctx.getUserAgent().getTransform(); } public void setScreenTransform(AffineTransform at) { ctx.getUserAgent().setTransform(at); } public AffineTransform getCTM() { return null; } public AffineTransform getGlobalTransform() { return null; } public float getViewportWidth() { return ctx.getBlockWidth(element); } public float getViewportHeight() { return ctx.getBlockHeight(element); } public float getFontSize() { return 0; } public float svgToUserSpace(float v, int type, int pcInterp) { return 0; } /** * Adds a listener for changes to the given attribute value. */ public void addTargetListener(String pn, AnimationTargetListener l) { } /** * Removes a listener for changes to the given attribute value. */ public void removeTargetListener(String pn, AnimationTargetListener l) { } // SVGAnimationContext /////////////////////////////////////////////////// /** * DOM: Implements {@link * org.w3c.dom.svg.SVGAnimationElement#getTargetElement()}. */ public SVGElement getTargetElement() { return targetElement; } /** * DOM: Implements {@link * org.w3c.dom.svg.SVGAnimationElement#getStartTime()}. */ public float getStartTime() { return timedElement.getCurrentBeginTime(); } /** * DOM: Implements {@link * org.w3c.dom.svg.SVGAnimationElement#getCurrentTime()}. */ public float getCurrentTime() { return timedElement.getLastSampleTime(); } /** * DOM: Implements {@link * org.w3c.dom.svg.SVGAnimationElement#getSimpleDuration()}. With the * difference that an indefinite simple duration is returned as * {@link TimedElement#INDEFINITE}, rather than throwing an exception. */ public float getSimpleDuration() { return timedElement.getSimpleDur(); } /** * Returns the time that the document would seek to if this animation * element were hyperlinked to, or NaN if there is no * such begin time. */ public float getHyperlinkBeginTime() { return timedElement.getHyperlinkBeginTime(); } // ElementTimeControl //////////////////////////////////////////////////// /** * DOM: Implements {@link * org.w3c.dom.smil.ElementTimeControl#beginElement()}. */ public boolean beginElement() throws DOMException { timedElement.beginElement(); return timedElement.canBegin(); } /** * DOM: Implements {@link * org.w3c.dom.smil.ElementTimeControl#beginElementAt(float)}. */ public boolean beginElementAt(float offset) throws DOMException { timedElement.beginElement(offset); // XXX Not right, but who knows if it is possible to begin // at some arbitrary point in the future. return true; } /** * DOM: Implements {@link * org.w3c.dom.smil.ElementTimeControl#endElement()}. */ public boolean endElement() throws DOMException { timedElement.endElement(); return timedElement.canEnd(); } /** * DOM: Implements {@link * org.w3c.dom.smil.ElementTimeControl#endElementAt(float)}. */ public boolean endElementAt(float offset) throws DOMException { timedElement.endElement(offset); // XXX Not right, but who knows if it is possible to begin // at some arbitrary point in the future. return true; } /** * Returns whether this is a constant animation (i.e., a 'set' animation). */ protected boolean isConstantAnimation() { return false; } /** * A TimedElement class for SVG animation elements. */ protected class SVGTimedElement extends TimedElement { /** * Returns the DOM element this timed element is for. */ public Element getElement() { return element; } /** * Fires a TimeEvent of the given type on this element. * @param eventType the type of TimeEvent ("beginEvent", "endEvent" * or "repeatEvent"). * @param time the timestamp of the event object */ protected void fireTimeEvent(String eventType, Calendar time, int detail) { AnimationSupport.fireTimeEvent(element, eventType, time, detail); } /** * Invoked to indicate this timed element became active at the * specified time. * @param begin the time the element became active, in document * simple time */ protected void toActive(float begin) { eng.toActive(animation, begin); } /** * Invoked to indicate that this timed element became inactive. * @param stillActive if true, indicates that the element is still * actually active, but between the end of the * computed repeat duration and the end of the * interval * @param isFrozen whether the element is frozen or not */ protected void toInactive(boolean stillActive, boolean isFrozen) { eng.toInactive(animation, isFrozen); } /** * Invoked to indicate that this timed element has had its fill removed. */ protected void removeFill() { eng.removeFill(animation); } /** * Invoked to indicate that this timed element has been sampled at the * given time. * @param simpleTime the sample time in local simple time * @param simpleDur the simple duration of the element * @param repeatIteration the repeat iteration during which the element * was sampled */ protected void sampledAt(float simpleTime, float simpleDur, int repeatIteration) { eng.sampledAt(animation, simpleTime, simpleDur, repeatIteration); } /** * Invoked to indicate that this timed element has been sampled * at the end of its active time, at an integer multiple of the * simple duration. This is the "last" value that will be used * for filling, which cannot be sampled normally. */ protected void sampledLastValue(int repeatIteration) { eng.sampledLastValue(animation, repeatIteration); } /** * Returns the timed element with the given ID. */ protected TimedElement getTimedElementById(String id) { return AnimationSupport.getTimedElementById(id, element); } /** * Returns the event target with the given ID. */ protected EventTarget getEventTargetById(String id) { return AnimationSupport.getEventTargetById(id, element); } /** * Returns the event target that should be listened to for * access key events. */ protected EventTarget getRootEventTarget() { return (EventTarget) element.getOwnerDocument(); } /** * Returns the target of this animation as an {@link EventTarget}. Used * for eventbase timing specifiers where the element ID is omitted. */ protected EventTarget getAnimationEventTarget() { return targetElement; } /** * Returns whether this timed element comes before the given timed * element in document order. */ public boolean isBefore(TimedElement other) { Element e = ((SVGTimedElement) other).getElement(); int pos = ((AbstractNode) element).compareDocumentPosition(e); return (pos & AbstractNode.DOCUMENT_POSITION_PRECEDING) != 0; } /** * Returns a string representation of this animation. */ public String toString() { if (element != null) { String id = element.getAttributeNS(null, "id"); if (id.length() != 0) { return id; } } return super.toString(); } /** * Returns whether this timed element is for a constant animation (i.e., * a 'set' animation. */ protected boolean isConstantAnimation() { return SVGAnimationElementBridge.this.isConstantAnimation(); } } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/ConcreteTextPainter.java0000644000175000017500000000431313063003351031044 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.Graphics2D; import java.awt.font.TextLayout; import java.awt.geom.Point2D; import java.text.AttributedCharacterIterator; /** * Renders the attributed character iterator of a TextNode. * * @author Vincent Hardy * @version $Id: ConcreteTextPainter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class ConcreteTextPainter extends BasicTextPainter { /** * Paints the specified attributed character iterator using the * specified Graphics2D and context and font context. * @param aci the AttributedCharacterIterator containing the text * @param location the location to paint the text * @param anchor the text anchor position * @param g2d the Graphics2D to use */ public void paint(AttributedCharacterIterator aci, Point2D location, TextNode.Anchor anchor, Graphics2D g2d) { // Compute aci size to be able to draw it TextLayout layout = new TextLayout(aci, fontRenderContext); float advance = layout.getAdvance(); float tx = 0; switch(anchor.getType()){ case TextNode.Anchor.ANCHOR_MIDDLE: tx = -advance/2; break; case TextNode.Anchor.ANCHOR_END: tx = -advance; } layout.draw(g2d, (float)(location.getX() + tx), (float)(location.getY())); } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/DocumentJarClassLoader.java0000644000175000017500000000705313063003352031447 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.net.URL; import java.net.URLClassLoader; import java.security.CodeSource; import java.security.cert.Certificate; import java.security.Permission; import java.security.PermissionCollection; import java.security.Policy; import java.util.Enumeration; /** * This ClassLoader implementation only grants permission to * connect back to the server from where the document referencing the * jar file was loaded. * * A URLClassLoader extension is needed in case the user * allows linked jar files to come from a different origin than * the document referencing them. * * @author Vincent Hardy * @version $Id: DocumentJarClassLoader.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class DocumentJarClassLoader extends URLClassLoader { /** * CodeSource for the Document which referenced the Jar file * @see #getPermissions */ protected CodeSource documentCodeSource = null; /** * Constructor */ public DocumentJarClassLoader(URL jarURL, URL documentURL){ super(new URL[]{jarURL}); if (documentURL != null) { documentCodeSource = new CodeSource (documentURL, (Certificate[])null); } } /** * Returns the permissions for the given codesource object. * The implementation of this method first gets the permissions * granted by the policy, and then adds additional permissions * based on the URL of the codesource. *

* Then, if the documentURL passed at construction time is * not null, the permissions granted to that URL are added. * * As a result, the jar file code will only be able to * connect to the server which served the document. * * @param codesource the codesource * @return the permissions granted to the codesource */ protected PermissionCollection getPermissions(CodeSource codesource) { // First, get the permissions which may be granted // through the policy file(s) Policy p = Policy.getPolicy(); PermissionCollection pc = null; if (p != null) { pc = p.getPermissions(codesource); } // Now, add permissions if the documentCodeSource is not null if (documentCodeSource != null){ PermissionCollection urlPC = super.getPermissions(documentCodeSource); if (pc != null) { Enumeration items = urlPC.elements(); while (items.hasMoreElements()) { pc.add((Permission)(items.nextElement())); } } else { pc = urlPC; } } return pc; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/EmbededExternalResourceSecurity.javabatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/EmbededExternalResourceSecurity.ja0000644000175000017500000000536313063003346033065 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.util.ParsedURL; /** * This implementation of the ExternalResourceSecurity interface only * allows external resources embeded in the document, i.e., externalResources * embeded with the data protocol. * * @author Vincent Hardy * @version $Id: EmbededExternalResourceSecurity.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class EmbededExternalResourceSecurity implements ExternalResourceSecurity { public static final String DATA_PROTOCOL = "data"; /** * Message when trying to load a external resource that is not embeded * in the document. */ public static final String ERROR_EXTERNAL_RESOURCE_NOT_EMBEDED = "EmbededExternalResourceSecurity.error.external.resource.not.embeded"; /** * The exception is built in the constructor and thrown if * not null and the checkLoadExternalResource method is called. */ protected SecurityException se; /** * Controls whether the externalResource should be loaded or not. * * @throws SecurityException if the externalResource should not be loaded. */ public void checkLoadExternalResource(){ if (se != null) { throw se; } } /** * @param externalResourceURL url for the externalResource, as defined in * the externalResource's xlink:href attribute. If that * attribute was empty, then this parameter should * be null */ public EmbededExternalResourceSecurity(ParsedURL externalResourceURL){ if ( externalResourceURL == null || !DATA_PROTOCOL.equals(externalResourceURL.getProtocol()) ) { se = new SecurityException (Messages.formatMessage(ERROR_EXTERNAL_RESOURCE_NOT_EMBEDED, new Object[]{externalResourceURL})); } } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/EventTargetWrapper.java0000644000175000017500000004452713063003353030720 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.lang.ref.SoftReference; import java.util.Map; import java.util.WeakHashMap; import org.apache.batik.dom.AbstractNode; import org.apache.batik.script.ScriptEventWrapper; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextAction; import org.mozilla.javascript.Function; import org.mozilla.javascript.NativeJavaObject; import org.mozilla.javascript.NativeObject; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.Undefined; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; /** * A class that wraps an EventTarget instance to expose * it in the Rhino engine. Then calling addEventListener * with a Rhino function as parameter should redirect the call to * addEventListener with a Java function object calling * the Rhino function. * This class also allows to pass an ECMAScript (Rhino) object as * a parameter instead of a function provided the fact that this object * has a handleEvent method. * @author Christophe Jolif * @version $Id: EventTargetWrapper.java 1733416 2016-03-03 07:07:13Z gadams $ */ class EventTargetWrapper extends NativeJavaObject { /** * The Java function object calling the Rhino function. */ static class FunctionEventListener implements EventListener { protected Function function; protected RhinoInterpreter interpreter; FunctionEventListener(Function f, RhinoInterpreter i) { function = f; interpreter = i; } public void handleEvent(Event evt) { Object event; if (evt instanceof ScriptEventWrapper) { event = ((ScriptEventWrapper) evt).getEventObject(); } else { event = evt; } interpreter.callHandler(function, event); } } static class HandleEventListener implements EventListener { public static final String HANDLE_EVENT = "handleEvent"; public Scriptable scriptable; public Object[] array = new Object[1]; public RhinoInterpreter interpreter; HandleEventListener(Scriptable s, RhinoInterpreter interpreter) { scriptable = s; this.interpreter = interpreter; } public void handleEvent(Event evt) { if (evt instanceof ScriptEventWrapper) { array[0] = ((ScriptEventWrapper) evt).getEventObject(); } else { array[0] = evt; } ContextAction handleEventAction = new ContextAction() { public Object run(Context cx) { ScriptableObject.callMethod (scriptable, HANDLE_EVENT, array); return null; } }; interpreter.call(handleEventAction); } } abstract static class FunctionProxy implements Function { protected Function delegate; public FunctionProxy(Function delegate) { this.delegate = delegate; } public Scriptable construct(Context cx, Scriptable scope, Object[] args) { return this.delegate.construct(cx, scope, args); } public String getClassName() { return this.delegate.getClassName(); } public Object get(String name, Scriptable start) { return this.delegate.get(name, start); } public Object get(int index, Scriptable start) { return this.delegate.get(index, start); } public boolean has(String name, Scriptable start) { return this.delegate.has(name, start); } public boolean has(int index, Scriptable start) { return this.delegate.has(index, start); } public void put(String name, Scriptable start, Object value) { this.delegate.put(name, start, value); } public void put(int index, Scriptable start, Object value) { this.delegate.put(index, start, value); } public void delete(String name) { this.delegate.delete(name); } public void delete(int index) { this.delegate.delete(index); } public Scriptable getPrototype() { return this.delegate.getPrototype(); } public void setPrototype(Scriptable prototype) { this.delegate.setPrototype(prototype); } public Scriptable getParentScope() { return this.delegate.getParentScope(); } public void setParentScope(Scriptable parent) { this.delegate.setParentScope(parent); } public Object[] getIds() { return this.delegate.getIds(); } public Object getDefaultValue(Class hint) { return this.delegate.getDefaultValue(hint); } public boolean hasInstance(Scriptable instance) { return this.delegate.hasInstance(instance); } } /** * This function proxy is delegating most of the job * to the underlying NativeJavaMethod object through * the FunctionProxy. However to allow user to specify * "Function" or objects with an "handleEvent" method * as parameter of "addEventListener" * it redefines the call method to deal with these * cases. */ static class FunctionAddProxy extends FunctionProxy { protected Map listenerMap; protected RhinoInterpreter interpreter; FunctionAddProxy(RhinoInterpreter interpreter, Function delegate, Map listenerMap) { super(delegate); this.listenerMap = listenerMap; this.interpreter = interpreter; } public Object call(Context ctx, Scriptable scope, Scriptable thisObj, Object[] args) { NativeJavaObject njo = (NativeJavaObject)thisObj; if (args[1] instanceof Function) { EventListener evtListener = null; SoftReference sr = (SoftReference)listenerMap.get(args[1]); if (sr != null) evtListener = (EventListener)sr.get(); if (evtListener == null) { evtListener = new FunctionEventListener ((Function)args[1], interpreter); listenerMap.put(args[1], new SoftReference(evtListener)); } // we need to marshall args Class[] paramTypes = { String.class, Function.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); ((EventTarget)njo.unwrap()).addEventListener ((String)args[0], evtListener, ((Boolean)args[2]).booleanValue()); return Undefined.instance; } if (args[1] instanceof NativeObject) { EventListener evtListener = null; SoftReference sr = (SoftReference)listenerMap.get(args[1]); if (sr != null) evtListener = (EventListener)sr.get(); if (evtListener == null) { evtListener = new HandleEventListener((Scriptable)args[1], interpreter); listenerMap.put(args[1], new SoftReference(evtListener)); } // we need to marshall args Class[] paramTypes = { String.class, Scriptable.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); ((EventTarget)njo.unwrap()).addEventListener ((String)args[0], evtListener, ((Boolean)args[2]).booleanValue()); return Undefined.instance; } return delegate.call(ctx, scope, thisObj, args); } } static class FunctionRemoveProxy extends FunctionProxy { public Map listenerMap; FunctionRemoveProxy(Function delegate, Map listenerMap) { super(delegate); this.listenerMap = listenerMap; } public Object call(Context ctx, Scriptable scope, Scriptable thisObj, Object[] args) { NativeJavaObject njo = (NativeJavaObject)thisObj; if (args[1] instanceof Function) { SoftReference sr = (SoftReference)listenerMap.get(args[1]); if (sr == null) return Undefined.instance; EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args Class[] paramTypes = { String.class, Function.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); ((EventTarget)njo.unwrap()).removeEventListener ((String)args[0], el, ((Boolean)args[2]).booleanValue()); return Undefined.instance; } if (args[1] instanceof NativeObject) { SoftReference sr = (SoftReference)listenerMap.get(args[1]); if (sr == null) return Undefined.instance; EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args Class[] paramTypes = { String.class, Scriptable.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); ((EventTarget)njo.unwrap()).removeEventListener ((String)args[0], el, ((Boolean)args[2]).booleanValue()); return Undefined.instance; } return delegate.call(ctx, scope, thisObj, args); } } static class FunctionAddNSProxy extends FunctionProxy { protected Map listenerMap; protected RhinoInterpreter interpreter; FunctionAddNSProxy(RhinoInterpreter interpreter, Function delegate, Map listenerMap) { super(delegate); this.listenerMap = listenerMap; this.interpreter = interpreter; } public Object call(Context ctx, Scriptable scope, Scriptable thisObj, Object[] args) { NativeJavaObject njo = (NativeJavaObject)thisObj; if (args[2] instanceof Function) { EventListener evtListener = new FunctionEventListener ((Function)args[2], interpreter); listenerMap.put(args[2], new SoftReference(evtListener)); // we need to marshall args Class[] paramTypes = { String.class, String.class, Function.class, Boolean.TYPE, Object.class }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); AbstractNode target = (AbstractNode) njo.unwrap(); target.addEventListenerNS ((String)args[0], (String)args[1], evtListener, ((Boolean)args[3]).booleanValue(), args[4]); return Undefined.instance; } if (args[2] instanceof NativeObject) { EventListener evtListener = new HandleEventListener((Scriptable)args[2], interpreter); listenerMap.put(args[2], new SoftReference(evtListener)); // we need to marshall args Class[] paramTypes = { String.class, String.class, Scriptable.class, Boolean.TYPE, Object.class }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); AbstractNode target = (AbstractNode) njo.unwrap(); target.addEventListenerNS ((String)args[0], (String)args[1], evtListener, ((Boolean)args[3]).booleanValue(), args[4]); return Undefined.instance; } return delegate.call(ctx, scope, thisObj, args); } } static class FunctionRemoveNSProxy extends FunctionProxy { protected Map listenerMap; FunctionRemoveNSProxy(Function delegate, Map listenerMap) { super(delegate); this.listenerMap = listenerMap; } public Object call(Context ctx, Scriptable scope, Scriptable thisObj, Object[] args) { NativeJavaObject njo = (NativeJavaObject)thisObj; if (args[2] instanceof Function) { SoftReference sr = (SoftReference)listenerMap.get(args[2]); if (sr == null) return Undefined.instance; EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args Class[] paramTypes = { String.class, String.class, Function.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); AbstractNode target = (AbstractNode) njo.unwrap(); target.removeEventListenerNS ((String)args[0], (String)args[1], el, ((Boolean)args[3]).booleanValue()); return Undefined.instance; } if (args[2] instanceof NativeObject) { SoftReference sr = (SoftReference)listenerMap.get(args[2]); if (sr == null) return Undefined.instance; EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args Class[] paramTypes = { String.class, String.class, Scriptable.class, Boolean.TYPE }; for (int i = 0; i < args.length; i++) args[i] = Context.jsToJava(args[i], paramTypes[i]); AbstractNode target = (AbstractNode) njo.unwrap(); target.removeEventListenerNS ((String)args[0], (String)args[1], el, ((Boolean)args[3]).booleanValue()); return Undefined.instance; } return delegate.call(ctx, scope, thisObj, args); } } // the keys are the underlying Java object, in order // to remove potential memory leaks use a WeakHashMap to allow // to collect entries as soon as the underlying Java object is // not available anymore. protected static WeakHashMap mapOfListenerMap; public static final String ADD_NAME = "addEventListener"; public static final String ADDNS_NAME = "addEventListenerNS"; public static final String REMOVE_NAME = "removeEventListener"; public static final String REMOVENS_NAME = "removeEventListenerNS"; protected RhinoInterpreter interpreter; EventTargetWrapper(Scriptable scope, EventTarget object, RhinoInterpreter interpreter) { super(scope, object, null); this.interpreter = interpreter; } /** * Overriden Rhino method. */ public Object get(String name, Scriptable start) { Object method = super.get(name, start); if (name.equals(ADD_NAME)) { // prevent creating a Map for all JavaScript objects // when we need it only from time to time... method = new FunctionAddProxy(interpreter, (Function)method, initMap()); } else if (name.equals(REMOVE_NAME)) { // prevent creating a Map for all JavaScript objects // when we need it only from time to time... method = new FunctionRemoveProxy ((Function)method, initMap()); } else if (name.equals(ADDNS_NAME)) { method = new FunctionAddNSProxy(interpreter, (Function) method, initMap()); } else if (name.equals(REMOVENS_NAME)) { method = new FunctionRemoveNSProxy((Function) method, initMap()); } return method; } // we have to store the listenerMap in a Map because // several EventTargetWrapper may be created for the exact // same underlying Java object. public Map initMap() { Map map = null; if (mapOfListenerMap == null) mapOfListenerMap = new WeakHashMap(10); if ((map = (Map)mapOfListenerMap.get(unwrap())) == null) { mapOfListenerMap.put(unwrap(), map = new WeakHashMap(2)); } return map; } } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootbatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGFeDisplacementMapElementBridge.javabatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGFeDisplacementMapElementBridge.0000644000175000017500000001564313063003351032610 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.batik.ext.awt.image.ARGBChannel; import org.apache.batik.ext.awt.image.PadMode; import org.apache.batik.ext.awt.image.renderable.DisplacementMapRable8Bit; import org.apache.batik.ext.awt.image.renderable.Filter; import org.apache.batik.ext.awt.image.renderable.PadRable; import org.apache.batik.ext.awt.image.renderable.PadRable8Bit; import org.apache.batik.gvt.GraphicsNode; import org.w3c.dom.Element; /** * Bridge class for the <feDisplacementMap> element. * * @author Thierry Kormann * @version $Id: SVGFeDisplacementMapElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGFeDisplacementMapElementBridge extends AbstractSVGFilterPrimitiveElementBridge { /** * Constructs a new bridge for the <feDisplacementMap> element. */ public SVGFeDisplacementMapElementBridge() {} /** * Returns 'feDisplacementMap'. */ public String getLocalName() { return SVG_FE_DISPLACEMENT_MAP_TAG; } /** * Creates a Filter primitive according to the specified * parameters. * * @param ctx the bridge context to use * @param filterElement the element that defines a filter * @param filteredElement the element that references the filter * @param filteredNode the graphics node to filter * * @param inputFilter the Filter that represents the current * filter input if the filter chain. * @param filterRegion the filter area defined for the filter chain * the new node will be part of. * @param filterMap a map where the mediator can map a name to the * Filter it creates. Other FilterBridges * can then access a filter node from the filterMap if they * know its name. */ public Filter createFilter(BridgeContext ctx, Element filterElement, Element filteredElement, GraphicsNode filteredNode, Filter inputFilter, Rectangle2D filterRegion, Map filterMap) { // 'scale' attribute - default is 0 float scale = convertNumber(filterElement, SVG_SCALE_ATTRIBUTE, 0, ctx); // 'xChannelSelector' attribute - default is 'A' ARGBChannel xChannelSelector = convertChannelSelector (filterElement, SVG_X_CHANNEL_SELECTOR_ATTRIBUTE, ARGBChannel.A, ctx); // 'yChannelSelector' attribute - default is 'A' ARGBChannel yChannelSelector = convertChannelSelector (filterElement, SVG_Y_CHANNEL_SELECTOR_ATTRIBUTE, ARGBChannel.A, ctx); // 'in' attribute Filter in = getIn(filterElement, filteredElement, filteredNode, inputFilter, filterMap, ctx); if (in == null) { return null; // disable the filter } // 'in2' attribute - required Filter in2 = getIn2(filterElement, filteredElement, filteredNode, inputFilter, filterMap, ctx); if (in2 == null) { return null; // disable the filter } Rectangle2D defaultRegion; defaultRegion = (Rectangle2D)in.getBounds2D().clone(); defaultRegion.add(in2.getBounds2D()); // get filter primitive chain region Rectangle2D primitiveRegion = SVGUtilities.convertFilterPrimitiveRegion(filterElement, filteredElement, filteredNode, defaultRegion, filterRegion, ctx); PadRable pad = new PadRable8Bit(in, primitiveRegion, PadMode.ZERO_PAD); // build the displacement map filter List srcs = new ArrayList(2); srcs.add(pad); srcs.add(in2); Filter displacementMap = new DisplacementMapRable8Bit (srcs, scale, xChannelSelector, yChannelSelector); // handle the 'color-interpolation-filters' property handleColorInterpolationFilters(displacementMap, filterElement); PadRable filter = new PadRable8Bit (displacementMap, primitiveRegion, PadMode.ZERO_PAD); // update the filter Map updateFilterMap(filterElement, filter, filterMap); return filter; } /** * Returns the channel for the specified feDisplacementMap filter * primitive attribute, considering the specified attribute name. * * @param filterElement the feDisplacementMap filter primitive element * @param attrName the name of the channel attribute * @param ctx the BridgeContext to use for error information */ protected static ARGBChannel convertChannelSelector(Element filterElement, String attrName, ARGBChannel defaultChannel, BridgeContext ctx) { String s = filterElement.getAttributeNS(null, attrName); if (s.length() == 0) { return defaultChannel; } if (SVG_A_VALUE.equals(s)) { return ARGBChannel.A; } if (SVG_R_VALUE.equals(s)) { return ARGBChannel.R; } if (SVG_G_VALUE.equals(s)) { return ARGBChannel.G; } if (SVG_B_VALUE.equals(s)) { return ARGBChannel.B; } throw new BridgeException (ctx, filterElement, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attrName, s}); } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGFontFamily.java0000644000175000017500000001212413063003353027543 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.lang.ref.SoftReference; import java.text.AttributedCharacterIterator; import java.util.Map; import org.apache.batik.gvt.font.GVTFont; import org.apache.batik.gvt.font.GVTFontFace; import org.apache.batik.gvt.font.GVTFontFamily; import org.apache.batik.gvt.text.GVTAttributedCharacterIterator; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * A font family class for SVG fonts. * * @author Bella Robinson * @version $Id: SVGFontFamily.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGFontFamily implements GVTFontFamily { public static final AttributedCharacterIterator.Attribute TEXT_COMPOUND_ID = GVTAttributedCharacterIterator.TextAttribute.TEXT_COMPOUND_ID; protected GVTFontFace fontFace; protected Element fontElement; protected BridgeContext ctx; protected Boolean complex = null; /** * Constructs an SVGFontFamily. * * @param fontFace The font face object that describes this font family. * @param fontElement The element that contains the font data for this family. * @param ctx The bridge context. This is required for lazily loading the * font data at render time. */ public SVGFontFamily(GVTFontFace fontFace, Element fontElement, BridgeContext ctx) { this.fontFace = fontFace; this.fontElement = fontElement; this.ctx = ctx; } /** * Returns the family name of this font. * * @return The font family name. */ public String getFamilyName() { return fontFace.getFamilyName(); } /** * Returns the font-face associated with this font family. * * @return The font face. */ public GVTFontFace getFontFace() { return fontFace; } /** * Derives a GVTFont object of the correct size. * * @param size The required size of the derived font. * @param aci The character iterator containing the text to be rendered * using the derived font. * * @return The derived font. */ public GVTFont deriveFont(float size, AttributedCharacterIterator aci) { return deriveFont(size, aci.getAttributes()); } /** * Derives a GVTFont object of the correct size from an attribute Map. * @param size The required size of the derived font. * @param attrs The Attribute Map to get Values from. */ public GVTFont deriveFont(float size, Map attrs) { SVGFontElementBridge fontBridge; fontBridge = (SVGFontElementBridge)ctx.getBridge(fontElement); SoftReference sr = (SoftReference)attrs.get(TEXT_COMPOUND_ID); Element textElement = (Element)sr.get(); return fontBridge.createFont(ctx, fontElement, textElement, size, fontFace); } /** * This method looks at the SVG font and checks if any of * the glyphs use renderable child elements. If so this * is a complex font in that full CSS inheritance needs to * be applied. Otherwise if it only uses the 'd' attribute * it does not need CSS treatment. */ public boolean isComplex() { if (complex != null) return complex.booleanValue(); boolean ret = isComplex(fontElement, ctx); complex = ret ? Boolean.TRUE : Boolean.FALSE; return ret; } public static boolean isComplex(Element fontElement, BridgeContext ctx) { NodeList glyphElements = fontElement.getElementsByTagNameNS (SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_GLYPH_TAG); int numGlyphs = glyphElements.getLength(); for (int i = 0; i < numGlyphs; i++) { Element glyph = (Element)glyphElements.item(i); Node child = glyph.getFirstChild(); for (;child != null; child = child.getNextSibling()) { if (child.getNodeType() != Node.ELEMENT_NODE) continue; Element e = (Element)child; Bridge b = ctx.getBridge(e); if ((b != null) && (b instanceof GraphicsNodeBridge)) { return true; } } } return false; } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/RhinoInterpreter.java0000644000175000017500000005045713063003353030431 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.Writer; import java.net.URL; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.script.Interpreter; import org.apache.batik.script.InterpreterException; import org.apache.batik.script.ImportInfo; import org.apache.batik.script.rhino.BatikSecurityController; import org.apache.batik.script.rhino.RhinoClassLoader; import org.apache.batik.script.rhino.RhinoClassShutter; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextAction; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.ClassCache; import org.mozilla.javascript.ClassShutter; import org.mozilla.javascript.Function; import org.mozilla.javascript.JavaScriptException; import org.mozilla.javascript.Script; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.SecurityController; import org.mozilla.javascript.WrapFactory; import org.mozilla.javascript.WrappedException; import org.w3c.dom.events.EventTarget; /** * A simple implementation of Interpreter interface to use * Rhino ECMAScript interpreter. * @author Christophe Jolif * @version $Id: RhinoInterpreter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class RhinoInterpreter implements Interpreter { /** * The number of cached compiled scripts to store. */ private static final int MAX_CACHED_SCRIPTS = 32; /** * Constant used to describe an SVG source */ public static final String SOURCE_NAME_SVG = ""; /** * Name of the "window" object when referenced by scripts */ public static final String BIND_NAME_WINDOW = "window"; /** * Context vector, to make sure we are not * setting the security context too many times */ protected static List contexts = new LinkedList(); /** * The window object. */ protected Window window; /** * The global object. */ protected ScriptableObject globalObject = null; /** * List of cached compiled scripts. */ protected LinkedList compiledScripts = new LinkedList(); /** * Factory for Java wrapper objects. */ protected WrapFactory wrapFactory = new BatikWrapFactory(this); /** * Class shutter. */ protected ClassShutter classShutter = new RhinoClassShutter(); /** * The Rhino 'security domain'. We use the RhinoClassLoader * which will grant permissions to connect to the document * URL. */ protected RhinoClassLoader rhinoClassLoader; /** * The SecurityController implementation for Batik, * which ensures scripts have access to the * server they were downloaded from */ protected SecurityController securityController = new BatikSecurityController(); /** * Factory object for creating Contexts. */ protected ContextFactory contextFactory = new Factory(); /** * Default Context for scripts. This is used only for efficiency * reasons. */ protected Context defaultContext; /** * Build a Interpreter for ECMAScript using Rhino. * * @param documentURL the URL for the document which references * * @see org.apache.batik.script.Interpreter * @see org.apache.batik.script.InterpreterPool */ public RhinoInterpreter(URL documentURL) { init(documentURL, null); } /** * Build a Interpreter for ECMAScript using Rhino. * * @param documentURL the URL for the document which references * @param imports the set of Java classes/packages to import * into the scripting enviornment. * * @see org.apache.batik.script.Interpreter * @see org.apache.batik.script.InterpreterPool */ public RhinoInterpreter(URL documentURL, ImportInfo imports) { init(documentURL, imports); } protected void init(URL documentURL, final ImportInfo imports) { try { rhinoClassLoader = new RhinoClassLoader (documentURL, getClass().getClassLoader()); } catch (SecurityException se) { rhinoClassLoader = null; } ContextAction initAction = new ContextAction() { public Object run(Context cx) { Scriptable scriptable = cx.initStandardObjects(null, false); defineGlobalWrapperClass(scriptable); globalObject = createGlobalObject(cx); ClassCache cache = ClassCache.get(globalObject); cache.setCachingEnabled(rhinoClassLoader != null); ImportInfo ii = imports; if (ii == null) ii = ImportInfo.getImports(); // import Java lang package & DOM Level 3 & SVG DOM packages StringBuffer sb = new StringBuffer(); Iterator iter; iter = ii.getPackages(); while (iter.hasNext()) { String pkg = (String)iter.next(); sb.append("importPackage(Packages."); sb.append(pkg); sb.append(");"); } iter = ii.getClasses(); while (iter.hasNext()) { String cls = (String)iter.next(); sb.append("importClass(Packages."); sb.append(cls); sb.append(");"); } cx.evaluateString(globalObject, sb.toString(), null, 0, rhinoClassLoader); return null; } }; contextFactory.call(initAction); } /** * Returns the content types of the scripting languages this interpreter * handles. */ public String[] getMimeTypes() { return RhinoInterpreterFactory.RHINO_MIMETYPES; } /** * Returns the window object for this interpreter. */ public Window getWindow() { return window; } /** * Returns the ContextFactory for this interpreter. */ public ContextFactory getContextFactory() { return contextFactory; } /** * Defines the class for the global object. */ protected void defineGlobalWrapperClass(Scriptable global) { try { ScriptableObject.defineClass(global, WindowWrapper.class); } catch (Exception ex) { // cannot happen } } /** * Creates the global object. */ protected ScriptableObject createGlobalObject(Context ctx) { return new WindowWrapper(ctx); } /** * Returns the AccessControlContext associated with this Interpreter. * @see org.apache.batik.script.rhino.RhinoClassLoader */ public AccessControlContext getAccessControlContext() { if (rhinoClassLoader == null) return null; return rhinoClassLoader.getAccessControlContext(); } /** * This method returns the ECMAScript global object used by this * interpreter. */ protected ScriptableObject getGlobalObject() { return globalObject; } // org.apache.batik.script.Intepreter implementation /** * This method evaluates a piece of ECMAScript. * @param scriptreader a java.io.Reader on the piece of script * @return if no exception is thrown during the call, should return the * value of the last expression evaluated in the script. */ public Object evaluate(Reader scriptreader) throws IOException { return evaluate(scriptreader, SOURCE_NAME_SVG); } /** * This method evaluates a piece of ECMAScript. * @param scriptReader a java.io.Reader on the piece of script * @param description description which can be later used (e.g., for error * messages). * @return if no exception is thrown during the call, should return the * value of the last expression evaluated in the script. */ public Object evaluate(final Reader scriptReader, final String description) throws IOException { ContextAction evaluateAction = new ContextAction() { public Object run(Context cx) { try { return cx.evaluateReader(globalObject, scriptReader, description, 1, rhinoClassLoader); } catch (IOException ioe) { throw new WrappedException(ioe); } } }; try { return contextFactory.call(evaluateAction); } catch (JavaScriptException e) { // exception from JavaScript (possibly wrapping a Java Ex) Object value = e.getValue(); Exception ex = value instanceof Exception ? (Exception) value : e; throw new InterpreterException(ex, ex.getMessage(), -1, -1); } catch (WrappedException we) { Throwable w = we.getWrappedException(); if (w instanceof Exception) { throw new InterpreterException ((Exception) w, w.getMessage(), -1, -1); } else { throw new InterpreterException(w.getMessage(), -1, -1); } } catch (InterruptedBridgeException ibe) { throw ibe; } catch (RuntimeException re) { throw new InterpreterException(re, re.getMessage(), -1, -1); } } /** * This method evaluates a piece of ECMA script. * The first time a String is passed, it is compiled and evaluated. * At next call, the piece of script will only be evaluated to * prevent from recompiling it. * @param scriptStr the piece of script * @return if no exception is thrown during the call, should return the * value of the last expression evaluated in the script. */ public Object evaluate(final String scriptStr) { ContextAction evalAction = new ContextAction() { public Object run(final Context cx) { Script script = null; Entry entry = null; Iterator it = compiledScripts.iterator(); // between nlog(n) and log(n) because it is // an AbstractSequentialList while (it.hasNext()) { if ((entry = (Entry) it.next()).str.equals(scriptStr)) { // if it is not at the end, remove it because // it will change from place (it is faster // to remove it now) script = entry.script; it.remove(); break; } } if (script == null) { // this script has not been compiled yet or has been // forgotten since the compilation: // compile it and store it for future use. PrivilegedAction compile = new PrivilegedAction() { public Object run() { try { return cx.compileReader (new StringReader(scriptStr), SOURCE_NAME_SVG, 1, rhinoClassLoader); } catch (IOException ioEx ) { // Should never happen: using a string throw new Error( ioEx.getMessage() ); } } }; script = (Script)AccessController.doPrivileged(compile); if (compiledScripts.size() + 1 > MAX_CACHED_SCRIPTS) { // too many cached items - we should delete the // oldest entry. all of this is very fast on // linkedlist compiledScripts.removeFirst(); } // storing is done here: compiledScripts.addLast(new Entry(scriptStr, script)); } else { // this script has been compiled before, // just update its index so it won't get deleted soon. compiledScripts.addLast(entry); } return script.exec(cx, globalObject); } }; try { return contextFactory.call(evalAction); } catch (InterpreterException ie) { throw ie; } catch (JavaScriptException e) { // exception from JavaScript (possibly wrapping a Java Ex) Object value = e.getValue(); Exception ex = value instanceof Exception ? (Exception) value : e; throw new InterpreterException(ex, ex.getMessage(), -1, -1); } catch (WrappedException we) { Throwable w = we.getWrappedException(); if (w instanceof Exception) { throw new InterpreterException ((Exception) w, w.getMessage(), -1, -1); } else { throw new InterpreterException(w.getMessage(), -1, -1); } } catch (RuntimeException re) { throw new InterpreterException(re, re.getMessage(), -1, -1); } } /** * For RhinoInterpreter this method flushes the * Rhino caches to avoid memory leaks. */ public void dispose() { if (rhinoClassLoader != null) { ClassCache cache = ClassCache.get(globalObject); cache.setCachingEnabled(false); } } /** * This method registers a particular Java Object in * the environment of the interpreter. * @param name the name of the script object to create * @param object the Java object */ public void bindObject(final String name, final Object object) { contextFactory.call(new ContextAction() { public Object run(Context cx) { Object o = object; if (name.equals(BIND_NAME_WINDOW) && object instanceof Window) { ((WindowWrapper) globalObject).window = (Window) object; window = (Window) object; o = globalObject; } Scriptable jsObject; jsObject = Context.toObject(o, globalObject); globalObject.put(name, globalObject, jsObject); return null; } }); } /** * To be used by EventTargetWrapper. */ void callHandler(final Function handler, final Object arg) { contextFactory.call(new ContextAction() { public Object run(Context cx) { Object a = Context.toObject(arg, globalObject); Object[] args = { a }; handler.call(cx, globalObject, globalObject, args); return null; } }); } /** * To be used by WindowWrapper. */ void callMethod(final ScriptableObject obj, final String methodName, final ArgumentsBuilder ab) { contextFactory.call(new ContextAction() { public Object run(Context cx) { ScriptableObject.callMethod (obj, methodName, ab.buildArguments()); return null; } }); } /** * To be used by WindowWrapper. */ void callHandler(final Function handler, final Object[] args) { contextFactory.call(new ContextAction() { public Object run(Context cx) { handler.call(cx, globalObject, globalObject, args); return null; } }); } /** * To be used by WindowWrapper. */ void callHandler(final Function handler, final ArgumentsBuilder ab) { contextFactory.call(new ContextAction() { public Object run(Context cx) { Object[] args = ab.buildArguments(); handler.call(cx, handler.getParentScope(), globalObject, args); return null; } }); } /** * To be used by EventTargetWrapper. */ Object call(ContextAction action) { return contextFactory.call(action); } /** * To build an argument list. */ public interface ArgumentsBuilder { Object[] buildArguments(); } /** * Build the wrapper for objects implement EventTarget. */ Scriptable buildEventTargetWrapper(EventTarget obj) { return new EventTargetWrapper(globalObject, obj, this); } /** * By default Rhino has no output method in its language. That's why * this method does nothing. * @param out the new out Writer. */ public void setOut(Writer out) { // no implementation of a default output function in Rhino } // org.apache.batik.i18n.Localizable implementation /** * Returns the current locale or null if the locale currently used is * the default one. */ public Locale getLocale() { // TODO : in Rhino the locale is for a thread not a scope.. return null; } /** * Provides a way to the user to specify a locale which override the * default one. If null is passed to this method, the used locale * becomes the global one. * @param locale The locale to set. */ public void setLocale(Locale locale) { // TODO : in Rhino the local is for a thread not a scope.. } /** * Creates and returns a localized message, given the key of the message, 0, data.length * in the resource bundle and the message parameters. * The messages in the resource bundle must have the syntax described in * the java.text.MessageFormat class documentation. * @param key The key used to retreive the message from the resource * bundle. * @param args The objects that compose the message. * @exception MissingResourceException if the key is not in the bundle. */ public String formatMessage(String key, Object[] args) { return null; } /** * Class to store cached compiled scripts. */ protected static class Entry { /** * The script string. */ public String str; /** * The compiled script. */ public Script script; /** * Creates a new script cache entry object. */ public Entry(String str, Script script) { this.str = str; this.script = script; } } /** * Factory for Context objects. */ protected class Factory extends ContextFactory { /** * Creates a Context object for use with the interpreter. */ protected Context makeContext() { Context cx = super.makeContext(); cx.setWrapFactory(wrapFactory); cx.setSecurityController(securityController); cx.setClassShutter(classShutter); if (rhinoClassLoader == null) { cx.setOptimizationLevel(-1); } return cx; } } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/UpdateManager.java0000644000175000017500000007233013063003346027637 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.util.Collection; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.bridge.svg12.DefaultXBLManager; import org.apache.batik.bridge.svg12.SVG12BridgeContext; import org.apache.batik.bridge.svg12.SVG12ScriptingEnvironment; import org.apache.batik.dom.events.AbstractEvent; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.RootGraphicsNode; import org.apache.batik.gvt.UpdateTracker; import org.apache.batik.gvt.renderer.ImageRenderer; import org.apache.batik.util.EventDispatcher; import org.apache.batik.util.XMLConstants; import org.apache.batik.util.EventDispatcher.Dispatcher; import org.apache.batik.util.RunnableQueue; import org.w3c.dom.Document; import org.w3c.dom.events.DocumentEvent; import org.w3c.dom.events.EventTarget; /** * This class provides features to manage the update of an SVG document. * * @author Stephane Hillion * @version $Id: UpdateManager.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class UpdateManager { static final int MIN_REPAINT_TIME; static { int value = 20; try { String s = System.getProperty ("org.apache.batik.min_repaint_time", "20"); value = Integer.parseInt(s); } catch (SecurityException se) { } catch (NumberFormatException nfe){ } finally { MIN_REPAINT_TIME = value; } } /** * The bridge context. */ protected BridgeContext bridgeContext; /** * The document to manage. */ protected Document document; /** * The update RunnableQueue. */ protected RunnableQueue updateRunnableQueue; /** * The RunHandler for the RunnableQueue. */ protected RunnableQueue.RunHandler runHandler; /** * Whether the update manager is running. */ protected volatile boolean running; /** * Whether the suspend() method was called. */ protected volatile boolean suspendCalled; /** * The listeners. */ protected List listeners = Collections.synchronizedList(new LinkedList()); /** * The scripting environment. */ protected ScriptingEnvironment scriptingEnvironment; /** * The repaint manager. */ protected RepaintManager repaintManager; /** * The update tracker. */ protected UpdateTracker updateTracker; /** * The GraphicsNode whose updates are to be tracked. */ protected GraphicsNode graphicsNode; /** * Whether the manager was started. */ protected boolean started; /** * Array of resource documents' BridgeContexts. */ protected BridgeContext[] secondaryBridgeContexts; /** * Array of resource documents' ScriptingEnvironments that should * have their SVGLoad event dispatched. */ protected ScriptingEnvironment[] secondaryScriptingEnvironments; /** * The current minRepaintTime */ protected int minRepaintTime; /** * Creates a new update manager. * @param ctx The bridge context. * @param gn GraphicsNode whose updates are to be tracked. * @param doc The document to manage. */ public UpdateManager(BridgeContext ctx, GraphicsNode gn, Document doc) { bridgeContext = ctx; bridgeContext.setUpdateManager(this); document = doc; updateRunnableQueue = RunnableQueue.createRunnableQueue(); runHandler = createRunHandler(); updateRunnableQueue.setRunHandler(runHandler); graphicsNode = gn; scriptingEnvironment = initializeScriptingEnvironment(bridgeContext); // Any BridgeContexts for resource documents that exist // when initializing the scripting environment for the // primary document also need to have their scripting // environments initialized. secondaryBridgeContexts = (BridgeContext[]) ctx.getChildContexts().clone(); secondaryScriptingEnvironments = new ScriptingEnvironment[secondaryBridgeContexts.length]; for (int i = 0; i < secondaryBridgeContexts.length; i++) { BridgeContext resCtx = secondaryBridgeContexts[i]; if (!((SVGOMDocument) resCtx.getDocument()).isSVG12()) { continue; } resCtx.setUpdateManager(this); ScriptingEnvironment se = initializeScriptingEnvironment(resCtx); secondaryScriptingEnvironments[i] = se; } minRepaintTime = MIN_REPAINT_TIME; } public int getMinRepaintTime() { return minRepaintTime; } public void setMinRepaintTime(int minRepaintTime) { this.minRepaintTime = minRepaintTime; } /** * Creates an appropriate ScriptingEnvironment and XBL manager for * the given document. */ protected ScriptingEnvironment initializeScriptingEnvironment (BridgeContext ctx) { SVGOMDocument d = (SVGOMDocument) ctx.getDocument(); ScriptingEnvironment se; if (d.isSVG12()) { se = new SVG12ScriptingEnvironment(ctx); ctx.xblManager = new DefaultXBLManager(d, ctx); d.setXBLManager(ctx.xblManager); } else { se = new ScriptingEnvironment(ctx); } return se; } /** * Dispatches an 'SVGLoad' event to the document. */ public synchronized void dispatchSVGLoadEvent() throws InterruptedException { dispatchSVGLoadEvent(bridgeContext, scriptingEnvironment); for (int i = 0; i < secondaryScriptingEnvironments.length; i++) { BridgeContext ctx = secondaryBridgeContexts[i]; if (!((SVGOMDocument) ctx.getDocument()).isSVG12()) { continue; } ScriptingEnvironment se = secondaryScriptingEnvironments[i]; dispatchSVGLoadEvent(ctx, se); } secondaryBridgeContexts = null; secondaryScriptingEnvironments = null; } /** * Dispatches an 'SVGLoad' event to the document. */ protected void dispatchSVGLoadEvent(BridgeContext ctx, ScriptingEnvironment se) { se.loadScripts(); se.dispatchSVGLoadEvent(); if (ctx.isSVG12() && ctx.xblManager != null) { SVG12BridgeContext ctx12 = (SVG12BridgeContext) ctx; ctx12.addBindingListener(); ctx12.xblManager.startProcessing(); } } /** * Dispatches an "SVGZoom" event to the document. */ public void dispatchSVGZoomEvent() throws InterruptedException { scriptingEnvironment.dispatchSVGZoomEvent(); } /** * Dispatches an "SVGZoom" event to the document. */ public void dispatchSVGScrollEvent() throws InterruptedException { scriptingEnvironment.dispatchSVGScrollEvent(); } /** * Dispatches an "SVGZoom" event to the document. */ public void dispatchSVGResizeEvent() throws InterruptedException { scriptingEnvironment.dispatchSVGResizeEvent(); } /** * Finishes the UpdateManager initialization. */ public void manageUpdates(final ImageRenderer r) { updateRunnableQueue.preemptLater(new Runnable() { public void run() { synchronized (UpdateManager.this) { running = true; updateTracker = new UpdateTracker(); RootGraphicsNode root = graphicsNode.getRoot(); if (root != null){ root.addTreeGraphicsNodeChangeListener (updateTracker); } repaintManager = new RepaintManager(r); // Send the UpdateManagerStarted event. UpdateManagerEvent ev = new UpdateManagerEvent (UpdateManager.this, null, null); fireEvent(startedDispatcher, ev); started = true; } } }); resume(); } /** * Returns the bridge context. */ public BridgeContext getBridgeContext() { return bridgeContext; } /** * Returns the update RunnableQueue. */ public RunnableQueue getUpdateRunnableQueue() { return updateRunnableQueue; } /** * Returns the repaint manager. */ public RepaintManager getRepaintManager() { return repaintManager; } /** * Returns the GVT update tracker. */ public UpdateTracker getUpdateTracker() { return updateTracker; } /** * Returns the current Document. */ public Document getDocument() { return document; } /** * Returns the scripting environment. */ public ScriptingEnvironment getScriptingEnvironment() { return scriptingEnvironment; } /** * Tells whether the update manager is currently running. */ public synchronized boolean isRunning() { return running; } /** * Suspends the update manager. */ public synchronized void suspend() { // System.err.println("Suspend: " + suspendCalled + " : " + running); if (updateRunnableQueue.getQueueState() == RunnableQueue.RUNNING) { updateRunnableQueue.suspendExecution(false); } suspendCalled = true; } /** * Resumes the update manager. */ public synchronized void resume() { // System.err.println("Resume: " + suspendCalled + " : " + running); // if (suspendCalled) { // UpdateManagerEvent ev = new UpdateManagerEvent // (this, null, null); // // FIXX: Must happen in a different thread! // fireEvent(suspendedDispatcher, ev); // fireEvent(resumedDispatcher, ev); // } if (updateRunnableQueue.getQueueState() != RunnableQueue.RUNNING) { updateRunnableQueue.resumeExecution(); } } /** * Interrupts the manager tasks. */ public void interrupt() { Runnable r = new Runnable() { public void run() { synchronized (UpdateManager.this) { if (started) { dispatchSVGUnLoadEvent(); } else { running = false; scriptingEnvironment.interrupt(); updateRunnableQueue.getThread().halt(); } } } }; try { // Preempt to cancel the pending tasks updateRunnableQueue.preemptLater(r); updateRunnableQueue.resumeExecution(); // ensure runnable runs... } catch (IllegalStateException ise) { // Not running, which is probably ok since that's what we // wanted. Might be an issue if SVGUnload wasn't issued... } } /** * Dispatches an 'SVGUnLoad' event to the document. * This method interrupts the update manager threads. * NOTE: this method must be called outside the update thread. */ public void dispatchSVGUnLoadEvent() { if (!started) { throw new IllegalStateException("UpdateManager not started."); } // Invoke first to cancel the pending tasks updateRunnableQueue.preemptLater(new Runnable() { public void run() { synchronized (UpdateManager.this) { AbstractEvent evt = (AbstractEvent) ((DocumentEvent)document).createEvent("SVGEvents"); String type; if (bridgeContext.isSVG12()) { type = "unload"; } else { type = "SVGUnload"; } evt.initEventNS(XMLConstants.XML_EVENTS_NAMESPACE_URI, type, false, // canBubbleArg false); // cancelableArg ((EventTarget)(document.getDocumentElement())). dispatchEvent(evt); running = false; // Now shut everything down and disconnect // everything before we send the // UpdateMangerStopped event. scriptingEnvironment.interrupt(); updateRunnableQueue.getThread().halt(); bridgeContext.dispose(); // Send the UpdateManagerStopped event. UpdateManagerEvent ev = new UpdateManagerEvent (UpdateManager.this, null, null); fireEvent(stoppedDispatcher, ev); } } }); resume(); } /** * Updates the rendering buffer. Only to be called from the * update thread. * @param u2d The user to device transform. * @param dbr Whether the double buffering should be used. * @param aoi The area of interest in the renderer space units. * @param width The offscreen buffer width. * @param height The offscreen buffer height. */ public void updateRendering(AffineTransform u2d, boolean dbr, Shape aoi, int width, int height) { repaintManager.setupRenderer(u2d,dbr,aoi,width,height); List l = new ArrayList(1); l.add(aoi); updateRendering(l, false); } /** * Updates the rendering buffer. Only to be called from the * update thread. * @param u2d The user to device transform. * @param dbr Whether the double buffering should be used. * @param cpt If the canvas painting transform should be cleared * when the update complets * @param aoi The area of interest in the renderer space units. * @param width The offscreen buffer width. * @param height The offscreen buffer height. */ public void updateRendering(AffineTransform u2d, boolean dbr, boolean cpt, Shape aoi, int width, int height) { repaintManager.setupRenderer(u2d,dbr,aoi,width,height); List l = new ArrayList(1); l.add(aoi); updateRendering(l, cpt); } /** * Updates the rendering buffer. * @param areas List of areas of interest in rederer space units. * @param clearPaintingTransform Indicates if the painting transform * should be cleared as a result of this update. */ protected void updateRendering(List areas, boolean clearPaintingTransform) { try { UpdateManagerEvent ev = new UpdateManagerEvent (this, repaintManager.getOffScreen(), null); fireEvent(updateStartedDispatcher, ev); Collection c = repaintManager.updateRendering(areas); List l = new ArrayList(c); ev = new UpdateManagerEvent (this, repaintManager.getOffScreen(), l, clearPaintingTransform); fireEvent(updateCompletedDispatcher, ev); } catch (ThreadDeath td) { UpdateManagerEvent ev = new UpdateManagerEvent (this, null, null); fireEvent(updateFailedDispatcher, ev); throw td; } catch (Throwable t) { UpdateManagerEvent ev = new UpdateManagerEvent (this, null, null); fireEvent(updateFailedDispatcher, ev); } } /** * This tracks when the rendering first got 'out of date' * with respect to the document. */ long outOfDateTime=0; /** * Repaints the dirty areas, if needed. */ protected void repaint() { if (!updateTracker.hasChanged()) { // No changes, nothing to repaint. outOfDateTime = 0; return; } long ctime = System.currentTimeMillis(); if (ctime < allResumeTime) { createRepaintTimer(); return; } if (allResumeTime > 0) { // All suspendRedraw requests have expired. releaseAllRedrawSuspension(); } if (ctime-outOfDateTime < minRepaintTime) { // We very recently did a repaint check if other // repaint runnables are pending. synchronized (updateRunnableQueue.getIteratorLock()) { Iterator i = updateRunnableQueue.iterator(); while (i.hasNext()) if (!(i.next() instanceof NoRepaintRunnable)) // have a pending repaint runnable so we // will skip this repaint and we will let // the next one pick it up. return; } } List dirtyAreas = updateTracker.getDirtyAreas(); updateTracker.clear(); if (dirtyAreas != null) { updateRendering(dirtyAreas, false); } outOfDateTime = 0; } /** * Users of Batik should essentially never call * this directly from Java. If the Canvas is not * updating when you change the SVG Document it is almost * certainly because you are not making your changes * in the RunnableQueue (getUpdateRunnableQueue()). * You will have problems if you are not making all * changes to the document in the UpdateManager's * RunnableQueue. * * This method exists to implement the * 'SVGSVGElement.forceRedraw()' method. */ public void forceRepaint() { if (!updateTracker.hasChanged()) { // No changes, nothing to repaint. outOfDateTime = 0; return; } List dirtyAreas = updateTracker.getDirtyAreas(); updateTracker.clear(); if (dirtyAreas != null) { updateRendering(dirtyAreas, false); } outOfDateTime = 0; } protected class SuspensionInfo { /** * The index of this redraw suspension */ int index; /** * The system time in millisec that this suspension * will expire and redraws can resume (at least for * this suspension. */ long resumeMilli; public SuspensionInfo(int index, long resumeMilli) { this.index = index; this.resumeMilli = resumeMilli; } public int getIndex() { return index; } public long getResumeMilli() { return resumeMilli; } } protected class RepaintTimerTask extends TimerTask { UpdateManager um; RepaintTimerTask(UpdateManager um) { this.um = um; } public void run() { RunnableQueue rq = um.getUpdateRunnableQueue(); if (rq == null) return; rq.invokeLater(new Runnable() { public void run() { } }); } } List suspensionList = new ArrayList(); int nextSuspensionIndex = 1; long allResumeTime = -1; Timer repaintTriggerTimer = null; TimerTask repaintTimerTask = null; void createRepaintTimer() { if (repaintTimerTask != null) return; if (allResumeTime < 0) return; if (repaintTriggerTimer == null) repaintTriggerTimer = new Timer(true); long delay = allResumeTime - System.currentTimeMillis(); if (delay < 0) delay = 0; repaintTimerTask = new RepaintTimerTask(this); repaintTriggerTimer.schedule(repaintTimerTask, delay); // System.err.println("CTimer delay: " + delay); } /** * Sets up a timer that will trigger a repaint * when it fires. * If create is true it will construct a timer even * if one */ void resetRepaintTimer() { if (repaintTimerTask == null) return; if (allResumeTime < 0) return; if (repaintTriggerTimer == null) repaintTriggerTimer = new Timer(true); long delay = allResumeTime - System.currentTimeMillis(); if (delay < 0) delay = 0; repaintTimerTask = new RepaintTimerTask(this); repaintTriggerTimer.schedule(repaintTimerTask, delay); // System.err.println("Timer delay: " + delay); } int addRedrawSuspension(int max_wait_milliseconds) { long resumeTime = System.currentTimeMillis() + max_wait_milliseconds; SuspensionInfo si = new SuspensionInfo(nextSuspensionIndex++, resumeTime); if (resumeTime > allResumeTime) { allResumeTime = resumeTime; // System.err.println("Added AllRes Time: " + allResumeTime); resetRepaintTimer(); } suspensionList.add(si); return si.getIndex(); } void releaseAllRedrawSuspension() { suspensionList.clear(); allResumeTime = -1; resetRepaintTimer(); } boolean releaseRedrawSuspension(int index) { if (index > nextSuspensionIndex) return false; if (suspensionList.size() == 0) return true; int lo = 0, hi=suspensionList.size()-1; while (lo < hi) { int mid = (lo+hi)>>1; SuspensionInfo si = (SuspensionInfo)suspensionList.get(mid); int idx = si.getIndex(); if (idx == index) { lo = hi = mid; } else if (idx < index) { lo = mid+1; } else { hi = mid-1; } } SuspensionInfo si = (SuspensionInfo)suspensionList.get(lo); int idx = si.getIndex(); if (idx != index) return true; // currently not in list but was at some point... suspensionList.remove(lo); if (suspensionList.size() == 0) { // No more active suspensions allResumeTime = -1; resetRepaintTimer(); } else { // Check if we need to find a new 'bounding' suspension. long resumeTime = si.getResumeMilli(); if (resumeTime == allResumeTime) { allResumeTime = findNewAllResumeTime(); // System.err.println("New AllRes Time: " + allResumeTime); resetRepaintTimer(); } } return true; } long findNewAllResumeTime() { long ret = -1; Iterator i = suspensionList.iterator(); while (i.hasNext()) { SuspensionInfo si = (SuspensionInfo)i.next(); long t = si.getResumeMilli(); if (t > ret) ret = t; } return ret; } /** * Adds a UpdateManagerListener to this UpdateManager. */ public void addUpdateManagerListener(UpdateManagerListener l) { listeners.add(l); } /** * Removes a UpdateManagerListener from this UpdateManager. */ public void removeUpdateManagerListener(UpdateManagerListener l) { listeners.remove(l); } protected void fireEvent(Dispatcher dispatcher, Object event) { EventDispatcher.fireEvent(dispatcher, listeners, event, false); } /** * Dispatches a UpdateManagerEvent to notify that the manager was * started */ static Dispatcher startedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).managerStarted ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that the manager was * stopped. */ static Dispatcher stoppedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).managerStopped ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that the manager was * suspended. */ static Dispatcher suspendedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).managerSuspended ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that the manager was * resumed. */ static Dispatcher resumedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).managerResumed ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that an update * started */ static Dispatcher updateStartedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).updateStarted ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that an update * completed */ static Dispatcher updateCompletedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).updateCompleted ((UpdateManagerEvent)event); } }; /** * Dispatches a UpdateManagerEvent to notify that an update * failed */ static Dispatcher updateFailedDispatcher = new Dispatcher() { public void dispatch(Object listener, Object event) { ((UpdateManagerListener)listener).updateFailed ((UpdateManagerEvent)event); } }; // RunnableQueue.RunHandler ///////////////////////////////////////// protected RunnableQueue.RunHandler createRunHandler() { return new UpdateManagerRunHander(); } protected class UpdateManagerRunHander extends RunnableQueue.RunHandlerAdapter { public void runnableStart(RunnableQueue rq, Runnable r) { if (running && !(r instanceof NoRepaintRunnable)) { // Mark the document as updated when the // runnable starts. if (outOfDateTime == 0) outOfDateTime = System.currentTimeMillis(); } } /** * Called when the given Runnable has just been invoked and * has returned. */ public void runnableInvoked(RunnableQueue rq, Runnable r) { if (running && !(r instanceof NoRepaintRunnable)) { repaint(); } } /** * Called when the execution of the queue has been suspended. */ public void executionSuspended(RunnableQueue rq) { synchronized (UpdateManager.this) { // System.err.println("Suspended: " + suspendCalled); if (suspendCalled) { running = false; UpdateManagerEvent ev = new UpdateManagerEvent (this, null, null); fireEvent(suspendedDispatcher, ev); } } } /** * Called when the execution of the queue has been resumed. */ public void executionResumed(RunnableQueue rq) { synchronized (UpdateManager.this) { // System.err.println("Resumed: " + suspendCalled + // " : " + running); if (suspendCalled && !running) { running = true; suspendCalled = false; UpdateManagerEvent ev = new UpdateManagerEvent (this, null, null); fireEvent(resumedDispatcher, ev); } } } } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootbatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGRadialGradientElementBridge.javabatik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGRadialGradientElementBridge.jav0000644000175000017500000001650213063003351032635 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.Color; import java.awt.Paint; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.apache.batik.dom.svg.SVGContext; import org.apache.batik.ext.awt.MultipleGradientPaint; import org.apache.batik.ext.awt.RadialGradientPaint; import org.apache.batik.gvt.GraphicsNode; import org.w3c.dom.Element; /** * Bridge class for the <radialGradient> element. * * @author Thierry Kormann * @version $Id: SVGRadialGradientElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGRadialGradientElementBridge extends AbstractSVGGradientElementBridge { /** * Constructs a new SVGRadialGradientElementBridge. */ public SVGRadialGradientElementBridge() {} /** * Returns 'radialGradient'. */ public String getLocalName() { return SVG_RADIAL_GRADIENT_TAG; } /** * Builds a radial gradient according to the specified parameters. * * @param paintElement the element that defines a Paint * @param paintedElement the element referencing the paint * @param paintedNode the graphics node on which the Paint will be applied * @param spreadMethod the spread method * @param colorSpace the color space (sRGB | LinearRGB) * @param transform the gradient transform * @param colors the colors of the gradient * @param offsets the offsets * @param ctx the bridge context to use */ protected Paint buildGradient(Element paintElement, Element paintedElement, GraphicsNode paintedNode, MultipleGradientPaint.CycleMethodEnum spreadMethod, MultipleGradientPaint.ColorSpaceEnum colorSpace, AffineTransform transform, Color [] colors, float [] offsets, BridgeContext ctx) { // 'cx' attribute - default is 50% String cxStr = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_CX_ATTRIBUTE, ctx); if (cxStr.length() == 0) { cxStr = SVG_RADIAL_GRADIENT_CX_DEFAULT_VALUE; } // 'cy' attribute - default is 50% String cyStr = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_CY_ATTRIBUTE, ctx); if (cyStr.length() == 0) { cyStr = SVG_RADIAL_GRADIENT_CY_DEFAULT_VALUE; } // 'r' attribute - default is 50% String rStr = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_R_ATTRIBUTE, ctx); if (rStr.length() == 0) { rStr = SVG_RADIAL_GRADIENT_R_DEFAULT_VALUE; } // 'fx' attribute - default is same as cx String fxStr = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_FX_ATTRIBUTE, ctx); if (fxStr.length() == 0) { fxStr = cxStr; } // 'fy' attribute - default is same as cy String fyStr = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_FY_ATTRIBUTE, ctx); if (fyStr.length() == 0) { fyStr = cyStr; } // 'gradientUnits' attribute - default is objectBoundingBox short coordSystemType; String s = SVGUtilities.getChainableAttributeNS (paintElement, null, SVG_GRADIENT_UNITS_ATTRIBUTE, ctx); if (s.length() == 0) { coordSystemType = SVGUtilities.OBJECT_BOUNDING_BOX; } else { coordSystemType = SVGUtilities.parseCoordinateSystem (paintElement, SVG_GRADIENT_UNITS_ATTRIBUTE, s, ctx); } // The last paragraph of section 7.11 in SVG 1.1 states that objects // with zero width or height bounding boxes that use gradients with // gradientUnits="objectBoundingBox" must not use the gradient. SVGContext bridge = BridgeContext.getSVGContext(paintedElement); if (coordSystemType == SVGUtilities.OBJECT_BOUNDING_BOX && bridge instanceof AbstractGraphicsNodeBridge) { // XXX Make this work for non-AbstractGraphicsNodeBridges, like // the various text child bridges. Rectangle2D bbox = ((AbstractGraphicsNodeBridge) bridge).getBBox(); if (bbox != null && (bbox.getWidth() == 0 || bbox.getHeight() == 0)) { return null; } } // additional transform to move to objectBoundingBox coordinate system if (coordSystemType == SVGUtilities.OBJECT_BOUNDING_BOX) { transform = SVGUtilities.toObjectBBox(transform, paintedNode); } UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, paintElement); float r = SVGUtilities.convertLength(rStr, SVG_R_ATTRIBUTE, coordSystemType, uctx); // A value of zero will cause the area to be painted as a single color // using the color and opacity of the last gradient stop. if (r == 0) { return colors[colors.length-1]; } else { Point2D c = SVGUtilities.convertPoint(cxStr, SVG_CX_ATTRIBUTE, cyStr, SVG_CY_ATTRIBUTE, coordSystemType, uctx); Point2D f = SVGUtilities.convertPoint(fxStr, SVG_FX_ATTRIBUTE, fyStr, SVG_FY_ATTRIBUTE, coordSystemType, uctx); // FIXME: colorSpace ignored for radial gradient at this time return new RadialGradientPaint(c, r, f, offsets, colors, spreadMethod, RadialGradientPaint.SRGB, transform); } } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGLineElementBridge.java0000644000175000017500000001157413063003346031023 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.geom.Line2D; import org.apache.batik.anim.dom.AbstractSVGAnimatedLength; import org.apache.batik.anim.dom.AnimatedLiveAttributeValue; import org.apache.batik.anim.dom.SVGOMLineElement; import org.apache.batik.dom.svg.LiveAttributeException; import org.apache.batik.gvt.ShapeNode; import org.apache.batik.gvt.ShapePainter; import org.w3c.dom.Element; /** * Bridge class for the <line> element. * * @author Thierry Kormann * @version $Id: SVGLineElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGLineElementBridge extends SVGDecoratedShapeElementBridge { /** * Constructs a new bridge for the <line> element. */ public SVGLineElementBridge() {} /** * Returns 'line'. */ public String getLocalName() { return SVG_LINE_TAG; } /** * Returns a new instance of this bridge. */ public Bridge getInstance() { return new SVGLineElementBridge(); } /** * Creates the shape painter associated to the specified element. * This implementation creates a shape painter considering the * various fill and stroke properties. * * @param ctx the bridge context to use * @param e the element that describes the shape painter to use * @param shapeNode the shape node that is interested in its shape painter */ protected ShapePainter createFillStrokePainter(BridgeContext ctx, Element e, ShapeNode shapeNode) { // 'fill' - ignored // 'fill-opacity' - ignored // 'stroke' // 'stroke-opacity', // 'stroke-width' // 'stroke-linecap' // 'stroke-linejoin' // 'stroke-miterlimit' // 'stroke-dasharray' // 'stroke-dashoffset' return PaintServer.convertStrokePainter(e, shapeNode, ctx); } /** * Constructs a line according to the specified parameters. * * @param ctx the bridge context to use * @param e the element that describes a rect element * @param shapeNode the shape node to initialize */ protected void buildShape(BridgeContext ctx, Element e, ShapeNode shapeNode) { try { SVGOMLineElement le = (SVGOMLineElement) e; // 'x1' attribute - default is 0 AbstractSVGAnimatedLength _x1 = (AbstractSVGAnimatedLength) le.getX1(); float x1 = _x1.getCheckedValue(); // 'y1' attribute - default is 0 AbstractSVGAnimatedLength _y1 = (AbstractSVGAnimatedLength) le.getY1(); float y1 = _y1.getCheckedValue(); // 'x2' attribute - default is 0 AbstractSVGAnimatedLength _x2 = (AbstractSVGAnimatedLength) le.getX2(); float x2 = _x2.getCheckedValue(); // 'y2' attribute - default is 0 AbstractSVGAnimatedLength _y2 = (AbstractSVGAnimatedLength) le.getY2(); float y2 = _y2.getCheckedValue(); shapeNode.setShape(new Line2D.Float(x1, y1, x2, y2)); } catch (LiveAttributeException ex) { throw new BridgeException(ctx, ex); } } // BridgeUpdateHandler implementation ////////////////////////////////// /** * Invoked when the animated value of an animatable attribute has changed. */ public void handleAnimatedAttributeChanged (AnimatedLiveAttributeValue alav) { if (alav.getNamespaceURI() == null) { String ln = alav.getLocalName(); if (ln.equals(SVG_X1_ATTRIBUTE) || ln.equals(SVG_Y1_ATTRIBUTE) || ln.equals(SVG_X2_ATTRIBUTE) || ln.equals(SVG_Y2_ATTRIBUTE)) { buildShape(ctx, e, (ShapeNode)node); handleGeometryChanged(); return; } } super.handleAnimatedAttributeChanged(alav); } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGTitleElementBridge.java0000644000175000017500000000301113063003353031176 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; /** * Bridge class for the <title> element. * * @author Vincent Hardy * @author Thierry Kormann * @version $Id: SVGTitleElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGTitleElementBridge extends SVGDescriptiveElementBridge { /** * Constructs a new bridge for the <title> element. */ public SVGTitleElementBridge() {} /** * Returns 'title'. */ public String getLocalName() { return SVG_TITLE_TAG; } /** * Returns a new instance of this bridge. */ public Bridge getInstance() { return new SVGTitleElementBridge(); } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGUtilities.java0000644000175000017500000014223313063003353027453 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import org.apache.batik.css.engine.CSSEngine; import org.apache.batik.dom.AbstractNode; import org.apache.batik.dom.util.XLinkSupport; import org.apache.batik.dom.util.XMLSupport; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.parser.AWTTransformProducer; import org.apache.batik.parser.ClockHandler; import org.apache.batik.parser.ClockParser; import org.apache.batik.parser.ParseException; import org.apache.batik.util.ParsedURL; import org.apache.batik.util.SVG12Constants; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.svg.SVGDocument; import org.w3c.dom.svg.SVGElement; import org.w3c.dom.svg.SVGLangSpace; import org.w3c.dom.svg.SVGNumberList; /** * A collection of utility methods for SVG. * * @author Thierry Kormann * @author Stephane Hillion * @version $Id: SVGUtilities.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class SVGUtilities implements SVGConstants, ErrorConstants { /** * No instance of this class is required. */ protected SVGUtilities() {} //////////////////////////////////////////////////////////////////////// // common methods //////////////////////////////////////////////////////////////////////// /** * Returns the logical parent element of the given element. * The parent element of a used element is the <use> element * which reference it. */ public static Element getParentElement(Element elt) { Node n = CSSEngine.getCSSParentNode(elt); while (n != null && n.getNodeType() != Node.ELEMENT_NODE) { n = CSSEngine.getCSSParentNode(n); } return (Element) n; } /** * Converts an SVGNumberList into a float array. * @param l the list to convert */ public static float[] convertSVGNumberList(SVGNumberList l) { int n = l.getNumberOfItems(); if (n == 0) { return null; } float[] fl = new float[n]; for (int i=0; i < n; i++) { fl[i] = l.getItem(i).getValue(); } return fl; } /** * Converts a string into a float. * @param s the float representation to convert */ public static float convertSVGNumber(String s) { return Float.parseFloat(s); } /** * Converts a string into an integer. * @param s the integer representation to convert */ public static int convertSVGInteger(String s) { return Integer.parseInt(s); } /** * Converts the specified ratio to float number. * @param v the ratio value to convert * @exception NumberFormatException if the ratio is not a valid * number or percentage */ public static float convertRatio(String v) { float d = 1; if (v.endsWith("%")) { v = v.substring(0, v.length() - 1); d = 100; } float r = Float.parseFloat(v)/d; if (r < 0) { r = 0; } else if (r > 1) { r = 1; } return r; } /** * Returns the content of the 'desc' child of the given element. */ public static String getDescription(SVGElement elt) { String result = ""; boolean preserve = false; Node n = elt.getFirstChild(); if (n != null && n.getNodeType() == Node.ELEMENT_NODE) { String name = (n.getPrefix() == null) ? n.getNodeName() : n.getLocalName(); if (name.equals(SVG_DESC_TAG)) { preserve = ((SVGLangSpace)n).getXMLspace().equals (SVG_PRESERVE_VALUE); for (n = n.getFirstChild(); n != null; n = n.getNextSibling()) { if (n.getNodeType() == Node.TEXT_NODE) { result += n.getNodeValue(); } } } } return (preserve) ? XMLSupport.preserveXMLSpace(result) : XMLSupport.defaultXMLSpace(result); } /** * Tests whether or not the given element match a specified user agent. * * @param elt the element to check * @param ua the user agent */ public static boolean matchUserAgent(Element elt, UserAgent ua) { test: if (elt.hasAttributeNS(null, SVG_SYSTEM_LANGUAGE_ATTRIBUTE)) { // Tests the system languages. String sl = elt.getAttributeNS(null, SVG_SYSTEM_LANGUAGE_ATTRIBUTE); if (sl.length() == 0) // SVG spec says empty returns false return false; StringTokenizer st = new StringTokenizer(sl, ", "); while (st.hasMoreTokens()) { String s = st.nextToken(); if (matchUserLanguage(s, ua.getLanguages())) { break test; } } return false; } if (elt.hasAttributeNS(null, SVG_REQUIRED_FEATURES_ATTRIBUTE)) { // Tests the system features. String rf = elt.getAttributeNS(null, SVG_REQUIRED_FEATURES_ATTRIBUTE); if (rf.length() == 0) // SVG spec says empty returns false return false; StringTokenizer st = new StringTokenizer(rf, " "); while (st.hasMoreTokens()) { String s = st.nextToken(); if (!ua.hasFeature(s)) { return false; } } } if (elt.hasAttributeNS(null, SVG_REQUIRED_EXTENSIONS_ATTRIBUTE)) { // Tests the system features. String re = elt.getAttributeNS(null, SVG_REQUIRED_EXTENSIONS_ATTRIBUTE); if (re.length() == 0) // SVG spec says empty returns false return false; StringTokenizer st = new StringTokenizer(re, " "); while (st.hasMoreTokens()) { String s = st.nextToken(); if (!ua.supportExtension(s)) { return false; } } } return true; } /** * Tests whether or not the specified language specification matches * the user preferences. * * @param s the langage to check * @param userLanguages the user langages */ protected static boolean matchUserLanguage(String s, String userLanguages) { StringTokenizer st = new StringTokenizer(userLanguages, ", "); while (st.hasMoreTokens()) { String t = st.nextToken(); if (s.startsWith(t)) { if (s.length() > t.length()) { return (s.charAt(t.length()) == '-'); } return true; } } return false; } /** * Returns the value of the specified attribute specified on the * specified element or one of its ancestor. Ancestors are found * using the xlink:href attribute. * * @param element the element to start with * @param namespaceURI the namespace URI of the attribute to return * @param attrName the name of the attribute to search * @param ctx the bridge context * @return the value of the attribute or an empty string if not defined */ public static String getChainableAttributeNS(Element element, String namespaceURI, String attrName, BridgeContext ctx) { DocumentLoader loader = ctx.getDocumentLoader(); Element e = element; List refs = new LinkedList(); for (;;) { String v = e.getAttributeNS(namespaceURI, attrName); if (v.length() > 0) { // exit if attribute defined return v; } String uriStr = XLinkSupport.getXLinkHref(e); if (uriStr.length() == 0) { // exit if no more xlink:href return ""; } String baseURI = ((AbstractNode) e).getBaseURI(); ParsedURL purl = new ParsedURL(baseURI, uriStr); Iterator iter = refs.iterator(); while (iter.hasNext()) { if (purl.equals(iter.next())) throw new BridgeException (ctx, e, ERR_XLINK_HREF_CIRCULAR_DEPENDENCIES, new Object[] {uriStr}); } try { SVGDocument svgDoc = (SVGDocument)e.getOwnerDocument(); URIResolver resolver = ctx.createURIResolver(svgDoc, loader); e = resolver.getElement(purl.toString(), e); refs.add(purl); } catch(IOException ioEx ) { throw new BridgeException(ctx, e, ioEx, ERR_URI_IO, new Object[] {uriStr}); } catch(SecurityException secEx ) { throw new BridgeException(ctx, e, secEx, ERR_URI_UNSECURE, new Object[] {uriStr}); } } } ///////////////////////////////////////////////////////////////////////// // and ///////////////////////////////////////////////////////////////////////// /** * Returns a Point2D in user units according to the specified parameters. * * @param xStr the x coordinate * @param xAttr the name of the attribute that represents the x coordinate * @param yStr the y coordinate * @param yAttr the name of the attribute that represents the y coordinate * @param unitsType the coordinate system (OBJECT_BOUNDING_BOX | * USER_SPACE_ON_USE) * @param uctx the unit processor context */ public static Point2D convertPoint(String xStr, String xAttr, String yStr, String yAttr, short unitsType, UnitProcessor.Context uctx) { float x, y; switch (unitsType) { case OBJECT_BOUNDING_BOX: x = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox (xStr, xAttr, uctx); y = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox (yStr, yAttr, uctx); break; case USER_SPACE_ON_USE: x = UnitProcessor.svgHorizontalCoordinateToUserSpace (xStr, xAttr, uctx); y = UnitProcessor.svgVerticalCoordinateToUserSpace (yStr, yAttr, uctx); break; default: throw new IllegalArgumentException("Invalid unit type"); } return new Point2D.Float(x, y); } /** * Returns a float in user units according to the specified parameters. * * @param length the length * @param attr the name of the attribute that represents the length * @param unitsType the coordinate system (OBJECT_BOUNDING_BOX | * USER_SPACE_ON_USE) * @param uctx the unit processor context */ public static float convertLength(String length, String attr, short unitsType, UnitProcessor.Context uctx) { switch (unitsType) { case OBJECT_BOUNDING_BOX: return UnitProcessor.svgOtherLengthToObjectBoundingBox (length, attr, uctx); case USER_SPACE_ON_USE: return UnitProcessor.svgOtherLengthToUserSpace(length, attr, uctx); default: throw new IllegalArgumentException("Invalid unit type"); } } ///////////////////////////////////////////////////////////////////////// // region ///////////////////////////////////////////////////////////////////////// /** * Returns the mask region according to the x, y, width, height, * and maskUnits attributes. * * @param maskElement the mask element that defines the various attributes * @param maskedElement the element referencing the mask * @param maskedNode the graphics node to mask (objectBoundingBox) * @param ctx the bridge context */ public static Rectangle2D convertMaskRegion(Element maskElement, Element maskedElement, GraphicsNode maskedNode, BridgeContext ctx) { // 'x' attribute - default is -10% String xStr = maskElement.getAttributeNS(null, SVG_X_ATTRIBUTE); if (xStr.length() == 0) { xStr = SVG_MASK_X_DEFAULT_VALUE; } // 'y' attribute - default is -10% String yStr = maskElement.getAttributeNS(null, SVG_Y_ATTRIBUTE); if (yStr.length() == 0) { yStr = SVG_MASK_Y_DEFAULT_VALUE; } // 'width' attribute - default is 120% String wStr = maskElement.getAttributeNS(null, SVG_WIDTH_ATTRIBUTE); if (wStr.length() == 0) { wStr = SVG_MASK_WIDTH_DEFAULT_VALUE; } // 'height' attribute - default is 120% String hStr = maskElement.getAttributeNS(null, SVG_HEIGHT_ATTRIBUTE); if (hStr.length() == 0) { hStr = SVG_MASK_HEIGHT_DEFAULT_VALUE; } // 'maskUnits' attribute - default is 'objectBoundingBox' short unitsType; String units = maskElement.getAttributeNS(null, SVG_MASK_UNITS_ATTRIBUTE); if (units.length() == 0) { unitsType = OBJECT_BOUNDING_BOX; } else { unitsType = parseCoordinateSystem (maskElement, SVG_MASK_UNITS_ATTRIBUTE, units, ctx); } // resolve units in the (referenced) maskedElement's coordinate system UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, maskedElement); return convertRegion(xStr, yStr, wStr, hStr, unitsType, maskedNode, uctx); } ///////////////////////////////////////////////////////////////////////// // region ///////////////////////////////////////////////////////////////////////// /** * Returns the pattern region according to the x, y, width, height, * and patternUnits attributes. * * @param patternElement the pattern element that defines the attributes * @param paintedElement the element referencing the pattern * @param paintedNode the graphics node to paint (objectBoundingBox) * @param ctx the bridge context */ public static Rectangle2D convertPatternRegion(Element patternElement, Element paintedElement, GraphicsNode paintedNode, BridgeContext ctx) { // 'x' attribute - default is 0% String xStr = getChainableAttributeNS (patternElement, null, SVG_X_ATTRIBUTE, ctx); if (xStr.length() == 0) { xStr = SVG_PATTERN_X_DEFAULT_VALUE; } // 'y' attribute - default is 0% String yStr = getChainableAttributeNS (patternElement, null, SVG_Y_ATTRIBUTE, ctx); if (yStr.length() == 0) { yStr = SVG_PATTERN_Y_DEFAULT_VALUE; } // 'width' attribute - required String wStr = getChainableAttributeNS (patternElement, null, SVG_WIDTH_ATTRIBUTE, ctx); if (wStr.length() == 0) { throw new BridgeException (ctx, patternElement, ERR_ATTRIBUTE_MISSING, new Object[] {SVG_WIDTH_ATTRIBUTE}); } // 'height' attribute - required String hStr = getChainableAttributeNS (patternElement, null, SVG_HEIGHT_ATTRIBUTE, ctx); if (hStr.length() == 0) { throw new BridgeException (ctx, patternElement, ERR_ATTRIBUTE_MISSING, new Object[] {SVG_HEIGHT_ATTRIBUTE}); } // 'patternUnits' attribute - default is 'objectBoundingBox' short unitsType; String units = getChainableAttributeNS (patternElement, null, SVG_PATTERN_UNITS_ATTRIBUTE, ctx); if (units.length() == 0) { unitsType = OBJECT_BOUNDING_BOX; } else { unitsType = parseCoordinateSystem (patternElement, SVG_PATTERN_UNITS_ATTRIBUTE, units, ctx); } // resolve units in the (referenced) paintedElement's coordinate system UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, paintedElement); return convertRegion(xStr, yStr, wStr, hStr, unitsType, paintedNode, uctx); } ///////////////////////////////////////////////////////////////////////// // and filter primitive ///////////////////////////////////////////////////////////////////////// /** * Returns an array of 2 float numbers that describes the filter * resolution of the specified filter element. * * @param filterElement the filter element * @param ctx the bridge context */ public static float [] convertFilterRes(Element filterElement, BridgeContext ctx) { float [] filterRes = new float[2]; String s = getChainableAttributeNS (filterElement, null, SVG_FILTER_RES_ATTRIBUTE, ctx); Float [] vals = convertSVGNumberOptionalNumber (filterElement, SVG_FILTER_RES_ATTRIBUTE, s, ctx); if (filterRes[0] < 0 || filterRes[1] < 0) { throw new BridgeException (ctx, filterElement, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {SVG_FILTER_RES_ATTRIBUTE, s}); } if (vals[0] == null) filterRes[0] = -1; else { filterRes[0] = vals[0].floatValue(); if (filterRes[0] < 0) throw new BridgeException (ctx, filterElement, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {SVG_FILTER_RES_ATTRIBUTE, s}); } if (vals[1] == null) filterRes[1] = filterRes[0]; else { filterRes[1] = vals[1].floatValue(); if (filterRes[1] < 0) throw new BridgeException (ctx, filterElement, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {SVG_FILTER_RES_ATTRIBUTE, s}); } return filterRes; } /** * This function parses attrValue for a number followed by an optional * second Number. It always returns an array of two Floats. If either * or both values are not provided the entries are set to null */ public static Float[] convertSVGNumberOptionalNumber(Element elem, String attrName, String attrValue, BridgeContext ctx) { Float[] ret = new Float[2]; if (attrValue.length() == 0) return ret; try { StringTokenizer tokens = new StringTokenizer(attrValue, " "); ret[0] = new Float(Float.parseFloat(tokens.nextToken())); if (tokens.hasMoreTokens()) { ret[1] = new Float(Float.parseFloat(tokens.nextToken())); } if (tokens.hasMoreTokens()) { throw new BridgeException (ctx, elem, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attrName, attrValue}); } } catch (NumberFormatException nfEx ) { throw new BridgeException (ctx, elem, nfEx, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attrName, attrValue, nfEx }); } return ret; } /** * Returns the filter region according to the x, y, width, height, * dx, dy, dw, dh and filterUnits attributes. * * @param filterElement the filter element that defines the attributes * @param filteredElement the element referencing the filter * @param filteredNode the graphics node to filter (objectBoundingBox) * @param ctx the bridge context */ public static Rectangle2D convertFilterChainRegion(Element filterElement, Element filteredElement, GraphicsNode filteredNode, BridgeContext ctx) { // 'x' attribute - default is -10% String xStr = getChainableAttributeNS (filterElement, null, SVG_X_ATTRIBUTE, ctx); if (xStr.length() == 0) { xStr = SVG_FILTER_X_DEFAULT_VALUE; } // 'y' attribute - default is -10% String yStr = getChainableAttributeNS (filterElement, null, SVG_Y_ATTRIBUTE, ctx); if (yStr.length() == 0) { yStr = SVG_FILTER_Y_DEFAULT_VALUE; } // 'width' attribute - default is 120% String wStr = getChainableAttributeNS (filterElement, null, SVG_WIDTH_ATTRIBUTE, ctx); if (wStr.length() == 0) { wStr = SVG_FILTER_WIDTH_DEFAULT_VALUE; } // 'height' attribute - default is 120% String hStr = getChainableAttributeNS (filterElement, null, SVG_HEIGHT_ATTRIBUTE, ctx); if (hStr.length() == 0) { hStr = SVG_FILTER_HEIGHT_DEFAULT_VALUE; } // 'filterUnits' attribute - default is 'objectBoundingBox' short unitsType; String units = getChainableAttributeNS (filterElement, null, SVG_FILTER_UNITS_ATTRIBUTE, ctx); if (units.length() == 0) { unitsType = OBJECT_BOUNDING_BOX; } else { unitsType = parseCoordinateSystem (filterElement, SVG_FILTER_UNITS_ATTRIBUTE, units, ctx); } // The last paragraph of section 7.11 in SVG 1.1 states that objects // with zero width or height bounding boxes that use filters with // filterUnits="objectBoundingBox" must not use the filter. // TODO: Uncomment this after confirming this is the desired behaviour. /*AbstractGraphicsNodeBridge bridge = (AbstractGraphicsNodeBridge) ctx.getSVGContext(filteredElement); if (unitsType == OBJECT_BOUNDING_BOX && bridge != null) { Rectangle2D bbox = bridge.getBBox(); if (bbox != null && bbox.getWidth() == 0 || bbox.getHeight() == 0) { return null; } }*/ // resolve units in the (referenced) filteredElement's // coordinate system UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, filteredElement); Rectangle2D region = convertRegion(xStr, yStr, wStr, hStr, unitsType, filteredNode, uctx); // // Account for region padding // units = getChainableAttributeNS (filterElement, null, SVG12Constants.SVG_FILTER_MARGINS_UNITS_ATTRIBUTE, ctx); if (units.length() == 0) { // Default to user space on use for margins, not objectBoundingBox unitsType = USER_SPACE_ON_USE; } else { unitsType = parseCoordinateSystem (filterElement, SVG12Constants.SVG_FILTER_MARGINS_UNITS_ATTRIBUTE, units, ctx); } // 'batik:dx' attribute - default is 0 String dxStr = filterElement.getAttributeNS(null, SVG12Constants.SVG_MX_ATRIBUTE); if (dxStr.length() == 0) { dxStr = SVG12Constants.SVG_FILTER_MX_DEFAULT_VALUE; } // 'batik:dy' attribute - default is 0 String dyStr = filterElement.getAttributeNS(null, SVG12Constants.SVG_MY_ATRIBUTE); if (dyStr.length() == 0) { dyStr = SVG12Constants.SVG_FILTER_MY_DEFAULT_VALUE; } // 'batik:dw' attribute - default is 0 String dwStr = filterElement.getAttributeNS(null, SVG12Constants.SVG_MW_ATRIBUTE); if (dwStr.length() == 0) { dwStr = SVG12Constants.SVG_FILTER_MW_DEFAULT_VALUE; } // 'batik:dh' attribute - default is 0 String dhStr = filterElement.getAttributeNS(null, SVG12Constants.SVG_MH_ATRIBUTE); if (dhStr.length() == 0) { dhStr = SVG12Constants.SVG_FILTER_MH_DEFAULT_VALUE; } return extendRegion(dxStr, dyStr, dwStr, dhStr, unitsType, filteredNode, region, uctx); } /** * Returns a rectangle that represents the region extended by the * specified differential coordinates. * * @param dxStr the differential x coordinate of the region * @param dyStr the differential y coordinate of the region * @param dwStr the differential width of the region * @param dhStr the differential height of the region * @param unitsType specifies whether the values are in userSpaceOnUse * or objectBoundingBox space * @param region the region to extend * @param uctx the unit processor context (needed for userSpaceOnUse) */ protected static Rectangle2D extendRegion(String dxStr, String dyStr, String dwStr, String dhStr, short unitsType, GraphicsNode filteredNode, Rectangle2D region, UnitProcessor.Context uctx) { float dx,dy,dw,dh; switch (unitsType) { case USER_SPACE_ON_USE: dx = UnitProcessor.svgHorizontalCoordinateToUserSpace (dxStr, SVG12Constants.SVG_MX_ATRIBUTE, uctx); dy = UnitProcessor.svgVerticalCoordinateToUserSpace (dyStr, SVG12Constants.SVG_MY_ATRIBUTE, uctx); dw = UnitProcessor.svgHorizontalCoordinateToUserSpace (dwStr, SVG12Constants.SVG_MW_ATRIBUTE, uctx); dh = UnitProcessor.svgVerticalCoordinateToUserSpace (dhStr, SVG12Constants.SVG_MH_ATRIBUTE, uctx); break; case OBJECT_BOUNDING_BOX: Rectangle2D bounds = filteredNode.getGeometryBounds(); if (bounds == null) { dx = dy = dw = dh = 0; } else { dx = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox (dxStr, SVG12Constants.SVG_MX_ATRIBUTE, uctx); dx *= bounds.getWidth(); dy = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox (dyStr, SVG12Constants.SVG_MY_ATRIBUTE, uctx); dy *= bounds.getHeight(); dw = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox (dwStr, SVG12Constants.SVG_MW_ATRIBUTE, uctx); dw *= bounds.getWidth(); dh = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox (dhStr, SVG12Constants.SVG_MH_ATRIBUTE, uctx); dh *= bounds.getHeight(); } break; default: throw new IllegalArgumentException("Invalid unit type"); } region.setRect(region.getX() + dx, region.getY() + dy, region.getWidth() + dw, region.getHeight() + dh); return region; } public static Rectangle2D getBaseFilterPrimitiveRegion(Element filterPrimitiveElement, Element filteredElement, GraphicsNode filteredNode, Rectangle2D defaultRegion, BridgeContext ctx) { String s; // resolve units in the (referenced) filteredElement's // coordinate system UnitProcessor.Context uctx; uctx = UnitProcessor.createContext(ctx, filteredElement); // 'x' attribute - default is defaultRegion.getX() double x = defaultRegion.getX(); s = filterPrimitiveElement.getAttributeNS(null, SVG_X_ATTRIBUTE); if (s.length() != 0) { x = UnitProcessor.svgHorizontalCoordinateToUserSpace (s, SVG_X_ATTRIBUTE, uctx); } // 'y' attribute - default is defaultRegion.getY() double y = defaultRegion.getY(); s = filterPrimitiveElement.getAttributeNS(null, SVG_Y_ATTRIBUTE); if (s.length() != 0) { y = UnitProcessor.svgVerticalCoordinateToUserSpace (s, SVG_Y_ATTRIBUTE, uctx); } // 'width' attribute - default is defaultRegion.getWidth() double w = defaultRegion.getWidth(); s = filterPrimitiveElement.getAttributeNS(null, SVG_WIDTH_ATTRIBUTE); if (s.length() != 0) { w = UnitProcessor.svgHorizontalLengthToUserSpace (s, SVG_WIDTH_ATTRIBUTE, uctx); } // 'height' attribute - default is defaultRegion.getHeight() double h = defaultRegion.getHeight(); s = filterPrimitiveElement.getAttributeNS(null, SVG_HEIGHT_ATTRIBUTE); if (s.length() != 0) { h = UnitProcessor.svgVerticalLengthToUserSpace (s, SVG_HEIGHT_ATTRIBUTE, uctx); } // NOTE: it may be that dx/dy/dw/dh should be applied here // but since this is mostly aimed at feImage I am // unsure that it is really needed. return new Rectangle2D.Double(x, y, w, h); } /** * Returns the filter primitive region according to the x, y, * width, height, and filterUnits attributes. Processing the * element as the top one in the filter chain. * * @param filterPrimitiveElement the filter primitive element * @param filterElement the filter element * @param filteredElement the element referencing the filter * @param filteredNode the graphics node to use (objectBoundingBox) * @param defaultRegion the default region to filter * @param filterRegion the filter chain region * @param ctx the bridge context */ public static Rectangle2D convertFilterPrimitiveRegion(Element filterPrimitiveElement, Element filterElement, Element filteredElement, GraphicsNode filteredNode, Rectangle2D defaultRegion, Rectangle2D filterRegion, BridgeContext ctx) { // 'primitiveUnits' - default is userSpaceOnUse String units = ""; if (filterElement != null) { units = getChainableAttributeNS(filterElement, null, SVG_PRIMITIVE_UNITS_ATTRIBUTE, ctx); } short unitsType; if (units.length() == 0) { unitsType = USER_SPACE_ON_USE; } else { unitsType = parseCoordinateSystem (filterElement, SVG_FILTER_UNITS_ATTRIBUTE, units, ctx); } String xStr = "", yStr = "", wStr = "", hStr = ""; if (filterPrimitiveElement != null) { // 'x' attribute - default is defaultRegion.getX() xStr = filterPrimitiveElement.getAttributeNS(null, SVG_X_ATTRIBUTE); // 'y' attribute - default is defaultRegion.getY() yStr = filterPrimitiveElement.getAttributeNS(null, SVG_Y_ATTRIBUTE); // 'width' attribute - default is defaultRegion.getWidth() wStr = filterPrimitiveElement.getAttributeNS(null, SVG_WIDTH_ATTRIBUTE); // 'height' attribute - default is defaultRegion.getHeight() hStr = filterPrimitiveElement.getAttributeNS(null, SVG_HEIGHT_ATTRIBUTE); } double x = defaultRegion.getX(); double y = defaultRegion.getY(); double w = defaultRegion.getWidth(); double h = defaultRegion.getHeight(); // resolve units in the (referenced) filteredElement's coordinate system UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, filteredElement); switch (unitsType) { case OBJECT_BOUNDING_BOX: Rectangle2D bounds = filteredNode.getGeometryBounds(); if (bounds != null) { if (xStr.length() != 0) { x = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox (xStr, SVG_X_ATTRIBUTE, uctx); x = bounds.getX() + x*bounds.getWidth(); } if (yStr.length() != 0) { y = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox (yStr, SVG_Y_ATTRIBUTE, uctx); y = bounds.getY() + y*bounds.getHeight(); } if (wStr.length() != 0) { w = UnitProcessor.svgHorizontalLengthToObjectBoundingBox (wStr, SVG_WIDTH_ATTRIBUTE, uctx); w *= bounds.getWidth(); } if (hStr.length() != 0) { h = UnitProcessor.svgVerticalLengthToObjectBoundingBox (hStr, SVG_HEIGHT_ATTRIBUTE, uctx); h *= bounds.getHeight(); } } break; case USER_SPACE_ON_USE: if (xStr.length() != 0) { x = UnitProcessor.svgHorizontalCoordinateToUserSpace (xStr, SVG_X_ATTRIBUTE, uctx); } if (yStr.length() != 0) { y = UnitProcessor.svgVerticalCoordinateToUserSpace (yStr, SVG_Y_ATTRIBUTE, uctx); } if (wStr.length() != 0) { w = UnitProcessor.svgHorizontalLengthToUserSpace (wStr, SVG_WIDTH_ATTRIBUTE, uctx); } if (hStr.length() != 0) { h = UnitProcessor.svgVerticalLengthToUserSpace (hStr, SVG_HEIGHT_ATTRIBUTE, uctx); } break; default: throw new Error("invalid unitsType:" + unitsType); // can't be reached } Rectangle2D region = new Rectangle2D.Double(x, y, w, h); // Now, extend filter primitive region with dx/dy/dw/dh // settings (Batik extension). The dx/dy/dw/dh padding is // *always* in userSpaceOnUse space. units = ""; if (filterElement != null) { units = getChainableAttributeNS (filterElement, null, SVG12Constants.SVG_FILTER_PRIMITIVE_MARGINS_UNITS_ATTRIBUTE, ctx); } if (units.length() == 0) { unitsType = USER_SPACE_ON_USE; } else { unitsType = parseCoordinateSystem (filterElement, SVG12Constants.SVG_FILTER_PRIMITIVE_MARGINS_UNITS_ATTRIBUTE, units, ctx); } String dxStr = "", dyStr = "", dwStr = "", dhStr = ""; if (filterPrimitiveElement != null) { // 'batik:dx' attribute - default is 0 dxStr = filterPrimitiveElement.getAttributeNS (null, SVG12Constants.SVG_MX_ATRIBUTE); // 'batik:dy' attribute - default is 0 dyStr = filterPrimitiveElement.getAttributeNS (null, SVG12Constants.SVG_MY_ATRIBUTE); // 'batik:dw' attribute - default is 0 dwStr = filterPrimitiveElement.getAttributeNS (null, SVG12Constants.SVG_MW_ATRIBUTE); // 'batik:dh' attribute - default is 0 dhStr = filterPrimitiveElement.getAttributeNS (null, SVG12Constants.SVG_MH_ATRIBUTE); } if (dxStr.length() == 0) { dxStr = SVG12Constants.SVG_FILTER_MX_DEFAULT_VALUE; } if (dyStr.length() == 0) { dyStr = SVG12Constants.SVG_FILTER_MY_DEFAULT_VALUE; } if (dwStr.length() == 0) { dwStr = SVG12Constants.SVG_FILTER_MW_DEFAULT_VALUE; } if (dhStr.length() == 0) { dhStr = SVG12Constants.SVG_FILTER_MH_DEFAULT_VALUE; } region = extendRegion(dxStr, dyStr, dwStr, dhStr, unitsType, filteredNode, region, uctx); Rectangle2D.intersect(region, filterRegion, region); return region; } /** * Returns the filter primitive region according to the x, y, * width, height, and filterUnits attributes. Processing the * element as the top one in the filter chain. * * @param filterPrimitiveElement the filter primitive element * @param filteredElement the element referencing the filter * @param filteredNode the graphics node to use (objectBoundingBox) * @param defaultRegion the default region to filter * @param filterRegion the filter chain region * @param ctx the bridge context */ public static Rectangle2D convertFilterPrimitiveRegion(Element filterPrimitiveElement, Element filteredElement, GraphicsNode filteredNode, Rectangle2D defaultRegion, Rectangle2D filterRegion, BridgeContext ctx) { Node parentNode = filterPrimitiveElement.getParentNode(); Element filterElement = null; if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE) { filterElement = (Element) parentNode; } return convertFilterPrimitiveRegion(filterPrimitiveElement, filterElement, filteredElement, filteredNode, defaultRegion, filterRegion, ctx); } ///////////////////////////////////////////////////////////////////////// // region convenient methods ///////////////////////////////////////////////////////////////////////// /** The userSpaceOnUse coordinate system constants. */ public static final short USER_SPACE_ON_USE = 1; /** The objectBoundingBox coordinate system constants. */ public static final short OBJECT_BOUNDING_BOX = 2; /** The strokeWidth coordinate system constants. */ public static final short STROKE_WIDTH = 3; /** * Parses the specified coordinate system defined by the specified element. * * @param e the element that defines the coordinate system * @param attr the attribute which contains the coordinate system * @param coordinateSystem the coordinate system to parse * @param ctx the BridgeContext to use for error information * @return OBJECT_BOUNDING_BOX | USER_SPACE_ON_USE */ public static short parseCoordinateSystem(Element e, String attr, String coordinateSystem, BridgeContext ctx) { if (SVG_USER_SPACE_ON_USE_VALUE.equals(coordinateSystem)) { return USER_SPACE_ON_USE; } else if (SVG_OBJECT_BOUNDING_BOX_VALUE.equals(coordinateSystem)) { return OBJECT_BOUNDING_BOX; } else { throw new BridgeException(ctx, e, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attr, coordinateSystem}); } } /** * Parses the specified coordinate system defined by the specified * marker element. * * @param e the element that defines the coordinate system * @param attr the attribute which contains the coordinate system * @param coordinateSystem the coordinate system to parse * @param ctx the BridgeContext to use for error information * @return STROKE_WIDTH | USER_SPACE_ON_USE */ public static short parseMarkerCoordinateSystem(Element e, String attr, String coordinateSystem, BridgeContext ctx) { if (SVG_USER_SPACE_ON_USE_VALUE.equals(coordinateSystem)) { return USER_SPACE_ON_USE; } else if (SVG_STROKE_WIDTH_VALUE.equals(coordinateSystem)) { return STROKE_WIDTH; } else { throw new BridgeException(ctx, e, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attr, coordinateSystem}); } } /** * Returns a rectangle that represents the region defined by the * specified coordinates. * * @param xStr the x coordinate of the region * @param yStr the y coordinate of the region * @param wStr the width of the region * @param hStr the height of the region * @param targetNode the graphics node (needed for objectBoundingBox) * @param uctx the unit processor context (needed for userSpaceOnUse) */ protected static Rectangle2D convertRegion(String xStr, String yStr, String wStr, String hStr, short unitsType, GraphicsNode targetNode, UnitProcessor.Context uctx) { // construct the mask region in the appropriate coordinate system double x, y, w, h; switch (unitsType) { case OBJECT_BOUNDING_BOX: x = UnitProcessor.svgHorizontalCoordinateToObjectBoundingBox (xStr, SVG_X_ATTRIBUTE, uctx); y = UnitProcessor.svgVerticalCoordinateToObjectBoundingBox (yStr, SVG_Y_ATTRIBUTE, uctx); w = UnitProcessor.svgHorizontalLengthToObjectBoundingBox (wStr, SVG_WIDTH_ATTRIBUTE, uctx); h = UnitProcessor.svgVerticalLengthToObjectBoundingBox (hStr, SVG_HEIGHT_ATTRIBUTE, uctx); Rectangle2D bounds = targetNode.getGeometryBounds(); if (bounds != null ) { x = bounds.getX() + x*bounds.getWidth(); y = bounds.getY() + y*bounds.getHeight(); w *= bounds.getWidth(); h *= bounds.getHeight(); } else { x = y = w = h = 0; } break; case USER_SPACE_ON_USE: x = UnitProcessor.svgHorizontalCoordinateToUserSpace (xStr, SVG_X_ATTRIBUTE, uctx); y = UnitProcessor.svgVerticalCoordinateToUserSpace (yStr, SVG_Y_ATTRIBUTE, uctx); w = UnitProcessor.svgHorizontalLengthToUserSpace (wStr, SVG_WIDTH_ATTRIBUTE, uctx); h = UnitProcessor.svgVerticalLengthToUserSpace (hStr, SVG_HEIGHT_ATTRIBUTE, uctx); break; default: throw new Error("invalid unitsType:" + unitsType ); // can't be reached } return new Rectangle2D.Double(x, y, w, h); } ///////////////////////////////////////////////////////////////////////// // coordinate system and transformation support methods ///////////////////////////////////////////////////////////////////////// /** * Returns an AffineTransform according to the specified parameters. * * @param e the element that defines the transform * @param attr the name of the attribute that represents the transform * @param transform the transform to parse * @param ctx the BridgeContext to use for error information */ public static AffineTransform convertTransform(Element e, String attr, String transform, BridgeContext ctx) { try { return AWTTransformProducer.createAffineTransform(transform); } catch (ParseException pEx) { throw new BridgeException(ctx, e, pEx, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] {attr, transform, pEx }); } } /** * Returns an AffineTransform to move to the objectBoundingBox * coordinate system. * * @param Tx the original transformation * @param node the graphics node that defines the coordinate * system to move into */ public static AffineTransform toObjectBBox(AffineTransform Tx, GraphicsNode node) { AffineTransform Mx = new AffineTransform(); Rectangle2D bounds = node.getGeometryBounds(); if (bounds != null) { Mx.translate(bounds.getX(), bounds.getY()); Mx.scale(bounds.getWidth(), bounds.getHeight()); } Mx.concatenate(Tx); return Mx; } /** * Returns the specified a Rectangle2D move to the objectBoundingBox * coordinate system of the specified graphics node. * * @param r the original Rectangle2D * @param node the graphics node that defines the coordinate * system to move into */ public static Rectangle2D toObjectBBox(Rectangle2D r, GraphicsNode node) { Rectangle2D bounds = node.getGeometryBounds(); if (bounds != null) { return new Rectangle2D.Double (bounds.getX() + r.getX()*bounds.getWidth(), bounds.getY() + r.getY()*bounds.getHeight(), r.getWidth() * bounds.getWidth(), r.getHeight() * bounds.getHeight()); } else { return new Rectangle2D.Double(); } } /** * Returns the value of the 'snapshotTime' attribute on the specified * element as a float, or 0f if the attribute is missing * or given as "none". * * @param e the element from which to retrieve the 'snapshotTime' attribute * @param ctx the BridgeContext to use for error information */ public static float convertSnapshotTime(Element e, BridgeContext ctx) { if (!e.hasAttributeNS(null, SVG_SNAPSHOT_TIME_ATTRIBUTE)) { return 0f; } String t = e.getAttributeNS(null, SVG_SNAPSHOT_TIME_ATTRIBUTE); if (t.equals(SVG_NONE_VALUE)) { return 0f; } class Handler implements ClockHandler { float time; public void clockValue(float t) { time = t; } } ClockParser p = new ClockParser(false); Handler h = new Handler(); p.setClockHandler(h); try { p.parse(t); } catch (ParseException pEx ) { throw new BridgeException (null, e, pEx, ERR_ATTRIBUTE_VALUE_MALFORMED, new Object[] { SVG_SNAPSHOT_TIME_ATTRIBUTE, t, pEx }); } return h.time; } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/CSSUtilities.java0000644000175000017500000010513213063003351027437 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Cursor; import java.awt.RenderingHints; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.css.engine.CSSEngine; import org.apache.batik.css.engine.CSSStylableElement; import org.apache.batik.css.engine.SVGCSSEngine; import org.apache.batik.css.engine.value.ListValue; import org.apache.batik.css.engine.value.Value; import org.apache.batik.ext.awt.MultipleGradientPaint; import org.apache.batik.ext.awt.image.renderable.ClipRable; import org.apache.batik.ext.awt.image.renderable.Filter; import org.apache.batik.gvt.CompositeGraphicsNode; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.filter.Mask; import org.apache.batik.util.CSSConstants; import org.apache.batik.util.XMLConstants; import org.w3c.dom.Element; import org.w3c.dom.css.CSSPrimitiveValue; import org.w3c.dom.css.CSSValue; /** * A collection of utility method involving CSS property. The listed * methods bellow could be used as convenient methods to create * concrete objects regarding to CSS properties. * * @author Thierry Kormann * @version $Id: CSSUtilities.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class CSSUtilities implements CSSConstants, ErrorConstants, XMLConstants { /** * No instance of this class is required. */ protected CSSUtilities() {} ///////////////////////////////////////////////////////////////////////// // Global methods ///////////////////////////////////////////////////////////////////////// /** * Returns CSSEngine associated to the specified element. * @param e the element */ public static CSSEngine getCSSEngine(Element e) { return ((SVGOMDocument)e.getOwnerDocument()).getCSSEngine(); } /** * Returns the computed style of the given property. */ public static Value getComputedStyle(Element e, int property) { CSSEngine engine = getCSSEngine(e); if (engine == null) return null; return engine.getComputedStyle((CSSStylableElement)e, null, property); } ///////////////////////////////////////////////////////////////////////// // 'pointer-events' ///////////////////////////////////////////////////////////////////////// /** * Returns the type that describes how this graphics node reacts to events. * * @return GraphicsNode.VISIBLE_PAINTED | * GraphicsNode.VISIBLE_FILL | * GraphicsNode.VISIBLE_STROKE | * GraphicsNode.VISIBLE | * GraphicsNode.PAINTED | * GraphicsNode.FILL | * GraphicsNode.STROKE | * GraphicsNode.ALL | * GraphicsNode.NONE */ public static int convertPointerEvents(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.POINTER_EVENTS_INDEX); String s = v.getStringValue(); switch(s.charAt(0)) { case 'v': if (s.length() == 7) { return GraphicsNode.VISIBLE; } else { switch(s.charAt(7)) { case 'p': return GraphicsNode.VISIBLE_PAINTED; case 'f': return GraphicsNode.VISIBLE_FILL; case 's': return GraphicsNode.VISIBLE_STROKE; default: // can't be reached throw new IllegalStateException("unexpected event, must be one of (p,f,s) is:" + s.charAt(7) ); } } case 'p': return GraphicsNode.PAINTED; case 'f': return GraphicsNode.FILL; case 's': return GraphicsNode.STROKE; case 'a': return GraphicsNode.ALL; case 'n': return GraphicsNode.NONE; default: // can't be reached throw new IllegalStateException("unexpected event, must be one of (v,p,f,s,a,n) is:" + s.charAt(0) ); } } ///////////////////////////////////////////////////////////////////////// // 'enable-background' ///////////////////////////////////////////////////////////////////////// /** * Returns the subregion of user space where access to the * background image is allowed to happen. * * @param e the container element */ public static Rectangle2D convertEnableBackground(Element e /*, UnitProcessor.Context uctx*/) { Value v = getComputedStyle(e, SVGCSSEngine.ENABLE_BACKGROUND_INDEX); if (v.getCssValueType() != CSSValue.CSS_VALUE_LIST) { return null; // accumulate } ListValue lv = (ListValue)v; int length = lv.getLength(); switch (length) { case 1: return CompositeGraphicsNode.VIEWPORT; // new case 5: // new ,,, float x = lv.item(1).getFloatValue(); float y = lv.item(2).getFloatValue(); float w = lv.item(3).getFloatValue(); float h = lv.item(4).getFloatValue(); return new Rectangle2D.Float(x, y, w, h); default: throw new IllegalStateException("Unexpected length:" + length ); // Cannot happen } } ///////////////////////////////////////////////////////////////////////// // 'color-interpolation-filters' ///////////////////////////////////////////////////////////////////////// /** * Returns the color space for the specified filter element. Checks the * 'color-interpolation-filters' property. * * @param e the element * @return true if the color space is linear, false otherwise (sRGB). */ public static boolean convertColorInterpolationFilters(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.COLOR_INTERPOLATION_FILTERS_INDEX); return CSS_LINEARRGB_VALUE == v.getStringValue(); } ///////////////////////////////////////////////////////////////////////// // 'color-interpolation' ///////////////////////////////////////////////////////////////////////// /** * Returns the color space for the specified element. Checks the * 'color-interpolation' property * * @param e the element */ public static MultipleGradientPaint.ColorSpaceEnum convertColorInterpolation(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.COLOR_INTERPOLATION_INDEX); return (CSS_LINEARRGB_VALUE == v.getStringValue()) ? MultipleGradientPaint.LINEAR_RGB : MultipleGradientPaint.SRGB; } ///////////////////////////////////////////////////////////////////////// // 'cursor' ///////////////////////////////////////////////////////////////////////// /** * Checks if the cursor property on the input element is set to auto */ public static boolean isAutoCursor(Element e) { Value cursorValue = CSSUtilities.getComputedStyle(e, SVGCSSEngine.CURSOR_INDEX); boolean isAuto = false; if (cursorValue != null){ if( cursorValue.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE && cursorValue.getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT && cursorValue.getStringValue().charAt(0) == 'a' ) { isAuto = true; } else if ( cursorValue.getCssValueType() == CSSValue.CSS_VALUE_LIST && cursorValue.getLength() == 1) { Value lValue = cursorValue.item(0); if (lValue != null && lValue.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE && lValue.getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT && lValue.getStringValue().charAt(0) == 'a') { isAuto = true; } } } return isAuto; } /** * Returns the Cursor corresponding to the input element's * cursor property * * @param e the element */ public static Cursor convertCursor(Element e, BridgeContext ctx) { return ctx.getCursorManager().convertCursor(e); } //////////////////////////////////////////////////////////////////////// // 'color-rendering', 'text-rendering', 'image-rendering', // 'shape-rendering' //////////////////////////////////////////////////////////////////////// /** * Fills the rendering hints for the specified shape element or do * nothing none has been specified. Checks the 'shape-rendering' * property. If the given RenderingHints is null, a new * RenderingHints is created. * *

Here is how the mapping between SVG rendering hints and the Java2D * rendering hints is done:

* *
*
'optimizeSpeed':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_SPEED
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_OFF
  • *
*
*
'crispEdges':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_DEFAULT
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_OFF
  • *
*
*
'geometricPrecision':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_QUALITY
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_ON
  • *
*
*
* * @param e the element * @param hints a RenderingHints to fill, or null. */ public static RenderingHints convertShapeRendering(Element e, RenderingHints hints) { Value v = getComputedStyle(e, SVGCSSEngine.SHAPE_RENDERING_INDEX); String s = v.getStringValue(); int len = s.length(); if ((len == 4) && (s.charAt(0) == 'a')) // auto return hints; if (len < 10) return hints; // Unknown. if (hints == null) hints = new RenderingHints(null); switch(s.charAt(0)) { case 'o': // optimizeSpeed hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); break; case 'c': // crispEdges hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); break; case 'g': // geometricPrecision hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); hints.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); break; } return hints; } /** * Fills the rendering hints for the specified text element or do * nothing if none has been specified. If the given RenderingHints * is null, a new one is created. Checks the 'text-rendering' * property. * *

Here is how the mapping between SVG rendering hints and the Java2D * rendering hints is done:

* *
*
'optimizeSpeed':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_SPEED
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_OFF
  • *
  • KEY_TEXT_ANTIALIASING=VALUE_TEXT_ANTIALIAS_OFF
  • *
  • KEY_FRACTIONALMETRICS=VALUE_FRACTIONALMETRICS_OFF
  • *
*
*
'optimizeLegibility':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_QUALITY
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_ON
  • *
  • KEY_TEXT_ANTIALIASING=VALUE_TEXT_ANTIALIAS_ON
  • *
  • KEY_FRACTIONALMETRICS=VALUE_FRACTIONALMETRICS_OFF
  • *
*
*
'geometricPrecision':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_QUALITY
  • *
  • KEY_ANTIALIASING=VALUE_ANTIALIAS_DEFAULT
  • *
  • KEY_TEXT_ANTIALIASING=VALUE_TEXT_ANTIALIAS_DEFAULT
  • *
  • KEY_FRACTIONALMETRICS=VALUE_FRACTIONALMETRICS_ON
  • *
*
*
* *

Note that for text both KEY_TEXT_ANTIALIASING and * KEY_ANTIALIASING are set as there is no guarantee that a Java2D * text rendering primitive will be used to draw text (eg. SVG * Font...).

* * @param e the element * @param hints a RenderingHints to fill, or null. */ public static RenderingHints convertTextRendering(Element e, RenderingHints hints) { Value v = getComputedStyle(e, SVGCSSEngine.TEXT_RENDERING_INDEX); String s = v.getStringValue(); int len = s.length(); if ((len == 4) && (s.charAt(0) == 'a')) // auto return hints; if (len < 13) return hints; // Unknown. if (hints == null) hints = new RenderingHints(null); switch(s.charAt(8)) { case 's': // optimizeSpeed hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); // hints.put(RenderingHints.KEY_FRACTIONALMETRICS, // RenderingHints.VALUE_FRACTIONALMETRICS_OFF); break; case 'l': // optimizeLegibility hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // hints.put(RenderingHints.KEY_FRACTIONALMETRICS, // RenderingHints.VALUE_FRACTIONALMETRICS_OFF); break; case 'c': // geometricPrecision hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); hints.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); hints.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); break; } return hints; } /** * Fills the rendering hints for the specified image element or do * nothing if none has been specified. If the given RenderingHints * is null, a new one is created. Checks the 'image-rendering' * property. * *

Here is how the mapping between SVG rendering hints and the Java2D * rendering hints is done:

* *
*
'optimizeSpeed':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_SPEED
  • *
  • KEY_INTERPOLATION=VALUE_INTERPOLATION_NEAREST_NEIGHBOR
  • *
*
*
'optimizeQuality':
*
*
    *
  • KEY_RENDERING=VALUE_RENDER_QUALITY
  • *
  • KEY_INTERPOLATION=VALUE_INTERPOLATION_BICUBIC
  • *
*
*
* * @param e the element * @param hints a RenderingHints to fill, or null. */ public static RenderingHints convertImageRendering(Element e, RenderingHints hints) { Value v = getComputedStyle(e, SVGCSSEngine.IMAGE_RENDERING_INDEX); String s = v.getStringValue(); int len = s.length(); if ((len == 4) && (s.charAt(0) == 'a')) // auto return hints; if (len < 13) return hints; // Unknown. if (hints == null) hints = new RenderingHints(null); switch(s.charAt(8)) { case 's': // optimizeSpeed hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); break; case 'q': // optimizeQuality hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); break; } return hints; } /** * Fills the rendering hints for the specified element or do * nothing if none has been specified. If the given RenderingHints * is null, a new one is created. Checks the 'color-rendering' * property. * *

Here is how the mapping between SVG rendering hints and the Java2D * rendering hints is done:

* *
*
'optimizeSpeed':
*
*
    *
  • KEY_COLOR_RENDERING=VALUE_COLOR_RENDER_SPEED
  • *
  • KEY_ALPHA_INTERPOLATION=VALUE_ALPHA_INTERPOLATION_SPEED
  • *
*
*
'optimizeQuality':
*
*
    *
  • KEY_COLOR_RENDERING=VALUE_COLOR_RENDER_QUALITY
  • *
  • KEY_ALPHA_INTERPOLATION=VALUE_ALPHA_INTERPOLATION_QUALITY
  • *
*
*
* * @param e the element * @param hints a RenderingHints to fill, or null. */ public static RenderingHints convertColorRendering(Element e, RenderingHints hints) { Value v = getComputedStyle(e, SVGCSSEngine.COLOR_RENDERING_INDEX); String s = v.getStringValue(); int len = s.length(); if ((len == 4) && (s.charAt(0) == 'a')) // auto return hints; if (len < 13) return hints; // Unknown. if (hints == null) hints = new RenderingHints(null); switch(s.charAt(8)) { case 's': // optimizeSpeed hints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); hints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED); break; case 'q': // optimizeQuality hints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); hints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); break; } return hints; } ///////////////////////////////////////////////////////////////////////// // 'display' ///////////////////////////////////////////////////////////////////////// /** * Returns true if the specified element has to be displayed, false * otherwise. Checks the 'display' property. * * @param e the element */ public static boolean convertDisplay(Element e) { if (!(e instanceof CSSStylableElement)) { return true; } Value v = getComputedStyle(e, SVGCSSEngine.DISPLAY_INDEX); return v.getStringValue().charAt(0) != 'n'; } ///////////////////////////////////////////////////////////////////////// // 'visibility' ///////////////////////////////////////////////////////////////////////// /** * Returns true if the specified element is visible, false * otherwise. Checks the 'visibility' property. * * @param e the element */ public static boolean convertVisibility(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.VISIBILITY_INDEX); return v.getStringValue().charAt(0) == 'v'; } ///////////////////////////////////////////////////////////////////////// // 'opacity' ///////////////////////////////////////////////////////////////////////// public static final Composite TRANSPARENT = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0); /** * Returns a composite object that represents the 'opacity' of the * specified element. * * @param e the element */ public static Composite convertOpacity(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.OPACITY_INDEX); float f = v.getFloatValue(); if (f <= 0f) { return TRANSPARENT; } else if (f >= 1.0f) { return AlphaComposite.SrcOver; } else { return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, f); } } ///////////////////////////////////////////////////////////////////////// // 'overflow' and 'clip' ///////////////////////////////////////////////////////////////////////// /** * Returns true if the 'overflow' property indicates that an * additional clip is required, false otherwise. An additional * clip is needed if the 'overflow' property is 'scroll' or * 'hidden'. * * @param e the element with the 'overflow' property */ public static boolean convertOverflow(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.OVERFLOW_INDEX); String s = v.getStringValue(); return (s.charAt(0) == 'h') || (s.charAt(0) == 's'); } /** * Returns an array of floating offsets representing the 'clip' * property or null if 'auto'. The offsets are specified in the * order top, right, bottom, left. * * @param e the element with the 'clip' property */ public static float[] convertClip(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.CLIP_INDEX); int primitiveType = v.getPrimitiveType(); switch ( primitiveType ) { case CSSPrimitiveValue.CSS_RECT: float [] off = new float[4]; off[0] = v.getTop().getFloatValue(); off[1] = v.getRight().getFloatValue(); off[2] = v.getBottom().getFloatValue(); off[3] = v.getLeft().getFloatValue(); return off; case CSSPrimitiveValue.CSS_IDENT: return null; // 'auto' means no offsets default: // can't be reached throw new IllegalStateException("Unexpected primitiveType:" + primitiveType ); } } ///////////////////////////////////////////////////////////////////////// // 'filter' ///////////////////////////////////////////////////////////////////////// /** * Returns a Filter referenced by the specified element * and which applies on the specified graphics node. * Handle the 'filter' property. * * @param filteredElement the element that references the filter * @param filteredNode the graphics node associated to the element * to filter. * @param ctx the bridge context */ public static Filter convertFilter(Element filteredElement, GraphicsNode filteredNode, BridgeContext ctx) { Value v = getComputedStyle(filteredElement, SVGCSSEngine.FILTER_INDEX); int primitiveType = v.getPrimitiveType(); switch ( primitiveType ) { case CSSPrimitiveValue.CSS_IDENT: return null; // 'filter:none' case CSSPrimitiveValue.CSS_URI: String uri = v.getStringValue(); Element filter = ctx.getReferencedElement(filteredElement, uri); Bridge bridge = ctx.getBridge(filter); if (bridge == null || !(bridge instanceof FilterBridge)) { throw new BridgeException(ctx, filteredElement, ERR_CSS_URI_BAD_TARGET, new Object[] {uri}); } return ((FilterBridge)bridge).createFilter(ctx, filter, filteredElement, filteredNode); default: throw new IllegalStateException("Unexpected primitive type:" + primitiveType ); // can't be reached } } ///////////////////////////////////////////////////////////////////////// // 'clip-path' and 'clip-rule' ///////////////////////////////////////////////////////////////////////// /** * Returns a Clip referenced by the specified element and * which applies on the specified graphics node. * Handle the 'clip-path' property. * * @param clippedElement the element that references the clip * @param clippedNode the graphics node associated to the element to clip * @param ctx the bridge context */ public static ClipRable convertClipPath(Element clippedElement, GraphicsNode clippedNode, BridgeContext ctx) { Value v = getComputedStyle(clippedElement, SVGCSSEngine.CLIP_PATH_INDEX); int primitiveType = v.getPrimitiveType(); switch ( primitiveType ) { case CSSPrimitiveValue.CSS_IDENT: return null; // 'clip-path:none' case CSSPrimitiveValue.CSS_URI: String uri = v.getStringValue(); Element cp = ctx.getReferencedElement(clippedElement, uri); Bridge bridge = ctx.getBridge(cp); if (bridge == null || !(bridge instanceof ClipBridge)) { throw new BridgeException(ctx, clippedElement, ERR_CSS_URI_BAD_TARGET, new Object[] {uri}); } return ((ClipBridge)bridge).createClip(ctx, cp, clippedElement, clippedNode); default: throw new IllegalStateException("Unexpected primitive type:" + primitiveType ); // can't be reached } } /** * Returns the 'clip-rule' for the specified element. * * @param e the element interested in its a 'clip-rule' * @return GeneralPath.WIND_NON_ZERO | GeneralPath.WIND_EVEN_ODD */ public static int convertClipRule(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.CLIP_RULE_INDEX); return (v.getStringValue().charAt(0) == 'n') ? GeneralPath.WIND_NON_ZERO : GeneralPath.WIND_EVEN_ODD; } ///////////////////////////////////////////////////////////////////////// // 'mask' ///////////////////////////////////////////////////////////////////////// /** * Returns a Mask referenced by the specified element and * which applies on the specified graphics node. * Handle the 'mask' property. * * @param maskedElement the element that references the mask * @param maskedNode the graphics node associated to the element to mask * @param ctx the bridge context */ public static Mask convertMask(Element maskedElement, GraphicsNode maskedNode, BridgeContext ctx) { Value v = getComputedStyle(maskedElement, SVGCSSEngine.MASK_INDEX); int primitiveType = v.getPrimitiveType(); switch ( primitiveType ) { case CSSPrimitiveValue.CSS_IDENT: return null; // 'mask:none' case CSSPrimitiveValue.CSS_URI: String uri = v.getStringValue(); Element m = ctx.getReferencedElement(maskedElement, uri); Bridge bridge = ctx.getBridge(m); if (bridge == null || !(bridge instanceof MaskBridge)) { throw new BridgeException(ctx, maskedElement, ERR_CSS_URI_BAD_TARGET, new Object[] {uri}); } return ((MaskBridge)bridge).createMask(ctx, m, maskedElement, maskedNode); default: throw new IllegalStateException("Unexpected primitive type:" + primitiveType ); // can't be reached } } /** * Returns the 'fill-rule' for the specified element. * * @param e the element interested in its a 'fill-rule' * @return GeneralPath.WIND_NON_ZERO | GeneralPath.WIND_EVEN_ODD */ public static int convertFillRule(Element e) { Value v = getComputedStyle(e, SVGCSSEngine.FILL_RULE_INDEX); return (v.getStringValue().charAt(0) == 'n') ? GeneralPath.WIND_NON_ZERO : GeneralPath.WIND_EVEN_ODD; } ///////////////////////////////////////////////////////////////////////// // 'lighting-color' ///////////////////////////////////////////////////////////////////////// /** * Converts the color defined on the specified lighting filter element * to a Color. * * @param e the lighting filter element * @param ctx the bridge context */ public static Color convertLightingColor(Element e, BridgeContext ctx) { Value v = getComputedStyle(e, SVGCSSEngine.LIGHTING_COLOR_INDEX); if (v.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) { return PaintServer.convertColor(v, 1); } else { return PaintServer.convertRGBICCColor (e, v.item(0), v.item(1), 1, ctx); } } ///////////////////////////////////////////////////////////////////////// // 'flood-color' and 'flood-opacity' ///////////////////////////////////////////////////////////////////////// /** * Converts the color defined on the specified <feFlood> * element to a Color. * * @param e the feFlood element * @param ctx the bridge context */ public static Color convertFloodColor(Element e, BridgeContext ctx) { Value v = getComputedStyle(e, SVGCSSEngine.FLOOD_COLOR_INDEX); Value o = getComputedStyle(e, SVGCSSEngine.FLOOD_OPACITY_INDEX); float f = PaintServer.convertOpacity(o); if (v.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) { return PaintServer.convertColor(v, f); } else { return PaintServer.convertRGBICCColor (e, v.item(0), v.item(1), f, ctx); } } ///////////////////////////////////////////////////////////////////////// // 'stop-color' ///////////////////////////////////////////////////////////////////////// /** * Converts the color defined on the specified <stop> element * to a Color. * * @param e the stop element * @param opacity the paint opacity * @param ctx the bridge context to use */ public static Color convertStopColor(Element e, float opacity, BridgeContext ctx) { Value v = getComputedStyle(e, SVGCSSEngine.STOP_COLOR_INDEX); Value o = getComputedStyle(e, SVGCSSEngine.STOP_OPACITY_INDEX); opacity *= PaintServer.convertOpacity(o); if (v.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) { return PaintServer.convertColor(v, opacity); } else { return PaintServer.convertRGBICCColor (e, v.item(0), v.item(1), opacity, ctx); } } ///////////////////////////////////////////////////////////////////////// // CSS support for ///////////////////////////////////////////////////////////////////////// /** * Partially computes the style in the 'def' tree and set it in the 'use' * tree. *

Note: This method must be called only when 'use' has been * added to the DOM tree. * * @param refElement the referenced element * @param localRefElement the referenced element in the current document */ public static void computeStyleAndURIs(Element refElement, Element localRefElement, String uri) { // Pull fragement id off first... int idx = uri.indexOf('#'); if (idx != -1) uri = uri.substring(0,idx); // Only set xml:base if we have a real URL. if (uri.length() != 0) localRefElement.setAttributeNS(XML_NAMESPACE_URI, "base", uri); CSSEngine engine = CSSUtilities.getCSSEngine(localRefElement); CSSEngine refEngine = CSSUtilities.getCSSEngine(refElement); engine.importCascadedStyleMaps(refElement, refEngine, localRefElement); } ///////////////////////////////////////////////////////////////////////// // Additional utility methods used internally ///////////////////////////////////////////////////////////////////////// /** * Returns the winding rule represented by the specified CSSValue. * * @param v the value that represents the rule * @return GeneralPath.WIND_NON_ZERO | GeneralPath.WIND_EVEN_ODD */ protected static int rule(CSSValue v) { return (((CSSPrimitiveValue)v).getStringValue().charAt(0) == 'n') ? GeneralPath.WIND_NON_ZERO : GeneralPath.WIND_EVEN_ODD; } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/SVGMissingGlyphElementBridge.java0000644000175000017500000000236613063003353032546 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; /** * Bridge class for the <missing-glyph> element. * * @author Thierry Kormann * @version $Id: SVGMissingGlyphElementBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SVGMissingGlyphElementBridge extends SVGGlyphElementBridge { /** * Returns 'missing-glyph'. */ public String getLocalName() { return SVG_MISSING_GLYPH_TAG; } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/MarkerBridge.java0000644000175000017500000000306513063003351027453 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.gvt.Marker; import org.w3c.dom.Element; /** * Factory class for vending Marker objects. * * @author Vincent Hardy * @version $Id: MarkerBridge.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface MarkerBridge extends Bridge { /** * Creates a Marker according to the specified parameters. * * @param ctx the bridge context to use * @param markerElement the element that represents the marker * @param paintedElement the element that references the marker element */ Marker createMarker(BridgeContext ctx, Element markerElement, Element paintedElement); } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/StrokingTextPainter.java0000644000175000017500000020052713063003350031106 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.awt.font.FontRenderContext; import java.awt.font.TextAttribute; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.text.CharacterIterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.batik.bridge.BasicTextPainter.BasicMark; import org.apache.batik.gvt.font.GVTFont; import org.apache.batik.gvt.font.GVTFontFamily; import org.apache.batik.gvt.font.GVTGlyphMetrics; import org.apache.batik.gvt.font.GVTLineMetrics; import org.apache.batik.gvt.text.AttributedCharacterSpanIterator; import org.apache.batik.gvt.text.BidiAttributedCharacterIterator; import org.apache.batik.gvt.text.GVTAttributedCharacterIterator; import org.apache.batik.gvt.text.TextPaintInfo; import org.apache.batik.gvt.text.TextPath; /** * More sophisticated implementation of TextPainter which * renders the attributed character iterator of a TextNode. * StrokingTextPainter includes support for stroke, fill, opacity, * text-decoration, and other attributes. * * @see org.apache.batik.bridge.TextPainter * @see org.apache.batik.gvt.text.GVTAttributedCharacterIterator * * @author Bill Haneman * @version $Id: StrokingTextPainter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class StrokingTextPainter extends BasicTextPainter { public static final AttributedCharacterIterator.Attribute PAINT_INFO = GVTAttributedCharacterIterator.TextAttribute.PAINT_INFO; public static final AttributedCharacterIterator.Attribute FLOW_REGIONS = GVTAttributedCharacterIterator.TextAttribute.FLOW_REGIONS; public static final AttributedCharacterIterator.Attribute FLOW_PARAGRAPH = GVTAttributedCharacterIterator.TextAttribute.FLOW_PARAGRAPH; public static final AttributedCharacterIterator.Attribute TEXT_COMPOUND_ID = GVTAttributedCharacterIterator.TextAttribute.TEXT_COMPOUND_ID; public static final AttributedCharacterIterator.Attribute GVT_FONT = GVTAttributedCharacterIterator.TextAttribute.GVT_FONT; public static final AttributedCharacterIterator.Attribute GVT_FONTS = GVTAttributedCharacterIterator.TextAttribute.GVT_FONTS; public static final AttributedCharacterIterator.Attribute BIDI_LEVEL = GVTAttributedCharacterIterator.TextAttribute.BIDI_LEVEL; public static final AttributedCharacterIterator.Attribute XPOS = GVTAttributedCharacterIterator.TextAttribute.X; public static final AttributedCharacterIterator.Attribute YPOS = GVTAttributedCharacterIterator.TextAttribute.Y; public static final AttributedCharacterIterator.Attribute TEXTPATH = GVTAttributedCharacterIterator.TextAttribute.TEXTPATH; public static final AttributedCharacterIterator.Attribute WRITING_MODE = GVTAttributedCharacterIterator.TextAttribute.WRITING_MODE; public static final Integer WRITING_MODE_TTB = GVTAttributedCharacterIterator.TextAttribute.WRITING_MODE_TTB; public static final Integer WRITING_MODE_RTL = GVTAttributedCharacterIterator.TextAttribute.WRITING_MODE_RTL; public static final AttributedCharacterIterator.Attribute ANCHOR_TYPE = GVTAttributedCharacterIterator.TextAttribute.ANCHOR_TYPE; public static final Integer ADJUST_SPACING = GVTAttributedCharacterIterator.TextAttribute.ADJUST_SPACING; public static final Integer ADJUST_ALL = GVTAttributedCharacterIterator.TextAttribute.ADJUST_ALL; public static final GVTAttributedCharacterIterator.TextAttribute ALT_GLYPH_HANDLER = GVTAttributedCharacterIterator.TextAttribute.ALT_GLYPH_HANDLER; static Set extendedAtts = new HashSet(); static { extendedAtts.add(FLOW_PARAGRAPH); extendedAtts.add(TEXT_COMPOUND_ID); extendedAtts.add(GVT_FONT); // extendedAtts.add(BIDI_LEVEL); } /** * A unique instance of this class. */ protected static TextPainter singleton = new StrokingTextPainter(); /** * Returns a unique instance of this class. */ public static TextPainter getInstance() { return singleton; } /** * Paints the specified text node using the specified Graphics2D. * * @param node the text node to paint * @param g2d the Graphics2D to use */ public void paint(TextNode node, Graphics2D g2d) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return; List textRuns = getTextRuns(node, aci); // draw the underline and overline first, then the actual text // and finally the strikethrough paintDecorations(textRuns, g2d, TextSpanLayout.DECORATION_UNDERLINE); paintDecorations(textRuns, g2d, TextSpanLayout.DECORATION_OVERLINE); paintTextRuns(textRuns, g2d); paintDecorations (textRuns, g2d, TextSpanLayout.DECORATION_STRIKETHROUGH); } protected void printAttrs(AttributedCharacterIterator aci) { aci.first(); int start = aci.getBeginIndex(); System.out.print("AttrRuns: "); while (aci.current() != CharacterIterator.DONE) { int end = aci.getRunLimit(); System.out.print(""+(end-start)+", "); aci.setIndex(end); start = end; } System.out.println(""); } public List getTextRuns(TextNode node, AttributedCharacterIterator aci) { List textRuns = node.getTextRuns(); if (textRuns != null) { return textRuns; } AttributedCharacterIterator[] chunkACIs = getTextChunkACIs(aci); textRuns = computeTextRuns(node, aci, chunkACIs); // cache the textRuns so don't need to recalculate node.setTextRuns(textRuns); return node.getTextRuns(); } public List computeTextRuns(TextNode node, AttributedCharacterIterator aci, AttributedCharacterIterator [] chunkACIs) { int [][] chunkCharMaps = new int[chunkACIs.length][]; // reorder each chunk ACI for bidi text int chunkStart = aci.getBeginIndex(); for (int i = 0; i < chunkACIs.length; i++) { BidiAttributedCharacterIterator iter; iter = new BidiAttributedCharacterIterator (chunkACIs[i], fontRenderContext, chunkStart); chunkACIs [i] = iter; chunkCharMaps[i] = iter.getCharMap(); chunkStart += (chunkACIs[i].getEndIndex()- chunkACIs[i].getBeginIndex()); } return computeTextRuns(node, aci, chunkACIs, chunkCharMaps); } protected List computeTextRuns(TextNode node, AttributedCharacterIterator aci, AttributedCharacterIterator [] chunkACIs, int [][] chunkCharMaps) { // add font matching attributes int chunkStart = aci.getBeginIndex(); for (int i = 0; i < chunkACIs.length; i++) { chunkACIs [i] = createModifiedACIForFontMatching(chunkACIs[i]); chunkStart += (chunkACIs[i].getEndIndex() - chunkACIs[i].getBeginIndex()); } // Create text runs for each chunk and add them to the list. List perNodeRuns = new ArrayList(); TextChunk chunk, prevChunk=null; int currentChunk = 0; Point2D location = node.getLocation(); do { // Text Chunks contain one or more TextRuns, which they // create from the ACI. chunkACIs[currentChunk].first(); List perChunkRuns = new ArrayList(); chunk = getTextChunk(node, chunkACIs[currentChunk], chunkCharMaps != null ? chunkCharMaps[currentChunk] : null, perChunkRuns, prevChunk); // Perform bidi reordering on chunk's runs. Must be performed before // adjusting chunk offsets. perChunkRuns = reorderTextRuns(chunk, perChunkRuns); // Adjust according to text-anchor property value. chunkACIs[currentChunk].first(); if (chunk != null) { location = adjustChunkOffsets(location, perChunkRuns, chunk); } // Append per chunk runs to overall node runs. perNodeRuns.addAll(perChunkRuns); prevChunk = chunk; currentChunk++; } while (chunk != null && currentChunk < chunkACIs.length); return perNodeRuns; } /** * Reorder text runs as required by bidi algorithm. * @param runs - unordered runs * @return reordered runs */ protected List reorderTextRuns(TextChunk chunk, List runs) { // NOP here since they were previous reordered (by batik's // BidiAttributedCharacterIterator); derived painters (e.g., FOP) may // use a different strategy. // N.B. batik doesn't sub-divide a text chunk at bidi level // boundaries; however, derived painters may do so. return runs; } /** * Returns an array of ACIs, one for each text chunk within the given * text node. */ protected AttributedCharacterIterator[] getTextChunkACIs (AttributedCharacterIterator aci) { List aciList = new ArrayList(); int chunkStartIndex = aci.getBeginIndex(); aci.first(); Object writingMode = aci.getAttribute(WRITING_MODE); boolean vertical = (writingMode == WRITING_MODE_TTB); while (aci.setIndex(chunkStartIndex) != CharacterIterator.DONE) { TextPath prevTextPath = null; for (int start=chunkStartIndex, end=0; aci.setIndex(start) != CharacterIterator.DONE; start=end) { TextPath textPath = (TextPath) aci.getAttribute(TEXTPATH); if (start != chunkStartIndex) { // If we aren't the first composite in a chunk see // if we need to form a new TextChunk... // We only create new chunks when given an absolute // location in progression direction [Spec says // to do it for either but this doesn't make sense]. if (vertical) { Float runY = (Float) aci.getAttribute(YPOS); // Check for absolute location in layout direction. if ((runY != null) && !runY.isNaN()) break; // If so end of chunk... } else { Float runX = (Float) aci.getAttribute(XPOS); // Check for absolute location in layout direction. if ((runX != null) && !runX.isNaN()) break; // If so end of chunk... } // Do additional check for the start of a textPath if ((prevTextPath == null) && (textPath != null)) break; // If so end of chunk. // Form a new chunk at the end of a text path. // [ This is not mentioned in the spec but makes // sense]. if ((prevTextPath != null) && (textPath == null)) break; } prevTextPath = textPath; // We need to text chunk based on flow paragraphs. // This prevents BIDI reordering across paragraphs. if (aci.getAttribute(FLOW_PARAGRAPH) != null) { end = aci.getRunLimit(FLOW_PARAGRAPH); aci.setIndex(end); break; } // find end of compound. end = aci.getRunLimit(TEXT_COMPOUND_ID); if (start != chunkStartIndex) // If we aren't starting a new chunk then we know // we don't have any absolute positioning so there // is no reason to consider spliting the chunk further. continue; // We are starting a new chunk // So check if we need to split it further... TextNode.Anchor anchor; anchor = (TextNode.Anchor) aci.getAttribute(ANCHOR_TYPE); if (anchor == TextNode.Anchor.START) continue; // We need to check if we have a list of X's & Y's if // so we need to create TextChunk ACI's for each char // (technically we have to do this for // text-anchor:start as well but since that is the // default layout it doesn't matter in that case. if (vertical) { Float runY = (Float) aci.getAttribute(YPOS); // Check for absolute location in layout direction. if ((runY == null) || runY.isNaN()) // No absolute positioning in text direction continue continue; } else { Float runX = (Float) aci.getAttribute(XPOS); // Check for absolute location in layout direction. if ((runX == null) || runX.isNaN()) // No absolute positioning in text direction continue continue; } // Splitting the compound into one char chunks until // we run out of Xs. for (int i=start+1; i< end; i++) { aci.setIndex(i); if (vertical) { Float runY = (Float) aci.getAttribute(YPOS); if ((runY == null) || runY.isNaN()) break; } else { Float runX = (Float) aci.getAttribute(XPOS); if ((runX == null) || runX.isNaN()) break; } aciList.add(new AttributedCharacterSpanIterator (aci, i-1, i)); chunkStartIndex = i; } } // found the end of a text chunk int chunkEndIndex = aci.getIndex(); aciList.add(new AttributedCharacterSpanIterator (aci, chunkStartIndex, chunkEndIndex)); chunkStartIndex = chunkEndIndex; } // copy the text chunks into an array AttributedCharacterIterator[] aciArray = new AttributedCharacterIterator[aciList.size()]; Iterator iter = aciList.iterator(); for (int i=0; iter.hasNext(); ++i) { aciArray[i] = (AttributedCharacterIterator)iter.next(); } return aciArray; } /** * Returns a new AttributedCharacterIterator that contains resolved GVTFont * attributes. This is then used when creating the text runs so that the * text can be split on changes of font as well as tspans and trefs. * * @param aci The aci to be modified should already be split into * text chunks. * * @return The new modified aci. */ protected AttributedCharacterIterator createModifiedACIForFontMatching (AttributedCharacterIterator aci) { aci.first(); AttributedString as = null; int asOff = 0; int begin = aci.getBeginIndex(); boolean moreChunks = true; int start, end = aci.getRunStart(TEXT_COMPOUND_ID); while (moreChunks) { start = end; end = aci.getRunLimit(TEXT_COMPOUND_ID); int aciLength = end-start; List fonts; fonts = (List)aci.getAttribute(GVT_FONTS); float fontSize = 12; Float fsFloat = (Float)aci.getAttribute(TextAttribute.SIZE); if (fsFloat != null) fontSize = fsFloat.floatValue(); // if could not resolve at least one of the fontFamilies // then use the default font if (fonts.size() == 0) { // create a list of fonts of the correct size fonts.add(getFontFamilyResolver().getDefault().deriveFont(fontSize, aci)); } // now for each char or group of chars in the string, // find a font that can display it. boolean[] fontAssigned = new boolean[aciLength]; if (as == null) as = new AttributedString(aci); GVTFont defaultFont = null; int numSet=0; int firstUnset=start; boolean firstUnsetSet; for (int i = 0; i < fonts.size(); i++) { // assign this font to all characters it can display if it has // not already been assigned int currentIndex = firstUnset; firstUnsetSet = false; aci.setIndex(currentIndex); GVTFont font = (GVTFont)fonts.get(i); if (defaultFont == null) defaultFont = font; while (currentIndex < end) { int displayUpToIndex = font.canDisplayUpTo (aci, currentIndex, end); Object altGlyphElement; altGlyphElement = aci.getAttribute(ALT_GLYPH_HANDLER); if ( altGlyphElement != null ){ //found all the glyph to be displayed //consider the font matching done displayUpToIndex = -1; } if (displayUpToIndex == -1) { // Can handle the whole thing... displayUpToIndex = end; } if (displayUpToIndex <= currentIndex) { if (!firstUnsetSet) { firstUnset = currentIndex; firstUnsetSet = true; } // couldn't display the current char currentIndex++; } else { // could display some text, so for each // char it can display, if char not already // assigned a font, assign this font to it int runStart = -1; for (int j = currentIndex; j < displayUpToIndex; j++) { if (fontAssigned[j - start]) { if (runStart != -1) { as.addAttribute(GVT_FONT, font, runStart-begin, j-begin); runStart=-1; } } else { if (runStart == -1) runStart = j; } fontAssigned[j - start] = true; numSet++; } if (runStart != -1) { as.addAttribute(GVT_FONT, font, runStart-begin, displayUpToIndex-begin); } // set currentIndex to be one after the char // that couldn't display currentIndex = displayUpToIndex+1; } } if (numSet == aciLength) // all chars have font set; break; } // assign the first font to any chars haven't alreay been assigned int runStart = -1; GVTFontFamily prevFF = null; GVTFont prevF = defaultFont; for (int i = 0; i < aciLength; i++) { if (fontAssigned[i]) { if (runStart != -1) { as.addAttribute(GVT_FONT, prevF, runStart+asOff, i+asOff); runStart = -1; prevF = null; prevFF = null; } } else { char c = aci.setIndex(start+i); GVTFontFamily fontFamily; fontFamily = getFontFamilyResolver().getFamilyThatCanDisplay(c); // fontFamily = (GVTFontFamily)resolvedFontFamilies.get(0); if (runStart == -1) { // Starting a new run... runStart = i; prevFF = fontFamily; if (prevFF == null) prevF = defaultFont; else prevF = fontFamily.deriveFont(fontSize, aci); } else if (prevFF != fontFamily) { // Font family changed... as.addAttribute(GVT_FONT, prevF, runStart+asOff, i+asOff); runStart = i; prevFF = fontFamily; if (prevFF == null) prevF = defaultFont; else prevF = fontFamily.deriveFont(fontSize, aci); } } } if (runStart != -1) { as.addAttribute(GVT_FONT, prevF, runStart+asOff, aciLength+asOff); } asOff += aciLength; if (aci.setIndex(end) == AttributedCharacterIterator.DONE) { moreChunks = false; } start = end; } if (as != null) return as.getIterator(); // Didn't do anything return original ACI return aci; } protected FontFamilyResolver getFontFamilyResolver() { return DefaultFontFamilyResolver.SINGLETON; } protected Set getTextRunBoundaryAttributes() { return extendedAtts; } protected TextChunk getTextChunk(TextNode node, AttributedCharacterIterator aci, int [] charMap, List textRuns, TextChunk prevChunk) { int beginChunk = 0; if (prevChunk != null) beginChunk = prevChunk.end; int endChunk = beginChunk; int begin = aci.getIndex(); if (aci.current() == CharacterIterator.DONE) return null; // we now lay all aci's out at 0,0 then move them // when we adjust the chunk offsets. Point2D.Float offset = new Point2D.Float(0,0); Point2D.Float advance = new Point2D.Float(0,0); boolean isChunkStart = true; TextSpanLayout layout = null; Set textRunBoundaryAttributes = getTextRunBoundaryAttributes(); do { int start = aci.getRunStart(textRunBoundaryAttributes); int end = aci.getRunLimit(textRunBoundaryAttributes); AttributedCharacterIterator runaci; runaci = new AttributedCharacterSpanIterator(aci, start, end); int [] subCharMap = new int[end-start]; if (charMap != null) { System.arraycopy( charMap, start - begin, subCharMap, 0, subCharMap.length ); } else { for (int i = 0, n = subCharMap.length; i < n; ++i) { subCharMap[i] = i; } } FontRenderContext frc = fontRenderContext; RenderingHints rh = node.getRenderingHints(); // Check for optimizeSpeed, optimizeLegibility // in these cases setup hintedFRC if ((rh != null) && (rh.get(RenderingHints.KEY_TEXT_ANTIALIASING) == RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)) { // In both these cases we want the non-antialiased // font render context. frc = aaOffFontRenderContext; } layout = getTextLayoutFactory().createTextLayout (runaci, subCharMap, offset, frc); textRuns.add(new TextRun(layout, runaci, isChunkStart)); Point2D layoutAdvance = layout.getAdvance2D(); advance.x += (float)layoutAdvance.getX(); advance.y += (float)layoutAdvance.getY(); ++endChunk; if (aci.setIndex(end) == CharacterIterator.DONE) break; isChunkStart = false; } while (true); return new TextChunk(beginChunk, endChunk, advance); } /** * Adjusts the position of the text runs within the specified text chunk * to account for any text anchor properties. */ protected Point2D adjustChunkOffsets(Point2D location, List textRuns, TextChunk chunk) { int numRuns = chunk.end - chunk.begin; TextRun r = (TextRun) textRuns.get(0); int anchorType = r.getAnchorType(); Float length = r.getLength(); Integer lengthAdj = r.getLengthAdjust(); boolean doAdjust = true; if ((length == null) || length.isNaN()) doAdjust = false; int numChars = 0; for (int i = 0; i < numRuns; ++i) { r = (TextRun) textRuns.get(i); AttributedCharacterIterator aci = r.getACI(); numChars += aci.getEndIndex() - aci.getBeginIndex(); } if ((lengthAdj == GVTAttributedCharacterIterator.TextAttribute.ADJUST_SPACING) && (numChars == 1)) doAdjust = false; float xScale = 1; float yScale = 1; r = (TextRun)textRuns.get(numRuns - 1); TextSpanLayout layout = r.getLayout(); GVTGlyphMetrics lastMetrics = layout.getGlyphMetrics(layout.getGlyphCount()-1); GVTLineMetrics lastLineMetrics = layout.getLineMetrics(); Rectangle2D lastBounds = lastMetrics.getBounds2D(); float halfLeading = (lastMetrics.getVerticalAdvance()- (lastLineMetrics.getAscent() + lastLineMetrics.getDescent()))/2; float lastW = (float)(lastBounds.getWidth() + lastBounds.getX()); float lastH = (float)(halfLeading + lastLineMetrics.getAscent() + (lastBounds.getHeight() + lastBounds.getY())); Point2D visualAdvance; if (!doAdjust) { visualAdvance = new Point2D.Float( (float) (chunk.advance.getX()), (float) (chunk.advance.getY() + lastH - lastMetrics.getVerticalAdvance())); } else { Point2D advance = chunk.advance; // We have to do this here since textLength needs to be // handled at the text chunk level. Otherwise tspans get // messed up. if (layout.isVertical()) { if (lengthAdj == ADJUST_SPACING) { yScale = (float) ((length.floatValue() - lastH) / (advance.getY() - lastMetrics.getVerticalAdvance())); } else { double adv =(advance.getY() + lastH - lastMetrics.getVerticalAdvance()); yScale = (float)(length.floatValue()/adv); } visualAdvance = new Point2D.Float(0, length.floatValue()); } else { if (lengthAdj == ADJUST_SPACING) { xScale = (float) ((length.floatValue() - lastW) / (advance.getX() - lastMetrics.getHorizontalAdvance())); } else { double adv = (advance.getX() + lastW - lastMetrics.getHorizontalAdvance()); xScale = (float)(length.floatValue()/adv); } visualAdvance = new Point2D.Float(length.floatValue(), 0); } Point2D.Float adv = new Point2D.Float(0,0); for (int i = 0; i < numRuns; ++i) { r = (TextRun) textRuns.get(i); layout = r.getLayout(); layout.setScale(xScale, yScale, lengthAdj==ADJUST_SPACING); Point2D lAdv = layout.getAdvance2D(); adv.x += (float)lAdv.getX(); adv.y += (float)lAdv.getY(); } chunk.advance = adv; } float dx = 0f; float dy = 0f; switch(anchorType){ case TextNode.Anchor.ANCHOR_MIDDLE: dx = (float) (-visualAdvance.getX()/2d); dy = (float) (-visualAdvance.getY()/2d); break; case TextNode.Anchor.ANCHOR_END: dx = (float) (-visualAdvance.getX()); dy = (float) (-visualAdvance.getY()); break; default: break; // leave untouched } r = (TextRun) textRuns.get(0); layout = r.getLayout(); AttributedCharacterIterator runaci = r.getACI(); runaci.first(); boolean vertical = layout.isVertical(); Float runX = (Float) runaci.getAttribute(XPOS); Float runY = (Float) runaci.getAttribute(YPOS); TextPath textPath = (TextPath) runaci.getAttribute(TEXTPATH); // The point that the next peice of normal text should be // layed out from, only used for normal text not text on a path. float absX = (float)location.getX(); float absY = (float)location.getY(); // TextPath Shift used to account for startOffset. float tpShiftX = 0; float tpShiftY = 0; // Of course X and Y override that, but they don't apply for // text on a path. if ((runX != null) && (!runX.isNaN())) { absX = runX.floatValue(); tpShiftX = absX; } if ((runY != null) && (!runY.isNaN())) { absY = runY.floatValue(); tpShiftY = absY; } // Factor in text-anchor in writing direction. // Ignore tpShift in non-writing direction. if (vertical) { absY += dy; tpShiftY += dy; tpShiftX = 0; } else { absX += dx; tpShiftX += dx; tpShiftY = 0; } for (int i = 0; i < numRuns; ++i) { r = (TextRun) textRuns.get(i); layout = r.getLayout(); runaci = r.getACI(); runaci.first(); textPath = (TextPath) runaci.getAttribute(TEXTPATH); if (vertical) { runX = (Float) runaci.getAttribute(XPOS); if ((runX != null) && (!runX.isNaN())) { absX = runX.floatValue(); } } else { runY = (Float) runaci.getAttribute(YPOS); if ((runY != null) && (!runY.isNaN())) { absY = runY.floatValue(); } } if (textPath == null) { layout.setOffset(new Point2D.Float(absX, absY)); Point2D ladv = layout.getAdvance2D(); absX += ladv.getX(); absY += ladv.getY(); } else { layout.setOffset(new Point2D.Float(tpShiftX, tpShiftY)); Point2D ladv = layout.getAdvance2D(); tpShiftX += (float)ladv.getX(); tpShiftY += (float)ladv.getY(); ladv = layout.getTextPathAdvance(); absX = (float)ladv.getX(); absY = (float)ladv.getY(); } } return new Point2D.Float(absX, absY); } /** * Paints decorations of the specified type. */ protected void paintDecorations(List textRuns, Graphics2D g2d, int decorationType) { Paint prevPaint = null; Paint prevStrokePaint = null; Stroke prevStroke = null; boolean prevVisible = true; Rectangle2D decorationRect = null; double yLoc = 0, height = 0; for (int i = 0; i < textRuns.size(); i++) { TextRun textRun = (TextRun)textRuns.get(i); AttributedCharacterIterator runaci = textRun.getACI(); runaci.first(); Paint paint = null; Stroke stroke = null; Paint strokePaint = null; boolean visible = true; TextPaintInfo tpi = (TextPaintInfo)runaci.getAttribute(PAINT_INFO); if (tpi != null) { visible = tpi.visible; if (tpi.composite != null) { g2d.setComposite(tpi.composite); } switch (decorationType) { case TextSpanLayout.DECORATION_UNDERLINE : paint = tpi.underlinePaint; stroke = tpi.underlineStroke; strokePaint = tpi.underlineStrokePaint; break; case TextSpanLayout.DECORATION_OVERLINE : paint = tpi.overlinePaint; stroke = tpi.overlineStroke; strokePaint = tpi.overlineStrokePaint; break; case TextSpanLayout.DECORATION_STRIKETHROUGH : paint = tpi.strikethroughPaint; stroke = tpi.strikethroughStroke; strokePaint = tpi.strikethroughStrokePaint; break; default: // should never get here return; } } if (textRun.isFirstRunInChunk()) { Shape s = textRun.getLayout().getDecorationOutline (decorationType); Rectangle2D r2d = s.getBounds2D(); yLoc = r2d.getY(); height = r2d.getHeight(); } if (textRun.isFirstRunInChunk() || (paint != prevPaint) || (stroke != prevStroke) || (strokePaint != prevStrokePaint) || (visible != prevVisible)) { // if there is a current visible decoration, draw it now if (prevVisible && (decorationRect != null)) { if (prevPaint != null) { // fill the decoration g2d.setPaint(prevPaint); g2d.fill(decorationRect); } if (prevStroke != null && prevStrokePaint != null) { // stroke the decoration g2d.setPaint(prevStrokePaint); g2d.setStroke(prevStroke); g2d.draw(decorationRect); } } decorationRect = null; } if ((paint != null || strokePaint != null) && !textRun.getLayout().isVertical() && !textRun.getLayout().isOnATextPath()) { // this text run should be decorated with the // specified decoration type // NOTE: decorations are only supported for plain // horizontal layouts Shape decorationShape = textRun.getLayout().getDecorationOutline(decorationType); if (decorationRect == null) { // create a new one Rectangle2D r2d = decorationShape.getBounds2D(); decorationRect = new Rectangle2D.Double (r2d.getX(), yLoc, r2d.getWidth(), height); } else { // extend the current one Rectangle2D bounds = decorationShape.getBounds2D(); double minX = Math.min(decorationRect.getX(), bounds.getX()); double maxX = Math.max(decorationRect.getMaxX(), bounds.getMaxX()); decorationRect.setRect(minX, yLoc, maxX-minX, height); } } prevPaint = paint; prevStroke = stroke; prevStrokePaint = strokePaint; prevVisible = visible; } // if there is a decoration rect that hasn't been drawn yet and // the text paint info says the test is visible, draw it now. if (prevVisible && (decorationRect != null)) { if (prevPaint != null) { // fill the decoration g2d.setPaint(prevPaint); g2d.fill(decorationRect); } if (prevStroke != null && prevStrokePaint != null) { // stroke the decoration g2d.setPaint(prevStrokePaint); g2d.setStroke(prevStroke); g2d.draw(decorationRect); } } } /** * Paints the text in each text run. Decorations are not painted here. */ protected void paintTextRuns(List textRuns, Graphics2D g2d) { for (int i = 0; i < textRuns.size(); i++) { TextRun textRun = (TextRun)textRuns.get(i); AttributedCharacterIterator runaci = textRun.getACI(); runaci.first(); TextPaintInfo tpi = (TextPaintInfo)runaci.getAttribute(PAINT_INFO); if ((tpi != null) && (tpi.composite != null)) { g2d.setComposite(tpi.composite); } textRun.getLayout().draw(g2d); } } /** * Get a Shape in userspace coords which defines the textnode glyph outlines. * @param node the TextNode to measure */ public Shape getOutline(TextNode node) { GeneralPath outline = null; AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; // get the list of text runs List textRuns = getTextRuns(node, aci); // for each text run, get its outline and append it to the overall // outline for (int i = 0; i < textRuns.size(); ++i) { TextRun textRun = (TextRun)textRuns.get(i); TextSpanLayout textRunLayout = textRun.getLayout(); GeneralPath textRunOutline = new GeneralPath(textRunLayout.getOutline()); if (outline == null) { outline = textRunOutline; } else { outline.setWindingRule(GeneralPath.WIND_NON_ZERO); outline.append(textRunOutline, false); } } // append any decoration outlines Shape underline = getDecorationOutline (textRuns, TextSpanLayout.DECORATION_UNDERLINE); Shape strikeThrough = getDecorationOutline (textRuns, TextSpanLayout.DECORATION_STRIKETHROUGH); Shape overline = getDecorationOutline (textRuns, TextSpanLayout.DECORATION_OVERLINE); if (underline != null) { if (outline == null) { outline = new GeneralPath(underline); } else { outline.setWindingRule(GeneralPath.WIND_NON_ZERO); outline.append(underline, false); } } if (strikeThrough != null) { if (outline == null) { outline = new GeneralPath(strikeThrough); } else { outline.setWindingRule(GeneralPath.WIND_NON_ZERO); outline.append(strikeThrough, false); } } if (overline != null) { if (outline == null) { outline = new GeneralPath(overline); } else { outline.setWindingRule(GeneralPath.WIND_NON_ZERO); outline.append(overline, false); } } return outline; } /** * Get a Rectangle2D in userspace coords which encloses the textnode * glyphs including stroke etc. */ public Rectangle2D getBounds2D(TextNode node) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; // get the list of text runs List textRuns = getTextRuns(node, aci); Rectangle2D bounds = null; // for each text run, get its stroke outline and append it to // the overall outline for (int i = 0; i < textRuns.size(); ++i) { TextRun textRun = (TextRun)textRuns.get(i); TextSpanLayout textRunLayout = textRun.getLayout(); Rectangle2D runBounds = textRunLayout.getBounds2D(); if (runBounds != null) { if (bounds == null) bounds = runBounds; else bounds.add( runBounds ); } } // append any stroked decoration outlines Shape underline = getDecorationStrokeOutline (textRuns, TextSpanLayout.DECORATION_UNDERLINE); if (underline != null) { if (bounds == null) bounds = underline.getBounds2D(); else bounds.add( underline.getBounds2D() ); } Shape strikeThrough = getDecorationStrokeOutline (textRuns, TextSpanLayout.DECORATION_STRIKETHROUGH); if (strikeThrough != null) { if (bounds == null) bounds = strikeThrough.getBounds2D(); else bounds.add( strikeThrough.getBounds2D() ); } Shape overline = getDecorationStrokeOutline (textRuns, TextSpanLayout.DECORATION_OVERLINE); if (overline != null) { if (bounds == null) bounds = overline.getBounds2D(); else bounds.add( overline.getBounds2D() ); } return bounds; } /** * Returns the outline of the specified decoration type. * * @param textRuns The list of text runs to get the decoration outline for. * @param decorationType Indicates the type of decoration required. * eg. underline, overline or strikethrough. * * @return The decoration outline or null if the text is not decorated. */ protected Shape getDecorationOutline(List textRuns, int decorationType) { GeneralPath outline = null; Paint prevPaint = null; Paint prevStrokePaint = null; Stroke prevStroke = null; Rectangle2D decorationRect = null; double yLoc = 0, height = 0; for (int i = 0; i < textRuns.size(); i++) { TextRun textRun = (TextRun)textRuns.get(i); AttributedCharacterIterator runaci = textRun.getACI(); runaci.first(); Paint paint = null; Stroke stroke = null; Paint strokePaint = null; TextPaintInfo tpi = (TextPaintInfo)runaci.getAttribute(PAINT_INFO); if (tpi != null) { switch (decorationType) { case TextSpanLayout.DECORATION_UNDERLINE : paint = tpi.underlinePaint; stroke = tpi.underlineStroke; strokePaint = tpi.underlineStrokePaint; break; case TextSpanLayout.DECORATION_OVERLINE : paint = tpi.overlinePaint; stroke = tpi.overlineStroke; strokePaint = tpi.overlineStrokePaint; break; case TextSpanLayout.DECORATION_STRIKETHROUGH : paint = tpi.strikethroughPaint; stroke = tpi.strikethroughStroke; strokePaint = tpi.strikethroughStrokePaint; break; default: // should never get here return null; } } if (textRun.isFirstRunInChunk()) { Shape s = textRun.getLayout().getDecorationOutline (decorationType); Rectangle2D r2d = s.getBounds2D(); yLoc = r2d.getY(); height = r2d.getHeight(); } if (textRun.isFirstRunInChunk() || paint != prevPaint || stroke != prevStroke || strokePaint != prevStrokePaint) { // if there is a current decoration, added it to the overall // outline if (decorationRect != null) { if (outline == null) { outline = new GeneralPath(decorationRect); } else { outline.append(decorationRect, false); } decorationRect = null; } } if ((paint != null || strokePaint != null) && !textRun.getLayout().isVertical() && !textRun.getLayout().isOnATextPath()) { // this text run should be decorated with the specified // decoration type note: decorations are only supported for // plain horizontal layouts Shape decorationShape = textRun.getLayout().getDecorationOutline(decorationType); if (decorationRect == null) { // create a new one Rectangle2D r2d = decorationShape.getBounds2D(); decorationRect = new Rectangle2D.Double (r2d.getX(), yLoc, r2d.getWidth(), height); } else { // extend the current one Rectangle2D bounds = decorationShape.getBounds2D(); double minX = Math.min(decorationRect.getX(), bounds.getX()); double maxX = Math.max(decorationRect.getMaxX(), bounds.getMaxX()); decorationRect.setRect(minX, yLoc, maxX-minX, height); } } prevPaint = paint; prevStroke = stroke; prevStrokePaint = strokePaint; } // if there is a decoration rect that hasn't been added to the overall outline if (decorationRect != null) { if (outline == null) { outline = new GeneralPath(decorationRect); } else { outline.append(decorationRect, false); } } return outline; } /** * Returns the stroked outline of the specified decoration type. * If the decoration has no stroke it will return the fill outline * * @param textRuns The list of text runs to get the decoration outline for. * @param decorationType Indicates the type of decoration required. * eg. underline, overline or strikethrough. * * @return The decoration outline or null if the text is not decorated. */ protected Shape getDecorationStrokeOutline (List textRuns, int decorationType) { GeneralPath outline = null; Paint prevPaint = null; Paint prevStrokePaint = null; Stroke prevStroke = null; Rectangle2D decorationRect = null; double yLoc = 0, height = 0; for (int i = 0; i < textRuns.size(); i++) { TextRun textRun = (TextRun)textRuns.get(i); AttributedCharacterIterator runaci = textRun.getACI(); runaci.first(); Paint paint = null; Stroke stroke = null; Paint strokePaint = null; TextPaintInfo tpi = (TextPaintInfo)runaci.getAttribute(PAINT_INFO); if (tpi != null) { switch (decorationType) { case TextSpanLayout.DECORATION_UNDERLINE : paint = tpi.underlinePaint; stroke = tpi.underlineStroke; strokePaint = tpi.underlineStrokePaint; break; case TextSpanLayout.DECORATION_OVERLINE : paint = tpi.overlinePaint; stroke = tpi.overlineStroke; strokePaint = tpi.overlineStrokePaint; break; case TextSpanLayout.DECORATION_STRIKETHROUGH : paint = tpi.strikethroughPaint; stroke = tpi.strikethroughStroke; strokePaint = tpi.strikethroughStrokePaint; break; default: // should never get here return null; } } if (textRun.isFirstRunInChunk()) { Shape s = textRun.getLayout().getDecorationOutline (decorationType); Rectangle2D r2d = s.getBounds2D(); yLoc = r2d.getY(); height = r2d.getHeight(); } if (textRun.isFirstRunInChunk() || paint != prevPaint || stroke != prevStroke || strokePaint != prevStrokePaint) { // if there is a current decoration, added it to the overall // outline if (decorationRect != null) { Shape s = null; if (prevStroke != null && prevStrokePaint != null) s = prevStroke.createStrokedShape(decorationRect); else if (prevPaint != null) s = decorationRect; if (s != null) { if (outline == null) outline = new GeneralPath(s); else outline.append(s, false); } decorationRect = null; } } if ((paint != null || strokePaint != null) && !textRun.getLayout().isVertical() && !textRun.getLayout().isOnATextPath()) { // this text run should be decorated with the specified // decoration type note: decorations are only supported for // plain horizontal layouts Shape decorationShape = textRun.getLayout().getDecorationOutline(decorationType); if (decorationRect == null) { // create a new one Rectangle2D r2d = decorationShape.getBounds2D(); decorationRect = new Rectangle2D.Double (r2d.getX(), yLoc, r2d.getWidth(), height); } else { // extend the current one Rectangle2D bounds = decorationShape.getBounds2D(); double minX = Math.min(decorationRect.getX(), bounds.getX()); double maxX = Math.max(decorationRect.getMaxX(), bounds.getMaxX()); decorationRect.setRect(minX, yLoc, maxX-minX, height); } } prevPaint = paint; prevStroke = stroke; prevStrokePaint = strokePaint; } // if there is a decoration rect that hasn't been added to the overall // outline if (decorationRect != null) { Shape s = null; if (prevStroke != null && prevStrokePaint != null) s = prevStroke.createStrokedShape(decorationRect); else if (prevPaint != null) s = decorationRect; if (s != null) { if (outline == null) outline = new GeneralPath(s); else outline.append(s, false); } } return outline; } public Mark getMark(TextNode node, int index, boolean leadingEdge) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; if ((index < aci.getBeginIndex()) || (index > aci.getEndIndex())) return null; TextHit textHit = new TextHit(index, leadingEdge); return new BasicTextPainter.BasicMark(node, textHit); } protected Mark hitTest(double x, double y, TextNode node) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; // get the list of text runs List textRuns = getTextRuns(node, aci); if (textRuns != null) { // for each text run, see if its been hit for (int i = 0; i < textRuns.size(); ++i) { TextRun textRun = (TextRun)textRuns.get(i); TextSpanLayout layout = textRun.getLayout(); TextHit textHit = layout.hitTestChar((float) x, (float) y); Rectangle2D bounds = layout.getBounds2D(); if ((textHit != null) && (bounds != null) && bounds.contains(x,y)) return new BasicTextPainter.BasicMark(node, textHit); } } return null; } /** * Selects the first glyph in the text node. */ public Mark selectFirst(TextNode node) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; TextHit textHit = new TextHit(aci.getBeginIndex(), false); return new BasicTextPainter.BasicMark(node, textHit); } /** * Selects the last glyph in the text node. */ public Mark selectLast(TextNode node) { AttributedCharacterIterator aci; aci = node.getAttributedCharacterIterator(); if (aci == null) return null; TextHit textHit = new TextHit(aci.getEndIndex()-1, false); return new BasicTextPainter.BasicMark(node, textHit); } /** * Returns an array of ints representing begin/end index pairs into * an AttributedCharacterIterator which represents the text * selection delineated by two Mark instances. * Note: The Mark instances passed must have been instantiated by * an instance of this enclosing TextPainter implementation. */ public int[] getSelected(Mark startMark, Mark finishMark) { if (startMark == null || finishMark == null) { return null; } BasicTextPainter.BasicMark start; BasicTextPainter.BasicMark finish; try { start = (BasicTextPainter.BasicMark) startMark; finish = (BasicTextPainter.BasicMark) finishMark; } catch (ClassCastException cce) { throw new Error ("This Mark was not instantiated by this TextPainter class!"); } TextNode textNode = start.getTextNode(); if (textNode == null) return null; if (textNode != finish.getTextNode()) throw new Error("Markers are from different TextNodes!"); AttributedCharacterIterator aci; aci = textNode.getAttributedCharacterIterator(); if (aci == null) return null; int[] result = new int[2]; result[0] = start.getHit().getCharIndex(); result[1] = finish.getHit().getCharIndex(); // get the list of text runs List textRuns = getTextRuns(textNode, aci); Iterator trI = textRuns.iterator(); int startGlyphIndex = -1; int endGlyphIndex = -1; TextSpanLayout startLayout=null, endLayout=null; while (trI.hasNext()) { TextRun tr = (TextRun)trI.next(); TextSpanLayout tsl = tr.getLayout(); if (startGlyphIndex == -1) { startGlyphIndex = tsl.getGlyphIndex(result[0]); if (startGlyphIndex != -1) startLayout = tsl; } if (endGlyphIndex == -1) { endGlyphIndex = tsl.getGlyphIndex(result[1]); if (endGlyphIndex != -1) endLayout = tsl; } if ((startGlyphIndex != -1) && (endGlyphIndex != -1)) break; } if ((startLayout == null) || (endLayout == null)) return null; int startCharCount = startLayout.getCharacterCount (startGlyphIndex, startGlyphIndex); int endCharCount = endLayout.getCharacterCount (endGlyphIndex, endGlyphIndex); if (startCharCount > 1) { if (result[0] > result[1] && startLayout.isLeftToRight()) { result[0] += startCharCount-1; } else if (result[1] > result[0] && !startLayout.isLeftToRight()) { result[0] -= startCharCount-1; } } if (endCharCount > 1) { if (result[1] > result[0] && endLayout.isLeftToRight()) { result[1] += endCharCount-1; } else if (result[0] > result[1] && !endLayout.isLeftToRight()) { result[1] -= endCharCount-1; } } return result; } /** * Return a Shape, in the coordinate system of the text layout, * which encloses the text selection delineated by two Mark instances. * Note: The Mark instances passed must have been instantiated by * an instance of this enclosing TextPainter implementation. */ public Shape getHighlightShape(Mark beginMark, Mark endMark) { if (beginMark == null || endMark == null) { return null; } BasicTextPainter.BasicMark begin; BasicTextPainter.BasicMark end; try { begin = (BasicTextPainter.BasicMark) beginMark; end = (BasicTextPainter.BasicMark) endMark; } catch (ClassCastException cce) { throw new Error ("This Mark was not instantiated by this TextPainter class!"); } TextNode textNode = begin.getTextNode(); if (textNode == null) return null; if (textNode != end.getTextNode()) throw new Error("Markers are from different TextNodes!"); AttributedCharacterIterator aci; aci = textNode.getAttributedCharacterIterator(); if (aci == null) return null; int beginIndex = begin.getHit().getCharIndex(); int endIndex = end.getHit().getCharIndex(); if (beginIndex > endIndex) { // Swap them... BasicTextPainter.BasicMark tmpMark = begin; begin = end; end = tmpMark; int tmpIndex = beginIndex; beginIndex = endIndex; endIndex = tmpIndex; } // get the list of text runs List textRuns = getTextRuns(textNode, aci); GeneralPath highlightedShape = new GeneralPath(); // for each text run, append any highlight it may contain for // the current selection for (int i = 0; i < textRuns.size(); ++i) { TextRun textRun = (TextRun)textRuns.get(i); TextSpanLayout layout = textRun.getLayout(); Shape layoutHighlightedShape = layout.getHighlightShape (beginIndex, endIndex); // append the highlighted shape of this layout to the // overall hightlighted shape if (( layoutHighlightedShape != null) && (!layoutHighlightedShape.getBounds().isEmpty())) { highlightedShape.append(layoutHighlightedShape, false); } } return highlightedShape; } // inner classes public class TextChunk { // the following denote indices of text runs over all chunks of text node, // where index 0 is first run of first chunk of text node; the begin index // of the first chunk is 0; for subsequent chunks, the begin index is the // end index of its immediately previous chunk; the end index is exclusive public int begin; public int end; public Point2D advance; // sum of advances of runs in chunk public TextChunk(int begin, int end, Point2D advance) { this.begin = begin; this.end = end; this.advance = new Point2D.Float((float) advance.getX(), (float) advance.getY()); } } /** * Inner convenience class for associating a TextLayout for * sub-spans, and the ACI which iterates over that subspan. */ public class TextRun { protected AttributedCharacterIterator aci; // source aci protected TextSpanLayout layout; // layout object protected int anchorType; // text-anchor attribute protected boolean firstRunInChunk; // first run in chunk flag protected Float length; // textLength attribute protected Integer lengthAdjust; // lengthAdjust attribute private int level; // resolved bidi level of run private int reversals; // reversal count public TextRun(TextSpanLayout layout, AttributedCharacterIterator aci, boolean firstRunInChunk) { this.layout = layout; this.aci = aci; this.aci.first(); this.firstRunInChunk = firstRunInChunk; this.anchorType = TextNode.Anchor.ANCHOR_START; TextNode.Anchor anchor = (TextNode.Anchor) aci.getAttribute (GVTAttributedCharacterIterator.TextAttribute.ANCHOR_TYPE); if (anchor != null) { this.anchorType = anchor.getType(); } // if writing mode is right to left, then need to reverse the // text anchor positions if (aci.getAttribute(WRITING_MODE) == WRITING_MODE_RTL) { if (anchorType == TextNode.Anchor.ANCHOR_START) { anchorType = TextNode.Anchor.ANCHOR_END; } else if (anchorType == TextNode.Anchor.ANCHOR_END) { anchorType = TextNode.Anchor.ANCHOR_START; } // leave middle as is } length = (Float) aci.getAttribute (GVTAttributedCharacterIterator.TextAttribute.BBOX_WIDTH); lengthAdjust = (Integer) aci.getAttribute (GVTAttributedCharacterIterator.TextAttribute.LENGTH_ADJUST); Integer level = (Integer) aci.getAttribute(BIDI_LEVEL); if (level != null) { this.level = level.intValue(); } else { this.level = -1; } } public AttributedCharacterIterator getACI() { return aci; } public TextSpanLayout getLayout() { return layout; } public int getAnchorType() { return anchorType; } public Float getLength() { return length; } public Integer getLengthAdjust() { return lengthAdjust; } public boolean isFirstRunInChunk() { return firstRunInChunk; } public int getBidiLevel() { return level; } public void reverse() { reversals++; } public void maybeReverseGlyphs(boolean mirror) { if ((reversals & 1) == 1) { layout.maybeReverse(mirror); } } } } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/BridgeUpdateHandler.java0000644000175000017500000000464013063003352030753 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.anim.dom.AnimatedLiveAttributeValue; import org.apache.batik.css.engine.CSSEngineEvent; import org.w3c.dom.events.MutationEvent; /** * Interface for objects interested in being notified of updates. * * @author Vincent Hardy * @author Thierry Kormann * @version $Id: BridgeUpdateHandler.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface BridgeUpdateHandler { /** * Invoked when an MutationEvent of type 'DOMAttrModified' is fired. */ void handleDOMAttrModifiedEvent(MutationEvent evt); /** * Invoked when an MutationEvent of type 'DOMNodeInserted' is fired. */ void handleDOMNodeInsertedEvent(MutationEvent evt); /** * Invoked when an MutationEvent of type 'DOMNodeRemoved' is fired. */ void handleDOMNodeRemovedEvent(MutationEvent evt); /** * Invoked when an MutationEvent of type 'DOMCharacterDataModified' * is fired. */ void handleDOMCharacterDataModified(MutationEvent evt); /** * Invoked when an CSSEngineEvent is fired. */ void handleCSSEngineEvent(CSSEngineEvent evt); /** * Invoked when the animated value of an animated attribute has changed. */ void handleAnimatedAttributeChanged(AnimatedLiveAttributeValue alav); /** * Invoked when an 'other' animation value has changed. */ void handleOtherAnimationChanged(String type); /** * Disposes this BridgeUpdateHandler and releases all resources. */ void dispose(); } batik-1.9.orig/batik-bridge/src/main/java/org/apache/batik/bridge/BaseScriptingEnvironment.java0000644000175000017500000007506213063003346032111 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PushbackInputStream; import java.io.Reader; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import java.util.jar.Manifest; import org.apache.batik.dom.AbstractElement; import org.apache.batik.dom.events.AbstractEvent; import org.apache.batik.dom.events.NodeEventTarget; import org.apache.batik.dom.util.XLinkSupport; import org.apache.batik.script.Interpreter; import org.apache.batik.script.InterpreterException; import org.apache.batik.script.ScriptEventWrapper; import org.apache.batik.util.ParsedURL; import org.apache.batik.util.SVGConstants; import org.apache.batik.util.XMLConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.events.DocumentEvent; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.w3c.dom.svg.SVGDocument; import org.w3c.dom.svg.SVGSVGElement; import org.w3c.dom.svg.EventListenerInitializer; /** * This class is the base class for SVG scripting. * * @author Stephane Hillion * @version $Id: BaseScriptingEnvironment.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class BaseScriptingEnvironment { /** * Constant used to describe inline scripts. *

     * {0} - URL of document containing script.
     * {1} - Element tag
     * {2} - line number of element.
     * 
*/ public static final String INLINE_SCRIPT_DESCRIPTION = "BaseScriptingEnvironment.constant.inline.script.description"; /** * Constant used to describe inline scripts. *
     * {0} - URL of document containing script.
     * {1} - Event attribute name
     * {2} - line number of element.
     * 
*/ public static final String EVENT_SCRIPT_DESCRIPTION = "BaseScriptingEnvironment.constant.event.script.description"; /** * Tells whether the given SVG document is dynamic. */ public static boolean isDynamicDocument(BridgeContext ctx, Document doc) { Element elt = doc.getDocumentElement(); if ((elt != null) && SVGConstants.SVG_NAMESPACE_URI.equals(elt.getNamespaceURI())) { if (elt.getAttributeNS (null, SVGConstants.SVG_ONABORT_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONERROR_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONRESIZE_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONUNLOAD_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONSCROLL_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONZOOM_ATTRIBUTE).length() > 0) { return true; } return isDynamicElement(ctx, doc.getDocumentElement()); } return false; } public static boolean isDynamicElement(BridgeContext ctx, Element elt) { List bridgeExtensions = ctx.getBridgeExtensions(elt.getOwnerDocument()); return isDynamicElement(elt, ctx, bridgeExtensions); } /** * Tells whether the given SVG element is dynamic. */ public static boolean isDynamicElement (Element elt, BridgeContext ctx, List bridgeExtensions) { Iterator i = bridgeExtensions.iterator(); while (i.hasNext()) { BridgeExtension bridgeExtension = (BridgeExtension) i.next(); if (bridgeExtension.isDynamicElement(elt)) { return true; } } if (SVGConstants.SVG_NAMESPACE_URI.equals(elt.getNamespaceURI())) { if (elt.getAttributeNS (null, SVGConstants.SVG_ONKEYUP_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONKEYDOWN_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONKEYPRESS_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONLOAD_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONERROR_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONACTIVATE_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONCLICK_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONFOCUSIN_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONFOCUSOUT_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONMOUSEDOWN_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONMOUSEMOVE_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONMOUSEOUT_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONMOUSEOVER_ATTRIBUTE).length() > 0) { return true; } if (elt.getAttributeNS (null, SVGConstants.SVG_ONMOUSEUP_ATTRIBUTE).length() > 0) { return true; } } for (Node n = elt.getFirstChild(); n != null; n = n.getNextSibling()) { if (n.getNodeType() == Node.ELEMENT_NODE) { if (isDynamicElement(ctx, (Element)n)) { return true; } } } return false; } protected static final String EVENT_NAME = "event"; protected static final String ALTERNATE_EVENT_NAME = "evt"; /** * The 'application/ecmascript' MIME type. */ protected static final String APPLICATION_ECMASCRIPT = "application/ecmascript"; /** * The bridge context. */ protected BridgeContext bridgeContext; /** * The user-agent. */ protected UserAgent userAgent; /** * The document to manage. */ protected Document document; /** * The URL of the document ot manage */ protected ParsedURL docPURL; protected Set languages = new HashSet(); /** * The default Interpreter for the document */ protected Interpreter interpreter; /** * Map of {@link Interpreter} to {@link org.apache.batik.bridge.Window} * objects. */ protected Map windowObjects = new HashMap(); /** * Set of <script> elements that have already been executed. */ protected WeakHashMap executedScripts = new WeakHashMap(); /** * Creates a new BaseScriptingEnvironment. * @param ctx the bridge context */ public BaseScriptingEnvironment(BridgeContext ctx) { bridgeContext = ctx; document = ctx.getDocument(); docPURL = new ParsedURL(((SVGDocument)document).getURL()); userAgent = bridgeContext.getUserAgent(); } /** * Returns the Window object for the specified {@link Interpreter}. */ public org.apache.batik.bridge.Window getWindow(Interpreter interp, String lang) { org.apache.batik.bridge.Window w = (org.apache.batik.bridge.Window) windowObjects.get(interp); if (w == null) { w = interp == null ? new Window(null, null) : createWindow(interp, lang); windowObjects.put(interp, w); } return w; } /** * Returns the Window object for scripting languages that have no * {@link Interpreter} object. */ public org.apache.batik.bridge.Window getWindow() { return getWindow(null, null); } /** * Creates a new Window object. */ protected org.apache.batik.bridge.Window createWindow(Interpreter interp, String lang) { return new Window(interp, lang); } /** * Returns the default Interpreter for this document. */ public Interpreter getInterpreter() { if (interpreter != null) return interpreter; SVGSVGElement root = (SVGSVGElement)document.getDocumentElement(); String lang = root.getContentScriptType(); return getInterpreter(lang); } public Interpreter getInterpreter(String lang) { interpreter = bridgeContext.getInterpreter(lang); if (interpreter == null) { if (languages.contains(lang)) { // Already issued warning so just return null. return null; } // So we know we have processed this interpreter. languages.add(lang); return null; } if (!languages.contains(lang)) { languages.add(lang); initializeEnvironment(interpreter, lang); } return interpreter; } /** * Initializes the environment of the given interpreter. */ public void initializeEnvironment(Interpreter interp, String lang) { interp.bindObject("window", getWindow(interp, lang)); } /** * Loads the scripts contained in the <script> elements. */ public void loadScripts() { NodeList scripts = document.getElementsByTagNameNS (SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_SCRIPT_TAG); int len = scripts.getLength(); for (int i = 0; i < len; i++) { AbstractElement script = (AbstractElement) scripts.item(i); loadScript(script); } } /** * Executes the specified <script> element, if it hasn't been * executed already. */ protected void loadScript(AbstractElement script) { // Don't execute 1 2 3 4 5 6 7 8 SVG Mines Mines Left: Board Size: Left: show Right or Shift: place flag Middle or Control: show surround ? Start new game NG Working batik-1.9.orig/samples/sydney.svg0000644000175000017500000001424213063003304016431 0ustar mans0954mans0954 Click and drag to move images Click and drag to move images batik-1.9.orig/samples/starfield.svg0000644000175000017500000003125513063003304017076 0ustar mans0954mans0954 Starfield Starfield 5 Stars at a time Frames per second 0 Frames per second batik-1.9.orig/samples/barChart.svg0000644000175000017500000001355713063003304016654 0ustar mans0954mans0954 Bar Chart Shoe Car Travel Computer 0 10 20 30 40 50 60 batik-1.9.orig/samples/batikCandy.svg0000644000175000017500000001455413063003305017176 0ustar mans0954mans0954 Batik Batik Batik batik-1.9.orig/samples/logoTexture.svg0000644000175000017500000006377413063003304017455 0ustar mans0954mans0954 batik-1.9.orig/samples/asf-logo.svg0000644000175000017500000030572013063003322016631 0ustar mans0954mans0954 ]> batik-1.9.orig/samples/tests/0000755000175000017500000000000013063003317015540 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/0000755000175000017500000000000013063003317016635 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/filters/0000755000175000017500000000000013153020772020311 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/filters/filterRegionDetailed.svg0000644000175000017500000003727413063003320025122 0ustar mans0954mans0954 FilterRegions test Filter Regions with padding No padding Chain Padding A Chain Padding B Chain Padding C Chain Padding D Chain Padding E Chain Padding F Primitive Padding A Primitive Padding B Primitive Padding C batik-1.9.orig/samples/tests/spec12/filters/filterRegion.svg0000644000175000017500000001100113063003320023442 0ustar mans0954mans0954 Filter Extension Attributes Filter Extension Attributes Without With batik-1.9.orig/samples/tests/spec12/paints/0000755000175000017500000000000013153020772020137 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/paints/ncp-example.icc0000644000175000017500000000102413063003320023013 0ustar mans0954mans0954 nmclLab XYZ  $acsp-descRcprtXwtpt`ncl2tmluc enUS6Named Color Profile Examplemluc enUS<The Apache Software FoundationXYZ -ncl2PostgelbVP,fMyRed6Sbatik-1.9.orig/samples/tests/spec12/paints/solidColor2.svg0000644000175000017500000000756713063003320023060 0ustar mans0954mans0954 Solid Color Test (Xlink> Solid Color Paint Server (Xlink) batik-1.9.orig/samples/tests/spec12/paints/colorFunctions.svg0000644000175000017500000001347213063003321023665 0ustar mans0954mans0954 SVG Color 1.2 Test SVG Color 1.2 Functions (Calibrated Colors) fill="#FF0000 icc-named-color(MyNamedColors, Postgelb)" Box should be yellow. fill="#00FF00 icc-named-color(MissingProfile, SomeName)" Box should be green. fill="#FF0000 cielab(83.25, 16.45, 96.89)" Box should be yellow. fill="#FF0000 cielch(83.25, 98.28, 80.36)" Box should be yellow. Opacity test with fill, gradient and filter. Elements should be yellow, the gradient yellow to red. batik-1.9.orig/samples/tests/spec12/paints/solidColor.svg0000644000175000017500000000753513063003322022773 0ustar mans0954mans0954 Solid Color Test Solid Color Paint Server batik-1.9.orig/samples/tests/spec12/paints/colorFunctionsDevice.svg0000644000175000017500000000765213063003320025007 0ustar mans0954mans0954 SVG Color 1.2 Test SVG Color 1.2 Functions (Device-specific Colors) #FF0000 device-gray(0.4) Gray where device-specific colors are supported, red otherwise. #FF0000 device-rgb(153, 153, 122) Khaki where device-specific colors are supported, red otherwise. #FF0000 device-cmyk(0.0,0.0,0.2,0.4) Khaki where device-specific colors are supported, red otherwise. #FF0000 device-nchannel(0.5,1.0) Some device-dependent color where device-specific colors are supported, red otherwise. batik-1.9.orig/samples/tests/spec12/structure/0000755000175000017500000000000013153020772020701 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/structure/multi-4.jpg0000644000175000017500000001113013063003323022663 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222x" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?҅BT$Q#I#TE,O׼yp~Ne/; yۓ3޼v4 (!_/lq UIui#Rn(t"\%8-H1ZP(ZpJb]0J]vѶFA>6P" T(W+Ac᥾mjf7 y1瑴GH9 +J58,-8]2I^ݩX~:oXʅANWr?ljeȷge]=OOjnN-,mdSy&)ʏ :I]o|-h:[4ale8'5Iė-. ,r$F׮+:1g'tVüw2EhgSU5"좹ΎQD^Xyl8*=>~P=j%?J1wp>miS%bޞvh,Cy5ee]vyAO=7) Μ\St9)>mm_-|{^[iw:ɰnKS'^Ӥ{/>~XʦU妒F;խ8;\R{ݝw|Icr~{gڬ(VR5!Bd}MvY5lcdUb>憍1! Ikm2+ܨ.Fn^ϯZ52`} u{O#% 3V ISm;kyfP?{K~ʼߔASEoon$qd;FAԋ;C^L&==OYPn2vSv=_Wc}V,Eyg$Zu#E! ꏹ261% ~ zՕÏWx*n~UEc7UOCh&rzHԻFrml>r qSxKg2*f O8p~u*z.n巺^nrL +ևJtQk..YRUu8ǹRVk*V0*,,y*qVSM 4p"!};Om@%iHB>e9\vTSWXΆiډ9.gW*A#}[CuWO1I7̠#}y IhX z=fCKNo`*)<4=o*K]Fs~:Bk7Q͔qZUF,rrz.Qh$HBO|c[=#H;&;qKKcW7.um%iZKJj</$uԩRv'ߍ\Sim`1˞Ojbb&q?z#UJJélaSqQ"yd䚕Vʹc J63ZI{9ѭ!RC1Z{d_3+)R@϶jiAΎǯQQ$.˹-J lIo9eAV`3zdΥ#`dxOZHglϽYR>X)r[cNkJIq+Hxv=G);Ns֫ W؞V3(ZI~Yf+ГA-Xܹ߀~T ZFnvV|+]bG &pz]h1d%S'Aid& 2nc4+mn=R 7 pXR`6P1ҡXd))Ș\BK ALA${SK+F7N!Xt5wNAn [ IXr1ȿ]G6n񭭤s$j+XnT؆^FTsOi!=Wsi"/m׳L t2,*KcVIyeE׭9m'RWlR˗a ]*;'?a~ԢXc9$@ص"Ls$fDS[K1(:(2rԨ9-9r6'`QA#AEVzw& v=WU`oT{ƅpU#Q@g϶pKdc'*;}+:]߻їJ \݇#>OUCey^b{t0q֣Kmr}}j%ʴBpXGcPAfoX7️GAZ-U.7e_sIMW*Ԟ%X,`.:qK,;ޞj$v&7 x^(U'E`g[HG-ݩ }ĎV#3~SGw^—iXdz)s]Eo,95WtXV@ҦvorXV8P=iHAx Ո13q/oǷTLzriU@$^y  jj;E< *%LNsҴ! Q_NAj͆sڒ"?3;n w0~?5'R  H'SB E=iTEǭU!2dEU݌w3MPjF'͜ҴEX rv(T1qE5g"(13/bhzv)Obatik-1.9.orig/samples/tests/spec12/structure/multi-3.jpg0000644000175000017500000000357613063003323022701 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222Z<" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? Am;M|󟻻!pc:[gKZͶm|%y^6"P>X߳<q{x6<"$~~g^IN2M=?a$G*!5s TU^Sj.+UUhy>ԞM%oִXe)8ܣNsߥkkEse>kO2NŎ‚yq"S#[t)I+"R=C%ϚFI,$VJ*XUd*85/Z_dud!Tf[G4\ =)4)'hlr,>\:Oz2mL09][]J)%D"l܍virA<%@Q8I>_%̾e/H15}=z]6{/6_Oj㒠힘6 xNSC xu42x}ǘG'vƭ.5M1X7v?.Cs=A jΓ֛AL +ڽ 5=|GZmA\ĐؑON#>TȮ8~5o(Hs(X =sXjyjsP[ #ğ+ Ч'ѫR*w:}іf;RuǶjOo|` ƅ$eXqǧ;;9NUXnYyuO \-$tc3kmoÉjt+JGpWԜҹ+U$Wܨ8 V#E _qBÞt)'e{{C|*Z=IJk|۰#Y[+\TFidb| '0iJ;GJUi6J_lCMLyK_i%N5Jv29 ٖ{=P]q©$sEWIs lu0P͐ m rJ%}s3ǓJnK̹yQLҳm<9`CګQ6F(^\?/+KBt^0-:OY[7yH'ޖ4K$6x2 8"'i;)!) fT|) Ml@2HH[K ooGEh28ŽTr}4q;As{oj@batik-1.9.orig/samples/tests/spec12/structure/opera/0000755000175000017500000000000013153020772022007 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/structure/opera/opera-1-0-2.svg0000644000175000017500000000343213063003321024261 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-subImage.svg0000644000175000017500000003520613063003322025366 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-2-0.svg0000644000175000017500000000366213063003322024266 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-2-4.svg0000644000175000017500000000366213063003323024273 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-0-0.svg0000644000175000017500000000366313063003322024265 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-0-4.svg0000644000175000017500000000366313063003322024271 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-subImageRef.svg0000644000175000017500000000362213063003321026017 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-2-2.svg0000644000175000017500000000366213063003322024270 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/multires/0000755000175000017500000000000013153020772023653 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-2.jpg0000644000175000017500000001277313063003320026115 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?U, dOmnA ~ީ1>cR@Xv=hv=)}p'$^Y01Pq2F8r)\vK($c(94~'"=hzq%z`ʌqOZD!W9>2 Ԋ1Hu4 R` cp{Si'R0i9$u=I9tim6y">$v޴1 =wQ0*?ɳ;S|18t>~U`qav.I\Puԡ^1ʈ<h1~gY 8v89 ~_si@F&@UAqnN8FxўTDWּyYciⓓ$$Ix4XAI Dg5g*YƳ.$Ooj,!ҺXv;|7'-ȄMv94W3:ɹ4q g>0$cCN;Z|< 0Iǵɠ`@HO30|A!h`& &0rX}3ڀKt!P$Z.Hv`lhb = aE䜚POZE9 q@I@=NrAp}P@/z\gO9( H[#\,={D$t@\ASf-4`W˸ 0Jq4b bn9OsMD-aW=܎9I p=hrA'h G|Z!qZYKgҘI+8wdasGrj299 2Ps?dŦ`#RP 3ޜHHVO@.2s}9]3qxPsƮ*lh\G4큆ϭGҞ݄3{EI<\3H#<7$A=3F+ $}NzAdΚPO0zќgOAJ9'GANGxRpK@p=(*@ɹ:@R_ip<I~HFqޅ=~R4@-`T `P=SlynǶtDE;Gy[zz].DrLm.:lOt5pjt0N{ svSp g9E<ZG<ArZRzQnt52ƮXOa5"b')I T_VSa$z6IsJHPKߊfK5]+(y5lkV7ӽIw0ҸYICH$Od</ڂ=9 ]520c3}i_jHuQ02F);ZF#4=-4#4Wu]\4EFx .rvTsٞJc硦\Emg 'zܔ4vд0E^^q.}OO!nX Տ55򤑴tJڍ'=^o}ͩ\JHayQ6GsVDҢw^i$oivni^+<8s-%n#@bl2 o^B~4Ive7UFp=XThks rSwHTeE'z%nӻ:ì,q$kW-'x:]xaš&zF#Q|$IR9=iN<sߨMpDX \_59p*nG$/,"W|vzךx-jAbOӧ*^gCuhEp h $mR@W_ՠed}'.m-4Q#=k@"eaSDd}6q@T;`q$se\xf+\P$`=5M=f\mFPwze͍˴A9$ۊzTG[B.b&ǹgckb 2t$gG>$ෘPGOKU@@m65dE""ek\Z(9Z D8*I9~I3P뾆3c[i2(t*:lU$o.&i _ WBY*|qKQК@B>t ~kWHoEbKOL9"qwZb8^JVdȈv^sgo~9y#eڹ*x{ve3{ڶ^RsC1WIZ%)m 00qv`I:~Bm̅RZ#?z!}qe5ēR+Jlu* 98?$Eg3/:M[. ܢ) m>UbgYjQ2=:QpcyQ}iq@7SFI۩ccpN=yj.+ Ǡ)gdwE1ImWAp0F) JRbH 6ަ:Rl_ZNAE_ wXDsȩ1R5Um=*@0i92"W?1nhÑ?>:Qҁ+[ 3֝G\v ~M;)J.!g(Z1.@т9b9 ҀqK 攁TMe;"89rҐI&nzӋG\qHKCLy=7g҂ ArMT`(s0G" Fg/b`r|f}V>js2䛈 1)Eir,4RґGJw/O⋅Z1Eߥ=װ (xTNsn1VH$?Oj=I qM2L7<ij=g4l|җZ9( 𢋅z1H{Rx4bR◮M担H$ґ14\,8g0\gޤ KeE ? @{R oN$PIE4Ywog?޻ b?4 SNiy71$dovz4=NHXcW%T{sSgD0{R`])zqڽ0RNGOZ.F)1aԝ.Huh9R.4hzA担3G򥢋\P92; .!:RwE'z ړhjyeN z\ >ƹf$ ֶ47XȠr?<3$z {h!ҥ+݄xr- (5W&^; QEIS$/Gj@y\,.qzސ4u'ГFsP \t&Gz8ҕENaI~d#6)RȬJPg^ ~88- 4?=S׽.i:(ΎXq\ޛ.z(=I;xU hZD{4( m㛝sNKc%dbB 2à}n,I5{Hжp`^i _4IY6#cּ]xGH!Y6WcӨ}i By.lL,̹1ZO1e?M7$BCШ*/LHdUKx_o4Iԏr^qڗ>It+v/(t=m.`嗡$;sKǸ{ ;x9w\}7/]v l/97HڙmPު>V6 ƆMM84aCڼJd6yzOTxR:S*rn2U *+$Yb 8/rIJ/c=)J==,=G2 m>8QWKze}ͽ1ʅ8 $z(;wtquS lŬqa9VWu{wbV)%P3 N}s'eyd8w. Š)-ʙ4ZC(>BYHkr=TQR.=DR`̮VaEah_)d(C(1JG?)HZ5(#7)H 9Q[l欕G\'8hTB@Qxފ(T>batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-1-1-0.jpg0000644000175000017500000000431013063003320026100 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?h;bŸE=;ӱq }hsF)G4"7cJpZ\~_;&(4&(ޟ\n;Qv: G=h RSq4SE0cHS8ӱ׽qя~Q(4TPbzC1F~)1@ v(7bO֗){~cjv(3Z)h+ ^b~cڂ7.91.?n)R`\S(Nj1OZ1HcqF? v9Q(j1Nj1L.7O@Ґ &)`ю pLz)Rv!}c)\@;₆mޔ/=;Z5)v9\c֖LP1R❏S1@r8)Qm3cZ~((~yQq@۽&=أ1QOXbbQԮ1{bS4 0iyZf)qNS;ԡib~4~m 4u0 0M?o1E ހ?1 1֍~6?i~=BRڂc.*M;P=(f&ѷҍ?oԻ;)P1F=sF)ݿZMRq1b#y4n)1ڟR@RcO3~( ( W,n)9)Gړ6 A~4枬Gde6R֚bd{h#SQpj\{)أoC1 zяž6i\c1F߭?m~~\C1 Rp#+FZ~?J6•Gƌ`Ԙ!T}cހ=iQjE(.)(ǭ?1.=zvm7mъ7P !Zb4m}1IюzP{hԛ B( LSF1ځ 6j\})iq46@^}Cvю9OR P6qF9?vG^h K\{P1OC=?P1LcJG1Oh9cAHFv _[[63:QY|$Z(/ۚ6QΕ@ ~:P\iE6ъ~ΌQpͿqOK.{FxF) 6J.Z1ޟŒQpmIŒsJ,3mb~Q.ϥST(jޯ9n)JqZP3E 8EM5vъ~\SXf;z@pqF~6ҸXf).v)V#.Ɯ.(Xm.)m F(JAazQ4bb#ǵ㞔cڝa"2e8>c{nN;) e8*A'mn%2Hc4o1EB@Rۢ3UQEcA{I=Rb+sh03EPP`QEzE!@ `@QE (?batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-2-0.jpg0000644000175000017500000000503713063003320026107 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?}.Nriqq@2r)zb(:94}hց v#c#3ތKR،NGP8 tK1(^8qڌqPhG<.hs)::s@1:Qsރ׽P(ǭ'^w@ PGNs֗ @0zGɥ'ю.Z0R~c~x"sAF8zQ֗~hԮu4NǧM:`L.lRҁX@;Rcu.( tJDcKҌz cPc)01OqKϵ7Rґۭ}(.:ьzN)~}3_!;(<яNzQ`Lv#ޔ'7M)N;PnO^zQA0GKG@ G)( 硢'oaNTGKǭ~@㏥)u4`\s}iO.9Q{o_åR4@ oZ?_zS.:dAь3ϥЀn:K)@Cގ}3J=4zP\~trH'SFҜZzuLQAE4=i8Ͻ1;dzP4P{CځKqր>V Œ~֔u#.17"Ηzc(L,7=cABsZ=zZP:ґNNc=({J\Δ{QqHAsEE4@)R1{QSя@4ڗǽ`@4uGCߚP:11zP3Ҕg$bLRt;gK(##Z Ɨ(=֎9)q.=sIsI֝߁I4cP^)p}(@q(ԸKPԃҗ~i@NpqF>11{h=Z1c=:ɦJ0qҗ8/|P`QJG=1)v9=P ( P'(K(8")ag zRB>ΟNh\zz"bLF=52Xݕ<ƞhednۉ-#ȣV8dQv6X#uZ.;(6=F}訴1AR3‚8]?Uκg4s*/9&FQ߉^Ń^JR;ӭgxD:X'H\CFE:i9Ϣ_&FhvCVfWF[QK%ja8i7z=T"vTr\Ig$ 1=8zb`N=j坘0գ*%TI%8PXM%Y/@d!JЍ5QCE"Tum{6DMä8FEH?_JRU$-CR$DO1,q=)'9c¥˰{6協8'=3ާ"c;v3)%q^. =jxSj4R0H&* | Gbrٲ9zN=IJ@.qJ*.}J)Dfo-xAZ (( dQ=OJy- Tg҃8N^> :`qM~4ۏQlan:QҔ&A}'AwފnES=9yPqס;\B;I\؝ ('gb%4f2AJi2=1I3H.-f;( eI${isOXٰ1jR=99$EyX99'HzqSq0#ri叠H9#p\i)$vHu =hR =[t$-!;WР,prIMI+ p3C> ŕT&g.#83!zC}ADAfipNM7; i$6(''$F1J1:RcP;H R21Gh0HiwjgK޸訏^Qp)$!yqSŒqLyF01=qbI4< F`d;Ҫ䋼ZI S[ڬG'oZO$桔P\ǥYPJ8QFFGZ HriI⑜c3I.x i X<~u"F'"(\ҤcM$)F@3SNGsSaO;g9p tLD|1'&c#֐h$CG҂8=i9@+08qP `L sE4HqQ@@}*'R/>>"c2hEo; W>NH㊋qTS98◀3ւc#Fg֡9cqiؤ; d‘## z6!A'ҞNHF},S֌):PfrA#~rI4ZM<רW*G_vBiq}i9k(8y'7nNq(#ҹ)0)۲ƀڊv}*jҁʍ.4 9I΀rhs q׀)s ~5Vf wU rzSU@=MH RlI0A#$>zE8#=![$`h'P3HTcGCuq#a*NA$pizğ)#?JqPW4(S>ҸX~}A 0! #$)v40qsj`=ɢn(Ҋ* Ҋ*&@>cN9LEBFGZ({ 9#4Q@xҊ)C҆E! {E NQ@t#qLE!O)bs֊(Abatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-0-4.jpg0000644000175000017500000001267013063003323026115 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<^)> *5 v #RI~q\QeHd >-z:ߺtqGEs93,;.$0# lg5RC󜏖=*tD>[8xq bku_鰎c[l1EeFF<a T)sg %!F]-ŋDpy<SzO8[hp}Y/$[Ig OcSKCjR_7S"ĢsY)$nv,y21g1HSX{X t;8H޴Qfw=jD'zz!?iMUƞNU杷!{})OLKg4ydRWQg'ґ`w~H9zc^mMf >XOE"4eIL>$3<(q~"?p cjp΅RJ;% VqNLk>ͨ% 5K/g ;zʬm:&:uj>Td6OҹS`z jڷ!rNI9ZMFʼt8CR>*2.ZaLD!laz$nJΜ*zʜ[QJ ͑Sfr2) P\4D,NҜi}8)枽@ Hv h!'84rCJb2}i1=GLӆ@撞GP=h7p^8lB1?ȮVQgD.ORf,y$8S)=Ď'V߆T.IP˰su̹ eY)l#, 50k#^/Y6:t)5 5e^ɣ4c8=*lHT1l!b =cHc rQ&q=-CB؜T8ܜ};SSt.Kq\#ޜf00A>S>7jD`mu).>Gݏ>TQEa9O8g3MM(?O89VW/9aGNjDPzP})/uA"Gz8z՛iz!`ԄngR<*H_j.ĽI{iZp#:Y翙kJg1h`Ja$͎?„mvte{"HehgQi b0s,iҟ0RkK{1R9EN"BfJ?.Xؕs:TȊE5]ٸ@&l<ڢi"Ci($Hn z W) 9퓊r\:< 8Qp9{SL3v+s )FIS1dPr( ^m¥U.)-A8Eԃ'(Ph\gVi\^=jq |ZMZ;IݔI9* G cJs֧U!@튅+ެ͸p0G^OZ} ;kH.ܒ J\̥BѦ2KڦUǨ:csRucI @$xhcz~Nўx<֗d83A`2@@ `HlIC2@罎H Ƹ\8Uj=Y] 5Hc}WTb.$1`hY'x88r: 4 zӈHԀ`qJ2OC@q=UXߚmR +i\U3R$L*x"RE! d8U @ÒOojp!zqR) 9})x=rNz@jqoQKCg>N¨GSPDHy" <ӀAq 8;aݬĕqE1\1B8PhB!'ޜ~p<=(#9n9fݩ)OFr9`O #`u9tFsГR:灑` ЁNݑ< aLrO$vD=(G I*D/zz @Z,.2NFxV` $v㊥, Xڧ|3nJshz&=+.{rpN}M@Xջ 5.Ē w E$w'M:80\# AVBR22u' qHiː # Y+Q`Si]yR;9>IW9w=3 #kЇpUɐA^C1V$` ʔeĊXqLyU! hAq7#MSeElPwMxF #~:-&1Qjfma2M?0rExag*Y|Xtջ a 7 'q6ZJ6q*_teF~T_$/4G ֜NJmƹ%pQsSXQ;Z6(T nIpAw\3 9`HuHdމ(+dkyBO)qVLg%+,~!ohټ c/q;Qke`;9㓞(qAV u/hiF7w?\vJ #rf*%w,{TwM?NIsH+?с'`+%&ѯ*Q6dl *!}X \e뜰.UrDc)$rzL Nয়ZVYIZPFʹ#gxdc$ ㅦ oHIނpr#>ءY֩0!Tބ߹yYT k vȑA I"! 8+NHա#ߨL"-O-ET1ȇkeNS0|IJ|C(=sTu9?tZ_l e95=A9F3TH)9's4$mʚ΃Ҋ+*eDgScŠ(`m 8n#c8*1QYe1`cҩ4K\ J(!=j弎J)9VqES؈%c+`Yj:(Lr6?F80N7O(FE8#Egbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-0-1.jpg0000644000175000017500000000550113063003321026103 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Z^Aӊ&;JE(ncQqK;f z9s@``Psc>Q  ץ8):Ac4 $GJ^8=P:u`}hGӵqv׭Fip =(sҀ.yOSދi;Q;>A.m.asP;:QȠ8日4}OjLP?J30sHBJ_” {_L4@sGJ3@r3ǽ9R֎x<1?Z1)qJ FJ\gZwZ iq֌}}sϵҔo֏@"}=p?Ԡgր~mݓ)1#=F{SF; 1gK`dg֐ tzP~?:;c#J҄`❁?.t9JJ|p 1fۨ'ҁQҕ ɣ?/abӯ8{юwy;INSE/>QqRpHx((sK{c`֐ZNiڝqA֔q֔`q bz1E)9Q逅y2( 1JhZW0j\qҗ#'<1N}OQHg֗A}Lw'J##^1c@iqFy8JxE} 'Q8c;t4P8K;q% 9c=ȥ<D4y)&3ɣ׃Qǥ;1LP>=GO(P1JԠ`уJq@XLh(  眊^ssrqKFtS@9~dvϥ.# cE(~h3ޔ&c=}{ҏ@1GsQq11J2qҝ`q4qjP;pzHBqҁק)q=)vNqIƔޞԀf8J3Qa/^q1E.qW׎ u Gמ٣Ӏ@⋅I"h⋌f=}ixNCH8@>& 3  cӽ<@-K . E )#(ے1@ Ҁ1җtGQ(wP)}F=i Ni̜})6UqsKJ=qր: LӀcQKJ⁎IPmƞ1 /i퍗)8*0HidqJwazMzzE.aXc r53!) iӁ@>yHl ;Xhր:zi1ߥ {sJE/nhLBfc 9& ; v=h4掃=F(/=h( E;m ׯj1KsG#'=)xJa?:\Ѵs֗ߊ1riO>w8(ڊRzR㯿zJ14)Ěp:~ Fyڗ4cߚ<4^mK:ԪF3Jp@MJ<@0zӗ JL=iBUURsIľdNт2GB1JԅÎ@\Ndڐ }=)p1hL}yJxǥ)PGbsELxE QE1EKJh;fQE1 AROP1w(t S`'|g E)}( ݢ`+u(batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-2-2.jpg0000644000175000017500000001442413063003321026112 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?JA (}+O=qA\q`Q|Ȋ^Q򘞕shqɠ& 4D}^[gY,ۘp;Us!EYKp$ٮ(q8w\W{٦X(|CՔg4W$yu;Jcc0C(lE)[rIkKY8pZO'Oƻ+ N-cAϭ]98}gVZLIfP9'+/bjpfh퓟ʸw0 $vT{ֹCz%kO㕎=۰ *-1X-PY{hjWp#ev잞^7>6 ǷQkj_,#ms+}q_^ZĊ$Qu 4dË4.zJ84I?y簠/q4'J??j?*>\, lNsL ?Z}NO'&kq\ޔ q9Q #{g#Hzݲl~XU2?Cڸ1U|j1$ZČ77;yǥ].٠ " Ğ(oKա2h Gޟ s9}Gjpv,vT r ֤9Ҡ}ub1"HGG@WpҞ[Uu%rǧNQ4*#(3V΢HʊYU^KW/;6J84R~[{=0mD?4WKRZn[n_SVJ˺.j7{ C^Ϻac<`;\^a]P}>{ˇyI噎I1h+% ^<7VQL7z֡h" nǧ8u+q0s'53qe8 ƴBLb@"XzVutEVj)3idO.-#v"J] (Ղџr1knnΓKԥXql#2ib7%SFIJݿW.n ^(6Ȧ~|Vyh~֐mBJJ4ky>TgCVZi/X@cf#=kxS gcr@yxnƼ*Ӵ,_BfpȮIAjZ.䶟 " rFHEs֊W;R=Ycb*$oWx[szڕ7v)IA J{5p\)i<쭞8eU&u r7?1]˖94ޥhmKr@j2G©\~BFIfMiEO5٢Z+ڐOCT~/Pv+M_H-h@jP!@ՙ[B;Km<@fA-dZ<*Οtm#O H ֗^I6*B-`%S,8ȑ4t<@Dn֝4şV')s8$aG?™sp"ۚGvQDJ~f\u?*Оr$ޱnXw"5f͂\Fǐ* O =*%qCF@큜)-En{bOCL`Nb=(- W?kF!dc})!ֿ&rDqzSڸ gTM! u>L*p#}OSFábu2IvQk^KSQ2L,ҷ$I/Kc:tޯzf=)t1s{m$ҭB $dƦ&rLcSF,[SqԺ @ ?ARxZܤ$In?FWs?'^`lkh59G}ڔ~I UWSF3G0B 4\,zm?^1=Fv4Gvs`1ELѲe GU9mYL,}OҤY!83c6CLJpA!dQ\V]\f ~Ē$kVW;GA몋,r^bXPHuN V2]:>Y0zR99q 55H/[#o9GuJ]ȢEݝcӵl+yNp>k"DE}N_;O^xtZH_Pl_Aڸװ^9n 2NItPzaRؕUfWfynv9' RSQx#*g˞o])$n潙b 6-:FKqʷOƉEvg Rd}P\.mo2ќcP]foZϟj$oNiۨˬ2Ut69 H2c27kiZ7+k.O̽R-7 TT>;jU>g`NEVeHGq[ PAMO!Ӝ C1^&B}`Β[lApRW vWߦ!$DG_qXkXX=uEe1ZƮ"rL?Ҙ8FD*AX$2@_+ Njd4+L5%}Y-A(Vke \:JnV4)lzg/u~oҬ%Җ6 dɫhwkET.MqeޣWAH5ufKw<;z]cjйYr;a~j[\d2&yq)i0 bH#gסis̐ka֣#Nsڵ5 w !.q?j A^?:g2 >S)}r^VKka2=qLw%|.e(ۡk?D84WMAfxP]`p9O7cB#4DnK伞_$ጄ.?Zt1OB7 #4”W]XxQvFD$"o1r,'0㡮K"edkHg;Xŕ=ë8bF%V:l rzzӳЦg2lTdo.a#i1J; Ea)\Ԙ ]ճg<ܪ`&G_>r|pթ#6f Tk)y 99Egɐ El?U̅Ǖ$br[4&Nzph"AfIL)3NQtg dW!(h@a('(GWb08 ώRɅ^S8WJ98`D1PW@p :@("Ƅm.[sתZE7X2J'<EP/5u q(Vy\QYDn,lIOuwlH6 gAE`vp'( F8<ΑA4Q@;7A4K}h1߭U yhܕQJbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-0.jpg0000644000175000017500000000536313063003320026110 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Z=:qRノ|,'?(#?4FzgBGN#1R?J;{RgsK){cQG:(yF=?Np|P&{804)@$ڌ) c `瞽#4q>g(hSiGj;i?;wB`{яzRь.&:qKj]c@ڌw=(4`4ҁ'j03&z^:zRI(@N903,!z{P8N=;qG.'큊;bGJblOP()R;up$:Ҏ:SL 1NHGN~с=s()?\P(+7)H9rs }h΀F3KGMa4?iQ@\Nzwc*wLqA#3H$z⃞9NFOz!^ Q(&:\`)qF0@LSI9Ps?*( s.rs@]h#a֎O=p:~wC=*?jw>Ԁ;JAӮ)yE084vN(A< ;Q֎(18o ӻ)1aKJN}1cJ8ɣNu@ NOJ6iqsP>0jP8KGO'B{Єs4R #Ƕ}h(=KCҗQ\oNԽzK8&9=sKБ0.:tA*\RcMzl1֌q֗Fiqy4cK9K׮qcZ0qڔ^J9pǦh#JQ 9sR)@gn(2,~tt9`{RJE):8f\OF3җ4pzzRg$uZ\q@3A҃}hǧ4J7;т:)Bc NpsJ{ҏi:ؘ>Z1۟;m~֝g9>\G$)z:Q;}hc@(q3S,E߰iG֗0{RÎ`~=qӜRBc31J0 j1z{P v= u=(uz\gJ? !iO8Kt擶3 08i—uiIy֓F;RPI"D&4cbhj. J)v@Xc Siq RGs(88(0=Hy}ڋ99)ACc43ގ{fc񣯽.F0=bJO=>&uiߞh#Lǵ.=MPJT1ނ3COΌu #'\Cq z@ȱ8ҀhҌ s@ qґA&t0'(뎔w){{`vF3FpiÎ8E!.:֌g&3(;=3@f}>c/C@:w9/8QE&3By  R:QE2DJxc4@F; Gր8?{i8q.Ηb}(Ͽ0^QE?/F=q@?*E9s@'֝:&&9<=huK@:}hюAր.3ǭ@\BiȠ^(\B8)O<g91@\LO8}zzSz{ siqcր)?@E)pz#1j TcߚQ@ G~yti}ހ@Nb0h{>q\c n:R)@=qqKF=(@9^qF9qG=4qӊ_P8d`7?ݢr.)q>ҏƔ-2D=sGjAa?Ê\P=G0 x('\R\sP w3@.Cޗ(@&1ҁK݅y߃G8PG֗Z A❏ʌP1h?;К:gЀiNQaR#\HKc};PjG#3Kgҗ#?Ό:~49:Q:_R@'S(~cs@3A{ P:uSҐ۵j:vL)p8hOCKq٣Lt~TRQ@{t zdр/AMZ;J? !^ϵ(>rsP(}izZ;0FA8QN#J0qހ$zQЀJ8.0=ǚLƌ:{RiO4naL.1ȥE.BƐs(f EE(A^()hP )b q( QEt(batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-3-3.jpg0000644000175000017500000001573413063003322026122 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?wdAmʓMO zRzd^Y#bY֯-՜q,Vk9LLgo\:s  Y؂"\nOZFVDJԾX$9$7l v9_vCEb &Nq g*Iѭ(W<4(#h #!F q*dUw @]" "[!"HI(( ZaoHıڤ*O>`I468;CI BiW$2r)Iq:hbP\]H) UazRe<G4Xmж\a9Zd6" וRN;JwXE6[-d.N2H$3+Cn8RDBdsҥ[>8M¾6G"aqRHRzl96郸lzR-۲s``X3PjKy֣ɆG-#>A{д!#,` G9$97CP5'zzU 25M>HɎAPǨc68l݁)$HO`i6pp}2%IGd2e*c 0!ڮÖ9JVYjeR2DKap$V_ y4 ;c$1ƣiggs4̪Hlqn \c9+376&aF`JM[BDťI1h]Yck.pr?*/uCV[uţ;.BV#cOwSRk8ݶ% ڹi t\5?CV6psQ<X- i0TǪ/p#Ss;)r/$BS)}k7iy%U?JORҺܨ"l\z.zFq=\x'h2aB)xOY"1[Кc b!kgbMP08:#^WC`s뚄N3 eoJ| 2A 4P9ZB2uYFnp;bv6zITe=M\rRCN赦kZ`JΫ'n)OޱbH۵2Dcך-ޭp#?hxS2%eq<ʅ8ԏ𮨥dÒn)2ޛ  @1?XͼdB#7 r?f(MMxHR3#OCH9`m|1}p(mb-$u ˃>1U(+:@#@ӭSnUxD$FB0bSjVdWW*]>k#d?Ր~kB{OMeIǿbjKosw#ʒ$ b~Zu ]V]φu{To! ss9]YG ƛ FmxokZͼMŻ$\l+*=2_"943)a%y#i9[$4EK@FNŒ">g$5RV-!  uS"E c?JZ\.凒xYw0Sow(#r 2j$ ʾ6C,\c?WEѡ RIĻG8t A{֥C42]H$qWQQ>9+,Ft$CJ[8:UzpsN=yL--36ͯ;'jmEnJmZW3Hۏ:J'8NAꮭVq,D1uc1P-8) qNˠY=I<[\dݚ22+:,ٷp#cE'oZFV N){lvil{bB+J[6Oy%" :ub iu:tDsn\jr{HgTy50kW8d=+jq\F\, B{̓ϩNW-o}6| XN:g5:/yt,a*R5"-/\P_Ɯ~꜒9Qkp2P6aZd_^i9i:wO9'E1b8 OJLi))zV4UXQ " p~5 (5{LK'YF]H:҅I L%Rף}FsO"֖;(-]U9'?doigkqbHԃ$Jn) $sq#5e f>vG#;t䅥V\/N,BG d`)$ʱб)a;Ӯ.^h*0:(C0 18ǰvOh{0||`3 brr٥ 49^y1)C<h@\o_ʃ1[v^39Lsq+ln=i*%tTg%BX9.:zV4.cv+5C~Uړj2%pk#Q)+"&9U=Gy]5;,,w ?OWGgڗʪXy-g^*𪶺i{vzU8#M&9E)+odjPLa"̗ι?]PaKpw/j1} =ͺ*O ;zPqV@i+ c#ާ,_=cRҞ640mqgHK8$; PG'8$ڴ^mj 1 9#{YX쵙`J18AYIRrg'ˁj&&ry@$1gxݻnzu޶~"5cP. SӷZ2(@Wr?^^K\Hfw1xRWr %$thcjĀA^#>,Xu5vJѰ'#@ +m3(`;m;J:/H4FHA+ ^LLw/TnH`~eE +B733M0$~ hzdqA8Zbuzm 2/R;TFܐ]tPiI< sj׋VX9=8JɂO# 8&̗nF~}MeQFO֜l"y0 /cӡ8.eA-P hsNfd (( jlVS$z l@ds&΢~~i\J _1s9|yq($G泦r׈@~e8/!ZC:t #9*:fkh0J4]'b?w}qTT%_0;c><d=Զc<Gz.V舢k8QQʐg ,A= I.$-9 Sb֌  AGV超*, WD_lU2@\۽o;OoJ|.&\vi+rS{TCC$ᴖ#gڼVIԦioJYYWj&bzk:Pm'̬e-^XԂ"Zn;(3ɽQH 8,m9 DhH[8jwa6ONViwvTQO\Ŀb'dA[r{U͵.@ANZer>lK &#A -rJ`HGgN:1.!zaiSv?/RǤBt37B&<U *flʘXk;E( jS\OZi /+yRIin6!RZTs&;M^ Yʨk=[1DF82ԩ\NC@?o%ԂiV,L`C $+kٶ?QLe $wk;785m[yk#)r{1)K,xTUQU-F[qE10F`̓ni %nMUHLi (wh2KxF9=*ͼ+sr1+qE3ػ9#˶E@8$uy:ɴ>23Q]cy,qޟ(yt*batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-2-0-0.jpg0000644000175000017500000001314113063003322026104 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?PC#ԁiBOjxZpZi"m3ioRm @3mjMhm.E5&6+⍦F{OZmKmMIr-i4SB҅҅4l`Z\{S҅W-H-DaiBӂ @Z-(ZFmH"JKmj]lvѲȶѶFmjmhd;(QL aiiij.Xj@킋ZP&jPm(ZmhZ](OjP\DA>&P\҅Bv@mԻ)v;(LmA6Th@lmOmT=R J挌-8-<-8-iii(ӂԁ}E(J.a)BTiBqSl E!jAdSq})*mlr=mC66QqmO*]Qqy5"O })B1Qn a)*@h 7jt2 75Ӄ!FsW3BST"SM]RBRrlDeKm-mRAmM\V"IڦFW Seǎf(CE)UWp˓󢧝 X48'M˰d8 Ǩ*FbL-Q ;vD30U'6@Ir};M$8Z(U$בs0nOz[qӚ~?:P+͹0&=86I0yp96zB?cǨ ]ASJ\$ѝgaϨ!Wo'hG&"(~YƯp0\K ߠ/]6<#{IoBzGOaYE]ݛ=9 Yk:JonH4.i#T j Ҳ,MސŌ #֍à#t;N8U%Yֻzz8U,w,urXo7ʌIc è8=RӠѳYig{HԋÞ1g ]FIp]IB\/ Mc!eCVW6~]!W.^l=r> v9zWi~!-Nq40\m$W_]LEG;sXRDq,@#I."+:F-C7V| 0E94/h`dZ~"ԡM1?Oh`.dhmK/$LI[\gNWxrNO׵RX.{[N鑟ֺ{sgXrJ[q nWS%6k{ȹ"NKG.1z]Wv:V2J#@z+HQLvjB~ibOQn"$q`0JKօ:6g`M*Ywt)9iGdc>^e!0#j}Ns)K {r8d~X5"{=A5c>SV&\s*6ڱ3huj4J/DsM63$VA)1&lfP[frR;SFs8ՒF Y^*~xSU Zʺ":\H%2BE1#Hs){k\gK~Z&dM>lQL +ݻp +ϼ ^=>$!y ̏@v^BLJ zPDlҼ9< `AGn5(.猀U튕#= hE*բtɥr]CG\@Т!~_~ G*ܚce(?T`~q]TiSJ$NIʍƫ]h.GfۯS+@ t׃ݻw1\ΔGBk{h[!X:㟥I->8ј#s<=fūj)7έN.m-/p!@#c@Z}c^uX ujYB{ﮡe I|=8sP+cZw,nb':M*y/ X$eہך~;Zc$7j7Iduv +)V bf@#3ֲK7֑3[[!O0i+ y1]@g W%s_MQs.:&MI6'ѣd0Þ8y+^@I|}j4#I\g~'c%TP[k#ن2zB%Q+Zx_D o=Ҹ*lT5o P;Zy)-Ragoqg38ʣپ&Epѥ\SnWfejzvq9U$ F''Ky;Mǐȡx}*=HR3+ƺl#?RHUN۱$ds:~#!T- yxkAoҙqgm"XUW1bMhtٖFa#3΋rlW7=m VR"ŒHNx$dG1s3>l8wlo/f[)yzd-EW=HWw-O{}oB=2r}aDEvc1qĈB>\gT`O=[tēTdĀ3DwH9E7 7aQLDJnpn1UHl(D4aqUBBDх# d6OdҲ;J(t'7HU\)sB>@ E(%Njܼw&OʨGȣ8*i`_`>֭3R->$k[sY#+sS+[\nI(( TE"|%c\"*d3h8W(}yQEL DaAfn8&`k"SsE}ѴVpB>Jw+p"#pbOś!o@QrSÂYc{u_aQEH $أ6/1@̃#=(nL1zd8 1EVbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-1-1-1.jpg0000644000175000017500000001706313063003320026112 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?>8T}{RLnEy3yݒ)}qSAb$}WL1pUǶ -dBm)VU#5Ti-֐_~0ՓG+^z:ujF^N^"u+-'QmPs= zUuh/uYy~gLW 9 ƽ|%yN^*ag{POFvq3S(ѴSъ. F^i\,36mpm6ѷڋ*n=Lx本GƋ: *Qb0Iʭϭ8 ^w>)AYsU5;Ӭ̢7cPF2ޟOz(o53w >RhWs_<3bıڽbxPkrm8-3^Xl-9QI]dӛ<Dz]9ȰPRdUяu8pmEʌp.z5;S, C)yxZ5[}LTK)qۥ{717S2M"\?-lL1nj$(d?2dqYZ2)P 'M::fr%&˿E@:]l@BIY=x?ҹ8W!H>(Vq֢咰E]jz j]"m˒x/M)ȵAvvcvvyK!Ǟ3?R#HI'W=Mz*2$y/y׮7VPz3Ҍ4F)hz<\V4㰨6OJ{:ڢRcLxU=izN9j[)E&}/$v).'GTEf'ۋlY*漻~2ϑ z4^SOu+ϋ|f@;wmsk///5l,{G $c r5W4,X$-~ ]੭71s#]fUۚ|ʸT MT#\qpvFA5]Bm哃cXdo >?ҹWR8 ;1[SQ9G^QSV=EK.'ɮc[y{hj7ogV$8$]PwG,ٙĀ׫ e5ApAHCmRHW&/dΪ tzR IFPߘ+;G~Ld]29f:f5 \RfҸg}hXij&\ )\v<ž.kn^@?/y!i y_Jsu4*92H]G\_;~R{}+ϧN0NLF+\?n@ySvp!C})a|n- f.f ~c0# }뎙c07c\z^kOT..nKbfEUc˽R2;X*12l'ǠSk '={{יLң;2 !r@2E%񽴌6 /EGzk@xUѝ~)#ޟ/ +VE)fM~SF uc,ȡ<;!KC0>s*Hq?JW#wMprF5ݤ#hŬʉYp'llv]gC[M岠Q#\̌0jOj1dfܬX\qӚkL qox4-0riӧ7S_Bp$/9O3[ΜZd]n.^8%{Dki m|wDD)=sc/mу1Px>tҿ5c\>v#>wM𧹫ZX^4Q2Y*Kb`#lǵF@2 rc?u了1(n3}(Qaa*na$qN1q K3'v>,αI$dqMŢy%3+} coO|RqiC$rc'{qz#]aS>fI=ԉ.MJA`dz1Ҫ/BoٞsϯA%13pO֯hDϒ#J%oR=x 1*&dDuՙkqNvlSTW Jgdj+̷_1غI|$z]/Z> \cXOV7y\Mo`vĨ޺jFzե Vp3HN`զ!ƪv:W]24u#^cv@ԟm`rj*1q tygJi*+ˏBxA6q*6Wypw6Km x8 ( V5`9ɞ?CYZFh $qqXr=9+Pe?9]D%J?s!?n Da$9\#]:.y/.g<nkZt'tB'>8ZV X5RF\5Kv4d,T`OzKo kfRNrEz p ^{Rn@<6 R9DQ6Rw|l?X]Q^dz<D0Yˀ ;FWXTD 3*,/ z6H T 19u&49x.-Z"!Ns39`.t;U}"Xw)+ʣnqg+zMWpcY^Zm5PKlpv֫AO$jIm<Hۙ0|qY= 'ĺKi2m˅\6k I-\ ʅUT֐lME6:p%7=(ns 1( t}hE$PGk9 ر?usH7 ֭u `g|~>!$Mq-Z=lp) ^@$itOWchE D,@zZrOmgs=ܒ]YMF[^u\wp7NO* 7ܗu>Z[h.e *ϼjw_kOG%7 ~Ͻ%!gM%2o "U˒=OXt*]隄sIa8!`Ei-UYvnz <ș nT`ִ3= ]OZ( >9"iseG2?~WtdiPzu1]5)T\抓vQ4L{ZÕfR{X|Qٸ|)Za \*Kf"FMQt%l͑'NE&6VQљ?-F-&gVppL "! :}CRUD( 8EtD^z<{daekX[ "R=8\iu31+?TU\z:q{>#rFrß4pBzAvڭh%_eGɐB֑G6_4:k .t&}c8fXu(,OFyV沄uйNƝKx$~4}KmNIy&Bp6QhW2 q=}kGi$b͜֐i:&eSPnmb- SA\l\F%#GT:zZ|3C\= Uc-cxqs,2 pYHZqkcUY8٢[+۝:Fë8#=:,笠[ano v$J#,O|VlV\A`1=XBhc5KwUc߽5qЂY*A:&F myUy9{8˱lzνCE#ZD+뚓Im-*s_ HOIn@C!poN;T6(Ӯ[vT0B].pM)[!x,Aav_KC'L9W^8Hf'GV\dq,eS'$1U#"⟴I,e 4 eYqAX* ?ֹ(V8Cv>@o+ qc{q-w780H9ӵZj$c%;lf?Z#]4l4/[NQqD"ԎO==CMwT3kw̜gNt&>\T͸kw@Qb%5"?Tg;j[C%]"-bi 8lAޣhf,wsV*l1n=SWШ;;_5YFsr}ZnC vvGq]ZYu*< j݈|I7QO+zXjPda[qk)^6!UNFs_z_mn3Hƾy4&28QA=> R1^%^F2Zm> MKn 9iJ>䜷ESkQi@P2 ,ۼ 3Zː&wI4̠ȐB9_>a8fDb@r"MhM {D"T7!-09(nV-=L9 >(Tca(;Mi3s#=Ԑ9'6 _ v(UihKijUEQu9 08[݈?EWdd`ā\3Jk1kruLdhvdIQ*ΞŘ=.°FI%iQ[ {GQTķ*8qrkFr7E"]$Kbj]?T! k:Dam Y 4QH u RsqW%46hn/&kﲩ (0jv[ؿ1,y'}K fQmNp~5=NI3jg^1E s=dUH՗-}I+Cbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-3-1.jpg0000644000175000017500000000527313063003322026115 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?^})xqR3mFFkܹ}h OMB`tHF{)F3@ 0{} `18&>c?J01ci1pM'q1G׊49=h`⓰{Ҍv"F8+jϵ8J1hƑ1z0;=8F.p}c4QpIJ\}h(@qp;;@ǭw=ԑ֎sƝNzz@;i&&=1N=}iqQpxON1Ah q<>zf} .vLq1c R;.?@ PxtǸ.ϿlтqǮ(֊](@A㱣֝ߵbϭ$iy& (qM(҆`PW֔( z1ޔztQSޗtPҗ1b)1׭; h9w4Qpcg4>8s) zQ`~4 M;˜ ֗~( Hn9FyHzю=h::}&)hpS@phCAN֎n6⏭;h=)iړ4GP)LO#4'(0:z)qHCӭ.ߥ.39PPآO4\,!ޔzpi\44q&3h ۧ&0iH$J9p1GZP>ѓ񞾴Gր^J1iyGNq= 80(۞P F:b֔?qE&1R[Cq@=)p;KP!!_Ɲ^Ӛ8ϭ;gژ$7&9`c&GC`p;Z_^qP1(+3H`'n4bq')SZ3Ӹc:QrFPGҝ튭{r-`/s©hBMml\lgm4.$A|Kz + Ӱ4cǯZ.>tRF1z~c\dg,3x<Zw1Hj.@RҞ ^(Ǯ= .84AN TGQɠV3X7/ [WR> cMQ1E[XʱҌ~"j1ӏ2ߠ/Ks68CqGI֋u&oʜ31EQ$P=Gzd RLvJ@CF=ph?=*\q(:wB@(=3ELsIA֝}j6@ǥ8L ;qHS=! ӈF:qLcNsLsuq#0#1'8kb#<ŻH*%=zQFh =psڌwWrFwLRLQZ_ n1F3iRb ƌ{R GғڜGJ1h R;+ӊB:Qq4 HҗюƕC jqxcN?shm/;C힟PkǵV[ř{𨞦mZ*K-N2N 34: wZOQ_Ɲz.!Qp4zR;A㰔c8}#)iv'z+җ)G\?>\=)qRRӥKoƄisڗbZ[N᥆7 `⊱E- cJZ(6% hBzQEb(ϭ)(RwQ@P(%R(!(Q@ ^sƕhM((batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-1-0-2.jpg0000644000175000017500000001337613063003321026116 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?qљ-⾹` LIEz[3< H` }SU7#\<*).x>wSR駢mRhf;rpXRaܖM2[M"5LhQޭw<q胢R>tRq5*9Z)g$j@i|OyjJv4w~Yu rp퀪?ۍccf98ϧVԵ1 -?yŹefg?X5`2s{D$gҮ= Wf 𭑕1#$R̹1 O\zĄAއ_(@SXTFhdmZ*<*ǼcjzIs&nd;bpy{Vx"%) DՁ;3d PS$yQuRqc֭\e p>jJAX%!VM[ȻTjV8htp9ss97̒8̅DSg?9S"vAH`3Gp\vM^T_#Tȑ '.['2$ji_Ҁ=#'PHj/raR Hө}j9miʩǷ5 jJMq~¥ PwRqz=FZu3cG0]|~NWP<'SF+80H7^ޔ䝁XȔ.y%(vU""(?{VIj :0*e^ P  +K2*j<=O[MI+rzJlL0yٌT1׹-2ǹqر';[k<#  v\Dk S1zW~ڽ+}ƤXOHx:[=)7aQq ⦂pO9ɫj ;Ԝ>4Q* ľif =*DP1Ӏ8yz z7l8q#5#ꑻɳnn\ 7p) ۟XrcR2d2J گ` {zRĖ#0=z梽kUȪKv8jFr\sP}IXrێނ] RZHINeY u8TiH4̓9/Up+"C2~M+$dI[*q<&9<ݘ`"d9BF_˔zިFO7Y@'PC,R&vd4qIP6 XP|=:{qLk ]B-Z`F0ۜU{4&D#ґ 2$NHq+];, W$ѷ ,fPG]!F9_dUE-5e-l;SsOH=i9T)8u c#i`p3Բ)0;Sq4H8U.5(coN${Y5%w5qeu,ǎCwg%#=ϧiYn"=M;-YJ :IIvu QŰ"(+*9 F`;K dXJ$jd:r:=MU!ɰAy>$Ӷ_i`m=A8=~ScxA*i2d(9Z;x}'{v\Wi*.2(3Wr8c$\zUCzEJW4g.|l ኀ=jb Z\sV"uS3E1R6bHc:DgKA,q׶+7inmۂLZv:ǟҪ@cʨhd&FAEmM&Ke1f`3E1FFytU 082ۚrO4zZ]P6bVD'GG!D3n ǽE-vzfrkILo( n'x秦qPiH|˂U{/i kb$ЊK$x]cuL,H&t5k'w}Fۍ\;qRdGSFg{r\G L{zڦ$qU^2cb<=D#"V~Jt 0qb8XO|RY.> ࿷la˲hⅱ-!u-+#Z{< v5<GR~|"˥.@ =pqbwV2Zڅ-=3U3 u$p[Y `̱qBaem1O`)BQC#5m&"Bq{xlaCпV9tkf60D8,$5Xb@\F}Ni K,ẖT 1HsT`3j&BI :xSEe'0twg4N6@>z{}u,o aV?p9MY9Q ǵ!,I Qa\W 'AiZu^ 'j (pP|c54MR5,xZ~R^M,{u*%!bCiM2Bt5rDİpD 3VnA@w9#_ZwnhcPx$d-e6'p@fOK 2)9hLwl橼ew!~\ޮZd۟g#S><"fb ƃD c$Qytz,qŚ r2yqaҚkPi\3Бӓ)a-ĂYRb'k9F>٨j{.R.-T#y3PI3,IIRr֙ަĆ`Zc9nⱚ^q}M^O->Ij73"INI5~-4*'nec݀{T7D*~UgS[#XK; WEz)ٓtAQ'J]\o nb(}]+d(#n3LW r1sTp^Q3T5gcncTde@'ƩNsHHMTR[rgLj"stޔIi!p:SKl"OZí&đLN1J,68hzxԹCQ欲S:Sx;qQ t# Rycҥ21JJ*j7v%0S.b=ḭFY0+-2۠a:5*PrAcmp8>238FokDs%72pTc抻pQ^ v4ܒI4܀9-7q٦I& 84&GjFpޮGkg%rGvpB;y%U=*X_WAG4e( 9Ǯ(,<ht<SОnvz{RO9zc91P@ 9K@Op}jIu Cxjžx^)H=eho+tcLAUSR.1FNW3.^1Rq.yؿtZF}߭vF**䔹 {q*F[#juP>9*:)]ʌr#9‚M\WnT!B†D<AVQƸE杓zp'-9#$Z8HKճ=zSH($`g PG$c>#7=~)x3Cep1 <@4F0q@!8G~Ɛ NԌ@۵ 䑎h2$sګ5#zlץ5s$&2UA>Ңy9p?:VCo*84wcp@  j6gaUFvHs dz3緦iGSH!ۏEE)؛0W8R#R9"5c}('/nsAp{+)=W8IzJxϹ@:R; BOA1*{R=k0\x1Ed׵)aI8 rq=Iϭ5\^RxDNB:!^=dJ”(<N֟e .RpzSKԂ@<J6E wLS#*1UD`Mt]ۂq85՝xZsR苸I=x(qFzs.{B@94'Δ c8 \N)qJ]F06[>u["e*+=+d#S'9xfE*7NJHI8Fkvdy-bf;0߈ 5ms־Nx#Ŝd8<*zd44&Ӄ=VD{O)v84 pZ Jv4s)Zz!f ڟ޴6/nn±]Rhu%amD(V=MkDaPsU `sWq8ը+ڄcqF8=.1ۥgڲ,idJ\;cڗp z gҝIq9:4`Jp00;36p^ȓR w?T*CA=kwTf4 7n?탕@"7F7)g1Psq&Xuʩ"[qSy! r`SQN6y J9XwҗpJ\ð{R>Rj. !B✩'@]'eVWfԩ{GdIFG95Zl W8⼊՝I]:q%>bYzr@SOW;f3=8#Qs>ԮcӃJ>b0{ ^_ccw4c<9-ߚZbDEIcH.|C9'i@@$2:Щ능9󢝄rba߭/aUE<+xmlP>iC@J 8Ta.@'Tawbk|ֵcL{qF cR QVF#$\s֣O6& vN[hLɩ:ڔ.OjVU#=9W)!A,pz$XsJ#CmwUuchcӑN QItw1ɻ`c_BڽKw?ʼ3UԮ@]Rus޶JUɨ}&YM"FV #ѵGFw".r N|b/CwV!(UΠϓt5վ&^@?LFb7w7]4)VB}M'JHx" I`*&Is-TDEV/)n>.ԡnʑGN 8V#"(aFѬ1d3 \r?.ç[I0}} =lZnKYEWz+ɮk3]HlBA1(ݔ*;TFv&g 1椻+A  d`*'vivsG,% ӯzӗStKɦ}\Ne "KO|ޕ-k!@UW5Ruw!yT:bńw7g׆=Z^̺Tb+]=N69UU0q}km{:\-A],e(85Wmm$ld`e[&2'ީPF/?*8֭KMj #%clLgKș< d})Eq52KP^!*ȆɣvT' 5[x9;T+jBQdke^v`mf)*H;sZW^+;y9- R~J[V yz=Ia\zy\:rG[ϴ]V=r?\MdRR{5ҵmpr : QWVAg( ˨H;[B[ًe8Q<]tވHCTH^%iQcF?JiI^RXd?魸%,CR&2ЩP9@9OQSENҏ;VɏZZdVNYؑb{Թ>[mU8 >w*$&0I9rkt"$afVj/ `A8ǯ5+/)sjCFXvzםx]R)o;1f=[۽qD-;z*4`*7` *!8s$VJq>]:\TZ+Oyso};՚rvǯ|V4u8+])!LzVxHDdB@^ҐsǨ? c/0m̻nHnG~ctʴli˛FJtrKxdʻIn8xPA620rbRKӢ-j6)->}㿎.PP@9o׊k3Sn &f۹MK8\FϷsce# kjqX&Gʕ]zQYFi4I{~!~dKq1,F8x+J+{Uzp?ƹZCid]"vÌՋ][T074@T1*!$r #Y$ܥ?yJE#_{5"b\ KKB\;I7I8=^kSY ki (2! yM\lS{?ͪ#nRʟR1[!FӜ#²܉ ! qF6N;3][Wt2p^J-Jw{~&ˏ!G?KtFIn1VZH^E%Bמy\T?{eeq9<2ׯS%I+P>( ˜`GS׊̸`C\0*F:9xoR . $wb$)*T2qTƛ݊uRnb@L|À*_ k$ …F,W5^w!Ԣ(RGbdҨx:BczUMjLftMr288]6>u%:Cu,*ezR\wl;~QҨ\-~dhT3k9Ȣ4QY $qjAy'ViMJ[$i[4'v]Ğ9=:-=s5c¥}:W;#<']Ro48i^ҙ>[TU'2(B3<Y*վdSs!fb|6S[/̈c\$9?>6 BV7$A\KX>p&)0Vsʒhf؝v,=cmKOQLMriH]n1#u^UɏݟR!"X7{83f\d֢Bd®HA8S8bVمux sc'!''f7Mmat\#9#؞y:`K)a)~f?zC4O=ete[o*%Fr0O]|/Y)[ $scE^Ҫ-v{FS~*^ 1~ku+hgd%':=FD[>xleYIm9a'B -Xiv;7XQ}a&8ȿZY# C19kCm&hxU$Q!WBW:PO[jn.~fO6I2@皟kQJrX P NJfd^ju~#탐F#OLSX"I 3y|x[j}fiMlfX{ԲO'UZV||O85.5WԠ[L]o iz[CFzv6ًM)u7c:UWM:3+\-ˁfдY٘.3|cXe|ۃ2ւ3Ǟ+Y%c.0dGNqYز+{xT2C'a:Qz¤0D01Hj;}x*j#FA!c" qi2U!iIi&ER͐`GiQKceWiu#96&'mSq*Sknܕ}\뱻{fX} O~k/ÁqqݔVc|B0q=}e-q{3mjs)c\cnd2ɸ#z)>;WMEHmIc]HG¹\\=ϘIl`0P򭨮ӴkkXʸS,1ڀԨ>O}uosurAh @= ӵjz- -Ԓ2O9~Ϭ#tɧrg5 #~82"q,:sG5Ko }kR N9O|KeǨwfEC93TM{-ד%"J%ʖׯqiS2KYh.TҼeA^jAn`8#SSZm"]VbP`m>ޚ] [79d/jN p1}6yij#a.c@~fJմ$XNbL`Τ{c◶Dd2Di_,o | `f,uK{< %0$dq۰⸒,>4N^4E5cJUdGT5Vx)f#Ϯjׇ5z,@wI=u^%89n- ʐ|zv{Q9PD֭_cew|,^\dDGg+Гu:#Z\$F'ޥcpCk^6>FA1%@þ¡.}˿&Yaii,L'wq0+2|xsTVA 20_OAOƦpSC1TbɽWyeRc=TsrYxߝ Cjj`pہ-ޮ\҂yE)F?EC,q5R6ĀÁ#m98p9WsgM DIB va7w>T'صg\,W> ߘr˴A6|ēXS{uΝ7D>`LVfwzY̢I>qT$ bIC!;\_t*I_SAyLa`dܼW6Ɓa-^z{e|L΀XTXF;qЌ#Tݑ;LyP`.?ΥU`sVgق`gj*KKu9ajjuPN%aՋv(!Gj$ʷ!VJ=ފYgazq/qE}|--]rzQEm?_!r?T|窌Er/|Q2:W > ٛ'(-2o \ߘlPܨ|zcҷ{; (a3jɢ2(sJ(8 m9FIT72}mp{FW<͡^ <}8үċ([SaRQEvGc[8,#4?tQJ{B{+fgrFyE̛gbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-3.jpg0000644000175000017500000002177113063003321026115 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ZZ=-cݩ[Zn, Uk*^3N*'Q[D{ 忝D @qSfg,Y Azy9qTt_,1n]#M?[x?26aӧZ<-I'zѤcqncݨv>#Sus!#C ' 7tXʸ2K>s"3n=+W* vqzjArH4닑 - xNkPdֹ ~f HO^ t8iY6Ò5?g\ug95I_\ xwrpzi%t69@29sZ2#¬ʬ@G'=0+%nn42cj'mf77A2r|UNY 1<1C!VjZ[Lh-O[9mtڋi'qgƖ1C=F]H` ;M(Atc9ltgմhvb`qOa*3cYez\줂u+Hn,Z(@OOZ~B3z%Ճ!fvL޺$(檤\l(J8[05oT!xsօv GI$*R>! IWqEii[fl_oukQse AMvG9ޣ=ֺj`9`{F F\g*"$m M`^G38Fv~j'?}V-݌ӼWmB_jé]FL6tQ: mt[\[rҷ?skuMѮ5h`?+v?Z+/-|$YGAIVND.T`Ork<_pœ:/m`-ܣdw sl\\C1T16vC ŚLݲ;+wK T<'?SՀRuIH,]崻i9m98aGYpx`8`G=:v[&b3;R>|fid@{W*< ?4~`޸Ix"o+c#ަҳ\wC`ՠZr z]tao1_уcG{G3I5ڌkDg-b@ǶiWMb`/$n$ =cL7? #1C+~h M&VG 8'=j&˧Mi&(Ґ#Er:ťΩ-,w{en"`6NsN.^Fqɪ͛󼶐70sGoj,Οn,ڴ K;6WQ:t V55cH 0 ہs]+yK)LOS.1#{FIIU;'ߚnjlGy/\wISKojSGvrFJ3Z:krQV0N$t$9\jCvo2|ILOl՛ jV:M@:p[ +Ӌقt[9- vq;n_`ڪGaBZe[7tFx,˸3׀rCqs:Cr}ZCS9FMͨ;agC@Xz #[|B4*0Չi2* c j\J'@#POٛk;n>=q[@VFs9s+hь 6,k |]t;V5JoݕNXHJN{+$$P"]W{c񢹛GLwL]^qN*=Z\W[4):j֣ugkK~QlL^4py[f޺++KWΡ$`ceޣ!U .8> saYr[>b)0 Ď X~fTB؀$Sx%K} ޤ:24^Iwr$\fmymo4}c'8k/4ǑG=+ơA.Kn 0$jZ0'x:XlzvMy.;|ðZ~?įڴR|xZDpqҐgwRGnk_LpuE5a>#$7ShxzCِA8EW/ ['J].Kv< [Kqh&Y wdn A8P8 pxoReha\->Dp䓒Mj2Y_+mL4cxd,3qߊo]Jy w4(K+cn::G ZNt.FR+n >3ׅVlfdOc*8gV& n}'i^$; Ŵ|'οPj-CKZ;/vá><{fW7csHbNqZ)gOI800/\m{Zc JHr@?0 wxl~"#$Hp =D儋 @y1EJynNG~4]Yr8'= ܅+~u`Y}28~QT]ƕ1>Hm1twQ`gb(QElJsWmq=6jfԵ{ Ʒ:ROkQ]jc%ZYTEn4Vm!n'gxkw}]kyX:|=;9'u!>N?:(a{{]JBbC0Hn?8V?Ҳ̝mfa`C2:t5RhAuCS/ \[Kr I,|&loR}pzjmi#]=8^J8Ӭm#*g,$Rs[~$:JZXG5s=1\Ρb$!:Z~Wv #ˁ࿿]'LWܧtsIjvZ EDPHpď x~I_QKKgp}^颂MʊK' z׆v:JH3d|W>MS"Itm63g##?[RH 'zgC) 'RϑbX g;K1ϻ$Z4ppTss*%3(hU1tF^IQg͠ӻ$'cmwll.)<7=R;wG7g@HzCj_e4Kb Psz#*(fXt I."\|{fK{Hྚfv#+?S:bd=*%PsXz\\ZǨljHSCm=Gy2͜tkztMڴj-Ơ|=yQwIQ+f9<~ JHX.$sEb^ZM!]ʬ>?ZɹLITv~;X[/7BLq'cII.P `@n#:sWJ<I >6t~c>};E5hф]9C,Cq'Kw.!y~-@n;sqWMxu:nE۬T zx%u;ـPPx9$kе.+9}u> wk]j!lIʹal(QҴWiNCM Okyo?QU%dvאZsLQSrkGhVP>;I47^v>^ι%1EvsrM4@`]}j[#tA\(+¢GonYP@\׌.an$&[ gO}@4ef=pz~s73!rr)F1lq"dUjì\%vVɢu:*s{4#6Nsv k3YљVAՎ O&K8Vta*𷨮iQGGN%0`NFOGZ^jW7 C%,ŸX/Ks!!bv1Y)pk{mh7/ g2PĠ^=red2Oz|G6(YnPx|_qrp+7m^)ǽ.v+dszU1I u賎Ia;T8Rz5* @yș 6s je8*4}Lۦ-p3ϵX/!<;No\]5ڂY!lO(0=3ֹ]F+ 0q( 1tjɪ$gXm:` 5^N=,YP2#C!??#N{VZs*<k[HY0cս\i9%SZ[[߉H5'&~C鞵k"MQ9Y1ϯVE[4ζ1Qs˜WlI&9¯`*}j݃Ǒjw۵KgB l~cSgUcbGk؛ZYyA7سN ֬1 dXp gʆ7+3Xݙ[ȫ1c =3hIj R5-hƞ"@Ir jtygwTrLw}ޚ-ǥK1ЃQI;y8h M AlB 16rxj_ӟZ@ta+KLH@ME6qX#zӲ%&4 ѠpIc=)HNGOQS";O 6"A>j{tJU# KR;] H_ddOpkWPѴ40DG+ d)]46=*S%ʹȱn9'Xҳ5%h:٦ʝg MpGeVg&oC;YWa5GSnNy&_ɪRUT :{߭P] Y(&SM-hʠ:l;a%bS=VNK%V ғQ%YF`+G;+#$%Mݎ#QQT`b-$2sI $Mhwb*'XĮCp{I!Im \F99?Z F012q""i˟sH0FqNP4Dh&8❻' `vfsI ]N/^9"ҊlT vb:QQbn*I7AFQ:֖ !yI9'jp'4qadڪ1ӑVZIGt"fbg#IŚReB gr @F1uW[v73g#LLyq,eRN3>fkw$,窐wu m6!QkʳS-i A :gp#z3yd*BIi}ND>BОj1`+t彎i1D.PyK?4 #^;U+B{G>\iŽ}*Mo\ 2E9]+6zrA>~-ܻq|V,4dSfv].%F'?+[rF$ 0^ZX$N EnrGJcP1.N0 h n<ՅoN{ՑD2Uc٧ 0 2OjS9=@"Q*֕lf$"ƠzFb0q#S3q ;nZ(Dp剢i=EF*H$jUA!N(kr.1P`dp?%' RjL"nX`]#| Bc}jHl\='L-0߂'fه}31ߐy sohOpQ@aU. %@Wǵe$EQX#tTtioPi`P 3vYV\FԞD0Iܛel֥閣ʗ9!@U%JHqV,Dq P%@m#M >яSrEih;@nc"3H@ 1&4hJLa!{LgyԚ͚C#ҮBy6F0hH+C =GFOznGJ-h#))}3Z'D`Bg,}'+,BF-jjI>R3:=x!΀O5i$"Nī\ErU%I畤'v=QE"Obatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-2-1.jpg0000644000175000017500000000532713063003321026113 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/)@lQO N}xJ\v8Z zӸqZAx`J$RzSG46nI`oJB+d:PA# N#hi ;ZLwSGւ9$ciK` C 7dM''J?X. H;ސQ{c(9Ҙ0M'~gFszϿҝnE;󢋀ݾ❷gf P? 0}h(F=RyJ1G1=c ԿiqK8_Ҁ9RsP!sA.r8RTcN9z673FuAxq .8sK:sHbb\{P18KK4 @zdt@0)g0s( =:R㎼q@\,7ԣ)`c8@E98Q(LF4cN#s{ (z4\'8LOZS(u֝۩ߨC}qҌ ^G )Iq(vi@zSRZ\ҁ4z?ZCbc R{Qb=z1 R>>89ӱ(#Tp(HN>ZAqP'> Rzc<.lovj\z(Btv c11:Ҝ.)1(:Q)G\P M(Z\sKϷC`7׽~T{{pZ]cIϮMu)}zE?.}1S/\j84z<198KQqXn8G\u$R94\,&}c.+ F=z6R@G=hbiqAF:SF:‰) \xhAC`1)44h q1ף4Ҁאh┌RcczcZ.cHFxiqBaa^{f@14cm4Qcbc&!>{~&P؄)6c=("ov=4/q(7e1uZ28Ӏ@@7iz84wN`y?J19 :ю4q(ޗbtz.P?*\cN 14K\,!~c֌hXn .3oz\pz1ҋOƊ\({8(MhC)1}; wNz =XN9(Z_Ϛ.zQGj\Rh$7{ǵ8ǽ9t67h_^1 Oc^iHKq׭i\VC@9ɣ4N3q@i!{c}hNRcF=p)LQKڊW^h ֊(QI;QF%AUGp0)I]ZWZRwu2(l; Erh`:RZ(&QE.QLgbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-2-4.jpg0000644000175000017500000001162013063003323026111 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?nq30Jhٛ2W?UinɼAbNN>gua MˑozmEdP㍣ɪ9>Ae!ўڈHCgTYčn$w芿/^$S#,ڣWctqT"[!{WREʬAnyrN{Vہ.d\f_Qy;OК^ݻ`o|~v kK%`beu >_3|S]>2I-gcN[#TnI cժUZT_S쑁Q/v>g<4V0df>↴E}EK^"@;coE ԢhaCCLysg$3bD9 # GHf,nVk6dB[2&CC~h)>!8AR}xqK1V1gn?la^f@$/rj*ˀT;pg)i9lU"6xbئ\Xm'ԗ-w'>{$f:VrٲzFx38;u ~5*YȄ4cZ4BkyVifc ^,ԋbK&hTKP׸l"j&MM8Р ;y= c֩T\ {Tg xRjwݏnӭ!c-E]ʻ97f2qU@>ըSF_ d\R˂\`ɫw#%bb%h/0p6eTV i<@<heSvfD-R͚Qo( SQDݕqVF6נ9֝S ?q$t`};E4p}inTlc3r)fՅ۽XUH.{CQ#H$(ldO?!IKKEKr i+ŋaG l8SFP&9QTcSUQgUzJ--EY֊By\t1NJA 2=pkA f"|Qpg$K,6Hm[WRFՑ @]#OE ;@W xծsWA/l\?\uu)FPҨy ˡ:0J͜瀢/kЍ49.zFN9;S',+7Qǧ;?ni(Rtgޭh jOVlI9w*- B('FN_w$JmAVM TsӂHAu&g`N;P^ņ>&hU9>Yi UNJ"l@pOAN"Iv {I4z $h?y \uT-Es ,hsW(.1@D6当\ӄ͏\T\SwsUd~mԭ&aחPǐL1uN$j;DA < <=Uv=sN "1֗ړ` _ԃ<h.)!rHP;QOWm8 QW7bg8»2}NivC<1s BJM ~0L MFס2#^.HD(4זzeQߒIWy䓸S V_{a<EX}*b$5.vq1Ih}here(2=i3Fup8H.HRzR}M繣'88cq (`:ddJ8/ӥ8SpHd})rݰ) 33}tqWXfbT| O`(gw9$Bq)4U^GUEC$/qW-9#1'4 ֥j$9~ 0y94䉜$Ut82aGY]ҮGUb8#ڴܓS"?b2~GTiw)&ѓ֊x'(Ð} Uf@R{SH Cv.$&qⷌleqxZ3 &Ih98gTЇs&@TݱzQqd NEg8U$RְHޤUy5'`T!&\1ƙP~ܚyٻhHW.Iy$'5 p WyBҳ.{ D֢{<Jԓ@Rj\5X)>j )f<)xi q HɆINKуL)N?Z*Pp(=23*[ T! zCqZ8qƲ!R=4N1@ċU{doNYW>R刮c8OL-fczʐAQnI:WMpM ʡǁN+$,GhƩϨK)9 tM'"5Q!POT&FbOQzu{ԙs 1cܓ94^rx=N(!FT{biji|(Gzp=.RF\Z| (=iAa |㸩g8\c󡱤K'LtF Gzp|"NRN|pGz\@ 9zRsRgQGsڀ`< #wq@X?E1-e<'{{sQB9bt]b`AQdO4TCri pRN1֭Ca,zH=jxm%SZ Q^1, ۸Haѷ(áVv)F鈘2®ڈv#zyEI ך})J#4bW憀T |ry})SA@ p[j@qRcE8c Ί*g?>dsҤHtGlUfMZv4A A}+YcT]J$pE'֧RN@ ru=I=*KHGLq]&Fͧ]ks} 8 זhPwCJ/gr o1ISb?/OݍNI?(+n=&󁓑Nc v!+@i7qG#"T3@ O p1R92OJW HJ̪== Hr:ސUvTTeu9Q' H4EDqpqEQ%`SqI1#>~  q<է||9{u(31qo^"Nr-6{I!$ׯ0܉ut 6}ͅpqrW+YjʹU#Fz}}+%%c6ISNKY%dqzZή2hˍfjzBǀf h$.Y- \V|Ac{5 |a'WCa sF|\mʞMH."tLܼz08`q]fAsW7=H(C/|Z¢. gfd2JzT’9䋀 F??h؅#DH TVIE<) ɶ'|$qȨo5{*K$_1Í8# uHѢӬdէek[PBۘO`1|N-w!F۷`IJVcdEZ-lnY6YUG|,fșY$KṷIFAS8Wa‚۶)$ZEU2I"GHfr3ӥc:qtܙBHkG9sTvZh0rX$* o qJ7gb0]N8`*Ș(4!+t?קcT^5x8k契pS,}P #9A) N2HS,J<“-]Nf9y?eje>lw85gP:c;J 5͘]A 8 ]8;ϗջE*7펢m8fpD`FG=3XbK4/?'9}k[JGӞh~yNWzrl<9jv7`MjL|'9ي*="=QT_8QCHYZF|FA qW"1WS9Anc/ĞK4`61V dMKs ,. ]SSRz'Y$dbNW8Pz oE]OעNS+,cjmI_y&AҤxT,"% 76{޽Fxd@pEK"И&hە֦jwaͧ[[tGogH R]hڗK& Q!]rps 2ޘT wGhm`HCͪܵ(X/{maQ. 'i:6*;dkK, BJF:p{S>}bl~'8" yTATj(v^@b#ڟJ?(qW ȉF s'i/WZ6IBH^FOW8]KL塸x@f=ʠ jfNO=O[=uh[ϵ+ вzf) 2N(i >MkxS5df#^X( sUn7L@8חs槗QOp2eHڱ t?Ʈ8=xM_"jdD =Z[YZUB{L۵ wt4Sm>]U -."SDT8A2VhOJ, W]MFU۾f0Qn`'#8$R}%d5ZX8 ]VVۚBz {к'qSg9crj\;Hdg8֬¡H=Uԅ sKi4n9ƊEgU%`XKj-[ib=Xq]ힲʶVmB%8]r_\i^F+?kxCķw7zx6 rAŽ状ҋf.̌2Zvz{mm% ܟo9xni^*{Y!G6*}?{Zaϟ6vMQtYm:tFtg'үr$=(0^N2v3^}smGPJʶr2 678waK"T8Hz~u˶3ɪ{N:W7s8^eH.cŠމcYGk ɹ\ fr曻:}+OrΣxU,G^*׌Ew[x[\G, $g4J*z^fIn¹985'mRT (1 hđ'zӌB&; -cȟöE9tOҹ{\1" <=>/ 7['U,`BsJnEJ<~NaeWYI`f.&m2®LT`{t+_kNWB*3aGX$&-O1mo[}Ml֬>:gQ&vd2sOz4q uvE@G^Ful/v \#}sS>DjČnn\i>PgVվؕ t8[> yKgH.G@Vj1zoi(^=) cɑi⢑\HB7үۉ>Sؼ8[07l=( VIV3j]teg6mrK f'5͠q[I$,քwyVXT1 +nSeɼ @FYF-FdvY(2(eNkEm^$,=OƩ%석i䘂#"2ډpNokZfgk yl8Fs>5cKFd6 61k}P,S 3{:{V]kNTQ]e y>åcȭ5ڱz4pJWV&ŐLUA؉;Ƥl&VEPNO,qޭ\-։, Yob>LuPJ( >Br+q2Be|ydTV9+;X8`C,{=Uk0l[8m [+9nP!P\NzWn38;Żx!qcciVAp4@16!Ir}EG6M-&UJJc./R{X1yGw~ uՄ+R!N𤃏sn/bL]3`89~2Tm( jML/?l'9<ڊ\8ڑ6mf $Lt`*"6qn aFD:B\  jGR)J .9u- T3N8Cޱ }n R4Fѷ ǨX[+Ӽ⿳5{T$q+&#a-渂Krd?hnVFBUC|Ջ9?,u?^\GiKI*9$ PX̻I4s,{Bέ*L+)>l~;Xѫ-Wɯrd9W80kZ%ْxcIYxoz0FE.VkZNqv(@c^Pەj*v!#EisWɑRrQ,[ep9sVm@Dl c uqR+hӃȌCvRp~>M-"rbӠЏ39{SYMIuR[# 2~nE#Xt,Hz؀`p*kwXl`yxTuhUrFTT6rI?8f H1sS/˸ Vǖ˞V̔6ǥt".NN?Ab\!$]IoK=AK3)S6F#!J1sedMA')=*f(A$rnWrlG*1OsCҎ)ӐZHI.rF#P4tWvOjJ (۔dz:ۅI$ njҠoC` /+NXYi%ջijDD_ᇱm&"u8BJ瑞Eu~QS-Cu(6=sIa3!9gע>y䪜` ;Yp#ӌsEn;VVNkR7vHQZYcܑ}eLXUDs#T N*3Ҋ+R: 8^ҡ3)1ܪ ~UM|)3q12nl]NG֊*X;+tb $)}I˩hy8+zKUIF;(eH;RrES(batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-3-0.jpg0000644000175000017500000000534313063003321026111 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?绞g1=+cߟJ ֊vފz _̟ZvsF1?/+4~/N8'(ڗ2( u4ӽ`֋ҝ1PpOLN( 8@&:!AӇ^?* @1xwcv&:cz@` ]#Hu㰠#?ZLߍ aQHz>i=(>ޢ}(LCw{)vZ(1֐b1\A0ipx?7ZPs8=KF籠4iAr1@ ǽ=>C sRrGZqړڀ)8JW@& qO;@ Rqv?jn{0sҝsړ)sx83N{Q!`w='FSґB??*SM/\n=?iG@11w>hJP֍z!v4zR=Ϧh &)9q0xtNz=)#G~QpqKqsKΆ`vր9 pN3@1 ;`vz1B}+Gҁ\0Nآ1c? 1Ǯ)'/CZ:ր0yE;cL8Jvx#4` рzcޗOK>ƒ t'.4L~tc&N'@3ҎHKQ(<ڏ֝>@10bp8j=@44q.;j1zӸ8рI?/$z ]Ґ (59ciq恉I9ICjLrO\ws'BGK(^1MCx4sK랞hc1֔r3ZP8c8==xN=9COJQڗh=qրzS< A4t\~O>\.&(ȧgb`E)4SPR㞴r:*Gq0h={{Qڋ=h#J9F=E$tۦ{Q .c'F8ǥ8r:Rք!#\dc3zL~~`)FsGg{Iӥ8 u0>1')0. n`IF|SQHx4\94mK?Z^'րzN@#bcҝu\ QJ:{ъNs@ ?җ8;.3ul4gcތI>1?\Fo G`pyv~4GZL{s'^}(#lP;tьq֔ghsIO?8tth޽SǮ{cށ 8:ӱA<c'@ǩh\ǽ(OQA'4QAh_SHhR(0(EP `Eăz (ƅECH;Eփ֊((S (batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-2-0-1.jpg0000644000175000017500000000634413063003322026114 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222Z" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?2\LNq,R0:cJzj 5b8R%pX欢҇>XDI7E?\!61&RYhCLv3/>\Be9YcGaZiٲksxLY2rČ'۽RR9={ ܒX1zT'8'l.".Gq<-3*lf*\^i!C7 w 滌dď, #PEaVI;}Ea4ASjҪOS.!zf"r6G1S}5j>Ե$9?_֕ pY&z|,cUcI7H%4;NIF4, z X -W0 O_v9QZj`QG3RhOQnmw8Y$@䏭BN&=83Je+=Y-hWRd;^%] 0eR9Qoa"?ڻ 4czjD&\avmDAnrHj}цbp?*i2YoOH:G);i8Î2kݠQIjVe\4q#cUi.eIsW#ӣ#,ľ:JurQF;s|aӤnOE(=rrA&ݏNWXػFAǨJMRIXO(~9* 'Qaڠgw?1$zU([{^x) =3S* Y(dvȄGB ˗R{g@2>(S+wJFU銸)B )@J(Uk1"GsLfDF>EI7P iB` ?*l`g$OTNA'Ⲧ$|GQ.rıQQskjiZV/fvdUDS!c$5b=>i*ܧ9$U0BIjJHl^Iȥ(.񫑡;;@9>4-~X 9e9=摊W"YCSJHQJb19$֐vZޠ.ܜJ"FOzqp >դCoӔnxSԊ;J`OQVv \Hj!#(@UH$9T^F)7v$(F:Q;Z`@iIJ鈛4T[s,$9>oAR |ӽ\('fh)Go,܁jv1cTy>۵&H`LS rs+ vA֑MUrIZp/&MFQ۽c#K#;և,HsuFwJr{ ( v464CncԚPOj!@(Hmr ED= hx;R <'=ȥW+}8H@'io(( 98r(s5z9cxsEm(B2 *EpSr03A`G'&.FJ?s2r})@Hd:ҬT!IINX)۳5XO=3}` 8 @deg'ӄ #ސIPN0M4ȼǸrs֎(8j8Lh2}h@cޘ9?ƣbI ,KsR*H u2bP@5 œck0[.0NGjFf#I,Q` )N1  㱤fߌ)GE<99r&8h 9 {$ #:p;ԛ  @'ޗqLM w2*N084~t ӑP1Ax 'HXހ#b-ԥ$0< *90<)Cq8T&o'JzN*cR3j4rHQp>R=MIy0}~W&IҰ3 GlR0IGpp)Wz7qrH<; `8}i9ONRa >*c `ZM1CfeI'F?RŸN 8>٢#P#œ%#1x(e}iNpM $yϟL7g*^0 <Ã2;HFh8 Mi'֚ #AJICzBpHPvszRVJ7|? xcƛ {N=YC`p"PTwBd083N*Tci"R0ԣ҆&9Ϧh89:^ <`z5QsidUl28Qx$ ɜZn&pOd`=hb=@] 4g'4Pr '#8 ֚TG\ {Z 6r):g#֞Y㎔cA)v`ddw6X=(eA>4HNw%XsT9R\|5*A\ :A#Fp0@4V'#Ңb@XҦ׾)Dpci\,KdXUBm:x6w~2Swy+@JoJ1|I50^Nқ cLwOAInc\zىGa[0GLk -o"1;0I= *֭4>Vj@z+X.w4LBc5Y帑CHS.d3 랕Yr׵RZe-H@Z*0HM;t eM# t2qښ6P[C+6I$SC`oTP}F!| kDdTb;SVnc6z57)ȳrY0\nkhN۱~jX vBi$~2@!#7Ɠ.۾hfj4;*2qT?o!lv(cڊWE.aEc$³v'o#JfD *\QnE7d\eŜOjc܁u-J[*ԓ֊=.¨ #Ҡk+8sM+J[5b{O.O8^z{RhBgoS0<!&Xqa)ZL@ (b\OҐ\e(R9kf0=p wzNE("qV㲍.wVN3A* >=<@`z`SLa@i84E~J($Vn9#֠g-N})Zi ԋ,M'F)N}X׾8O: ? >w^hmGLr8$ >Xn84 8^Ha Dy9s)cvA)=@q IH=3r}(P= K#! )X4A,E0I`8 9q= Hrv(8$Be$LREh3(SR0)v'`'r3NUI#)U3.7{v@\4|P1r^*@rhbԪpHMg8_A r8\Un R pz{b FܞON1E Ngҗ@ };iV ڀ8ZEʰ9ȧz4냌g8BXqLc r@xcHcv$Ғri|Ҍ;Q`Eқ9#Ԗ qL ), @ n <0 מޚW AJ*"yh¸!yʐ`jw @)(*1$r*F@0t8=Z'8?JzJG._{Rl!IG,Y6@ NIIO~iAROiT0E">}@H sc8 NqH8 r3 \81=AMG6FIp 2@h2J;x4BsN')@Tzh|4 iOjv p19 $sqRFJI9 ݯ$Qa֔)cP8݉8 vQ&繨wAI@$P9i&r(n8I˕?. ܣ u"* ɎGpH E1C?P.ܨ4x4Q@=M8╎W(Frf;p1(n5IKMRGS8 =jbx$*0=L*IN(O(batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-4.jpg0000644000175000017500000001507113063003323026114 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?8~4 Nv; 3PqɦݵbJG@ I<59;ev@~c;vB[qjx:%.= a+Qcg6q#ާӣ/&sҶ(P@R~ܟO0CԸkC`mpS@~us.p| jFoL'^?¡.[UE.fZƶmp~U`{ӞPeHu«^iW/o@:1pSْжA=j`$튊YL+ b qNP";wUr65a]imЁ`\ܗsa [/&,sŠt}khRPZA 4*zjud>ڞw4q3u#2 <H85.$G-sUS`=EMKJ0YX(9j&. ,OЏZ͑fWVwbXLf0 zG# p@}&6pAzr\`Og޷R4|H$79*43  4}Aoq\)o&|W`l ?&D ʸF!2\|<l ~Q +eRWؗ[c,r5_Ƶz,fUz(x?ZNJG]˻ܚR72$g`Ŋ#IЍՐ{WmMDgG]Hf_Ұ5{NQY :0*YoFfXݺ?ҵ'kM(!> }v#*rT<0đ*7)یJ!G;|GsQ=Ӱy7 8ރV3|Ƒ\m7)$h{j͊(^~TﭠGNV+{Qo/v$rm>R弛pB_Ŧ;EsZVrZ& ob9s>at11 [I$:T84Jv"< Ԋ4vҜgx.EPS֞JsND3S8?NDtl#=hE UB!>Ir86'j/pIO8 .;RWW./Q4w,S˜0Pp/H۱Pz,8c.FN>m[-#;)'TK܄0^` :rO'Q(d5)r-Ehmdb.zJnZL'u_o,|W={H"^#v5^S}ű;$mEXL0`y ؊m &1Ê|ёa\컈nߍ5>˙v /OSsl7F>Q;&7>Er03)7aIlu=Gҋc:*q쎦4&7CCb4͈"NKwHGSMK,vI,KPxϿ[XhEb@z=t?*ZMw|IHpT嘷LW3ceu,E"FxCMI}:X ITegv{Vp96//9`I]3EqNxM= e3sE-!/zU'g+s8UGL(p\ҕI 1<8皎}[?ٲn,91t^'$Dv۔r@b,0ޫ<&M: r8@qdҖ?QQt$8ܻw} ZCl@8} qwjIzTtqy<hC8WiOҩ=ټRBcYpO9Uʰe$9 n$51O`%H *} Q$a62}{}i*,ym]AOjn7"mAN\v?Ι<{YxIfA.A?j*A v'RC1Q;EAN;xw'ڹof'j! rۻǹs: }ǩ9n"/1ZsN"O@\aL ԐyIHr8 M'␮HXV֘YNM/'E| ZʰMP۞Zz6NMK]A3BRY 'uuiY@ ME2RIڥF޲ٕqb}ۿAnnw˱*t5[0÷0)iDcHnB-jcc*x aB{*);{xRҌQ!V0p0T؞9D#֪)3>1UGRM TR}_]1}ެjga =@,}XJǹY&a!,sUޅKxjLp+9<*յiv{wp>\Zm jUnP|᛺3j ƪBy?RM<2p* omn2۠I$ɨ 5&դ`DdF1YprI?A߯j ڄwg9Hp =͂q֣ff.,UAMBǵGց7p1\rj#0#*{N+)I% V}Ksnv~yE#t$n=Bé>C[fq2OS?eN Q Ύ&$3j[IL@=yyZ q!C9,}sZ}S+u > 9{'jj%]-;ȏ$8U9Ntvh6vsgN}EvB v13r[5\ ۬-ܼpyyE>4 'eQq8j!'Ni*61XLg`P$sH)\iiN8IsN)XOΗ0&>R5z+ ,ITbҹ /b`{ǒ+^4XcF+6i 9=6-%QN H3E;%:!jٲE9TdLN~~70 } QEmfWJ :Ud\8@Rꆌ%v%{UhBzOJ(TLE1""s֊()袀%0jiy#z(c,嫐39e=qQYٚCqx eQYتQZbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-1.jpg0000644000175000017500000000633213063003322026110 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?cУqp8<0p>>h1=8㧭gR=1. LF8h/.O4n9j]{r16c89G^@ s}9i#~b=>'M@d =玔Rn)#{( 1N1G^1194 i RELc= gg(ɠ?Ԫ3K(u4}zZP<ьtNbBsQޗ=iq@ /':ҎEi =riE{p֎)q 8\ҝ#4\A\,B?ɣiG<\qHb}y&x3꣑P`H"E(S8JP;3K&3J:qGOƔ W{ҎiX= GF1ڝJ^EaORr)p2~oLqJ>F=(4KJzИ8ь J>BQKE+#„aދ)\tҜEʔqsAcQR<Z)\Gn(@ .(h!hJ01$ڂaSԌP?|q#(R~p=MbdQN (DL \q4jR,B31җS3ӰOK8#Ԙ8>ȥ1(:ހ3ڌhBu? pߧ4RݨnQӎXc@QjXi$2Jq$k s[SmXcS9׃ĺcT1PG9-鏥<(#WΛ䷍ԃa1yCyzH3+ԆdN'#h ާtx&JʻӀH5/vu= qۜק&5ى4}zPAQPzf3ǵ.1R㎔)p1ߚ\u &;u8GlQpS8X22q((P8zRhQ5ZQ aCN'&+-zx*m 8m<(rkȹ 8qKq֜W:ԻI'P*n1uc^ PA% iĒp3ol .АP5 tۂ*z +:yy<ʃ?}+ 'ilrbpѪ1sj{(u`*cz3R\ef4K(xǭQ6cJyquӸXn>J\{֗"(=h)آ? P2xڀ0LU6`OUf&kNrI6 eRs5Z=jwQ֐SNLF)!6x)A'Aك4cFh x{u=O q֝p3Ƞ,7xdҜAb ޕ $wpQxb~Q-$JPOqҕϦi\ڋ)$isQ߯Zѕb2A#zpOpEsr[g]-lhO_lN&/ι[N9‼SP1{Gj~~l?C01Fj~ӂGn`))>Qp*eјIΊ+ M(E @8 BH{QE $7(C'oD_0,z) yYմwErda )FPYXE5wYɁ%źHFH=EWP؝VBQM:Ebatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-3-4.jpg0000644000175000017500000001143213063003321026111 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?,Qܵ*_#eg2Gl✢"A9M y{lޠ?tSSQ>SVlq$X͸$~IWLi7.3$P{l FMA61$&.S1Cq*As,6xFeS|z@b QkSq#'8FrYPAn9?9Vc!-ka! ?JyTYI&8㹭(lv.1Kc>9֌6qQj؄A ?} Yh OSXNarB8'j+yʈM@& M9t#իAT/ <=6e5ia`j>"!8ه*߀s̻N-2RA9`ޅcfMMLސJ **uޝ\a&KC7s=(FfA}ƫ& Geog8Yr{Gk7?flL}3Y2\5\O@~9(7o]E8γc'ޥY0ƖK :RɂIOOJӂ8J8vo$.Đﺠ jUVw 9-#hkb`P͂ޱQA[[5FjWn2Hҿ\˞W58rfqEIDP{z+-@@Z0֪bz [>r\5xܑqNKy8I O8ʫe{ɷXߐ3.UHUQG-ħ!#.1G&ɩ" B?nMcIwjw$(?v!HўؒOj%OUizL?JTobLK$* 0=1VgJ*Y9UXg*`1O,Ҭ硡1P)1I>ڛ09M2YQl`y ֙$Զƪaf#_y֖b#IⲝNEq3u|Ub;x63֙=v:}+ROsBJsTՑa UE EtbIVG鷟Ҵ"HP6aV쭈F_jmPG5:|0V3f|"oc:{_iɊ0;9L?BGjwQ#gzPFҐA'M!N\v CjppqFmˌG]3裦* z*a:r|gګ<ǜ=Mieb$씸vdO nqn;TLd} XFѴ6>UQF"EX Rt'=E#FօϧqQcKq=E.@Fq=8'Z@4U= 32})Ka(5r+#ZpԑG 0jq DQe-c+O)fv\鹻iEXb n)px8<Ƚ} 2m8 S,BPb)1m37rR2=)bg*"ĐIzTnGLCUqwzQ &@=H>}R7<)4ڣ6eCng0@+v, hւrjD\yJc%rI z*nUX `%n=-X8ݜ MX ==ǽKqnb!ЃBCM 8"9'cVd࿭EZ̨C@ ӥ"9+8\Fzý3Bd \H蔣N$^tUGS;`Y9$+rp ƚ*L#)GSnsV@sց4ۥ8`=R#޾HSy 9z.x}~b1dN޴NA'RRիx{ -핗͗=O tJXw1߽B#'i ։X2A#t*P85"xPI ~8l: z[)67$/47LbH#FʟzlZZ0[,,]$p XfrH] qa`aW'$-Mܔ#q5 11FNy>JRc{Qһdqnn^ȦTPAV@d:sޛҀIQKzq֕pH*RZ\w ıKiX!YZ:87d%pON =POlԟt9r-DDL?$2w@9Eo%FIj,[XeQ Zw7^4gHcS'杉.HMti?F9HmcgEEF}H "DY,bq5:.:J< T# H@hzҮ746Lal^zlc֙7HԀiqށP+ IPǸ#ҙ9G<ۚRNzH qS ~QNA9*NqQEfDQϹ ըy Fn7b)qT S(C"~SE3 z}E) ^jNTG) F̞OZ(0NHj7P"qNxbzR(a(batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-3-0-0.jpg0000644000175000017500000000557313063003321026116 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222Z" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?BS}jp O S+S~ JpJ#P+Qyty~ ]*ߗI u*J\# ^ЎCtGQfȆU@`|cӧK[xfg~fae>ctź]2xXbL@dOkFHJ^ᨢodH #)Jd7,\j"U$v+ []sj }jݾ[<+x *6l`ɻnОJf9WWl99*rsRmxB]m(08ݷjư`θm/wd]I#ޯh[ ݛpLn9VqBKR%%>jh敮cȒG 9?V:]`:2c<,[;oo=<zǛOiondc[r}ǷZs_C+ڜ^2Nq{WY Sir7$g#rFj嗃68ج=OY-= #;8nK[яޮ3A=+)F12ӡJk6w}:,iduU>R'a3Pҫݲ@U;eQj}MNwH{yfG(XXu5j:D,"&,:Mq?ʲb($(?ңSsF 8U(v5%72\ɱZFT*(DGB o1VbzgҬ!ڡQjj,n.BߝJZ(R7Lys횏L<c-g$MKM;"$X?Ozx#>aa$`a3 ';b5bDj@=逗s}sHӰX ;蠎 6؍їNMYBFMR {t'9sJ,C{&G.cS1x* y})3 ڞQNp2I ~zEVݗ41vEtP'JN S1ؚLE"batik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-1-5.jpg0000644000175000017500000001112713063003321026111 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?rI(3Ҹ` #>{\A+XEQɩq MekeӮgc$aF%a֬y6w^M$$Q$N+^T" ˌ,iM,y9RqF;S)csۥ#˞~4\dj"Ҹ,zC曓K搃Ҭg+hOz(Wrfo$ r-8[քd.@nPn Ԋ8jSKҸ\Zc9n曟ƂzQp3ɣ4c=*X䐀N{ 4ք:z+nXVGpޥ4 tSr|cv7sFAw5X c%==})N{d9QEa98j;#fy \qVBS6F`I):UˍMf1.Wj)@*Kf1@y?yUR%0{ O%6}j@BF:{Nn}W4T1E+ Wr#SUF@9iGaJܨP ##/ yRgeyR\tx'P)OK5Pm^q kS(Ӹ'J"W,W3:(\ZCx[L2a=2I⻣#ǒH9qK6 8S皡It}nbGF֮%!&BoPm81}*w(OPNW=O`>laphQ9*XFvdkbYzZ ?;Қbj5N!uL& 8}+ʗz \oD3fb!A!9",ǯ%vJMDt`s޴JN㜹c\Ve4Rr{J}Á* zލ>­KhYH-331ON})k#ȓ#iGF1֛';$ AL9pzӏLME1J)vr +<G491ސyH˱ d0NIjEIÒA$@Fh4WfxZx)1j 9u*[ xz70q6+s6E.V IeS?uH98J͎YgrfJej\=:5"TdD&}8LއTb#s뚩{r"BI58XrHӹbN®7&MJib]'x0z}+#I䞔u=p;挌sǵ'ia@87c8^y` w!rzc֒(^O4 2y9cq暣v' 2y0;P0I$Zz1bF0*lRJ zwf.@u`[gw,ӎ>9A8})¦xֳ,>1BD/ʓļԊM.2!E$?DAJ<@=hREEY0dd*8RiA8U4q PW9E9@[M` Q'M<w8px#ۊQNb:uGJnr$ ~tUB?+<.A9A',F= K8j>xNMcuSsңU @' 8pNj7\sz r#)$u|85qE$OSM5OHORx`$30鏚$U`X>9MAӷZD>2 {I4G\g= D< ӎдa O l#jbd(P>PG$8;u5Tt SY0N Ǩ+c8 w8=) BQ׊|DĕKb{9 =M7h &H#<..8h=~=Y;suH$sJĖHד۷OYՉ$ލJqDX@ bb;q=*'Q֢SQ.Į9}i JrO8MS䓞(#R T9ހCvdr r@' L20AbLPv5]NU֪*GzPҚdlO#U SOΣ$>M3zV 2ER9g$!rWqC0 S_hbN2{TA0,9?)a`JwEUtX^b FͰ>JcJX`Z1lVj&2 Fs9Rzn>杉؟LҞ4r}=P:Ѱ$4FOTz _^{TB$1Ij"FNzTZP'!p1楖#*@_ Bs:IxRg*yHbǁ$sRqP9 =i͍ā*[90E8~1 y[r8愂G'#4gM{$K`[ZG=wP*JP)qڔ%F)ؠ (j\ghqF3N=vhuQLf((0b} (Cp8~vbSF(S׊\S(ǵ E?SSiFJF&;)q.=hZ1Kc>Уcڌb\OJ\u.;R .)qJiތS~.)qK.=KAKqJK{{RڐKiqcڀv=\R4c%cCqF)إǥxKp@j7K\PcmP1Kv(R().4J1)إJ3]vN4 ӱKN{N?Ȣ*J;)(Όjf^;;яP!.1ץ.()qNKf2i@qN4b ǵ;({R`Sҁ Kvo֌:1ޝKQq ?hS41iq"ݽi@bQpc?&Ը"=ix3i\Qv)vQۥ?.1ڐ җ)hiݾcm@ ~v9-hh4TܢOjP)qNc@N+Lzivj` m8 P?Jn)R9F)L~t})~SP?xcpoNF)LfS](cڗoNǵ.;⋈fRڟ4`QpE?Qp@Ԡ{T~4{!0zRj\{f ]8Q*vE.]j7wR4iiqLN.=h hp4/\SR⋀~bZ1j)OS?mSڔXsJ8.ivcKvvvʹiRZAar:ѷ< 4 \})i@4΀;zS⋀оZh {vv4hbtQOǰR9dS+*n]@)O1)6ڝ)Qӱ⋀zg>ԠsJ(ZpP+ J8 퍑|kڳR4)ӕIr^N(AenaLj_IʝGdf?ԸW4٠\:z*Z:MH4?v]⵹cKN .J)v@RK){f惕{zS#u5)@"#zq3HfSHiБ'u{l~\|Sn=h:`cZRr=R iTsȥSH 4p9zӇ F\ RQ֗vrzdw(9^gbpv59 3[3ދ"QU9n ϥAͼ˭RX=sPHny(e9VbpH:tPҸͤT$O회2})RGQI%/qEDrNhWH L( )pH޳JÁ LfGjaczcO_ƙ b% ћp$sƃi#MDOhlhc׽0P x=sVg$J4BM[̯qVR—;Tؤ1"^1Ҝq}pGq&އKF}q> (CxI JL9oqOPH9$rz8'M ,\*H򢙄 A[$ kLfv5l9 4|n*hR <'vhʃ֤08axEEm!<Ҩ upG 1JO>09#$+H= ^0'۵ngҀ<{STw*;Hs LRpzx8ϵDВsߞ?E3QD)br(FhPI 96!Q2G4*3ޚpzPXC&ʰu*0m Z/yE3y`B#JrEH-Ϸ]2@G *V0{Ӓ00O?K#)F3#\ӽ9G= "brIVU<랔nj:m`p{ Td٢Kr*3۰i3#}$9=h\^vp=&bGI8g$֭"[w=U#F{юIh0p;ӹ)cNQ>24LđPi4XR9I9 AKwwCޕʱ_ 9K~T֍s=8ias)X VU@ `4>; 6=} w5`'ޤVA.zv$ry:})G9PCz\y R`3JQaVbFy'$~cA?1mMicGT-ϒ=1HÐGsg֞ c6JW0;Tp3ǭ5I8籧nRHw;FFip0OSKr?C <j:RI40dg4ц9Қ 1@1B@I֊o֊arEAHt 8=irI;y֤,Cc8AJC)>A݁җ铎3@'$!$E0y-jk8 Q'ީ!6H 8TLہ'j6s}iy'QE'g(^(Q3GGr});3e$Kd p9K ~T\cs3Fps֔qA?sniǾH9ASL,=֓('$ `Rd@Hv9<}) (cjc1kpDCOzcWE%23ONE=z*AELiN:EJ)yF?($((N$h"RI #S`ETbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-0-3.jpg0000644000175000017500000001653613063003323026121 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3#+=똎ٯWP0w`{}*uTq,Z}Gqvf:d5WTTܚ 0$L'cڵdF$3ק^=#5թrʬm8srCp}M:Oh`37qs> kk䴑Z-i$~j-<~Th{p?JɶYխ3Qϯzz<)iE\-, uڃ%̰x"#pAv`Ɲϗaye& wsVgNqr&$96O=nP$sZY{21F1+ԢarC؟c^7eQq֚ {SnH 8$t0i$ w9W\"< cK {bb9Ob%K߸Pq*TԴed0/VP?JxSJuPP< <-,l .2FH {LV3x>y 6-TSE͎ %K1$`+ѶL[,0k9YFyİ6i OYɞޕnHOCo.v ,Z3Yv1J]i[&ܧ@Z|Bm.2|Qq'̶.\$1mVQqaK(Scu $!"8U}1RPqm rU^U<ΛJ5엺ViH-,ߘ?w+ɍrLzqֽ+VӾ\-p-kpe1G?.i$kI~AialB'@I$(YYNOS).U$Tl +YT@KFFoxܨLHT-]_(`u%Zgd`A#:b*fYzwE*A<7La2ãkQR(;>,F;\wս3\~(d̏%'\ӯk\o`$y;+f`10yǏeGjB-s€` V8xŪsu6bW|¬H\(JquW@<}*q 3Q>[Hڪ哻smMv Y| !=Xwbt1 0sU5C:3(=Aץc} I(b6!Q[̨+m==~t2F7r>k v4O8`:\ēb3½$\kɧhV7v%VA‚.I` 'ĥec ;ܰ:ThĎ֊:48Eά ?510G6` hv\~hyƧ˜ȮT"yMXGVDs6;sq6],,$ 2\ )m1nߘ_X}q:-ذyFZ%˓<J͖UH $; UnFjk/=O k{}:po rH#v\<)W u$#9]9>G.3:zTsoM;>%ѭLerI$AF1ی\JI¶@ȯb+g*{DZGʹlc:WyjI- ! =jt䙤KeUПq]4PF$K:Bu- y$ 8U.=Lx.Ns]&M@K&sĊ6+wF"M 1QUuAuŞIMXlʮX89u9IuvgHɍ #ݎ5xȚW#+9lpH9浭>k4-k  Ltm=Fm#۴q~tZwj盍FiȒhH @ Th'@K= mQd0ociWDl-O8ɭ>)63SUI䏽M(gmZ"ϓd԰?v6[w ^e=ʔdYөMn\6ihÌd\jMK|đVVSY}Rk5U΢MNEI dF;FWxkWf\ga,{w'3XvJDA)?R$)ĤqUȖ ҸSCu?҂e##Z֤5-2hms"sYK0S&j0|<=tqc_cB7l ?Tw%i'%[U'$LV* jt cb#QJF;vT8^4K[;[cӚ6 ,s^8iVrjkkV e@]N{|;\6ҥWEx7 PNm[Ow}􌜑:ʽЮumCPkR!`@8qQ[ QA;dq֩:( Mz5^o Yߌbѵ.s,e.of;W) ̤xNr 椤opXWngye4lr,щP))%[3C)#Jϭ1$iU_}=Oc{ihDt0b*?bKܘ `Ns [-Zid1(29ơ$/$+翖y 19*{ Uf|@ѝLhXÑ5}P+Ngm lͦ=!qYT2++QG#L G+GtjS7.h y\(u[oE?ӊMVhFqx?C]d5ˇ V$1rrAp43_ؗ5-ˡ 78Uj |RX{ζ$큚D{\`xx{ƴ:;O?^zӥ-a;r y٣'ӝF*]͝bj $\@aݥN 3[$L\puo[ ^/#Z}J~!ʙl}x-cD{2Z-&6=·);_`p3[WI-8*faJ Z}e'..0I v9t炜VBАOzTChU}LWQ00n3PRHcDIlZ-仵$\2{֥w*0Jmo D}a(5;2ݿ - OpSD}{hd+12{晒 :hwBOcMY@C=x{H)?!~v=yg$kEJ>P#( ǶyU!p!sҬ&dN+)>ŤgIl[⪼#ڷ&N1%:T8-4 P*zc(%>d-o)\MS1jV;Vr/T9-JϠ_HA m,x* 5ɖ$})0S h,UPw5~_(Gy*{T +Tol*憢EIlG,q/_z+6K}J*=2da+2}|>GK*zLJU! jd$Q&P1h`;^r0GlYO(?"at5i!&sF0GbN*R()IltRiH(v$=R lPp٤IgFl<ΌO9eLXC2uȨ$ث[HX+id9=8|Ȟ2>PjŰLH?t k>0Vo5chbm>5s,312F?q\Cw#FF .w/٭䙚(I5X!R*-3fGgg(ĜQ\۹ph`.y(`]s'pbЂihcӁ]<ԇ$2;'o~  OFF!LlRI ^sn${b{NЃXc*$ 1f osOkJ443q@cvX=01R SЂ=3YZLUf8Jr@>M %FnPm}}"528PAdU=9%@(Lfd&|BoߩKJaIۅr-xZH$YWYV sҞV\\ 6>N~_J朹e]()rjR@>ߔd⪳3%>5̈ոYrW9+xJy=BsȤisUrBGpj7`4 !Pz*D\pXɠ+$jqؚWo,1,z{VsUIXGbi\)i2w \=jwb3N׃+* OqEHUz)c ֞ ϩ #%6Ht6[rI8Guq m<3PmF8cgi/Ę +*N6Ufj i%.mU@г-Fֲ<[k=e A <ٛIp"aJ/ _\3rI?p-*s#ܞ>GEզM0=i}sT: jr8kŇRq2X(=Z89 zb+μqU佑+dы lUdIȌr~~;vyXOzi?(VnZV.&TeRXHj@U+|_ƊE3-Ks4w#ӵBzz( ݍRS12)Uƿzo@OBy_QF8_ᐂIYmM>^RH*Lc'uݜf,[FKDՒb+)nͣC0_.'h895qER1UQEsGe=)'9'zQEt/!&*>5S1EH*tQCQEbatik-1.9.orig/samples/tests/spec12/structure/opera/multires/opera-0-0-2.jpg0000644000175000017500000001051313063003321026103 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?\c.=?jy6zuC@XoLRJ:sK( ֗c7tҁQ.+Z>(`}sF:v ҁz?$яʄ#(q4;ץMǜu\j)[n SCN9ҾԻ)13 Qu1qXf(O@h$7c`g&@cZ:v,& d\~tbE-cR3SsI1XLvɠ1Kޔ;QJoj[qaYԫj֝)M!F=M(9=V*}?Ji*\z89Bb,ul\уSmHSZjB"㟭JP.V7zS 6;J1NۏZ@3J.zǨ1E$4\S8i0HzQj-اg֍Bę_jP?ߝX -JK\ǙjX[F5dA})KQҚ0Oy@#=>bH-xsފfA(9= 隈00vhwS}3Po֝ubP}=)GJXSNJAaiA♟zι״9NV_drQܨS4)d/9..Hj'hI @Vo8J^Ujз-:ɮ݀57~ ֝[˻Xp S]Nx#[4CG';grkGC +,u MJ?2%yQV %ўi-V?Iy'oxj-pjԦm=E1Z֜zos~de*r;Hi=q}+$(Y S MM$^#8V 9#t?Nx50 BQveœ ]5Dұ=6yHds+L=E{!M:A>">:pͪǖ<̠4B|dUZȤf#Q$9S$I ʒin/nbGWs(+%'dIx^nXÍǚxC9I+F6'9vF± j{L5^ijvYhp噗q^L6, Orp}UFMp@U v_'01/vj=MMJh8i>AkmԒ*aMI=zF?\ݺG կWQC3Hlڧi]9YXrjڥ-m\Sj|@M#MZ俵nK ?=u(2:QסG?;=nm- (kv0ޟqmC 仵vb|ٸ'2D129X΄4>[ `pZl~lr} &z簮&$ITx(tM6+0;6۵`6s$cL 6p@X/!1K!9=V$Ҿ]=5'|'YYf9cèi݆~lD\t3:IYNDIɃn i r`2XeI5x|i@,)5 *ǕYNrpj+?ٷymUXu+F'c`7"ᕗ$=kEx |gCfKh%gN 9؊gV~[\(^_@f6^ ē'(#x6NG"*pGJ᷆DH"/9Ն9 $~ `xצh|HڏLi[Q\Mf֊)p8v쩈,@@9[fçҊ+iq@T7W:5DH*sҊ)&ZHf9EUbatik-1.9.orig/samples/tests/spec12/structure/opera/opera-1-0-0.svg0000644000175000017500000000474413063003321024266 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-3-0-0.svg0000644000175000017500000000266113063003323024266 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-0-0-2.svg0000644000175000017500000000365613063003323024272 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/opera/opera-2-0-0.svg0000644000175000017500000000342713063003321024264 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec12/structure/multi-2.jpg0000644000175000017500000000202613063003322022664 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222-" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?M:fo=j0 @J펟xFI㷺.R ~CQ2{/Bm3OZ[X E{87n=]q T.Hq 1qW:P&-)> >Plet{DrZ,$p8u|/?ZBu!#:iweڡaI7`J8>2Yɑv9fnvwY85b(sh=*(bFN9')c֮?batik-1.9.orig/samples/tests/spec12/structure/multi2.svg0000644000175000017500000000525013063003322022630 0ustar mans0954mans0954 MultiImage Extension Tag MultiImage Extension Tag batik-1.9.orig/samples/tests/spec12/structure/multi-5.jpg0000644000175000017500000003364413063003322022701 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222h" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?1Kv)q^;P(P < \P1K~)q@ PqF)R☆`ҁNǵ.( SKq4b1@ PqF)f(?bF)hG\SF((6b*bT{Vo:E$`8 @+DŽTCzm<5{yF򈀅A9 qg:[#(&C3DŽT¹b_*?l?ߴϦ~yGȽs۴qKnKYyȯԬ[/34cv#8ҽ^֒1dcjKXƼKBUQ%ĭ+ N=2stݹ Ra?@ R⟊6Q~)q@ m #.)h@ @F*MmImxmIS ph{ÿ4k^>, ZS@zy".mkJG##:+4m *pFG#59VrgIGCծYl;ve888 z.?glmg&uG=G_IQ[uc.̘{jsm|7,rzy$I "1WF*GPGc]F9jR7fC\SK2m?m()اP6⟊\P1Km#K~)q@&(@Rm1Rm"vmFړmhG)إMcҵ+)JV9'$cOm6 pI$3ls׵yW;rf5TuW_Is(x!P *A>>ǵ_~&vc[IBHH<`rzVj!Vw]Wv\#*FA171M|u`m̓PDB&PpSB] d_š<,éSLY̦UHܱ'ni>ѴDd!ka= bXkmH@.qxmRY&V˂}qڡuxNHnLs;1W^Cm5hEo"ij #)f?yN>\E:yYtWmImzw<ћiv GmHm;-.ړm..rN]6+t849N=m1Fw6Իh@Rm-mvѶmj]h*ky紝gHe_$lUF8"pZc4l{Vx NH h|іh+p׏ \S~F.-8Fլ,Bάxf :]I; b8`בm PxtGS/jalJgarHWm?m.chm Ef]h @Zm.."=jMhmIm=m6Ѷ]&6qmRmm-mvmE)VVc/Wf-9Ij@Ң# J#Bxl}jOe\\,W<6aiBE`Z;9@+SX}m/,kH`pbVvᰞsKcx$]iXTzu((2@8W*(QՋ*w1^>6Eb=jMhXmj]mb=m1Kmj\QѶF."Fڗm&."T"2zZ[jHfԬ~pSSsK SiBӀ%Y~baMvFx NoNE)Pw7RE>BrQ]M>[Zl ~(T''AB*+QO)=;bvB6}?\񟲺M* =cx%t?xoGjSkKy:̫Ѷ#;^G왟2}ه?*ի{$f4No`mc)iZ(g ~2L8TveUN 46ѶkmvѶѶF."j]hEWR SFBNVo,oJAZx$woaO.j1gS)ZpZ{Sa  4T}OoQ,c<х6=bGʶ=|6SW{}Q¸nu ڂ)3=+#[Ʊޮ~BOu'C`ѭ{f.-ĈPdc#ު$(0V 6zU ' '_JMFx+L(W{YTZՋEs kC /,GW=k'&vlyďFeiWu2He!˙6 *~phwIJ͙3 +gq""O׌s[$҂u=VV7߇-K䷶֭ݵ|zy?{g(4$sY‡+@= Sb4BqkFGSF)VGҝޤX8IQ-vS!rc]Q=E\L})fjn,o8lO,U&,@mAcn#mq/mcQQ\p 1aAzTXOּΰ<я—J ߥ#22NJIfX*I9&@I-`8eI=; zzSA\R ')mޤ֦<GSP4T8݀Yei8'75ѭmB1du 37GV6D0U$b9Ua|dMP8 7:+/NM:k<,grc`£I'* }3T҄XUp`ҫRw-` 3gnKEf=Úv) xV,z!#=x5KR?h;-ZςAw ?W+w(b~PzWE)?fZJ=?d0I!F;YI}G@ƘTL?{]}R}Cc" >YJubRg1&)A#Q3gJO6G,S\붰b8R;_򫖚|C:9sWkidRCXnQ (,yt/;E 嶫LF}ګxU`Yg`\Ctuѩfz.i"BdB<ȝp?3]=+!Ս̩ B gtW:q4/nə< د5AԓH헺>s6ng1Mx|_^kzҹFI±'{3\E-$9%0+pKUr~Nu'UH(.g9QIVxN:Oܬnp#<>w/4k+ `cZӢ乙-} _AH,RUתۨSUir‚!?%&SM#s{PGMxnn-[gajJʱ'BG`$e;Bii.7ْK+2O~6déo}SVgxmY-d$螄{۩0f-KCNOOޖ©+h#f)^Fiͼy&,>FspwgDpWeт2σ*A(S[8>`CrA61Zpu± E;=K#?Yt:չdc%6la vQD~uߍÜ{V,lsOY\Ldžw* ;J׆C3[] \u ok0_AslHr3/L?QXB2nnҳX3Fiv\\oA뎸JJni!UTW4\9O I6Hf a9(4 Bɼ(]q{V-py2!WUum' !H%%ϧN95fzi!JtXuTIgȊO_ОkxdlN֜dJ8FTn<?OUG[GX 8pUH҃Q5򕡺yUy4%hgH,xWںV#^)jK>^GO>K6eCPzeR8h5?s4Vn%iͫorfŝM%ơ,K9?Mټ(%]a V$k_okXu,j8 sZ{gwhT`HH=ym6y#199F;qw>ؽiG:O 2*X 2CtǽSM[A]G 0vdp8UԷ6j#KnBG&eCf>VݼOqifo[e#8${cĺ<8{;KU{W9EPd(Mw1j+퍚91SzqjjeT]\@ ?Y}CIa-J*.s֣,;UW`1Qר9<*"՛bwIZq9`=ZkVV$02NAuߠFh5;˛_2yzj{ {Z"_٤]qdgs='Z;I5=$](_0 q9܎=k6? =D_[]4mv`usڸ}>WYi61H I.X`` czLlT*I9{=75$N_ s$6JJdH1)tws &r0@~m/b$5&SvϦ$aZL`+6d`|*K7Gm:Ε+ ]M#giLdo2qh9Uj9-Ymbې;aNrI8\iڤq^_mS$nS$g5}źlU$#8#硩T'8Ehj~=K-R U c`|7+i_)7&0`1~xPpqiLdPcg5e2JyiދTs$ag!Ywpv9RY*Sz]v ޕqz{YPt5*5sK[V-nL wPyC.偉bN;XwN~32׹:¥bQrֲ/ 'Ka-d7|?o]{V/6Ƀ?C.dsƅV99=fXHt L7bFmnyR171:w7}*m?{onN8}V:n*H~Pn@:~U*A+"' gr;An0]q 73U8jnv`n53&UWm)ln N?J `HD$IJO-J>< #n9 =ZK(&4`uWQb\whOj7:UY<EoTdDfa7ull-8~jKKwM]чHx$fBfRp >~ѼS|%%{7ʊ8ۉ<0{ "&S 쀪sx]&ka̟4zgޮ4*b oGR4@:wuϪi#|N3([˃ێ)"}\V.)m{wnn#UIp~<E7Nr崶$Kimb+*D뵕H.Hrx'8t,׬V;7Ja#Ò;0Kj)4"7x@w1 ɒ㞵\M29.dmtw-Z) bG^Af㸬KB-'ZԬiR8ʩ"~rUFy2`s~QvDΎzCpr 8+v6wr $*Ix<|ZZڅEaR;^Ʊ=zlz( gqO4+[ωHU:.1)%fC9'=kFSܹlo w#֒[RBԂx3?:~iNVk=HPH`-WV"J_ Π$͐rT7AxDT#<`b;S7ux0,րA9S&\'MUM?-mϰzԭtvRe4BUV[(A[}ELI91oAB9bM2H1$66[#i@( w85Gn&)G'#jd. _SUM.CkX-%{ rڹ !}xm{>nGF 20?]=sPXJ@cQzV ; 7$sVrßjmLDH]ZKrfLB6.s}?7Pynm"ʍVڛWIT$ uO*jO(x^sʤƶ7|bd$~\7٣JYEKQKqF\ssY[sXi%kťэF%)| lyq^{U#s;RG'i۹ Uxٲ?)~uN79 R/O_꧿,dM?_(Sn6 M&e.KK(>̷/) FJ?#Qs]陷Kpح++ُ ZT~,)5` UE+hCmDXU{be==ji|a%ta{ r7$:W: c՝IZ#*!LK>ϵs)6ncm w$a 0+$oU?*"B0Eq7l.iHdqY77zq]H'w=M_FGUcf7 G+wyv0QŹa3G8ې1}yiSȅbEET`;qMM,2% RG ŽÁ׎iLP̃=U- hbRۏcqYoJC??iEDݴ"2;*AʬPVlG6R<gob{n?ZĚX*{,al7<՘IisRFlK0XӧQcՔyu\"Ba'ڢS+=qXtvWʌn?2s.O4l˥4G&Wkx%i{;n?i}SډxSl#2oV;wv37>j0F?yS\mInLFϑ 8X#; Iv$,+9>ޢn,(|GjS,JQQWg2j1$L$'HJzʣ>ºlnC[#WiZ*@Jݏ-㷍wz4\SE8J<6Q RڜX ,.f+-Xm8LXte< 䳱[4߂rqj{{51So` y`R$RlաD%~RrpkY|ùG' 񩽞M $Hq/'<dVSx"gHmgD'+^՗<c._LЉn1ȱ<|mxB8~8܂E27`qLdvFPcg7/Z]#DO#3_^o} +Rh bv`2y6+[E @;=*NbHiyI,c=MVBDM@,Wl`g*xѷ12I뎟J vn[>j]W/?U ]HhA*}qĤ[ïm^> Y=DJK#8?SV. $iёr0ZGU%b"J80CT viy$/6|I/W[tkS~LWi`)=+XQnkͬHF#Pk:[Ƒ33sMyۅn^L0KACg,;SՙzZWeSFUiD#\zfn ;8 =0Ln1 fzp#ځ= :QGNﴬQ w ${z>YfI[Hwc\0[ҁUʈrc$i3(D-R?v%}(n/@SGn8yNOeC̖=jBJ+b#vOe0qRG8Ÿy7d{RBӑ@\Hn#;@X{R0(ǹȪIa *E=;حaZKF#ߡ7VXXF>#~VOSǹ$ʶ5K¬1 \c"HBPzTg4ʔ E :tIPq@8K=y )r0yuF@8 KQz杅YiW2͜ڥHN2$-ǥ Nwټ"N(FnTTo `2If{9'?ʢi4۞p9?John~MV܊WLX*Ҝ''RRCQHUrښ@C׊p /^x%I~49"&3ѳiNi4`2y)~cځێi f1@@'0l@@ MultiImage Extension Tag MultiImage Extension Tag batik-1.9.orig/samples/tests/spec12/text/0000755000175000017500000000000013153020772017625 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec12/text/flowRegionBreak.svg0000644000175000017500000003610713063003320023423 0ustar mans0954mans0954 Test of Text wrapping stuff. 'flowRoot' Region flowing Region break flow A region break 1 A region break 2 A region break 3 A region break 4 Paragraph flowing The para 1, The para 2, The para 3, The para 4. Text flowing The text 1, The text 2, the text 3, The text 4. Text/line flowing The text 1, The text 2, The text 3, The text 4. Line flowing The line 1, The line 2, The line 3, The line 4. 2xLine flowing The line 1, The line 2, The line 3, The line 4. Span flowing The span 1, The span 2, The span 3, The span 4. Span/line flowing The span 1, The span 2, The span 3, The span 4. Region breaks A region break 1 A region break 2 A region break 3 A region break 4 Para elems The para 1, The para 2, The para 3, The para 4. Just text The text 1, The text 2, The text 3, The text 4. Text/line elems The text 1, The text 2, The text 3, The text 4. Line elems The line 1, The line 2, The line 3, The line 4. Span elems The span 1, The span 2, The span 3, The span 4. Span/line elems The span 1, The span 2, The span 3, The span 4. batik-1.9.orig/samples/tests/spec12/text/flowTextAlign.svg0000644000175000017500000001602413063003322023130 0ustar mans0954mans0954 Test of Text vertical-align. Test of Text vertical-align Try top Try middle Try bottom Try top two lines Middle two lines Bottom two lines Try top two lines Middle two lines Bottom two lines Try top two lines Middle two lines Bottom two lines batik-1.9.orig/samples/tests/spec12/text/flowText3.svg0000644000175000017500000001110013063003322022226 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff This is an ex­ample of a very long string that is split ‍across multi­ple lines via text wrap­ping. Now check if text wrapping handles a number of tricky situations: a­very­long­runon­word­that­spans­multiple­lines­with­embedded­span­elements & super or sub scripts. Now we are just about to go to the next flow rect (note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here). I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets taller batik-1.9.orig/samples/tests/spec12/text/flowText.svg0000644000175000017500000001060613063003320022153 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff This is an ex­ample of a very long string that is split ‍across multi­ple lines via text wrap­ping. Now check if text wrapping handles some tricky stuff: a­very­long­runon­word­that­spans­multiple­lines­with­embed­span­elements & super or sub scripts. We are just about to go to the next flow rect (NOTE: if the 'about' were included on the last line of the previous flow the line would not have fit in the region, so it is moved to this flowRegion). I want to make sure that it stops when it hits the end of all of the flowRegions defined. Also the last line includes text in a larger font size so it will not fit. The end of this sentence will be cut off because the line size gets taller batik-1.9.orig/samples/tests/spec12/text/flowText4.svg0000644000175000017500000001045113063003320022235 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff B B This is an ex­ample of a very long string that is split ‍across multi­ple lines via text wrap­ping. Now check if text wrapping handles a number of tricky situations: a­very­long­runon­word­that­spans­multiple­lines­with­embedded­span­elements & super or sub scripts. Now we are just about to go to the next flow rect (note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here). I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets taller batik-1.9.orig/samples/tests/spec12/text/flowText2.svg0000644000175000017500000001150413063003320022233 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff This is an ex­ample of a very long string that is split ‍across multi­ple lines via text wrap­ping. Now check if text wrapping handles a number of tricky situations: a­very­long­runon­word­that­spans­multiple­lines­with­embedded­span­elements & super or sub scripts. Now we are just about to go to the next flow rect (note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here). I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets taller batik-1.9.orig/samples/tests/spec12/text/lineHeightFontShorthand.svg0000644000175000017500000001310213063003322025115 0ustar mans0954mans0954 Test CSS 'font' shorthand 'line-height' Test CSS 'font' shorthand 'line-height' font:20px Serif font:20/2 SanSerif font:20/1 times font:bold 20/.5 times font:bold 20/.5 times font:italic 20/30px times font:bold italic 20/15px times font:italic bold 20/15px times font:700 20/1em times font:700 20/75% times para: 1.5,line:.75 para: .75,line:1.5 blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah batik-1.9.orig/samples/tests/spec12/text/flowText5.svg0000644000175000017500000001157113063003320022242 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff One complex flow Region Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow; a poor player, That struts and frets his hour upon the stage, And then is heard no more: it is a tale Told by an idiot, full of sound and fury, Signifying nothing. Three flow Regions Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow; a poor player, That struts and frets his hour upon the stage, And then is heard no more: it is a tale Told by an idiot, full of sound and fury, Signifying nothing. batik-1.9.orig/samples/tests/spec12/text/flowBidi.svg0000644000175000017500000001160613063003320022077 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff Some (embedded bidi) of text. Some text goes (right to left), other text goes (left to right). arabic: ء​​أ​ؤ​إ​ئ​ا​ب​ة​ت​ث​ج​ح​خ​د​ذ​ر​ز​س​ش​ص​ض​ط​ظ​ع​ـ​ف​ق​ك​ل​م​ن​ه​و​ى​ِ​ٶ Some (embedded bidi) of text. Some text goes (right to left), other text goes (left to right). arabic: ء​​أ​ؤ​إ​ئ​ا​ب​ة​ت​ث​ج​ح​خ​د​ذ​ر​ز​س​ش​ص​ض​ط​ظ​ع​ـ​ف​ق​ك​ل​م​ن​ه​و​ى​ِ​ٶ batik-1.9.orig/samples/tests/resources/0000755000175000017500000000000013063003307017551 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/style/0000755000175000017500000000000013153020772020716 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/style/basicsad.css0000644000175000017500000000171513063003310023172 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: hidden; } .basicsad { visibility: visible; } .wow { visibility: hidden; } .grim { visibility: hidden; } .oups { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/cssMediaProjection.css0000644000175000017500000000200113063003310025173 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .fancyBackground { visibility: visible; } .background { fill: black; stroke: none; } .sectionTitle { stroke: none; fill: white; font-size: 14; font-weight: bold; } .sectionContent { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/cssMediaList.css0000644000175000017500000000256313063003306024014 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ @media all { .all { visibility: visible; } } @media aural { .aural { visibility: visible; } } @media braille { .braille { visibility: visible; } } @media embossed { .embossed { visibility: visible; } } @media handheld { .handheld { visibility: visible; } } @media print { .print { visibility: visible; } } @media projection { .projection { visibility: visible; } } @media screen { .screen { visibility: visible; } } @media tty { .tty { visibility: visible; } } @media tv { .tv { visibility: visible; } } batik-1.9.orig/samples/tests/resources/style/default.css0000644000175000017500000000171413063003306023051 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: hidden; } .basicsad { visibility: hidden; } .wow { visibility: hidden; } .grim { visibility: hidden; } .oups { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/hot.css0000644000175000017500000000154013063003306022214 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .logo { fill: crimson; } .light { lighting-color: #ffd; } batik-1.9.orig/samples/tests/resources/style/subdir/0000755000175000017500000000000013153020772022206 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/style/subdir/useStylesheet2.css0000644000175000017500000000166613063003306025653 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* for the useStylesheet.svg part */ .gradClass2 { fill: url(../../../spec/structure/useStylesheet.svg#grad); } .colorClass2 { fill: crimson; } batik-1.9.orig/samples/tests/resources/style/subdir/useStylesheet.css0000644000175000017500000000204413063003306025560 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* for the defs.svg part */ .colorClassStylesheet { fill: gold; } .pattClassStylesheet { fill: url(../../svg/defs.svg#patternExtReference); } .gradClassStylesheet { fill: url(../../svg/defs.svg#extGrad3); } .colorOrangeStylesheet { fill: orange; } batik-1.9.orig/samples/tests/resources/style/oups.css0000644000175000017500000000171513063003306022414 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: hidden; } .basicsad { visibility: hidden; } .wow { visibility: hidden; } .grim { visibility: hidden; } .oups { visibility: visible; } batik-1.9.orig/samples/tests/resources/style/wow.css0000644000175000017500000000171513063003306022242 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: hidden; } .basicsad { visibility: hidden; } .wow { visibility: visible; } .grim { visibility: hidden; } .oups { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/cssMediaScreen.css0000644000175000017500000000203413063003306024311 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .fancyBackground { visibility: hidden; } .background { fill: black; stroke: none; } .sectionTitle { stroke: none; fill: white; font-size: 14; } .sectionContent { visibility: visible; font-size: 10; fill: white; stroke: none; } batik-1.9.orig/samples/tests/resources/style/smiling.css0000644000175000017500000000171513063003310023063 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: visible; } .basicsad { visibility: hidden; } .wow { visibility: hidden; } .grim { visibility: hidden; } .oups { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/test.css0000644000175000017500000000171413063003310022377 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .title { font-family: Arial, Helvetica; font-size: 16; text-anchor: middle; } .legend { font-family: Arial, Helvetica; font-size: 10; text-anchor: middle; } batik-1.9.orig/samples/tests/resources/style/cssMediaPrint.css0000644000175000017500000000203513063003307024170 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .fancyBackground { visibility: hidden; } .background { fill: white; stroke: none; } .sectionTitle { stroke: none; fill: black; font-size: 14; } .sectionContent { visibility: visible; font-size: 10; fill: black; stroke: none; } batik-1.9.orig/samples/tests/resources/style/grim.css0000644000175000017500000000171513063003306022364 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .smiling { visibility: hidden; } .basicsad { visibility: hidden; } .wow { visibility: hidden; } .grim { visibility: visible; } .oups { visibility: hidden; } batik-1.9.orig/samples/tests/resources/style/cold.css0000644000175000017500000000154213063003306022345 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .logo { fill: RoyalBlue; } .light { lighting-color: #dfd; } batik-1.9.orig/samples/tests/resources/svg/0000755000175000017500000000000013153020772020355 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/svg/defs2.svg0000644000175000017500000000453513063003306022102 0ustar mans0954mans0954 Not a test - only contains definitions batik-1.9.orig/samples/tests/resources/svg/defs.svg0000644000175000017500000003603313063003310022011 0ustar mans0954mans0954 Not a test - only contains definitions <g> local inherited explicit <g> local inherited explicit <g> local inherited explicit <g> local inherited explicit <g> local inherited explicit <g> local inherited explicit batik-1.9.orig/samples/tests/resources/script/0000755000175000017500000000000013153020772021062 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/script/scrollbar.js0000644000175000017500000001034213063003306023375 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var svgNS = "http://www.w3.org/2000/svg"; var xlinkNS = "http://www.w3.org/1999/xlink"; function ScrollBar(contentId, steps, scrollBarX, scrollBarY, scrollBarHeight, scrolledHeight, arrowWidth, upArrowId, downArrowId, cursorId, cursorHeight){ this.content = document.getElementById(contentId); this.steps = steps; this.curStep = 0; this.scrollBarHeight = scrollBarHeight; this.scrolledHeight = scrolledHeight; this.arrowWidth = arrowWidth; this.cursorHeight = cursorHeight; // // First, add the elements which make up the scroll bar // var insertAt = this.content.getParentNode().getParentNode(); // // Add the up arrow // var upArrow = document.createElementNS(svgNS, 'use'); upArrow.setAttributeNS(xlinkNS, 'href', upArrowId); upArrow.setAttributeNS(null, 'x', scrollBarX); upArrow.setAttributeNS(null, 'y', scrollBarY); insertAt.appendChild(upArrow); // // Add the down arrow // var downArrow = document.createElementNS(svgNS, 'use'); downArrow.setAttributeNS(xlinkNS, 'href', downArrowId); downArrow.setAttributeNS(null, 'x', scrollBarX); downArrow.setAttributeNS(null, 'y', scrollBarY + scrollBarHeight - arrowWidth); insertAt.appendChild(downArrow); // // Add the cursor // var cursor = document.createElementNS(svgNS, 'use'); cursor.setAttributeNS(xlinkNS, 'href', cursorId); cursor.setAttributeNS(null, 'x', scrollBarX); cursor.setAttributeNS(null, 'y', scrollBarY + arrowWidth); this.cursor = document.createElementNS(svgNS, 'g'); this.cursor.appendChild(cursor); insertAt.appendChild(this.cursor); // // Now, add event handling to scroll the content // // Scrolling down means moving the cursor up and // content down (i.e., towards the positive side // of the Y axis). this.scrollToStep = function(newStep){ // // Compute new position for cursor // var cursorPos = newStep*((this.scrollBarHeight - 2*this.arrowWidth - this.cursorHeight) / this.steps); this.cursor.setAttributeNS(null, "transform", "translate(0," + cursorPos + ")"); // // Compute new content position // var contentPos = - newStep*(this.scrolledHeight / this.steps); this.content.setAttributeNS(null, "transform", "translate(0," + contentPos + ")"); this.curStep = newStep; } // Scrolling up means moving the cursor down and // the content up (i.e., towards the negative side // of the Y axis). this.handleScrollUp = function(evt) { if (this.curStep < (this.steps - 1)){ this.scrollToStep(this.curStep + 1); } } this.handleScrollDown = function(evt) { if (this.curStep > 0){ this.scrollToStep(this.curStep - 1); } } this.getHandleScrollDownFunction = function() { var thisObject = this; return function(evt) { thisObject.handleScrollDown(evt); } } this.getHandleScrollUpFunction = function() { var thisObject = this; return function(evt) { thisObject.handleScrollUp(evt); } } upArrow.addEventListener('click', this.getHandleScrollDownFunction(), false); downArrow.addEventListener('click', this.getHandleScrollUpFunction(), false); } batik-1.9.orig/samples/tests/resources/script/common.js0000644000175000017500000000746713063003307022721 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var svgNS = "http://www.w3.org/2000/svg"; var xlinkNS = "http://www.w3.org/1999/xlink"; /** * Sets the transform attribute to a scale along the x-axis */ function xScaleSetter(target, value){ if(target != null){ target.setAttributeNS(null, "transform", "scale(" + value + ", 1)"); } else { System.out.println("target is null in xScaleSetter"); } } /** * Sets the transform attribute to a scale along the y-axis */ function yScaleSetter(target, value){ if(target != null){ target.setAttributeNS(null, "transform", "scale(1, " + value + ")"); } else { System.out.println("target is null in yScaleSetter"); } } /** * Sets the transform attribute to a translate along the x-axis */ function xTranslateSetter(target, value){ target.setAttributeNS(null, "transform", "translate(" + value + ", 0)"); } /** * Sets the transform attribute to a translate along the y-axis */ function yTranslateSetter(target, value){ target.setAttributeNS(null, "transform", "translate(0, " + value + ")"); } function emptyElement(elt){ var child = elt.getFirstChild(); while(child != null){ elt.removeChild(child); child = elt.getFirstChild(); } } /* * Sets the properties in the input properties array to the values * in the values array on the input element */ function setProperties(id, properties, values){ var elt = document.getElementById(id); if (elt != null){ var newElt = elt.cloneNode(true); var i = 0; var n = properties.length; if (n > values.length) { n = values.length; } for (i=0; iVincent Hardy * @version $Id: rhinoSecurity.js 1733420 2016-03-03 07:41:59Z gadams $ */ importPackage(Packages.java.awt); importPackage(Packages.java.io); importPackage(Packages.java.lang.reflect); importPackage(Packages.java.net); importPackage(Packages.java.security); importPackage(Packages.java.sql); importPackage(Packages.java.util); importPackage(Packages.javax.sound.sampled); var svgNS = "http://www.w3.org/2000/svg"; var testedPath = "build.sh"; var testedHost = "nagoya.apache.org:8080"; var basePermissions = [ ["AllPermission", new AllPermission()], ["FilePermission read", new FilePermission(testedPath, "read")], ["FilePermission write", new FilePermission(testedPath, "write")], ["FilePermission execute", new FilePermission(testedPath, "execute")], ["FilePermission delete", new FilePermission(testedPath, "delete")], ["SocketPermission accept", new SocketPermission(testedHost, "accept")], ["SocketPermission connect", new SocketPermission(testedHost, "connect")], ["SocketPermission listen", new SocketPermission(testedHost, "listen")], ["SocketPermission resolve", new SocketPermission(testedHost, "resolve")], ["AudioPermission play", new AudioPermission("play")], ["AudioPermission record", new AudioPermission("record")], ["AWTPermission accessClipboard", new AWTPermission("accessClipboard")], ["AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")], ["AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")], ["AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")], ["AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")], ["AWTPermission createRobot", new AWTPermission("createRobot")], ["AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")], ["NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")], ["NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")], ["NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")], ["PropertyPermission java.home read", new PropertyPermission("java.home", "read")], ["PropertyPermission java.home write", new PropertyPermission("java.home", "write")], ["ReflectPermission", new ReflectPermission("suppressAccessChecks")], ["RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")], ["RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")], ["RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")], ["RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")], ["RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")], ["RuntimePermission exitVM", new RuntimePermission("exitVM")], ["RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")], ["RuntimePermission setFactory", new RuntimePermission("setFactory")], ["RuntimePermission setIO", new RuntimePermission("setIO")], ["RuntimePermission modifyThread", new RuntimePermission("modifyThread")], ["RuntimePermission stopThread", new RuntimePermission("stopThread")], ["RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")], ["RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")], ["RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")], ["RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")], ["RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")], ["RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")], ["RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")], ["RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")], ["RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")], ["SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")], ["SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")], ["SecurityPermission getPolicy", new SerializablePermission("getPolicy")], ["SecurityPermission setPolicy", new SerializablePermission("setPolicy")], ["SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")], ["SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")], ["SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")], ["SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")], ["SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")], ["SecurityPermission printIdentity", new SerializablePermission("printIdentity")], ["SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")], ["SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")], ["SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")], ["SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")], ["SQLPermission", new SQLPermission("setLog")], ]; var permissions = null; var statusRects = null; var nGranted = 0; function init(){ var docURL = document.getURLObject(); if (docURL != null && (docURL.getHost() != null) && !( "" == docURL.getHost()) ) { permissions = new Array(); var docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0] = ["SocketPermission accept " + docHost, new SocketPermission(docHost, "accept")]; permissions[1] = ["SocketPermission connect " + docHost, new SocketPermission(docHost, "connect")]; permissions[2] = ["SocketPermission resolve " + docHost, new SocketPermission(docHost, "resolve")]; // permissions.concat(basePermissions); for (var i=0; iXYZ -XYZ ,batik-1.9.orig/samples/tests/resources/images/0000755000175000017500000000000013153020772021023 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/images/tde.jpg0000644000175000017500000001251213153020772022302 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2^Photoshop 3.08BIMHH8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM FJFIFHH&File written by Adobe Photoshop 5.2Adobed            F"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? "|va ƭ9U]Z^P~ne-eA;[Qh뚩^ #F:^ӆY^s*{)ڭAi>]Se`fKr%{ͬlYf}$"t7t&\FoSdkA#+jN5]Mn?5Um߄-uk6O`aqmokYo&Ău_MoV.iu=VPE+x35Zks&A. ons+"5%d"HAyah1IiG縏X<T'o?K$ڗ|C`h~ cIHzn[UU:s?3TekP͵*9lk .>tp|kRվ=:Q4Z߲©Y"Z"5NWF7T~6ߵ֟_DˇEZH|IGe.dnu3!kqVnf8JU=r5ܤO7#OgI}GD8BIMCCF -! "#1ABDab;!"12AQBRa#bq3r$C ?U?i Wlur>[ЍX3C\nrPv"Za\p|5xNlħ2XvA&&8hvwXOG)|?I4W /r8揵{Ъ֚ bݲݎ$[nƻW 9ܾڵv,]Qg[ؒlFC:*Iiif_T$(csyB9⤀p%%KTTPǕ)RY+8rbFP}~;vD ^6Zb-cK0!H\+IN|w~&q1ؕƪdN"QÛX;;ʣ{@S\%|*p7fU`B\ߞ<]z {гG\ U3Һ #73J%2Ik y?j5|3$#$i]o+_-''.Ob7F8%5oZh D"?֧)ў&P:d@?}bMY3@3E`7&.FvK8аm}gU8~LSq[~7_sUyD{ ?vEAVT~6oeU绪]zV}ƢC4ŝ95%<clC\k[g8}"LPh9)2{Kt1WXJB߿ԦH^UTDV\e\,@ᖙh6o$[ MTVe:Փ}.p=xc99y~>^mx/Ɣ6%˳Íl4Md2mf6*V(aQ_xv^i觋Xs/3Ca,|sDw|wx~ ۩VY"eoMRK$F.)b0`&jv,[ZvVi:Qa"bJ2,}kz VHcbm+ۓ 2.K5˭ PTl{3;vFDL)fkh쳘jVKvlZ*ڶf59C,8a4 @>& rf0m`yʷQ~h_eB&g4BSYfIZoc + GSl;3I5-e"l-Zڄ} aݮ ,O^߾˴WTsE2yf?5xRF]c^1+Eij igFx?RʋF |lcEۧaգCn8x}..Js{;c8xLZgC!A6nsVHy1Kw_{ôg|5J*:z!T2!F*ˋƜdž^NEp7oa09[;rYFޮ6e],A!bb.{( NSbr͒[|SR W' xb{t!yk)rw6L:Zl$aldk"wذ3L${'Ǧ{ O QT&aaoq(pI kzp||Rbݘaj%-xQ )Я*D&H^K޳]¿rUUF9s˺ǯխ"TOOPY!~9;/]7zF6<=TU ;#QiFDbb"Ԫ,\k3؎%9[U- J4kr Ct[3q*9B[KZfN tUţMQͦ( (bdD^wZSJʙ Mp5Rڡ;L'4R+f 8d!F6}XJLoNCqeM+ ngӦj9嗏0a oLHu)6ToVG ъÃ?ٛ] Nx-\*TH̴SԖ"0uL$32?r/E$m>`++rrnpڮ#>#ap/ƅ78}[ N}&S jg1Lد O};yO$1|$2C4n2F#p"UK2~eC.r)ضDJ12dS24B [IAU^HTW^P/}a2E:,`fip^31Ycs"joj 3?c2.P6g$2! x UO"V*e2T7 u;H;"qq^rcU֨6;fӭن v2Đ@cADzxCPsbuL7=@eh"8B1“ҧCcːnm QJX5> \Si <#jgG/BT?c顨\RN dbA/II31L?~=a`9(/+_beQH_gߙXk8-OeϏuZ\7LB ?S+Q}oL2NFEAAލ YpeQ-]^p`|0ytALTuģh^`0&C 8!Ie1J[=ggz2(u;u*в-M}|f `nVa87ٰ8OWuZB %9H~Jj=J֪0W4N(YT+^ZLwş(3_&;Jply;4 `ZtO\,qmȗDhK&!~pE,vYϟ<@ﹹ9~|}OX23{ 6&`e_ qs|oQ߁6Ny>1U%叻~0)"M?j Ͽ4 `k?AFf?`7Y8$AL?ͭ ,?#rY& |>?%w89T8}ͫ6ٙsAJK8F`˳~13@˘aI.&)b . . %%ɥ͡{o~{<%yRS[F}XQ4&?^ 5~9 31B]]FUX <Z V'Wlc)04Y5]Qc Hn0kk&9<ןXt?nP.-ƹ@ \ufĔ 4KQ5BUb܇h1z?H>CNĢctj65RK TQq1z0.ȇ_@ay>`a_.o~hSD@ϟxX&QUq  Pb1 cOBza(kShTh5, 1ṀيSᦃ51xb?E\oj8WgAJ=nN{ه@RNO6S_l?y?@DO!.Qgձ_;׵E ~0(AE0}+/%('l221}{7&i%_ןoċL^0߿//?sH9S`(vU_6E9~dLL0z! _x`&VǏoEE?QDd9+GafO$dPR| 蝰fa`]Io_f|F6ޟo`塁D6f$,t|`c_gfg/Y?y737qp21gfb߬ ?I6^? w4)~n0˿/ec٭yV1!, lX9/3 ׯ\,, <_2 e˯~󿐲'(,bcdf'yw>Ȑ?gFs ~11/׿_?˱|GV OFfPkۗ_8f'/Wߞyb<߿p}a` qfV/Krw}٬ A8M5-A%ՓɃ>E "RݸgA̰OEP8:Q/--^?Li&x*[W.oSIB]?lj͚ p\`dQ"\owbÒdasYk[AbI2d?`Z6o"  @F `5<*6țP\&12L  ?ﶛA8fVj1Υ*R$BrFl?}-??y+tqZFA" KelTFD*~y/ע)X13 c`,%3;#õL?8T<#l5![L(*$oֿLl?>*߯%YYSA{oV`A7,0}aΊX }'ebmAV}}9HwZ?LLL,V5ؿfz{R{%KuPo,14]V-EEOqqTA)rֻw.N"eBxjqgLZIֳӊA#Wk*kưfkkQxgmv!J?\0G8~Pz/ɻ 'w骶kR~TY74j }:I`jdb>p}OaڴV'MMIAvVV'cG!Hx?"3՚zA43f4bv%]MMJNi 6^ĉ능NZȀT;sC?12lYiG>_0%. lR{nnl\C(# dF Z/3.1ֲC@wfF8I|;{8 q qݧuh,u)@>C ܮ٢jFx=Cذw|7ׄpR)2 7?n1%K %;F}WQzJY-zvvG>= N ?\|-٘@EPIt<Lo W3wa&q э&RIJ&X=Yѳl,(t| Ƽqp,ch̓tNNd0/bZ o]dLĨ@P׆Dq Yį6][;bք:>V򯦃5*櫂 GnhZheٍ3κ^.ϙV0->:W.sV0 Dij]*U3LR0GO$U&i l4va2Xm<𧺛]P?]EB RZZLۗEWڝh9ZCBc0|Q}ɹu<Y"8ylw>@D AN8P-BW gf ? ؃1d5Wi_8ePʏZUc+k<.%wxЗة&܅[O膹Zf6ۉO -GZ#f- あmf*x|$ lj5#UcrX ]EA\b#1#9K`OL@\-fӚ@1EDۓ<"n5_鸶'B{Kn9< R(fW#ibHWͪ z-!~S#ʼJg,Rb<7$;cH!4nH)fxV-Kd?F\7$vRnC+^)ֳɊeJz8+?`XTbv>|[;;"8,!IIb*MF*!0 ᱝZ$ v܂lQ7@D4N$BHPD7Y,YmECEh^i~UŅg:Cd6W-q\IyP;ozj @@dX !%z3G̱3r2Ǝ4F4S:A?oO;W^_ahQ0 ]!p{q{ D&Fq+=5˶t ~S 'q|ykv9FQ,@XEpivN^\~?]Zg'b+66ƣ^|_؇ <n=Ȧ &fip"a8 ̣`m)/bKXE4޻mnl?mDR=:v}y䮴vޛաSbUcS"1E-uKd8^Vvt"4blZlM>b* rm')JLmXӣ;AZX[5R"DuMȑg-Y`cIâ0cBU-xq\ɚ:,`,! '* } $ Ca׭l Q zc >W0x`Ȁv]{f7!&'m9mV= ބ>MtWxJb6uNRwYi)i"2c݉B3n/Pq ~9ԏ]xumȍQ&وf$L -M7DL1"BUџn 2Rws\Ccߕ?%c7<8;G?]p On.= Pn;-e<& n\ MƄ1ꀐy1-zѸpɾ= K],fD>{Kfjn$ڄ\q~]FCMT6I󭹒Ǔ1]c$]f1!QO^ g#T?g@W ge|l5EA=H 4d<,/:6򁥇'/G#r`U.BlZFK UM-Dai2\345DJg[ߒބ03#GGji[`Ҥ.)8 7=TB[^K_n-+P7MGۙ:8 WWBN̳(zցpON979$Q3$?QwXHm l л>ϷM\\>_4bq(6 R8 2jYj,'X sf)ê RG } y[)uYe"-zڬ MY OЦHxOdʂ2LCKgk=(PZعJr¢ᥕMqE :(M]R@,v+ t%O+?Y HhSߢTGv7|߷YN0-6mJ] !qnxbyB T*dq'^Tz˞5z\Z P?JܰS֨փ6Ӈs`U˲ {|GIgB*b "˿2e:O: X2:>irLsږB>Kתb @| ӌU; }Yuey[WxZ2SL nIUJ%q_ 5)VU j0 Ik9SE&:ƞin0d Is1VZn0<Ϛ U0lu;&!IJlr~3ى°+N44 qsX0nN'q% p,\*2#xADŮO1~:tFs?_RzB‡vZ0|^Oi^LF)2?|;Ac6gO~E\/j8cǠ5m<ڔbVTY?/I{kEs 3_E5y{P0y3q I,`t~6洊;u;8W5Mۺ@ >Nk(nB Tdvk ʹ,7 CaX˶";uS3 Cav5K^ѮX NK8NR}F$ދu=exjPLKFKΒQeO ^*w-'͐nOLCgu}4Սg]}#"]|nf׉N{ ө]Rn7/.)Ezؼ&ödw DӢQoNLL>.*Lc캩:~5"۱њ0&C)sTZq AeIw'~ B@aG̨a (懡:yo盵:$$*s0A.#TU_VΥmdmam^8l; 蹟~0lES`+gvbŖ]:&<Ro OH@/07m=F z@v)\/Gj898DY Kӻ /2Kp[ {UꏴFD|^Bp|v-DԣKU EuT.4xĪmbUH4ϜޑT{fFVL j+u3̓{؏_Nvu^-,brymy*)_WbrUc> :نPΘ@@{t!J6| ~U%fjؔ@[;}Ц5{MVILb?01'܋u׋j0#ٲd;iR:-7^c{VZZhˠ`I&H,iw t~~>2mR BJݗE'e38)HYoc??Jxh)L[L^ _ +IWo^OGp$ޔtwaOe nz9swfqcȼkZ`Re_mHtw^\kt/w{EA9)n?#+ y[cVqj 2,fҾ?-(ݺUќ6ܭlqN}Dx1̆"H7 iWNHr3+ye0Mꡔ8 $4|G |@HhU R[ZeqNvRzQ1Bt6#X;<[,F eAI[Jig869߱IR(*A'j>4s5FPk ݳVQ*V8AįH(.38ڝwd(ԏ7&qfQ<Dmo.a~~nK H1)-9(e{-ًqKG,mʹUWl#sDx=8:4pDvǨYbt,>ۿ~fDgAR|Z$ xˠb`ac` LΩVKIM-/M"B eB^0pQ-^jKh5xNJajZ)aDamdNXH]=ym°ǻvI% BPo* "؉?^H=q;²V%-cx T0=ps?_4A7?xl  e=罘5]|=~ћM]7{5# ?nҺ0ݚN5~XMU5l) N!Ce^.dug|Kֿ ƅr38T gU >ok4V܌2)?G ̃\,0(lCs&f"I9 Qڡf RI/Yc+mX$^*Y<8FkCƑivŵIAy={LwԳ<{痓[3R++W6 De˒cENiBi24a8t3 =v`h~C؉HdzTǽf{ڝq0o "htHDv Z ˤ]h8:[\XcQ*Jٙ4Ko!aOHyѢ%6$VLXR 尢c'tO\ z ury_ٮ[ksO7bRT|1'=Mu1<)6),Y^^ϳz'y#P/jФ:h#<.QKw/WgMP6l*b]5PYe@.]l6ac<ݯ`@ "4$A$ʱd|6Qm2:nn+mDQ޳瘉VIZE0}Z{h!IH|y@BlouK椉k;3 9O>:q/FȂ+e]UӴxN[!'XʾjTz5!jZW臭ҥ*b?4 \|!IXYv32fOõ ?oMTpg^ vki᧪P뻵!ϽT)۵߇Fˮ K/_eX*Bl/X4&3;'Χ]7'.78˩F>{#ex.IwB[Xˮ$6`屇Pt,yp<%M0K8LYŽ^t#1rFa?+-g4 Fa۱xm%mB:U&6MwW]@bBڮK|ԎmҊ;@ѫNZi%@TKQ%Y:ƾ7ua$_Jv_Шv6򮘽oᛁJ⻏(u<L(6;Lwl }@$u K* N' b<#SUiwNxc;AaZVBUso~uUH*Pq~ypJ0ÌwXOnF "moTGW! 6KXrFwr]ڬٱWcyẁ1a zH!u`QǼ*]7{KyF?,gT~>8Tg uwu]jE;aBw2a!|wݜR/U$RQVGYQEZ==> 5ݥV(ryBT%n&M"C1'1 w$93~v7y" ߡ˺SA:juoF>+$?Ol o16sy@ǒȊUKNV+Sc}jSGΒU 4;ek¦8%袤Fj<bsZS(v!t [킌U<0wE%#v`#__o: ?ofbʪK_~OҮli {8.Ж"QT}g>G$"JKMjNb{=@ su0nb8TJuȌkh;S'΄ƩZU#Ăw[5L=|/B2 =ijP!2 D!`*5D>Fe 0>>F/7歹?lη/a]Է{~ǺV$hunҭ4,pk*t!ddpMHhg^ߨ_S\3l:&MnM\/n'.`YvV=Eŵš}xSNOqΟOqra<ޭ#m"̰!cEWUdi 'Hb= PJN~Exˢn4#Tt4K!`\v(<3v[8&r Tl,X<lB @i.=qޡp6Χ_G \,^oiDC(g\y'}WUMG(Y( '/,C• &Շb% K[,/~I|z, eX <&]3ɦ꿟¾V-Iy ί9| T2ls\D0ܾieG{[KOѾ7ȼTn#4:,QQQmyƩdk뫷TCHe} WYaAuL&dGs@{h:~q5Pp^8Ϛ ֨e?=k]PY2Ovt"$YűX%N-0&mpP`7:(UX/ݦ{_v:n *HT qGmrCrЈ%'v>BbsX9jQN$Ř];L"MAxuTyц甩 >@rz7}I ==m/'͠˧=>oC8Y ^5b`Ȫ֣(<' XMe,wαK)r߯6Uv`KGp>.֩A-$NyҜkÉz\kPXz0>KƝa,'Ha>| ,3~5.@徧2Q7mY׏En#^!/E2TZCxt6;=0R{ W. `8:*J*)Ud8T0`p'ݍ{?v6iQgl3ܤmEU)>~mU*J#c{?ߡ}t{Ab0|ߚ[EZkצ,<ZHA6{)YPհsl +gNaj/X|{lxCqk9n6IK<4A~0&7RUm޺?^]>je݆rG9ê(cmk$8C2LV0{?k%E)Z o܈~ hS":9]&i4k_|>'BQôv/vPsWe-iMe!&!!Q8?kv0 i'KΑ ,\w{ O" XUW<~|fʁyM@ݔ5ާHQ>ѯt>L ,daҭ zź3xT%]EcU!RXH#m&2[hPo_!#kg6 aJj28vRhР) @EG^^tI@ȴXH|53o~̼PcT뀶^cY!E" * B (A5kNJ^k~7Xإc8BSƪ"˥z{dJMWF|_Wsp͕:_OEoQh[0M"oy$.ASfqx˘' QC"gsik{;c%h PEAjE@$v^{>}iw5tXAASί-l HNȗh_Z$ $$۪;? cO),9'HXq "t{UK܊!ϳ"j1c/wayb}K5>@I9(9'X lE>Lc!_C Fv)>_s !s@=6?ZiW~1U)hV!ǖ>4_sXXثX~Lmw1PM19>Nɿ=DgGQF/9'6b;#1%,PFn$Vvn7d-0?{Jkf"|[Z\dVi<3؎c'T ĦR*uO3tQHu!4bSJ.ηcM0yն#C<b5h bQє"O$ǻ ub2L,?_ #+.&7w߭[@g`.BekD_}2h`ue[V\0 7gW/p;s A2PjnW_z}y wb*ܒ3д?Bktc|2,TI,*1_ƥ)TY &i,ITi`uB;V/GX1'>=@< Jw7ojj|ph @ؔ2J=TQyKuQ$/nᒲ ͅ64YdSw2~phqh뮒rg=E3<|o~~?ˡQMJ Z˖n_E >OF,/D6C.A?6[?smzwY'mGMUR{pGP %( Ѵuk{600#hX]*aPrm&{DǨbl"T"HE`Pyx-Tl\~O1N9zlـ ح!?B>Y.GoEHgv6CoÇ 5@J"}4I5g,!Kw]$^|I8m_%|t /T* DPup-Wl7VmQ*X"仪u3{l`}>u)3*5SRU|ҧ:{;_!r ?OK"HH+BWd-^dbRj@g4WݜF#vH )4vپqRt N: "b4Le#8CE!w|:πJg?lj3 w\bu  ls$tP4o$+]jy[o3W|V4m, o$'=_=GjY(U-/h}yz_^a0 ֳאw@!u񎜾 &5F`lv(l{5U1V7TDq+qg6EPRO:;AlD~sO:/azcE-]e>8|t,?쑎 r*i{Sk\5O=Ȫ%kFfBEw[;] Le.wM_:BJ(Non@g|flNhjS {!< ĆR 8۱;x0/q^l~_? <۵,N+\Re̡E4t"a]Ell+FĠH؍3Պ5vvU/+i .[Lw !hH`랮 \(csdED[*1od zV/FDwS(j3ї)[ "f.On+ xV͞g qI{w$j\KW(]%ƣ1*ɂ`nٵ|=ߵJKQi|Ӛ($TZ/\mn68eZ0>"pŗ\gɏLn_0̡g /2`lv(wU*uƩNJp]4,CO}J<߉3 p Y'IگM-jW2+2AUNG23O1-/e wσj8߹e%M2b,C/ Pl'4ĄjQ4y6UxvtkNwbAIC, lDHB݈)if 6Sˎ}b rF.`hiH12r} RHp~Tw[γp=G)>Mq'<\/]hBe5j1҈,4! űW1N{|*u4#7f!w?殃@ d`Ğ7Nαdꖵ{ݾyrӗH?gK 6.\?ሪ.K5aUגa0P Lh[-R=&_L/7&uS;@8Y0:{a"7(\X,uж#R{O|*r';2W}ș\2@sNjcݙ+tihg[ZZ= ._fi Ijހ+7nODžW>.Pp8ލz?ؼC`f45b 'GTHr=GkХkmэqvtdv^~- ~׈6.n6p.B'ʟ;Hĉ6$: x]Ѹ'0:um\(voM Læ?޹'%q$ `$$Awo?iغ8mw';;dǥk"VB$HFy!0`eXL(ny%B1-M!s~! f9h=}ѭ8f[!T<͠yepL#:vƃuSϝe"Ʀ^Y: Kr) R,^ R欈iRΫ,E % !s bxJIp4D& oE8#K{ͱ4'}K|EKѪ0,,rce_dz (D8GQTF&"./>F+x#(a8o^Ud M? ,dQňi  K$ ne}"pE>Qol%D>Nߎ<vMAtw}q# :n):? -)H0'AN 珻n֮z̓Iy?!Vr<^ېGmMZvĴ$65oz{{V|דsJ~6`u,|t%6&(t >\x^@/˟oP>lƗRNF{i< t w[Ͼ9_^/y_3K9@c< @۹DDan]5L_f3a4 kL\pe A aV =gy._?{XPȨߞiz`7,դXv7I"5NY'"K S]F﫲t°k ܎b 5Jj{=hs9ZUU4|*Hp#k56Ϯv:%p~0ܑíB]`ūd? R$l`J,נud[H=S2ر ({~W^d[m"vJ``.ntXSPgoD'%|5kkhq6z>.? 4s ,ӣ=0P#v]Л_^y8t*Qu GwWmm ëJZ%Y"vI moz] y^9ˢ)#FVgA[=FEeMCG;>7/Z)R2fvȤd҉_?MjR阼=:66 .U&y9\;{kAiaAhvWa'h;a( {USBK j@8(` v &1M&i]'qx%Y:^_]|kkR~w$YێXw;MPk#)R6'&&M BeU+몥,GˠˬE5D4яȔt㑾TUQcN8hz)u/RI|/ oj`&E%0) (3vR8ԀޮR㊆kA"+aw U7[j\[h5~rc:%FJ#V,MܧZeP;j] !8,n,4gT#K kgo;XOYT*~Zܪ"低˦t;Y&X O8!bP,PN~ttST>EjkxH24rl9 z$lbݸ 6p3jZzݍGX]6c &~@p^}|*P_6)dwrԒGaqٌ? b& 6 CQƱvM[ &2 &xCh6]Iǩc9:Z>/n;e䈉sYp8z»O|:.1Xn|'gnVWXr`^t$C!z]Lz/?  sejVuXRcϾBé40°\6XulP7չO2>Yu>}U6c!K0B+@ _Re/s8@dw@S·2Qd ] #wWt2qN y+fܴ0; |[{Cc/Vrż];5pmY`?(h*^t?2||@,oo$Efao}J)f)0Zl1 3l7vJWfÙ19JB?-%ont;!p;8V$kW8D]%2Aa0 (+cnܸ! $㶻mڑÜ*޻ &-juyxce._s.{Kq|'4R-n2 gK1mIXWXLs,RYAٵe  @ҜL+\KzjRxpsA*7\3>ki+vb_^&R^!O(h4TD"C8Ư;8 V;IRD1Ek7a6C;H"}qUX N뀄'/_`OyOz܈k8Od*5(D#+#0[ %?ylXwO0*Vso䍲Bjw6JRL!`uXْWjOq8,-wCeRY f\ͰB=Jy{4lB8Г 0Ɏhi+(\fyz(6W%p]ǢUTp$U#E,ED/6J4%/X(ٺV*P7PbD_#|&E11Hhe:bpsrp΁UV h8?o7a;칭Fb$_}5 X =M:ݨxa.26]Z&wC(ۘڊ'1r.Eߎ!9/Tr6bxZK Ŵ J*^zȩhIe!Qv,dϼhh+UԈKgsӘ-&<9L4L~ε Ze2#jM飂E)>LC<}]a )G퓅cd6`"|!b#b&sK4i</WQ*s3<ڹ4 Dax&[MZFtW]^i6LnDb8 ^0\٢~ΔY|9K0Mĵ_U[ytɢLB. IXbʯzU 8o}ZGMw?mP\uY󨞍x:* :D٩HbfcQt` tU-ґ/cW|߶ǤZ3-mH=]7M 2!tb*̷Yj!pz/SnIDC XHJFo'ҁZ^hm+x gP1 rWv'05ll?X(:"v: ;_pssrNnr=,Dj\x[<Ncﵞ|8N) rI4ݯZŰir+(\M\EgDŸb1<{&Y!kUeYܮҔd!'uyΨ]tzɋ7njG਽Ui;SCY1Un8&Kk [::Fމ"4 3S@n\@EQ*Qc,lݫ?v6- A&M[S(TPoğ_O Wm&f7 8ü{/,"ı_;4"c~%/4%ݰ˜zmQf9N1hpTG<=kw˜"?%K YB:#\+#K>cJrN#JJ+ i8(IXE ʚ+@A7r!b۶Y-`ڏ6"h0ŦDYRyW$قK27K¥m%92ʴzz89$D@+u8Z, x*TfRu ƹo*}򃾾 REKVA .,,,GV6Mz2jQ)˲݃sw7/7?XQo8;L>$AiH3pu :.}KGoM;:fv*ĬY1}uxxGx*֣K$is gJ  BrrtvEEeE1r E퐻{|]2OڰrYZj}ݭSi̔G>p6ۨ~OӘ.Upa!31iY/ĕMڎo\rIS.PC!X@yL0>zywRkR/%1V8jz74;?f3F@۵4 fwjKADѓUDē 6lY7w^_0T kJA&3ɰ{ z~̪twjL#˪ulNQqCy~Yeuq8Be}UTҭ]=|VPt^) Rr u R%%-vLȴ"E3$zaN)Q) z$Sx0<^yn8_ǣQ;)tc;0| \K"S;.a6 ȳuth$ v[/M+k_Ā( DB cNo5Ms5w`q^u&8;%,Eش T`^l%q߼d%;NMKbOie!.`(=^;pL?}J_فό-qMڥW-=SkԮO-KGBH,]SV~=f{֡1HZJ 5"6Cwr'2au&".8"U;:"}[Q9ÊbHpa[gKڳGc! pl{ ]zW 2;)e\Y:Gt TYKVΧ'a ݺ[`L1&L'/^~N0rd ]ԃo|楯~/mX8ChjpvX>ej:D'>q9hZT\1m5 /ka[c9<@\8M[ RRX nQZGSU BC%˔Sۣ_ͩ9~+90 B,?ѣp>fހ\$:i_8{isFjn%sfq&+ƩDɜHX cvLҴ  s) *h[kc)ݓ̹>cf*@!HN_yajVs}UX, t6"f?(B 7UH[K/Xa $v4i6!tU% [H !ҲIlN`sEkޛgc N?!6A,]ӈL.$f۪b( (('&PHˢ9U ni5"f)n>8uj**NoKɋ~7_V @'!b 0-ף/3(7ٰ-zYEᅋ+;1*m{VW)l)>k u25|lq!8 T3Y,> Ф ql5ep2.PWtVQ=T| ϦPETr"T *8-eG*KTp_S֮eaڱ;n4M ā@ Um7kā#?hwf_ Kv"x:0zu]8 ϲ lӂ^[i҈`>s:õy0j9/QL01 >0H_3bZmgw|S@(\3y.qS]FC4R޹ Af^ #nonL֘ZJJFwcLxbͥl&pf7&bZý#s:p!>>1EǗ z)\Zcd"Q ݛoli$*Iۊj,ص7Ly!T{k{xfGtC@g˙e0k~)a?XT䜧˼-Z0i -ze*`X'V='ψ'33IvhKB *&Fx'114!@[-]3safKfc!h;*JvL_3GBX` _§ɶwg%>'kf =8<`1sh\PYnos߂>LN^2F]?W ՋL8ot]UYcC,;`2vGrPǓ6Jns@[ZVGI4ȣnH^v&YLA,UN#qHVRw'4E!m#Ӱ0ap<6.GtC1uE Rh16NĪK6p@V 8,aKBK>:7ӭ (#kg0 EQƮ]qJS b&`@ŭa7q/xz=Kp8jF_ /. Zn_7r.|ewnGhW09tz²fob[?8zU4 >󁱯/4U 3M+Cu7:K:Y"'VFRLԂnb -aUC(_ׁéL%fpD _`coITlSѹ!p-=w(j_ *Lo/|g: ON=OWio<,| & Qqb'D6*UPjV%$@m |8ԑE uJ㳩<.xU@jH2B5%҃6 oX|eI{h[} {r7Ƀ9t8;icϜ 8X nbmDδJi* !/kVSHKZkyӈ6U,@GmnM;5bdARj-/YKt 0rC|t  b˯il_D(J k*jv'|rVd`a&lS~o8ai\|v[v6- `OӼ4mnaxxVS!o/bsm&iLAۓ!'+,O̦<8gY9VD 0DcG󾸯"x&W5ֹYR/FvwR'1oa:p>Kٱ%\]Qh"¶OsnCO$huX+{-R\˛吳lޘ<y2-F2XwFh*+mT1S-ClVmfo#+ ]ݲ.3{Wх<&k/|a%%.cV0e%RCuj`ۚ_ zzwX;{a( ǎ'iԢTe L</1ZDK6?_ld]E+̀Ъeދ[?uoSo/ =4LGu:I }>EK6M #?;4ͥ6/ C0`0 :'+K H٪AC z]:FVj=4|Py=/FCW6`ԭFXi :CU(6Uo nTy]*l.1-Nፊbe.PD@tdžwy-9tH(X:[G VIR 7N2ܔDSkd,I`~Ҿ`Jvhv,U (*_8r@ mJ[HL&Pn:?`sq>qZi^{U]O~7^TXӁD-_Es>G(=H QqWaDפ+Lʯ+xgYh [B?B2^WЈ(lyb"Yd#yhǀhOL A\2,V#q&J9A鍼lx=^A'/_)PbZtML 0Ua&R+ =(oۭK86gqinWoc}N7]Ƴ%q 7IW֮na 'MҦk&s W Cd"C \&MRB=@@Np6vWM]ǥ un) )i7)xNpL*瓝'aILZ{g3fm"~勉H!#ȽKeMr*mefpæv}`+%Lxښ2}a}iS[d@H) %ɣ >}cZWiF P+)hh1&{M[Q c!vꝎz%^`O,@lM& Gj Ү2Q; 0"hgS~S%kg@ v˲!D"ŗ}oF9`"|ǶO&̡&xod*NUJpQ$>=6b̍sR22j V{4-c @,HAjl0B>n/YS;S6 `rLO %V:DCwg8fo܆I8@j8pɪ-]R(z?iA *BrHn*m-gX7?Ve4rR0( A>]U[:m *I2 ]0࢈lLyf%713eM'ya86}(g ͎D+~W͝a~ΣMP@U kQ*U}Ф i'67bbcw9绲+,hO%lwsU6/i}*':pԵ睊A󶗺H'698x;y>LiM,c bJÈh͆_\c F0iɰw0T?53EBXS'SNq֫ QLfCfl>ۏ>TC#e-)@>*OSVT O`Mxq㖩*0 9? t\B#Iѳ.=߽vd1iT{T{0MBGD)GٲH.s,@8%zIp61}e je66xVaQ2wunQ‰v|8`b6+(NPTt Ư h$R4,k*X(O)gML q;~`y0l;q;I"*$&D?0!UUiզ%iq8H,ڧy'N,uH*_ov󸄡@o^sK35Kͥ}wC}h+;W٢,#PC&+paye]࿣bj Z9p8f+sG Ws}WiZI#oF$!$Gl<"d+{-PtGqh}f=;:$,Br!v JeL\pG 080%C9|Q-)n|'ү7P#k0 E !"66#E" w8170u,OǾ绶׊ڎ}Nymt;+6li$j}SgiyCt!3m{V4^$t [N}l숛AiYl;i3ܦ1/@y&kIelaҦR4Aðcz" O`:\=qozM%;ygB*ř&\aae3p,QvRRs  Ppݦ0kiGlhrHѶ[~S[T% P}т`D;eξo%%r7N0֦%mZ*x! EB[ĉ0y8`a?OG5dP@4?/dfy^sŅо @}N$}HI JUZ}&;H w}N>KR{CäX&Gޟ\~d6l4%^e/c2Д~' )c"45]dq:PpCxp]RS6{ [ Q^c Y9xvj'KMҦ?ai}x$"ԗqiPpK5o* s0(qac*Cg>@mWUIgCDzZ ͸j']m?Vگ u<7No:fkii ynv[[PTz$RP]nۅf+cHHyfz=\f쭟t[ +Kxv*\-)@JTkFlO,<(/t<#7cnʘܐ?wXa %iiKC[@ $~{**M%$qb9`i$~x4sZrt,A ,+n۬~G:QD0*(dR}9K>J{liܦ?nFeEM.>$Ἆ,4O-4$^zp18TU퀔ϼașB+k[h&)"?p33&xAPyCal|7ח]KO0 NjEDGHӴ]_IۅqEXg"]Rֽ #N\ļve~۠;+vS鉂^w5Lز3!v:l%'g]H:$<qyADetm2E ~ }0fõ|.Gj;Ñ17`zSJf/V艪 ڍ jmL'Έ%3]f*AG:6C> @);x+ЈuI5V[.)!XMTE/y-+W@ D󵛶ۦ Ċ/ kk~ut[Brɼ޼qWg9tfjFb|kEaN+۞U .C:DfWa~*Ҏݲ{';{,[$HJ˙,^Ťi Gq*XQI~͜.OnzAqsg&~tdݽ0* j;=J4ܬpB8-١ej;1$&^USi,D0gǬ_̽/Xa(,MzIw.*AȦFjiNdy \ù7cAZ-!dPw8Y*i"˕?s -}=D`鴦|b2s ^EO9}QTAUc4Zj-񉣁swM UrTn];h ~N+w%hS򩏨vIm6l8$Nt_ؘ\m՘-*' ?b([X41 nqLݕzs$E"ݾEjjd Ba^1xi(f-tp'ygvt/h݄a BSQVH=HZ 8io>ɲ3=*JSM^eO7T\%gg\lb/YQhBěנkIQdqn_7κ'Xqfg~rsd?B!NuB-lX׆0MÄ82Tx#e a(1Tw9Z4@ f}vg+*M 3BF45݇J3¸ˢՔZI[HNJVK60zFDn\{g޵ b*nK+.ӒlQ0;Ĺ ,R&&xoKڮa7i$m+MBp8i]& &q[?b 1)mí_OG)u76֯ʠxEQ7.xGfh@Uǰ?qȆGԡKIYSeȯ*I"PϮǎMM[r[EOBP~0F)U i5?`Tҍk5 4k8r}e~/R@\%׎Rp3jN`IJUTZde&3 x]E(k(H։"^- OcH< YV~ ]vD1iZ1x0gaݾ/L*G֮ea!ihiSS.|uP?_8^q:㤏$M&BqqW~9{8_:qTk$K^>'SRuk)1{WP9=3Clw /[ZmV#VC7GW]zr\bxr.Yo+Y5A-ax#溚 "7\0KQ9ۋ$! e[mEi6*Frk#%2Tf"D&ànl0"Ztzo{?qv7RL"Qy?GVe&׼Tkd " .\T }<:d: ōCs90ed;glޝoyQӱδo).'-tU*F}i`)JT\T]jPlDi/?V EZAJ wM*P J& ("<6,׻QuCE'2㇧Іwy'q˒f7RUϸ]MRZwt7xtBpΉo7#S"uUBa/O[43O˔=e% =4?[ޮeaډcYҨUJPP%GT\RM<8G;ڿI#(M ޏ f:{>/ptISG XjNͳ 7\{iύQX5&T(xlŒ(azY6{ucM"Z37x80 T;w]|Fp0jJ)/SqP-7'.DVӐowI0 ƶ@}ݳka;n-XA7M:nUЮ0M9d}t]\s,*'VMՋa ϭN6J(yz ݱtb6 17fjn*d0gAɎ@S~&Il!=\D5魅;pfIXe1⊂ Y+TCqT{&dܻk5j4-Fj7ڍ({B[?'ǭ )(4h= uN mcDUXsiߎCh* mR$6l;6 **4vs-{x3Wwhf4/*ArZ9< |}g p"OQOwMFz+R2hJ$ (GL<q'$ϿtØPHC@e$5/tid+(C4uQN>82P"H $$ݏ+ć>t^Ux/}{ z@go\fDL7M)i"{f ODit+jkLw֚,(Ws=vMi qOPGw,ϵX=SUjX\/XkcJmOXa GwJhZZ#_?p@HP*Hմ qcGXYzgv?B>[aܟ]R6湖h@E8 zMg)C9," erj3y1swlOocr'ɾ^UgHK0GZy,Õ^*2HIsek?Gn Cu[ǣPw\GU1+~ Ӡv)ƑfGu-?׋e1ꤗ8uhYgtfWMoX[v(24k_v: Qp6Nl@R!:DCS B$_{K@۽ѼoFRԜO_~ri ] FYqSE!vtЪ!b=s["E:$sI<93xtqT5 v2;8g7~OHȳ {G@1x~\Ո E1 bLAo`.}; 6ULY>NЇYĀ|9RgMoq_rj/cYW@Nz'N]=0,$a`(oXMͩ:l*G| @۵4 A;c;mDmBpʉrG= Q iSv.BHH/ٝݵŲ(ƎDxTY3u Dzwd"Y1ȐKyά ˶iUS=_j>7"+r7oQA4>!Ѓ?cx뤬ހQL)$ |N+J#QctӤ0"U&ƆB>X@6K|6YT}fxԁD['5t5S/ԐЖ tA )[a/TOakZ,~h L}!v-; @&mV!zD_;_J%F46 3+kYvX; +EP>^猭na=dk)2LzB [Q=W? &ȇd\Gɀ?יdq4H=•(_upČηm3FҀB՛<(6`DM *N%2XNAkcMQ<qpqj084rα`i,^b'!ǨJT&V֣2}TeR#Q޾B&jێ対׻=O0}qܸn$$BJefgw3֥Rh jI1C w/"aT7Ae9F3*|;.LG\[q01z i*7.nϛu{DO峮yzFqt7p9w7HJi|ləՁ`[G2L7VbiɝPjȦh[↰n|!U,.MQ:퍵C{C*ݣ5ePL'ka1aGfFA~Cn`O+q|J5w}`x+^gX^c| մ4dl-V xERhݶnv71`_0a&71Ş[".aD .-> 㠪q܇rIX|=պ:ݳP(tʚzz-7[hi}+~m'lɢS͢`\cWM jͪN>+칉1E j}^ckc5⦡e1Bhg2[G  Lny9,x0j' 'TX4E-/%n]Ipnou4NtWк)g41g)Jyt^v: Pԏ!hUU,!&"M3xes?7@vMǢf#o<B/yhҙRkHu]c/x؏jt􍅍T*/Ԯt`n4=w]e"j"BOCC{EdT7Lg{)޼k.9L7=&+ɳmfD!O`c t #inZ+(|WΗi@krQ :9 ;P=zI/d-~]9!zZI bʕÙEI*]W7vHT sWYk\9XTK8hRb[2=ad͉@E\vyGX;3}-C: T*&"eNauWڮe' vH|17 ,˼D :JեEpaKy?,g2x:?I6{04ȓOguŌo;We7n!k'cWoT'q]5 "}i>T3{eVD02h2M:`8-D頑?p }َ@,G\`(= T,rx:[2M.h)fW<|Q%iAB{E}}lq5TȒF!%B/{7v&; @fۄ R%}GPOU"Z83\,K<'fzam~]]0 3`nn3y;geӫ}[Kznu7dzAh :x0K3Տ4ŵ"FS;Y8z*Wh>lrK1h/4 Hm 5^:F!8=&¤$BRu@߱'66L!x8dIPIܻsdFt$&*M~JnSq2:ᗩ,UP_YYn}4 a9HD 3#[&$V@BЖ$%m;v0 _eξw=D,<'bw2 M =rMLe\0 m~_|#cǡ m#'\( ^Ө]'APsgprLCh:#M'0W-g* fGwj~D_$Up:nē}-N2k,Ơ#VK #rnfQKM"%V(ƨOG!P s`uׇK0œIӦ66e= { x$A]+MČ ^E^S4Ȫjg.}-a_tv6铬kv%핵޾ Í^<%lzxKgֺ\.~2ֈ`p)W!DL?PԎ#QΏr:ғTV˩6%tl|,!d<:`:Y\ܓ_k2SG.`r,R::V|)- a4&ʏE|#ASL`])S .fK]aƱc'iFD`@|Z1 X^H*I&mn:taCBxe]֒DV Šld-wWiNIacja[: RHҴnfh1s'Mˁo` VaM>vlI:W}K쑋r- ΌOA;jbƯnHN[aQ&/N®Hƒpv'1XMvIA3`2j2d~d-lOS86Op*=~iq'_S‰p^0wu+ PM՟nUVn ^gUݦ֖.mNROA ||II Q[>g1wjbn#R8fVhqor_>e AFJvatRF_O~WSZg\՞ss2FάzBN[r ml:?3]md _гRm`DCS'}bWE)uq&ERJHvS)Eyz)] 6Sqpf¸']~`uD@(E@ 1Y{ ACy'MTF'Сsi㮚B>JҦb"ip-<7CSA.Qk~@DKZ{羛Dۍk|(Ipv0˗M ^둦 s- B0V63aRٯn{TsݧZZhF%B3_lՈR-(\7W6gPД k>2W$*gQ>$og0 4iҵSɆΣɳ/WqtmOHx<~w<%lf'Fm~Ɇy O𞡊#=:"}qgޏ^&Uŷ !ڎ';{x$p,"}z6YMDܘ`t R]|CqJpTNO#$$U6IaxFFD혓[VF`6ʝG1Ls֒LvF'# &%E {<ݝ/9e_Yc"vwrO]z3vCsD͸EjKܦDFG=6*6o*'3| MD (O%p&ެ{mUpqߎkii>4mZz(Ń??z𢠖Jjcuzޤs 曓8PlDq,`br䯀=4vd_f~&wKSW pt6.O1 =L.Ts ӂ9'DYFC`E@<[( O4iTK*ns)b^`b7CKm ]=wFwѐĉOt ԩH--(~Uk|u[I~Ǹ"0w-;PJ Fqf YW9FwYcK:.ѭpsnYQF:Gvpѻ^]; yKjlPky)ӈ(Sf ,K5k8Խ'ـl qov WdTp5Z77]&zbw-1\xьOx9uPO R ʶ^Np +*=Dj[Є<5zTAWjI* @#G mʃGJo\S I]ϸvE+ P4M%MS6Vd@ ti61Dأo9ܛp9O㚺5)Gz=H(!z"]\3 î6 ]{8\|w=I?&~ZrbhLDi#+.g`Bii&36I@ $k ?ٲvEט٩9WEޑդ dRt$y. do=Iڴ'*Ugg5%9}RPLn=Y4j羜z"n1" r%")iؖhFqwǑB,# l} +_ wj_+&"$l&/?WG[Xa} 哒Ga_,(Kdf@A Cp95;!R#e*ML?=ðIYK'&D8wBOdKXEq|]UmWÁΐ|Pq'F0"<(O!s0 @If //ğѡ&iLyp8@( =>;-txm}M/*Z\&[93WAt&o*,GԟњH+maO') D?$F:AKwvm43rW]8dD5_wS'%tZ,V7Xd*JObB#jo; 1ו-o1 N/wbw]ѣa/AX>4I/z9d 380p'^-\3ibZ#Zaj}c8:E^y |uᩃ/aRֻyefgy~v7m16X3:`2LJ.+qfA<6jD: l0첶q6HTX5S9+zu|bI\:9Nri7?!Qc~}>`jvapYv(tH]!xZކ$$e횶 H,Kﳝ AHz7x{Z2KEdTub&&i2v#֑,((R\C_BF\z2_?fШ- kFKpl514D CƝ]v3)i[c 9sSYyvA WXܻ|Fs˽ҠЌǂ0ܞtm 1o&$M]}u ,W<\Gz| @ܵ4 ub;v^U B)R8{[qSJRplf}><3YQbaԐ>Cv7pAoc=0*IEK)xDcT "eSVxg[:lM "ڿξ[AO07*cJjEjalhrg`xW2ySWycWAEO$R&zZ߮\\R@cd{&*LFFRD(R2gZ""*BJM-e΁Ѳ¡!w IC Z=s`xZ쌜`+*ql>,#eLLTpȧje V~l+)ƯuT`v(?AQ q~|XAag%mײ0 `AB!RJhO@( e}/hz K\(^lt._fق'[0eKc/`8yV|҈1`T=ZZ){X(xxAt } 49MN{b+&`Y5MEe#BYd\_XZ *IυL٣XL–\MxU6a]xc3E=sK@ha _I V GTčs QPժ$MR6^#/;f7fYgg2^avb;q6 >Oc0 1"!1b &! J0zr vRyJTZɝM-C%@ Grp H.r449QS̴'BqG# D]kWx}1uc~VW"bhq9U$ʔ M,6ϗMN0=vI6mT;@ ]TMی{$ ޼Ҽ$ 1]PD-h!-"Ptk7'q*UW%Zd*ʡ!uNݫF34>KR" qnG4zYeb[Q‰ A6ʐTljK3A#/n,{:ar`wي˸e0=#4Tw1›挜҈z4>ԃSt$.!9<S\PvVz Dh}[m߻4}:ħ#sײ0 vLCUQ!@="GBUi$nbs䎄?fv,Zhւ~y̲Ki6s`\|p@E: m4"AazʒmN=A?LDOajYL^RJ8}sW\ Ԛӹgsa}1Z^]0O%j6"#:J{l&MȲ5i:\DžGuܵzW߃TpQ*oaA6u=e*h0g2ۙ oh;a 'i H0#py=փ(bKimd+H9$o'{MaQtaؤ6Wy[vٿA1$D7ƬR/ul[%%jNWHJ4몜@‹Oe) "/qZt\T!md(X!}x$±o=mEb`*8Kq1q z|Iκ뻽 vyQ_o/]סw׷hii>e{(;= uPyԜڶ?n3(*Cl:DOf˵B=$8W[~jhH@EzO:^ы/ !$Y7}'9lvߛS3ǯX,1Ä\$%wtoo1$ҕݽ;)̪;3.>M{8W[Fc6n5,gv3>k[^XlD3yZcE{K'eѺ$4.xӾ 8Z C(L1@cFBSE\>:8⸟" f_ysYi\d:mMSK녢.ĝ+ۇJFDCd͉ .<Y|?EIRzS|} 1@|gKo~ XN_DXD7<"YbLPe \θ$@78R+p"VsD cAԙ:K5acv2,d\5M.c7i/EIrL&GZﳭ8JޙF!ys0UZTѽj;Nʖ[zSw.Ia{PZvc&xWm?/#_MQT-w5ԡ*C:knXt59r6ᐐŇ)2hNG&f%, M=)|>Ц{!Nǜ 0 u ^÷|I]uƩ'}+W,{Z;3ii p:,-]*^EA(hAt7Kb}ӿ { $IHzHFRӸ]shQ!D= gO.fI:jꄭPPZ9r6.ejJKǦ 7w6}&i~f(4Iw%R,uэ\fy8_Mr''g>ؖS`E+z9=6J"%;Ի !Hh?[iM<f9]4+hvd)Ӥ0)-{]a>{9|[+iY2$mR! S8#!QPJwYg r䌄Y߳XT?*ڮ@ bs\Tޏ vc0eU ĦmQQL$1bңLif;j_!U<]/}`yɜG(o ڭQؐU<:`p,N%9u1<)Ѓpv@'aIF,z@-VP\Q$*5{h 2>}bKko-W"[V xl{Kp+1PT)hn$ =2yՊOF^t[̬@Yۥ:ft΍zBR]bM¯b9[k ;D4r/@/L&Uvm; Atw^^hkS5? < Defٺ_Iv&gΙ倁Eh?ںk-нVi\YO?%mJ֒:!mKi_OkójwSgNʬXƶ:sywtk+=lD^y@INSc h!_}G'+(ڻ)3۝Gq$-51uCvE灟CcB$"A J-s9 Ј ^,s9H2OŪh U%rQ AfǛOdBwFb_Y~`jz(.KQ>`gHA[tpwo&q.syITb?'#:*1<1CsLNbIrfH@A+M3|HAӯhḑUJ=h & W9rkÛNق~$G,쒀/w-uW&J!&d5X6V*CL`r^  -D.oQkT_ kEVA,]ޯ΍G(p(Oer]K ]q"^  `Hr&BaoI? -l {yO Jr,Vª#vjRJ&iY5o ֗#v<|{QMpu6YǞ], 1m't 8ʾ`\z(<̃)Bi55n'JJc5Pa<ti 7'$KJFyI Jf`Ƚ^ [_=>1L&aFq㧒Ih<F簗0KPk-([Í/g.fxw/m7m5Wն7S@$MD/5rț?Le]g ehjTz2i[EJ :?͓ 3?z%^U'Zuy< ٚظ(`P:YpZٌՃY |{bIݶ-jC%JL<@&Hb fwrl̛d潿J5kli!fdb ["HE;`?N֑W=6ƾE^V\_,"{GK3si֍ٕ;pLSp_MqZU>7yo^z˗(U=Um2?D N^r]|[u9UҠǐGGyڵdG-A6FL՛Q"F|Ƕu3fn0|h(4ʸOH0mYfw$ nw- b8Mwy 2Rj:i֢gּ`=ӷ֞M4v]LIVb`ri| d; +q@- $6v% >>/O¥@q,HzQ \yJZ2E > KٳAKapѿ(7ߛ־`JvD1&U;oܸpkԠi[: Wn =9+5A[&TFXaYAjy!ݰʢ)r|?M([. 3tX01(_^]W&A񲄺r7ȉyyuxr.GqPqPL!_ܮy2spF]UZiF:#TՎ6[IGI\)tF168p`BF}13'm6&FWkSP=/táw@HEOmK9t%BiϸJB8|y<<'@g)dxiBRhmVlaP3/_ki6PJ"Fz31EO&41PXRzIf&3`UimK6 ZtQQFTi)H98]>c]ɓޑ#U͖"I URhpWQG@<|\(`xCr;}ִ XU|B$c[Of9b^`͞9يcޞ&Y@F"uxJsAl?RKBv1a(,2L b&=>:mc, Ft"O+,%/SiALwU#x7 E$fQHКkYi䝦E!-jΥᗺĝ P*51fydTp΅_ppbL%Ҿ/.rwp17Ƥn^w,e;'rY.Z^x1(:t)A)R?ŔJrq9yڶp-QYQ7f}zq# `xPmĻ7 Lik|Wh `}nYn _]QM64IJ.49DA\r; eUfHՔ9\"%GiKL/\d܊XqȩdR  w"#UIo7-Fw[B/(zgδK`;~#.LԍQ$PK郙SMw.ssIπeWWEmkÖ~zkp$ :q#?^KilimPVJIכ6gcݞ5 Tcdpu'~gKe臝t;\k.AfŔM!\j9hȐÄ<ۑʹIR"e@IӁ6k F?y2GnoGj.lURs/ ŎB,kŴB8Tʼn: _a0w< PcǎӴI۔* ߱{YX`@BH>qA"ļSh*eY!B3dӇWR% x{u])sO:4Ɋj94Hd N#u!m҂mrYttiH>EӵnR3!;"Qԇ̜MN0N )PPKR"ر* *](8I%vl}#=֠oZ2-$Icýplqa S}ްh LK+vqԪzkEFwҲl;b֮MA*Eou"@p9[]kG}Z RڟkɄFASVW.:7l|O=\ Wq(<%k;2p:$gj2@l/xPrHć**<>Gny8li]a+_5-og@ DQm &H ,ذ;pl#$$"R&<'l"vpK.W MeYjJ۳np ƌVh򲽜VEj͑N%@7 ЃYg@7{4 wwE&udl`X ɲP ͦ)׬ m9`}cLp)kOA A|*bEf]x4 3=2.ޯ#@2JD:&\بv NŦM!<#ZU -Q?Cn+:2A KVG'Oxba ql') U@td{ @JTj6uۜbBbAx|=X6#˄e7y;;6,jN 7z6Ls9cHjPe8r?JI i a5MUACޮea'uijp[> q=PJ! ibul"n8 ~a5!iۙ_# VZM'n.Rލq{TY4D.0iƧ;DolEV}lGXZ_2,+CkͱǘY^UI"+l1zfH MT.\4 yQkr0 k"a2U$?&/$ 6"=AaDijp|I2&|C[m `7{ŘO{F1PBt\bA)oW0 Ff1mW4)}AV2n"ӵkicŮB|΁sp,.#:mrCZM=_$7X{lECpfLޗM":(/QDXo(/Wii)@uRχn'7 KUnae<m? P,`[VG r.Nɡvq)u0cY˻6q%Z㱸#cVqzl6DHnV/j˟$ĝߒ!uϋX 0sI,}R(`_ěG Iˣ+vEēy2o; Ru"w1^n~I$pӲ1Y<.n߀gR2NcV3=,u Nԅ(u8L }j+zq -OQ?F]8FaSҤ-ѝ% m7Okmhb.ǎ*5j\6DfsvrRBBFvV=₯m!秕B*Dlp7V:sq` O;UjY^dzmQU1ӜOF'IvJ ѣBDۥvezxLf2yoo\Q'C )uf<*+~xX:9YLP}vSwB- {26rd*r=aTapz/KvZzPl`>s[r~Y É`n!Ck4fFqd)[~?zCiٶ{ 6EY$6t nb!# P~{]1W Ke0ʜ[eTU^ H/xza j;j&i FX*g$ĀPB %MḶ bӻwv [],.}Ԃ.fg p7?jHy\ :%EmZyt">-oP(٠m zFŠ=SrGeP {z% ׆|;21/:SNpWe`.H=Оp nY!^kzuLZY.8L"4ۖs$PZƘ%pe/;w{~Omv 9IK!oײ@ EL2C;ڗ.t!?Dp'tхEN;67nE܇\NN΅=KHlsە6Q,;v{J(:PZtʝ뛀C~NRy he쪯:|AC (v`>nʟ8Ƴ7>lDR*(;H>:h.8e7]d!(T<Z3>&?Pz-N &aFdU9ϱ>$gG{`v1/+-Ҙ(۔.{# +K9=cv"459qJ,EU  (^r_.Q9!b! } ɯj֗N0@%v-JE?gs8!I+v™BO37gRВ3 hPj?vY Y>|(OAc=`e-+"O .]t{ ~1&+ اܠY"Iq"MMg`Ȕ ~wmoyz=/Up8 4?PMD-.)-]U}o7GfRڔ6#EQ :Yp,Ua9UR[mP!!Ogɂ_%oW0 D;nq)a P"!6U!j6 !GѼ7O2w-3{ rU4'[+=o%NZb>w!oN nY̬ЍzG]8e~g6e? TbήUFF]esqa; h gN7q5U PJ_R96wV;k6{Q:#Y'=-0G'RXGa])BpX/l;(~\Nj ׏Rp{T6_/x;{a ;c'!U҄BL,DU(A M{`@bAՒeHg{A2K-^;?V=Hٔ4:nx~_zӽFrw:rjZ95& #WT\{Ǎҝ<>@Z~R"[m#lRfhUۥ!YXm$E]"Az0zȲzeƪ*1o5&ֲ T10Eg?\_\dZ8U8Zqbd\vm= PxmWX6!qKQ$21^֋=7}m$_NON*(QT#ψk2Y߯l[B]飿ndO?X>$uv3<FbH Rjѱ_%M 4iYVbj OBcZAPmK4WlcyMӴsF{H$ڙDwx +)hŬnH}ݐT(')LK72Ȳ߸xa(-{h8T-Ɓ["UhB,!$N OfyoXEu p O߇.ìݿnX75J]FevJƧ$<#/MBNʕ-$ef0[s`j0=|lgd7_&bT]h= QXu z5EGzvۃc.k⠷. xbp9paf*ʲp^PpkY.| (Tb0L akn߀Sڮeaډq6R(='>P%DEy-$^ʉxw{X!Np64H^le\!. b lv%^ F7arEr>ĊAj7Eg}_A}0@XOnԷr= <n8K;X %pЖe? B,XRhT)Vx$zDU5z,Koy\n{e;arG?+Qel 8,{-ݼ}s O۞M4,V!Ïq+uZ{s:ťM ubYXÈ7F-߻S,z2NhL<ޠ+-iW0G Zln&~'?Dm2]4`&<w&x,;`x t`ئ>ɹPYSNf9 ?z =V BtMr@Te33g$D Y=\Hȿ C7#Ѧ#8!&dvW cR2F0GaʳA/ϱTi{8Q$P4M-%EbCLb"Ks4h`L= Pd ! RP rJ1S`C?Z :#"̪_6[;߉ xz&y5;('BpWUBQm9)#:ۇ7vb,} @۵4 8N֥-{!uago4TmYIpz"? ,gǏ?V%G;"G=nLNBZms ?;{&<)U>uӤ9ydhFs|eNfBzؑ=>Hqii2$m4"}hHW賴}^y+BG(b)aH&swZ0,9 c]M./S!Xݻ{Äbp׽hR˹pU)5),, {ˁEfɕ{2 5}4xF. s(~R4V"(R%  J'r_ B.(T0Ԡt>2@Jʛ*+c/~b+]l|[jhOɕ?I3`n|W$mXI+֝1nϒ=(JFu9hĥni"PU>K~A XaC%Ch4 jjbw׻߽BĉM^6Ol67~Ͱ\ieYN-i/cL\NO~,d| 'l+\P2^LWa hŤ TEp!*6 !=ޝ]͞XaFOL`g㳻[fhZ_kQ[CFl%QWV'Ōr-@P /ٽ]L8]1z<; 85$E I4F!t)jƹ)n&rZem( c睊OL.i<ϖ`[Йݟl'i9Pj/"X2GlmQ *a*GKc0YRR^3M\2qXZnKlRQ.`:iF"; nh g|حUeR_qg0dD?q)X1_p-qW1 CSg>-e2 ~#aԽL4Rg?c9`(HHlDw'Ĵk 8,#LjRO/R9EذgMT"ΦT`LX JrOp&xPi?v5|5p%̚vUM9&&g*tJ3o`TDUZr..)J_;X?`yhRHQ,†C+*! 6 :So-=NÚl&=ͣ^tW)S$=f2"7rg`yiCᬬpolI-ݻaK; G@K%]:ٹ5uGzPs,޴k]q׻xr<^C-&E hYslPϚRR9׌ #cewВB^<_0w-+ P4Pj/QpN&$471_p=J̆E]DY24ɤ*5HH3>5(>$4W:d! g'1\ycPzݜ Yj$D\B~~Ә_JgfA=AIӵƏ*&9WAa*~Ѝ+<Cg[䘃:T 8"ۣbn?PY[ (0rW=ߠFk28$\압4 EˌxJٷ_Ln$Lw&^0bY`Mc:.dz9Ix`V5t㨃|5*t m^f7"vCnoM L$9nꔶ 堑Ɨh&.*5Ƈ\MS  J0M;ՃGK{q2IHA3::۷š{ Ry-R ə|rGrf1~ybچO ed%0A#Ό }KZ>GK Ke).rSJpl< CkIgFvJr6zs5{ϊHQK%OԼ;hwW<ݴ@%Txqb|!,G"_!:oPwm 0$v@Fh6iKU@B$ U'mR|cгUԆ.#`חTumb#9ûf ?ΑA>bz$NAU,^ qKm l=I8-SB3 W/ lyFG>KIII` ~ EE_&$R׮-uۛAty_+:iqqc0/T;6bޚ} @4 k4 Vh,9M!1ZFNB Lş/eh )]hy}7@QAÊ|% И ̺<V+4ty{L9s$q> \ ۰ӘF-\+hC(gMRfBFs]d6o2+ OV% =uÔH׋ d*}GIZ.uS_ދ]M0W!BFl37]-q4Ɠf7說3/"֤pJxIqqf%y^G]?x`Th%'Jj_^ T[y'CP pRZ3 5$f$O~N}OQ)9n`[˩ٯydv9.ӾM"]ZN\vG+>,GRh7 O,lsRŌغ9?O|'s糚0nVkH ׾sZ(klvbA>0o?w}unWe$SB$FTǚ-xCxIԄ6H Úϗ~);}$L D&ړ'.JWG&uc}d Dklx86򰍽3XR7dq( 7F6_m퓭X@)h?+sAh * b >ܰ1*{Z[u{vzM:ـ4r,Our:祦}1ejIc806T 0V 1Q4}u^3%e:cu Gw,٣Ő2Ϻ\l'ц)$i[)A5k$>Al^],%Kr;$ w^4Hɿcxa&KG4.;KIHM7u]m ā#|gYֳ ?GHqRbNg}x#yėd&w;9ϥHOUbtyIAGJݪ$QXmЦSF3 2rA? <Gk3HeA&w:x*,WkdFn\DgZޯCPon8][k{sI p{2FWƅgpFЙ>&rg\˛snvh>|ܝqd&G{f8ͨago$KEXsD.y8Q5tSj1qtf{5ȇunW]iFq,O+q pF"Ƞ~lI-+.↋ĠbGT1sJ :JgSatG9 DW:R3yKne7a8` 捊ر XB7eCDIq!U]10#y;9zQNT1aWVBcN;,6-& L5Lm { _þ7sf]@YDž2ԏ;%],?Ku@Q(BG"A0.&u%u_QBX'zEM-sq儺ˬYi_km4ЦP=@ D!Htׄ7x&s0 Xb:mzR#wH\]s;L]c!:=>WM28p`r$5e*ZT;6 ǹؼ[V Td+WȰAZdko3xMxҵN#0/";tXm$za%G%WiY" 7\/?VS,7_H eM- T&c/o ջ4%$YG6wg 8@84EȞ\}CuhB* = bP g}2QQ{,k0=&E-X5z?X4[$= ^)ya xaMZNArf>E bIx\|3⽽~ ق6+3u+k^ej3օY\Ng UnW*iBe\l۷Ñ ?,pک$N'l4"%l Z ;tYz11xiYy~Y̿|K} @ܵ4 Ida];&` ҵkDyD-Y-۟`xO  RCvzE3KTLF OY/s"+jm韧jSf*._8݄` ar yCIZάݮd]3t)ǟKDˊ,lʜ0wŒQ9_?@kd2eXw-; @pnn-!T"JDQ؈K _juNxИɲmQ՞O[pIa-;MzZio-$@L2΀$p!}V\{fЇQݮaH ϐ Ì{ºsPb5'P,Sgd^̫ӹ ̏0с b0*|ć1.؅Sk9N3)ku,{Rf@6fıkxjpw-; @8v4!*p$. Ie򰓵"z.|J+Ƴ}a>2|ႂqS`*viHy秹کXCryYꂍ8kCأagJyz۩%Yd5w/ y]%j%3żv:3P>qһSO+/,h^&b_m(k>t,?a@fBtʸ @˵4A ˫ٸl4_{1CiKa5Qԃߕ 0w`Ď(q8xC:^ioƛ7G`IsrD Q)He' 'l@ng}`~. _0OVd| cMAoE$Ⱦe T2f-  !#n]!9M'L<h\+{:[q{`#w3upeσ  x Zh$KR>@PFccV$M"c Ǽ\={wbS +geޝ_Y[KGDݹ z102VnC/?')IGcYk.c;3[ OiOcd 2ZhS?8\T׷E@0 y*zNm02DKIU|4znL и͸F|FmE-g{wηmK0swڮ -ѤdoCay8?.]X1I%dzZ> ˼3O?zk6YrWp-8- 豸]&şa*g1)h0 L hvrWi8>ݬQg #e]nHG$H`#<_xdHe$EdՅB*datwSQ ~Ok?t<XcDh{<귢3`+T,SQmy{j)T0srf8gb[^&Wcduy(wȑhIVZG+#+f,rs]&HmpzfaI$0z.]C^_)4՚N|M6yރdт, rHYxQ*s &KJ&dAGQ+nv6 `--򡠌dnfKz{ZD'!1z0zl>}ɓиdh8=൨FX/ f^5%*[Td,)6漯 Z?f^ٝ|N>5xCa:>.P-ojM1[, pJU%7k7i&FSudUWZeZ ^DO#,sWך0 E6[Eۂ(!ž|P KII\CTpo1 9m,'ev;ڡD薳aO8!x 1uJTbO&59%ŽnMril#iA]JIlV Ɔm!}%$Z"ɯ`1[ Qmm){/v-r9Hsj`%-YNO>-BW!gԒ+sƽ1 jzahe [7i.wnhM *Tnm|$L\b9َŽceJKאOӟA&@߁όV*k)it_pRq .bWС#;. ,wek]U$n tS_Ka.;h<"/Aiu{W>quq 0`*ة||rtLxϗ`b윘:[̄ y{} rYy[ip~]eqU^C,dksOZe^@}p~\RKϫ#Hë3(߉\)VT8U~g&[d͠SCIs:5J""؉7fk)#n[gKz,!c M;Y\b፛X^ywxF[{,V/?^پ Zr?/%TDJR|lsMĪGl̳G3,*z#z js{!L9&B[mPz x1(#YDd( Ɩ ~jOf>BHW$|eڣښr)I*t8FhUyыOuыg#522 i&`0;6AT1ԜjA$Pycr6Q( uMR֫G*8Kd7a ^bdҪ7ơTDXDHŵI^*!Ngy~3UBq7whyWPH6M$8ңS7\Rmm_kB[qtf=j]G=;.y =AF0,rMfpUaB1IJFm_// )[ 뉾L ;`y1A*yM>mn% yvNE1Eq? H+ϢTjcLge^sq $,<CǷyx7o)y90k}{M-:nGͣo游6f_)m1 [تXEP<܉k ^z'pٲ Ӵ&1YbH@o䟿DgNlY?nGSU#\}! )@œ֤L$o[Juft8> zmW|2=Va6B ڮLM#(s'\n.=#WU%P{ T{ō%"hwZ<zYzVcPQ&@FzrME5x\=4׏dlNki&q["=W`A4 ؉U+lޛb&% Ġʦ&( Gv sp ,}[ͻA}<= $tNXˏXVZ; }ң88Q׏T2+˳IhltcʳB,P_7XN|DofP9%j{wV@OHB( 'cM\ ?ĥWǦc3lL\H}{9Xd8SU!wz7^`F!:qbHd'B9bElOu6 ];0*l23deuwm1E7u`gH(}ғl/e(,e<^ٽUIzr!H7mӭ/7ILz2`RJo)^7Oρo{Mt{TC/(ދ>POܸڃ/#;g`< %˚!*֯h@+#{j[‡*ɶیh`S448.,3\$F&v[ A|ky6ۭnhٰn/mK K,ӞGX) Ndu0Ln7 w tHОof;}.)ԞZv}0avhM\ BK2i}Íł65be\ %I( %Fԛ]UV2}{ZݞMy(Q>[rmX:TF-i:57JHU`$\0s< @N$N\(  _DJ |Ԯ}U$nYxa@$AU64#EFl77q*"ǚN{>lI@r tx,6#I~tFzV(SMBxj6ٍXgeEf^p=)H5b|5+=w1,BE܅Ac}c&A5E8 DSklkNOju'U b>X7ڗ]n0+ 1YԞ{HoC 8&^ڂz]vV37VP~e?x8 B7V;>Rd| Z8`4*a:δoW}"/mg!$|nIBVm6z1^)N 7q)ØIv){t|,s]dgS ~ѯ]/J_nM}uW5 h"m~VQj?JZݝb6n>Pd Qg";ݖ)(O0Uܕ5.eyq}?Pw< @v<4%T@bd ;J IɳWmnLlN}w1r@ٿU+&9#@&pkظ&#h}G~&@{w\щMw+}pa[=zp'zp\Ӓ6g͒o!hFnEГѺIYJPA"fGϺLNB0G^}Ӗ){#iq+J323[eLbCYpYiफP0(Yݰ JvmY*H_n"QD&M:u8F'n|F{yϱr"hFC2=/Bfܠِ;ΕeN$ysjdKB_nw4ض*)*(D2*nS(:a^ 0&WA0iXIӎRvʲh(N\(T KEɮyQ϶lC)"4b׼@nZ.vUr K N&PwTwӪfXsǭl,QU9H*yєxS⮥a oMjZC{(xxj&M}K z\0|o~7SucIxнIɏjO:9Jfk>j #CK:mlsW4J\rFRjn0yLmc2,P;܊>Kl|[߼T+*yZʩ!yg`DZiQO%u0 ڦj[UAA7dv&m9o|C_.=7`萐ToUx֭N6e·)#i6lmTdAi1}zD7͇v=DvKiZby:5^F'J&Uh&7bj0l ҧy O|aiM{$;4Ts^hXxVKW_.1Mtsgˤ0(wX78[TƇԝN0E67n CU/VHIJ88]XK/< >sc?ơɱEH4!y?GS[:@w&1OQt@; 0w ;aƦ@͑w"x1rϪ4bxŶz.Vx$*'%R{ctrUqO!õu<\݂;(MH3M^BkeF]VVEFE>T73mho} ܹ4 Q4c{;iP@HeŖز,PI*Nؔb|՜]Oᛰ&oƐis>;Gv sSe'BA)8:6ƅkw~[5Q! h c,7={E .wXRZ/gW`N hv]Kq6nJ9yi }98xvy޸wR*E2 K7 i%[bˆHs兌Zb$N7{w Cqn"g.ֻkKh|= (_ӏD1Y74yĐ;MW5wD 'G"ytQ{EدܜMN0:E!EM n"&I'8^h&f1w@,}{Ȍy_Ȝ"Ym=g޿u mcr`vfm19~ ~n5-kf߻bPMQ^6uy .FO5LCi$~N>3TFJ-Ν(/ama9kiN?8mZh !u_,VM4qv[12pwoWq{GuVS֏A1(#P/󙓴Ntb=,F`h܍SdktovڭI|Y O0]QCzʖ|WBdX@_ФW}*UGtlXID+M-dk!1Cr=c9c-3((7ˠP6n>C ޏmcXbp9bWS,)ƸQ c} @ݵ4 ѤvW5)4v7܃ 5--$cDZ!F( 6X0'hf>3X* fPݡu^4ZR41CBn: 9OGGHQ +f\ ~xnV4]b *\Yc=lɕ!:s9܉ ]ƶdQl#Zש]zgw['TDc>ezߩыD.? d&< P%>u(j.YEO/ :$$UP/?ƎGD=#XjFPCFr֨d|ł]6'A7eo{10Y/倌ȶZ"YvzWy'R{5-ꭜi ֙6 gĨ34L}ج*+bꯗ~qq{wd0Қ"Q;Y>tc,=2FURaB5 cbn̔1AA^ea Ii RQA*5?5>hn!qO>8ήZ,{}w(M>ʑ&;iIc*B 16Dn'XiOgt^<0mbPC%~#zX_Wz&;yϐ-n-A6U==c~6JguK CH5pRupc.gltsM~5,fo)xxqҎxyNU! LGBbakA0N22ɃNwO?#~~?Ìu)%0=d."iz q}K2HR613Nت)DP_9[}\:C>8ԯH]^!UVfaY˺<#)њsӡq,?VgӢ- 7w h тid4js#$ao.|m}zfΡɿii$% *4bAH ,mve@JCCpCBbeOzzwz'kd52?q%cmj?Aob.M9sD\:u@X[Ύ\(J>tU*> ~$l1mg&Fg/\{Fo)(3kdwW ؒ*^v錵\oOX4VM's}ci${ 2_; n%E AʑG}Oē!1z ݝJ y7/haO5Gx?NK ֛~fW6Z0i}ξw$q´VTaL,Rj*Ĥ8fm_Kh؊V.qEDKs/ S tPj8/h4e܆h*"3XEWd7wǬ_+2r_DǨ/;( 3 ?CKQ0o΅)$fp]>×sM3kzG5r<6Awƿ*r zuQ8tfz*R8PcDPX I|m(k*F0`-" |6]6"(Q^87+ FzLf{,}DRPccKTs!Y+}gauGMs `=R/| @ݹ4 QԯMM&Tm( BGah#8ƈf=Y{f;637Pgzq SBڊ6~#tA9^[v/0<#jG0jZ 6ROOK#+ӍϝͼNj2%X-JKe(Eo*[#ktawR EN$iunrB ˾{h钪i leQxAʲ=H:lkGQ08:[o!5g aHx7S&U*TK囁У<}vM&g`ak\Iv ʴH8NUgY;[Q6AFl_u:5k.3VezD^,jc%U3[gepL(jJT~N>zXxZej|kZLj^Mpρ@$;(bmBpR<=ze<7w^%9n2;ށ m(.5bhssR5#8(HY^<3%7g! ame¢&4&{̓.5X--Pj7d7 puRp=f4ب+dd!fT 0_A`[[n-F}Ec(b8Xo74boCUSe)0r@=|n`ڵx4ʻ =o.[@l1@Ycv3/cCg0S+NvKT+T21ng;:tSPwm; Q]e%M4?D14{aad_|/o8ə;KK՚5m,;s=n֖SW[8qd t lOw g`/a Ƅ`@iR}F݇R&QF!!v5Hz豧>`okZɵq872n:=>#OP=+CCMqÉl|C4!ԉ3mn !`j֒y ԇ.Bٗ9mytU"*1)Q r"ۥef#zחTKe2"jE>+h|1:̈́TZu *kuO-wW! [hmY]5Qkї]/@\퉵%5¾;m|Fá'>D*{1nuf\ت?$?K%aƎ;I@mE)*{ H(@ۤvT=+Ѽ77X0088BR $n6zwK)`Av4_ɅR45Q^[6SBT2O:=)9? @4 P.)-P:tǣ[evݑ󬹼1e}]pfhg3UY`Eo"tx<ShQbJS3';X0҄y]Mk, 0T{tLݭǺzKWT/}p#TmJs*l [+J]o x!g"MdX( uM{OiIGhw[-.UxE[6MM&1(*Pčı W$.\?Xi5ٝ2+?("JzoBY7A֡{S4/5Yj Oʹ;Wzxdj1J2q,2Eզ#ILE(L=/HjB0q@|cvݨ-StpW;ݓWh*}QH,lmRQƠYKQ_~>|va0$M]ە1 Lހg ⤍im\࣏-?x7~5.uw -3 񓟔 )Z8xޕɛiX mu/-See^hJH٬JTZAK[o7&o[H 0q)O!ǁ$ĖUU|&q!; 0 u[|kwՃvd`ZN|n,-rEbMZ6&dh~EHK[jea(9\Km(J7E}p[EPӘ{rI&[7 o`3tLeA>e)}~'`b_UWVYZc5*cR"F@՘.eúVbB6-%y2>bm&3k;O &]O$ݥxz\З]MK0綦,]דEPQPmӦ'A^f00o4л^Nw lL̎0Ң| JScnT&{wPKBYgN(.&m|Y(+)`D<{h4,A:ds~JjWoFC=B4 BLԅw9E Zeٲw63G.>yb]/\&$MZ:Dl,L $&$@z}Бͻ$ ;۫BzguBM`i8]@ )F 4 /M˴-aɃd'Fqmq%FYxB q&˫[ Z.; :JBNR*U(GAlh lo$W36$Ϸ s[j?1P ҼfL܈<uϢ68(t } 6Q666r=CU.U%6165YwUo0'Ҍ@W# ba3:dNis> 5ָEDs,\xE_TAI6<޷)NYtn44tiE(ij RH[NfU& ډ A02)g.m<|~~SR &c-H_}~tG l֓fE.0aX"i9=(ldPQ?pw.+ a\2\i(T7OMi25dI\?92Fm{ոP7 Q3e25ùxƌ8Z{IC~u M7Y`:QAbv5JP~|b:V8a?2*_jN0 wSLȆ~3ͳef liwӸ"B$0`+Eћuv{Vq0-K ŽqǃgŒ/aޏܝKO0 y-Mc &n:BA<*m#i qʉ/`,B'#W7" #> ߗ@wOx3KǀPUVr? d8 Cgf n"i${ jTHƣI\6-HƷ.{n qzOnE6rgBPh48!S2|e9DlNa|ߛV`A VX~7,zdvCgXJ(',iC/ȗ]R0& R=z_ƒot*$z܃;;w;B U+?r <9ϒ$__1=hLs <8xôK&z6ʴ]WF=ʘyW/om8ѴEֹw!5*öo݂fƐq`rv& #T FPb }<cs軍< H;8"ۢw>c _nMxN 9:k\9׊a i-X0Y/&-{@QP,ă9N8ɼ5؃W ~, fm.~~u.BK/]hof55h64Y=&fc]#g)S <@ux\H+i[@ F&h*X-Pe]L=@?$oy˛SPиS[?q ڱ/z/T*3CGV+FRfd 3K5,}ϼ 8Ć>.-)$s.}B KLMZ \^ X7nfCGڦ#J_KZj< j̃]݄ZHo_"wFYVTALt84 n1J0NQpw;@-Jq@`%K dz's$-$w{$aa۰wy}@TL&VcʴiHH2۱Pjq<X/dfusLv2APQt q:VOv՞H&I~6=]YcVʮOI:~ݶB6yfP&oeLtAjQ'_pw: @;iFMF'`eay&6$UBBĉ8~NXI8~G5 Z%qބقX6"7y1#c:ϓ'YW·PV*؈.jƖ]6}4ICV>~A7%{BBDx*)aPv]x{CzDRz%UX-fsktm9 1xWEҩ:EX kd>u/q"6NH#P5_wPQ 8 qAIG[vfV3GE 50hgv"{ >2N(G8:PqE\;#HR #/n xu8_^ lwۈ̀(8liēffc]ҫIlv"0J(KcN3+8(Ľ+.wsn`v"'[5]-%v鰷l7QǨs.O*}!@Cb5`p2'"'iPy 8Z^x:4ǒ[]ZdhL'}ΫhteDVZӫq±o5Y8A>дbsKA$j;6u &Wa/; Ifi"ڲPŮ`!Dgy2A,8+|[m_-1R=L"YdhĐ810_. 2|xn.|YꀺѤ3NbWx=9SM7LqL%9{4 W:oBM=1 _9Si{ʠU@$`o=VZ%JL H2L[46.Ă0M$ XitLRCy1·J!Ncl|Ұ\k+|V"8I&i .+,{O^}Ol&$xr`s>?Z,Y18h:@C}3!y$t3h##7?8.W>M5C,Rn#)VdD;TKj%5Gk6.{.Ў[#L>OUb%j}<:}~Q%vzZ$ qxu .\Q:H9,m} s-8BI"XD)._)wW0Cgdi X?s RsHHO~<` UX[qeHy2@cLAݷ+ʃsҰ|;<ɨo!8T%{\ŶCya!R:'^~C:CkS^\L)T, ;w#ہޤGn\(OyUϬ;͒, ܷN:a_D.^̚kge,HggELD*WX!wW0ߑI j]XXPIT3Փ7{d|)†h&4U&}C@id^[-saT=,@A8e.ZOlvi6>>Kp[]bKH5":n7D :5A߲%^{`8foY4 CQ~NSh@2"n6eB͒pt/8v\.F1ԽUVbo*F+Q{4Q0$^D=8cя(Z)o{Z*sn ' j A= Y.M`O1VyyaTP,f5\o4`5^d^{㷭-l`z Ԩ#Va8. yuվ8^_vb h{X#E? %L|c!R_hfwF`D=U٢0f50xGtEV0|U;LV',IJ1LF T* ]Ln"R^}F 8;-}Wqm噳S+n칏ozgAZN} M2ɩim 9.Yu$$J`i5&27ۋظ'\jzahh(Lp)8ԍ}M"ƍlOzXjn@#לm0, vhs _EO*$ [N4~{F9k5:3Bd  ՛3+M~HU<=Oˬhjm>ЯfFFmAX7i[ cs}el$Qc{*'=Pr|\D-2Ęe1&I_J;a;Iڢutvށxhl5]? C<7,K~gY_4#*2w۶v%hVM0i-%[uIXÂUt0-3ŀ?"<^hCu}몓sW17-,O-i&&JUM"at^xG1ـįQ^2LQ,Ov܄ _c ("E N@Cs4RX|` f! -U3ś߱uMm>ZU5BI1hKNӈv6h9\:[eGMHٯ}[-*t4 W.e mX JE/?GwX5ǜVo9 QZKPF-ձom~SHeE?z cWF`;MLu rI-( P?A $L[Zx118i2e2t`A~tcC.-I͗zr0ܳxҚ7aʅRġ,3vWw:?b&S馫B%w-l,9{\N*)ӆ$K^XDO9l5m>{XSьPi=9F+mvV0#/;a0i%[:t00 zA,t.]?ocEC#JOٸF/h-~-$j0WY 5wzJ@Tg۔+%1qϬk(kpw.;Qљz K;{/`RBkh54VҰ=Y?s~o, KT3lqSKN5*Cdn(Q^^F G+Hba`Օ;W0uhCAd\Ll)-h9Kl]On)0γJtiMw߳<4'' p15F.᪕ \NwǼ>WApOSA+-EDH?J;fcn dPH/Y jÓH8b1]=1#UtSDLu-9̼f7ˤf]=B|ehě!ߖ>jEIQe[lsݧttאݫ8|mwX͹!ˡ|52-+Ap7X|$6Ò&Bg-7g@ihQxG&,f|&u9iËRh㚵.dU] ~D 9MaUfC8.*do~͇E$Fz!5u۶#,(ndըe~1~5g.&w{sgHlWQc +t9ZMa؇J%4i \LknM'8!ngY#ta)`Ek[Yd]3j;f7,QOSC4?dD!o Ӭ4ȸ9Wr&b5WJ⺐;, Y\b' 0|%e-mR(wOe|# ԩ챲ٳ[fOՆa %ْL\B+-PrIò9VJoqݙaoBKI[υ@'(dF&$cH׿c JxEC6מgk`;v*2g *H3SZ6]Z4gvxs%P0tކwXC#&ild"nŗ%kbFr|G@-3AV~b^_nps6+ PNl&L?f=bwp8".f(hcm4I.pEƢҁpCx8,#fSm:oPsbu;-~*(U\JZț(C^3 0M˿.iކ蔭8ވw^jVjhv]o'3ݢ3Z ݕ* v$c&/n(/Ap(&&g x?ihqKAɩ0mX\c?إa*7oZp$#}NkE,G. ui&Wk>AvNzu9MO3wt) OqyeV )}٬ؐ%X=Ҫa"j~ ~Y%EZƊ7 Wlg˴e1<֌u(8)N(It@eaBLA??!HH )DAY]#{1ntL4r yăW/+s8fqdM|Ip@ؼ?TYUز8˵W۽]_5/d5ewtcRo~m)~og %jwv݄ xN&H@iR t)%dcc]|m0ݙfoX9sIIA\(Je?~mmwj69V=KՃ XTzǘH#w9%~C{44V ?mR]ߩT-u0Df%iRSc[3 Tj7Y7z^ax3]b~p6nx Tp<4j׋gPoX&5Ib KM3zkGS|;K$TCʓ.ؖз?0NJjeɴ@$Y(A{lЗw\H#0&>/Y+)FTF>z+{]IG?4lv 5IE)$.*T=R_ IH)b+wF#j5ߣZwF`0\b׉@OFFX[n%;v3,*t/!mT9msb?q]77 _PVigZDUVc^T9LU,e"_\q[/`xpOAGg |^>.i3/Psv+ `O-\jmY,x&[Va]ctY(]{s`9{z90Nv]f vs$)G-sԪʮG,ˍ1^8` ט5c@lM'8GUgmL! ó:t0T 2O,h3bbPκ! 4J7,fOTXșW^a‰(8ia(CjhH8nb0}O;tw`_WMMǜz3 bHOX=Ӊ+.266s ͏єp6mn >\/f=+]uY~1^˖#8&"Sɻ *!>hyOl7#o92;1c)H} fr6[aݯ\J0MlڭdU`.Ũ"s5mdib{qXi,׉!8(fj>t3~J|Cq<'#3珦ҍ3u(z$]`Yȕ `qT@L,R9^U7b63Ms? z#Åƣ N֗MC;|2XulZ0 >'qao`^6";; )BaHAb?^}wy9*M(zW予hR kak~e7ìⲅjzڛN`ô`\b6XDi=U9ɏDr/DR`@u =YOg6=_YÐA$`ԝJ@gw3$]Mhi)^>@EmZ(1v78p\} ꏅ6 P6mJ}^C1%]u)_,T`4P9+u0d.McSh, ]X߭.ԅEb)xi 2133Nw8|M,;Rz<,۷fOѠk'Nv(f:d˘ٺdeSTlx )4!UU>%,PJt ڮek +vBk?[6pt]j,9;{RF4˘8^@Y/0ˋ WP{?>oޢ4`S( jVn6?6%]"/oPOA+<}9 09JaCF4` ߞUp-dҼ{%tZ[JJNK}01)ֲtCO7b繠S"ז@dz GƖkId&=9I졟57myw/jT2υu9;a ؉-'i Ī۬ XUP+jڱd O7~јO"էk]jCMhx[,_.rmDąNWYJCxeY x@@V,s9XD`@VP0 UoQ-uwCF-n?ޡ=_E''M;WXJ?ܘ+ӝXz=]~+X|fg{9>L!OubvTա# eGKp15FP8M\o,yQȏ5,xΔ@Q2@jo{)a`6޾J *Abwvc ʝp jRY򤭖P뺖)gZg39@ Gpy+.N%W>e`z\g;hSBtR[?Pw6) Ao (Н 99pNa0-ANt2xP_Ճz .*(QߡW{}V8C߻O(g[[Z5|݂"qțڵ,[zO9\vȢ?oPX8]1y߈a Gqt3UY׵>F g| 5%,ź9PˍkF"G⏴ Bac+`bbbu3qvx1zP.ujJ??J#'/_ĤW<̀֡T??}/+ Ycl#Y\Iߟb7 njKL|/!WZvaag蛴{8l#72@je` 5NM/B[V¦Ăwb!hӡ1`Ws|'9_맾;f4Rtosio34DH:>W&T3VT&83wKG}Ԭ%2`]{3WXL Sv~0i}E(oQP8R M\IJxB^/A` EB$u;P 325˵1s+i#'VܾTAfP3{n ^mRe"ݿ U{?<AnZ@, @na]ק VAw OU{{|גejSD"ܯHOn ."J %JQw(ccv8ǿ/LS34)#g$ep m>G^s5- J'0pHaBEZ9"6[]]LpҺц%LлvTA8*缤LtFQk$=KytWʄ>X1 (KX1̿1 !/NYcĥc_?m~t(GNn`CM}Ho"-/Oϙ}72r>.Xe~_lOpp|x靽*#/6g)K$ Tx;sIAh5WЙPu$A "*6iԉ{=.gr?֗,G$U ~L*otN)P__qGJÂ!*:Ūy}1}2+*-uŰGw?وeTJ]!BQE-"2Λ+#V( 3җԛj@Z#&]ЅO]Y Bcꐙр6 w8+⪼p?'XvT7-o1Ve: 7TøyfL1M ]NIߩ)2ӯ${cqtlV<5VVWeiCdFiZv@D3>[+껡4+2Qf&īܝA @EggR))"AGۊZTRDM-̎QGo4 SUoVNd#˜E,ef뙓.1#_ 'UtEV9P^XP=*理 X8π$6Gz&2>Fu I .Ċ𶡤|\R(7(&bTzHWʝNDEgN 6D1]VIp=ks9_="Erw% Y mi4Naz[iWw~ƒG.DhBӟtߊʕ KF@go4ԣ\}ؙyir--\1Ӆe8aCU[mudtTx΅9V zU#Z;@QAu>ftuOEv<0|0>׷ "E5D yjYfPA_Rc,,!\x9rE 7 +Ͷ@*OBλrBeFV3o[6Zu#fI% ȩ;Y-tl=Ș z @6A FAv:T" DCl1]G8}'t@.)MBHZ0Ǿ/Bp՜3CNBfUOpΆN'CP4Urm;_]+HnMCMZW2z.x#i?}ѧL2Cޡ?Jakx<~'tlϯ!&z3A0̰#@-6ha#1&. A! 7=8Z %(ͳKa ʞWpTsInH uԷS`5vum$v+&ي@#=uf݉k: Gb}Z Pqha~{եL]}<Ψw&lA0SB(?)! aO ܨ+c APmb^޼d9a }!@+P934/hg9:; Оp06\Ӊ鑹(":,`Qd[Xabz=%[]bFvp0Zug((Ĕ\t}@wr׆>I_ @oUYQ^D!\W(^vU4$^ ?PJݽ۟a 3?'B#rAʱ*-)㮁 ^-଼$Qg5a0fE%`nnB-dB3zr='cC>\7 zUn+?q uYPf5K 0D6~+q#wp!tJAłiC<ü0VA Ѕ8jh}ՠ/rmgKGU|0P{=P/"N3%|,@pS 8ĖXZq/i5{"<|O#uC0mwt-)'xp4ԟkn>s2_2Ϳ nW"jSB&1d2{_X5-CB}9>g84u2x I MQ.V0*vWOi ebMUm3AhuSL(F!.&#p At#\ ?f,⫤Te9NUצ$}f%sǽU3~4y9dfC㢥`=(L,Jq B'Kf:V-b L/Χ'0e0 \*4q殦k(|ZR`Fm+E?+ݨ+A[F)t0 q#4jIl\k!0V1|jvX~5MƚR&l*8rDɗte0i3X # k#nkwhw1+ݔܳԨTo痁0s\-jd"X ZgrE Д> յ'Kɽ`zl=]W4邵>u?9<3)y&e/Z4#d'ZخX{wBpTn_yܾqSl4 QP SOwT&i[2t4nFV{[͘ZG-S4F+O~ ݝ `tS:": 7o!$\@lӚ6[=];M4OIeCJJK@Oa d?Q‚#WO Xndb u0A oΐ[*D(9ycu!n@YM2V Œ [E+;nPn(]p ](Mt7ϻaidJ_Pw6 `lI !)qϊeVHbN]`o1o5,] s0|-?N${]th)OE3_c$0cqH +C 5`RMDٝ=cHiTxxR(W7KP]ϧ/9(~zfP8Ľ=&BAz=B%UɫTRk, W?^^XO@9pW)ȴ 4*Stmw]Me1ӄU [Ҥnx߻#gϴBv9 -HD⚍"y˼`x-7璃 Җ$"J'p彽 ~c0)"#^f12? ECpk8 |h+H,$*SKEYT5DǸi1p&h,9fB;E&SܨO%9ximvκ]s[ʇ]#|ߨ{_e-^<PNX `#$3}Bedd𕍅g!QǛ7>W!mwwd(#'\/E> ߊ2dP>^N>>n[/U8 'QA&/?3+/L Bz f Ѷm! *!='] l_<{ &dfP Y'(L688@ѿa#>\YviQ)бxU9-bslF?KOjTܕB.۵$qnZIL=A,*aS|0HX %n3c,L B#?&?Y~&$ "(,b⼼dmo>yqS0u 3`;֟~5Z.a9?r*y?v <Ywa HkY%</`GI|$hA(%%k@lfݙ րo߄6*6Bm|Uilfih]09@JgDUFz**M_#Y5nާHBRp1Q^hD93kQ(|t3F8=!7g 5]zwu44-Zןu7 *|>f.3`['qՈUlV?,6˓"V z;aAv Q+Vuɬ-1<"< m)& .*s $!dUfSl;0Co^pw-9@PZXc  7pk@DMS *`A:'df'O1g`%{@QB=p.0WL22"ei =oM3ʅO26Vy,l*{&ɡxBqxr6 5ԕtmJ?<9Qwg -_U& 7Ul'~R]ޗoB",8^YK,߹^?%o獠?J9?\RQTbdcUHO&A p//[1͌t0O B& twG9~C(<  oLL5̿^x_TZWo~p1iOO7>F7"Z$ү* L 2|UwN&A9=aTm*|O;R#g \ kA -uqhRp:qC$ɼցE+#d".D-JM 0he#=q(obםd̓$]@3Nn4 ?*'k$E㩞SO_Uzdv٪Ml?Pwv+`gNfT*a9FA$8n͹})Q@wf\51jgɿ @ѼVcקa3B0I LENa,e~94ѥ@FjփADJ[g0rCluPyP[%`vmP1?sUrژiǷ\K0ki߄pe0a'@Vz0y7/33SbY;{0z# K)jb&'qƗ-=iw7;)#ǔyhD?ԚQV.,,b<-9$ P'VZ/ǦWacuua0I"P.x7aD!4R4  ^^=5:05YuG1E%4N"O0@6{yn&v87ÛoGvcI6jkH^񡙄| ` :n5[>?~:AIA.Y Cu-Kj]aM a`a@ TP$͓f7ؖ-YO`ƀ{Sv:,ݯ"lAt׫riOnؾBDA)& @I0q6VE/Jb7Gkb?^aY`$жA1)F |IV &T}@ QwuRLB"B\ug:tuN{o̔Xct>aMQ* ]es YUd{ZE$I= 47t^-F*h;(Q@T:JiEHOle0k'$5mFWb1hi`(ukyJAGa N,8X )8(ĉ8ThFOS2EiYZiURpQkJZI 9OΨ 2E43)qEA+by jܻ xGp(%q:FyW?<7O~E_՚RxQrut1]7xܑGeanѦV{)^Ńo)Mi5ڋG~.`7\U&p fa .z 2 מu<"(9$2ۙLL!h缐MO 7/F6|K[nFvZH}MFɾ.io{ԓyc qBlG]ǿr`+Lfgv2Ne`!z5fW`4b5_\Dh_zHyG=yt%TT֞"JDsܐgAf2 B 50DGU4uzkIAbmST. \yz!(+Q[雾gʅ! IH ,>pa9_ƧiP4RW@ 1xwG) :Zi¯`G̑[E{TЗ 5!`ʁQqVIFTKIufQs$垆VtCfF@'`6Po9c q@AAĸ{EH@<]='ퟂ\yL̙ %p.If2Lc3+|GQ ;0$HIZT>p=d|1n7dO?w/FAebG&e5S6Uh_Pw-9@-R V@ .tQDA~mmY.usy7S`kC9 - e7Mվ/T뼐MQÝCz2-90V[lX WWMܐF6?WvE  CgbduOl4~5M[Sn0qшTZƒ^3 K/l_Pw&9AZT gqCH@hj+7nBMͯ,[nT̅[H 3slmtȵ.cb|X:ILE+_PBTkL:Sd9l 7T9 .'?JBOD$oļ턣zAzv Eb|)a;:{0S5 :h=nZ \x @& QqL ,EH[Ȁ(BY!5}uKUz˓ݽ{RbY#"ȖPԝM"%R"~Np)_SDAEK7Ap (G;uLz9‰eq"skN=cX hH: tEQwn8fF /{Y[1CPw-+@0i&؊EQ< Ѧ5݁YvXqePmCm-n&E>ݥL !Fh]-f<|o'Y~AGyƱBf,eiD@KEbNΫ"89xƜJnM1u"t$ЭT؇]gj'ɗЋұ=2ݰO+Ʀ53çԝ 0siBzRAtp|'QA|JKKg=??g@td,c,0i3(]u6 ˅}zM $$m`Xh_mE3 O X_# Be<\[J@aOQay}S0HI $piljo)F}%pjCe' vkYAc‰~>ઁ6FN/J/*]J?%l?Cmԫ5|mKoאîӦ-!8#_Ӣ;;|"|LUҪǞe$45J6#T+A !Ob{(L6&l_9|=UlLV0Hdk>E1]% ]Դ6y][uaw_GBk cYgO vzQe<SK44Y 0j !1 ^_S)y4Hpm≢]Y}x wy&}ߕh3YVMV#8>-9&ldy,'"Q"5f^yI$.r ,, ,x駧wO%,SFFPEqc˂'}вSy_1pקcR J/Dmb]h&uq8]}2F5"O,HTY//9GZ~&C}܊,hxvtC"̃LYOT3,˸B :{6fLr,H Lb]N@'`" S-PHF1qvqHQP w;ڙYivFФ"+mlR>Eknt|o ۈIWΪue(6v ;g\+1%"]08zYc Y7ئ*t\+PyvW.k<ɟ!t}&E~u©"PaAIg0$.ֱJBx$ 9Z. ѱS'_Vb.\ãK+"Ѥ9rwkiGL /!Q ( jER7!u8a \eΌu2Y'c/eݷIP\/X Yߕymf%ȐFPMP[h/¡pd?Os rõ%u֓=([Xhֈ_TiJQU.OVʊ6C2Aot#Iұ, _5*& 2"-WX̟$ ޺~(l+O-S%50 Ea'SƐFS=.7ҋ4&/EMISZZmbaj&.js"ݭ VɢX.k6k"8I n,.SiuIZ.jQ7.yޖA <2_\@!=[?E?Ps)~Ak?xG5Zd'Sa5nLY79u_Ĉx50/zW>y`j^uJ TUHH]@BlF 4mN v7|,R _1 E㯴Q rϖϛؿтv5U28@}*S4mb6Yg/ȄB0+%?,c6L,V w<z.7h. nEhd}xXY8Ċ(B|sɼ$}z/\UXÔ;3Aj!BeK5F~n]fU?p,_?8nD]$OR5DbbԫUK O/:] 6r|jz~Z@4x r{3hj~vcbxuoa/3oo/`o3X gHCK Ƨ"Yw\˥J"ȟl#eҶӻ<(%*6ZNGy=]}˅iHf"tåǖwPPrSo<-#HG-,wRTݮ W=PYNF'z3k*k=z]1a pU UI#C6 ߾ߟKR P8 Ʉ=c7jEÊ"" #SΝaε8N4J*u@b !TPţN\'001كsg I:p299v܏T8NyW;KWCru>oO%_kJ%?-}#:y[ħaBهnw;`ӋhÃ+:RU"Qz9ԍUORjF%"-_w@F Zi*zVU'u[0mʬWd^Y%Дf2̪@IG$`*W% BlËUќ٦MԐdXxuڲ邴)ms?%ug@ $nۥVZ?yUEh)t[w_IքB r}&X$ԮD,e TɺN(ѡ˽~u.eK.f‹f2mL6ٟFT=t^=Y/T4p/Β-,WB /$Շg|62ѳk;R \7h״'1myշ 66,Hʕ;x{DuJJnCplE Ǥj=#tNcNN03,պ z_]e2ja AGᵲJҟ1hx4vlvelcSPm| oʍ )e:3CyI밭~Z?Gor:Tsm7f[ԁ˒k B T?(KqՆ1;黸%XNi":]_DPu ¬AjSKٞju,QjHrL7mk!mΐH~L)hf(X`yEhy 'by M5Y`pZVbzA&=`# ~|A^ʤr*(tRWN+WYJB3m=>);oW ,q<0܃‡cDkIO$UeONjv TR ?'<yQ# )PƋgo?=`4mLjxHE48"Ҕ}r^-0Tg|G{RgkօBd~2e1Rb;>94F̗qC_gi'TŔ(8TocU_cӏ

Bh-]? 3h!3eP3bQ"iޏԝJ0ۿju[EO/*Aܑ'†ۄ:vI5iay^B}_| 3-އhkcEˀY?S9Q]7fcmV,2蝽<@ . ntq~%ˤt3,M q#C 8B[}t9i:2Ac)qrMHAv`oe+F-qwɼor6,trB zp aUt&A  BדK@&Z^bF QS6^qb I{4yv(LGMa7WB6* ~ѹ{(wW0Za~vCko^J'1ki4i'XB\#%R Z8qmQa8̛7ƞXS[BƋ|.i6~Asnmj揼|y6WhO)8 jJ70%q-5:=7(yQ9n֓sj `-]$HӦR4yr|oTwHCk&yd`$ %9?FLq4KUD^â3j&[4blP3zNi/-%_Uknj0 F՚2b"U:( v?M!/Vmf3ˠ2GU-ug0 a-8$@[ ==zPCKblDer+}>`a I%լRòeY)h|ڈES~uیnRmb|gh\Y[ODSBի}fg*01|0F K oV'0jQ|㺈^׽s/&`qqLrU*" `s6Z;.Ç0sHwVAZtU _wbNsV@LH۠rrCs]B@-=~~1N.ԙߒ&b{SVht "5׎@ D=׻ĬHGB"UnI8 gDi"(A$Fhn̛70R8^/!UN+QةɇƣM䨼Y50_zAha-%Ť`mlGY֟O 1221"N罤:nn9&밣uLzb)D@w3d\%D/"e>uy](oMHU1QITuT`Em_6/t:e"4 d@?'(.=JⱮ.dKջ8gPw%; @Ա;k불T@'pGsȕ'EHPQh͉lB~ͼ73z/u L1 et% qMy?ɦ_}:'qR$ .!4b ,dbW:j6,|,rԗ ӹ6дsMxP[$7~IB#:Y$J HPRH,]TBǎu ,՝2]ٺ@TCݕyImmpgJA[^5xV/:5TwI\hYh9N'T+b;6ط"MJ=< 8JNWy(n 9$HTaJ:~$DB"Ȓ$k(}jGoާ<4N+`БHz=*u^Jެ<z\S\l,=D/_[E_4+l]HJՒ2HpGbeyQ- 2!܊Kh80e9p`2C5%+Gi ؾB$eC}ZaUczL)*kÅGd@ Ulƾ91J~z@W϶az|hZLACڛ֯ԝN@g:iŖJo 0&D}ڗ%q#  L۹x;6'83g3jZ:v6xfTZ5DU ZW0/c-}H[/F$oǙX?q? N>FD[U7eGiT8.VbW-l|dUPTkF&Ad, A%uGxIצp+ɱOA̼J8&uItmF6k&{%媝mds+?$Ia)XҚ' d4A}MEQ|}-Dd?tGj\a kDN  QW)xX $zhQ@A.8f6-OZ韝ٙ#,^) .^pdE>Kꨛ}s;٫؍+ߗբiCz?i^aN G>gQLp6'YG%ĢWAi(R_8d]ЖBD(1u_>d;2eUv&^"0hEj=wL'^H*0_n zvXjCzR`jyӚWڥuX3n\ *b^6r;_/=p!(p\B1|qkii$jZ(T/œ<^<ے Id}$? Pfխf1zؿ݃=#Xgf6]7ga]zI$/_>TX6Pd5O ,i؁Q0r5ʌAqL4A7 LλZ29XtWTNx;aTZ,.6* ~AtrT)6,.xfm mG9/ow'?=3t_I%*4CE?:P`!PI+_;өXclvmI[ѰrXZ]TAAs Ǵ+eK_g yvPg\C'mQI(6 |g'#@%6דa^ףcR+NSinYD.cmUCxxS^ . &mXJo:/b@\!fo0FbqS1{H(%ul`LV@=2sIpZ3"8`b %{L<+ƈ06n={x~&,¨$ax|@T/_L:oͿ⡣j,gs!fs~vR Fǖ8\ŨΤ NG~(ð2J5rEib%ĕi(DI|ut@,Be1`}}w;%yM97pLCj6Gw% s0(o~ԳMX(BްJ`q Fى/`>Xs ̖|AI۹(ԝN0E=g&BEbgohh hmꌎO`˷,w|oK[ZsIgQNY|.n\VaХQ8JhT(WIp(3p/uPMwH^"DD஦Iua_f"1SUk-tNoX|6d>X҅Z[Fh ӸJN+~Qz~K/J̑*9pZyfs/1Hr1NC{݆[>4ݺ8Ո[ "jҤ7F-)ZB0iWS3'y\\`nhZ.H@-ɖYiA [{HFeI"h1yuUP_~Z ^ݖ[/( yȎ!S)QI)uײ0En ѯwH"B)-3iae\w2wa5,3eQܝ=?Y 5A;{ejV4MJU L=1fz^jX$]|y2pccn~vhQ޼;uC/5:L#<\T4/:ZB 8i[wBOf:p',5o1jf{&(Id.P2d-ʀЮYpW Vi8Yi Ӹp$Xv4_7p`)Y+C"+n sH@xJ Q︞>ޕ`!7M91D{|0h-IizD#M-adZTbLPzKXoB.. ~H71%7͉J|ݵ|*t:W.eQ6wba)q5,+Y%f18"8_"Ń d5t'+͓W@Wppؾ*Limârr}ݛ_zR"L 7Wqemw" V叛蠉mKhxퟦ큊.?ܤ&ic G|Up\I(0j'lԑ.8>{DžS<Ύ֡ytf_- BB`3jLqW7wU:$R,(YQ{8kiqhJ B{>n@HQH?>ؒgvֻǃez^!@/ε|J{TBȷQf1L,:q%~>i!ɥl!vzKDz7lG|ܧc#I[[ɷfRxaĄ:ݩԅ\ZSO5ԐZGԦxLa R8gVtfLfJnɓTqf,OY /o[F6<0Sog[HH{ĝY8X96.Qkh_:tihKΦa!41ڪ3=x؛_:~O,iN79s`vwݝy?V>tKNQWT摯Q- 1Vuv7j@_cxNrVl]HظrC?/wf!J:PmMi_J̻keƀuFgz[/k${"VxE}I К޲e!:P6fu@"dL6<?;߆ܥNK?lSPN>5Y-k/3Ӥ7ZV _(:6RIdӅ Xh|Db2 8n;/8'YX|٤E6XL~gZ1nTc-:2ԿM)M@ :#۾V*!j2J2E@(~Dէ@Ґ=- 9<9@'^v>T+N YK#7A=Lszm >Xfrh` ,Ą;cUi}ciqb ҷ]1 ]GC۱S3%w w I<Q9v:fͨhgf"Iϻ %4M}5@C-H_}ɛU[iZY%' d+&ΑHN.ޮl)EK)#k? ۸d>fґx>-33F6nlz` TNeXUIENDB`batik-1.9.orig/samples/tests/resources/images/bmpCursor.bmp0000644000175000017500000000607013063003307023475 0ustar mans0954mans0954BM8 6(   ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))batik-1.9.orig/samples/tests/resources/images/sm_colors_pb.tif0000644000175000017500000003342613063003306024212 0ustar mans0954mans0954MM*@@nf*nv|(STU******************************************************************************* *** Processing History *** ******************************************************************************* Info From Tiff File: sm_colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* IreFastScale: X-Scale: 64/256 Y-Scale: 64/256 ImgInfo: Size(64,64) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* Info From Tiff File: /home/deweese/space/permImgs/colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* Uniform field: Size: 256 x 256 Colors: 0.000000, 0.000000, 0.000000 ImgInfo: Size(256,256) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* This is just a test&j@@@@  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||<~  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||7   $ ($,(0,4084<8@<D@HDLHPLTPXT\X`\d`hdlhpltpxt|x|?       $ ( ,$ 0( 4, 80 <4 @8 D< H@ LD PH TL XP \T `X d\ h` ld ph tl xp |t x | ? ļ   $(, 0$4(8,<0@4D8H<L@PDTHXL\P`TdXh\l`pdthxl|ptx|?ĸȼ  $(,0 4$8(<,@0D4H8L<P@TDXH\L`PdThXl\p`tdxh|lptx|?Ĵȸ̼ $(,04 8$<(@,D0H4L8P<T@XD\H`LdPhTlXp\t`xd|hlptx|?İȴ̸м $ (,048 <$@(D,H0L4P8T<X@\D`HdLhPlTpXt\x`|dhlptx|?ĬȰ̴иԼ  $ ( , 0 4 8 < @$ D( H, L0 P4 T8 X< \@ `D dH hL lP pT tX x\ |` d h l p t x | Ĩ ?Ȭ ̰ д Ը ؼ $$$($, $0$4$8$<$@ $D$$H($L,$P0$T4$X8$\<$`@$dD$hH$lL$pP$tT$xX$|\$`$d$h$l$p$t$x$|$$$$$$$$$$Ĥ$Ȩ$?̬$а$Դ$ظ$ܼ$$$$$$$$$$$$$$$$$(((,(0 (4(8(<(@(D (H$(L((P,(T0(X4(\8(`<(d@(hD(lH(pL(tP(xT(|X(\(`(d(h(l(p(t(x(|(((((((((Ġ(Ȥ(̨(?Ь(԰(ش(ܸ((((((((((((((((((,,,0,4 ,8,<,@,D,H ,L$,P(,T,,X0,\4,`8,d<,h@,lD,pH,tL,xP,|T,X,\,`,d,h,l,p,t,x,|,,,,,,,,Ĝ,Ƞ,̤,Ш,?Ԭ,ذ,ܴ,,,,,,,,,,,,,,,,,,,000408 0<0@0D0H0L 0P$0T(0X,0\00`40d80h<0l@0pD0tH0xL0|P0T0X0\0`0d0h0l0p0t0x0|0000000Ę0Ȝ0̠0Ф0Ԩ0?ج0ܰ0000000000000000000044484< 4@4D4H4L4P 4T$4X(4\,4`04d44h84l<4p@4tD4xH4|L4P4T4X4\4`4d4h4l4p4t4x4|444444Ĕ4Ș4̜4Р4Ԥ4ب4?ܬ444444444444444444444888<8@ 8D8H8L8P8T 8X$8\(8`,8d08h48l88p<8t@8xD8|H8L8P8T8X8\8`8d8h8l8p8t8x8|88888Đ8Ȕ8̘8М8Ԡ8ؤ8ܨ8?888888888888888888888<<<@ batik-1.9.orig/samples/tests/resources/images/pngCursor.png0000644000175000017500000000053513063003311023504 0ustar mans0954mans0954PNG  IHDR gAMAXG cHRMz%u._:oi+IDATxb`1 #2- [@4 hn@Ds - ,Ϡc@De1z.- , @L [@,Kù  L0hu,"9Ьa`z  -t; |*(@|y,IENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotNE.png0000644000175000017500000000050113063003307023403 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```OK|A/ v@ bbr@ h@pЀ; hBzh@pЀ; 4 ׆0@ h 4w@ h@pЀ; 4w@ 1  K9ZIENDB`batik-1.9.orig/samples/tests/resources/images/svgCursor.svg0000644000175000017500000000261513063003311023533 0ustar mans0954mans0954 SVG batik-1.9.orig/samples/tests/resources/images/svgCursor3.svg0000644000175000017500000000267613063003311023625 0ustar mans0954mans0954 SVG 3 batik-1.9.orig/samples/tests/resources/images/sm_colors_pb_tile.tif0000644000175000017500000004754213063003311025227 0ustar mans0954mans0954MM*@@nrx~(B@C0DESTU******************************************************************************* *** Processing History *** ******************************************************************************* Info From Tiff File: sm_colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* IreFastScale: X-Scale: 64/256 Y-Scale: 64/256 ImgInfo: Size(64,64) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* Info From Tiff File: /home/deweese/space/permImgs/colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* Uniform field: Size: 256 x 256 Colors: 0.000000, 0.000000, 0.000000 ImgInfo: Size(256,256) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* This is just a test@@@@+$^$`  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||<~  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||7   $ ($,(0,4084<8@<D@HDLHPLTPXT\X`\d`hdlhpltpxt|x|?       $ ( ,$ 0( 4, 80 <4 @8 D< H@ LD PH TL XP \T `X d\ h` ld ph tl xp |t x | ? ļ   $(, 0$4(8,<0@4D8H<L@PDTHXL\P`TdXh\l`pdthxl|ptx|?ĸȼ  $(,0 4$8(<,@0D4H8L<P@TDXH\L`PdThXl\p`tdxh|lptx|?Ĵȸ̼ $(,04 8$<(@,D0H4L8P<T@XD\H`LdPhTlXp\t`xd|hlptx|?İȴ̸м $ (,048 <$@(D,H0L4P8T<X@\D`HdLhPlTpXt\x`|dhlptx|?ĬȰ̴иԼ  $ ( , 0 4 8 < @$ D( H, L0 P4 T8 X< \@ `D dH hL lP pT tX x\ |` d h l p t x | Ĩ ?Ȭ ̰ д Ը ؼ $$$($, $0$4$8$<$@ $D$$H($L,$P0$T4$X8$\<$`@$dD$hH$lL$pP$tT$xX$|\$`$d$h$l$p$t$x$|$$$$$$$$$$Ĥ$Ȩ$?̬$а$Դ$ظ$ܼ$$$$$$$$$$$$$$$$$(((,(0 (4(8(<(@(D (H$(L((P,(T0(X4(\8(`<(d@(hD(lH(pL(tP(xT(|X(\(`(d(h(l(p(t(x(|(((((((((Ġ(Ȥ(̨(?Ь(԰(ش(ܸ((((((((((((((((((,,,0,4 ,8,<,@,D,H ,L$,P(,T,,X0,\4,`8,d<,h@,lD,pH,tL,xP,|T,X,\,`,d,h,l,p,t,x,|,,,,,,,,Ĝ,Ƞ,̤,Ш,?Ԭ,ذ,ܴ,,,,,,,,,,,,,,,,,,,000408 0<0@0D0H0L 0P$0T(0X,0\00`40d80h<0l@0pD0tH0xL0|P0T0X0\0`0d0h0l0p0t0x0|0000000Ę0Ȝ0̠0Ф0Ԩ0?ج0ܰ0000000000000000000044484< 4@4D4H4L4P 4T$4X(4\,4`04d44h84l<4p@4tD4xH4|L4P4T4X4\4`4d4h4l4p4t4x4|444444Ĕ4Ș4̜4Р4Ԥ4ب4?ܬ444444444444444444444888<8@ 8D8H8L8P8T 8X$8\(8`,8d08h48l88p<8t@8xD8|H8L8P8T8X8\8`8d8h8l8p8t8x8|88888Đ8Ȕ8̘8М8Ԡ8ؤ8ܨ8?888888888888888888888<<<@ batik-1.9.orig/samples/tests/resources/images/png2.png0000644000175000017500000000545013063003307022376 0ustar mans0954mans0954PNG  IHDRddgAMAXG cHRMz%u._:oi+ IDATxb` "`nP]Ͱ`Ñ# 0|?:ӧV`hnfHH`gb`dgCi)æM /_2%hA1ϰoC}=$@4G S0DW(,@B/_> D|/,x` Dg F28;q"fO)D#*diriJl}"3|6.*)!!XLS}*( 6(,MD&E\Q@&C?^)/nn  s3t@E 4bffXlA7t$// |(?=@g4s& Ȉׁw=ѿ !!8 #..ـ;}@3$%=X;*/xG Z{6[UĠ߿ݱ @aApp8֌,,!@ Ԣp86owf'LM-_p:F=zİf ĉ }}KhXW2pr@ [[jZ1Cv6??<<#uk2Pw}p +=FBA$@-kюgVQqbw4- HHfUiXr@ZB;>U,Q[F Ӱ jde6(i5 a">>Pjw]~zQ`f9v&"OOZQ۷`Tm-M  (6jFuAn.>%ZЅBԜ")rrX /_AV9:ReHaW>m# Z烬 *)7o2pp=vvg@+Qlo  RȚ-[ltb"Q>%lN 0`ׇ @-:`gF߿QbQQz*/^0hk0C߾ZN8fqzGٱXa(`jmC bc>F.26DH0ɁYy$1)DZ @{hjǭ[ &`T==s7= ж m@ r"`_ F,s ;V4lQ@!h]0@ wB4.B Cզ= v ` kF/3CScH3H M@aG :d<c j?θ t6h@F5_ (!/w GUU -p Z'b` (Zt4hљ3 r@@PD̊Z[@P$* Z87b B~J6np]-RsE@!M^9IӲf 1))| XC~&++4?? >D_X/~lrq! D2.EnEׯ faYlH(F bg's5sSid>>ʒX/r tMd#giH yWT@Xr&\o/ y@U% <YZ %* ,D 23h к5$pp*ߚc?p7(E`otjB4o)IE >l.ÉZ CE0+3֙{@TVƐ Z#L@ µ #aarv '@M, i LŸNLjX[+b`@Aex^a!N :g:#9WK Զ^gj:rf|1 @:8tN ` Lk3g$PC X?،ͭX D<=ii| HUBFn=Њ#G@ӽ+Qs3d + l+SM_0rtJ' " EF1@D b]C3; H@EE1)SH4TP0N|d?{`r Apd#`+ D~/5uՕL_aƌ<ႆ._UDM 8~?x.>f8Pt:ht;bcIf V~ʻv]j #yySQaV;éSQ0:D'@;,] *t)N0~ A¹^ IENDB`batik-1.9.orig/samples/tests/resources/images/operaBridge.jpg0000644000175000017500000007501413063003311023745 0ustar mans0954mans0954JFIFHH*ExifMM*!(iEASTMAN KODAK COMPANYKODAK DX3900 ZOOM DIGITAL CAMERAhp"0210x    |Ƞ0100pld 2002:01:17 04:33:502002:01:17 04:33:50   I KDK INFODX3900 p!2N0pd drrsqomid_||{zyuplpm~{vooAnrw|vn]-ba[PdrnfT ,.34);FG +#$(+/&%  تUUUUUU1#r~pITV ffRyeK@90@@-@\3(?*R^VUU Ad,d,#}FW6pPBzzVq6d('.1  q\QE<'q\QF<6( d6(6(6(|omnL'nLnUUUnLn|omnL'nLnUUUnLn|omnL'nLnUUUnLnR980100("+HH     x! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?'].?n w\V5 ҟ].?nGjs__֗?5s W5 {Z_\.7nsڷ>_|r ?%bakU7GϚ._Ҟ-oOMk\{ /iO~CA#S+"XNs{ /iO!?qJԇOQԳ^s{ \%A)#AQߏOَg_#¶/5O?P9nO,Қ[].o<t?ʚS;q4KtFnm=?FPGNǿWgP£)S߿Er"*2nޛ[HO/>vv"d=y]?hsidc/?x5f`15t mMKQ{s;} K a@ ʛ&N@¿d[j|,zByNJMqwՃo]z=3? ~#>Z]Fge;uf;oMo{c}n-Y]g{1sPG=?^i.oӥo *xO֢dև֛k^vb58Vw4PK1⾌掚>ojg gd93WU{auJ)-וGAJj* k[yZ7݈UiC:{xu5z+zy9=@';Ӝ\/L4{f"[bd3zzޅmZE}]I#h(y y|=kiYˏQN2Ȫ}6ۯW˷҇ۏۊi &Wk[O )ݻu#0׷NW:v)}[~>;?Nj#[h>T$yT/}^=v˾2 t4=/=nϐvGM(s|zYzq uJcU'߫k_5T{GR;ޕwۮţZk[wOZǿ_NߥDۯVBP:WNntV~d sW+#?0Kѻ=ޛ!p9\M|ZL, {Xki8lz晄|v*w?zH,}mWi{_]bzVq equ\(ûsvMxwԦ[TxQX6#a9\rׯFJw}/8%+M+{շ=6W>iW&ȣhۭi7[Ue`wi q\ݻʘG*cK{-zMZi --V2=9*׽;^k+8usolztHG qc9e'Wsu\%z\d$R%TAUVqמ\וwnl4nԵXF);G@Hzgּ^9\jg)rnsӞ+ KWRjߩyY7ee}%3Q ;A_'N9AZO'1=߯ӊQIw8ܜzi֑s,?養ښi }'*=domO!rחNvؑo읶ݳ7Vhg2dX}HP$'vXc5Zv]vܟg$RkQxs>[t[n>_xxQ+E/e{t]?3' t9&5\KөY=]~v隻~z̬[r{>wSW6:\Z_<؊:oVL М-keK?ck>-,=Fv|`(hܭmOW-ogqlr~1?OAGs^]s;HYf%ɚ;k_6R;{eJX<̉ t,UHUAc$E-ВIcKfehAs |Xz5Vz'm{Mz+]FM'luCxNY!ข 4x¨ڧ=pT zՂ4ub0  JnUm_f'4vn%uՓe}[m^n!j4Zd^Vh ;FwAAZ/1%eCr,c#8lqҝg֮=Sӿ܉S蕬mK~Fod+82둃ԥ8a9J-H/~ZA4;k[~P.U+ApsR?LwMWs[۳~oMHL8x?UcWu{>-b 9t6ZZ<?O,_US$ X899(&Oc+WJф^3|Q95+ ;lB#,x瀖WBK6}Lgi+~-E=Hu$d߭mkI/{>׿ b+O5$I nv#)dEZK =oZ̢*J*W^CF_ae9Rc dg:}=]}9}zj{۸xJ+<#9ʏ (wi<}af@#s6UbBT Gagmu-tv!R E˗I{F'߈4Bs\4U[#_Us2b7%POU_ZC:lmxT.x h&eG2攢un] wiG.]f5"8e T|j]ƉqVrʒ S+fp;oIr$ݤS[kEVzx*8zبFy)(ew}ۿnD,vN"0[ta*, #7qe*)f°+ kU9Jj׼c+~eg%̓M=.Bj RwNu*jM5fT{}\׉5u-ZRgr&n_N2 99ZZzOi5Z<%+6a{`Sƫ{h" ݷiRd?.qrNxδTu5myO[9iRMEZKMV^!'۲!tl:O2 oT`䜌ӭiϨ2}BIɌV*'M \ቬ8BQi˗T۶u5:Tۇ/emݭQ/}Mciq3C7F2y>&vc!Bc2|Dwv$P 8tjKmW_#9?Uyv dp ,Y遀zv\GNu߽/fjWkNTag")qsc<ޟJX,kdH )y#Jl{i$;nD5+ ae dc <(t)Z^\}XN 9ץoir{݉S)+RW[Y.iѝyc.?#BZ̼70qoJ"{٢U'Q8s9ڡ!GsYK9lՓ]PĨ I%gk|]<iX `UeES,FT'hUv2+Zta+*\mx[DYo}jO>AT}[wkZ2M <ł$1'5)do:G%&`A$~J0K*Rݵ{ҒM^mkHld-5p:#)AeO&,^q\qW+5;{=GJ'ICŧζRkGwm-МXO-R1Ux)g)`{?{utd9Jv)>JW}ሯO٨CFRm;$e@\=q?ίhw>YVB2T[ey.g(>wtԮtz 3z}w,pOgwJ}fRZ{Ci$8 r1Cf qj*[% Ms6Wէdm; s$ii!p0;bmtO5J'~ 7׎z v|yyG50jގ=8l;dҬi<ߏoCZ}/Bikrc9Y1Ԃu_}GMwTqBp{zN1uЪttiv[n"Vh&w),zaeͰy7DsI?SQ8FipSO[4&I§4$52$j˴We2RGs:TT*=vg5R,ʕIi莸U%zq2纲iI%Ե([' KD qvi#of=n_֦ms_[i_= ps(we5VVqۑqӏ{QzVkoFaq9x;e~v`MU`/=y~'zqGEgBRzצMt]ǮG,T,.9v]{iٽm%o/V؉?#߿UY9,Ðys}m+vn'{>>n?#NJ#oz-KIۦO1Pzzp3?Ͻ=en@#T4Ef_闵.hV)X[FFq\Adk\֑.kKK][Iɨ+Z#DoG'f]o׿PD_ݿ>q=4\y4i]'.?ƏO=7mb~&4isMh O=XK7o.a|_=eۧ@O6_'ߍ''~:|Ǐ֋!ݫٵ}{xѽwoQ$Ni( Photoshop 3.08BIM ResolutionHH8BIM FX Global Lighting Angle8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIMGuides@@8BIM URL overrides8BIMSlices@200201180524900@8BIMICC Untagged Flag8BIMLayer ID Generator Base8BIM New Windows ThumbnailpKPbpJFIFHHAdobed            Kp"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?lWM}lV6&؍ʼnňکXX(%jjj桹ZQщvUǠMk|yK^iį ``n{cqq{нÅs glu.Bq?N]O? GFE?2F024Ώб-Rڭ 0mEژ$RrNR2a U pC,{c縆.'kZ:V-+^φWF`>>dnkwӻX|&RN^J79\e.Ms cnvUǖeo xCϯW`:"<إ;>O=O8̊=MWQ,~Mݱu!ԺI;s7>7b4}?{_M_[OqۗHi{`6n6+Yɨl>XHv}OFλm! ZmiWY֩-/Զʈ?qAּ7ݺAhn=UebPkN-ݤ+ ]䄏B}74 `;R.\Ŏ¾˃.yp{hX6vɱGۿ'Dpd8K-"@<(:V-?6 mchOo[;۶}K,G$mʫ?QD~Ώ9?Msc$~Y>{ל{˞du_ѡf[sn{8 }3 Ui̝]$O%oZ_KNžՈ& #]VOs6uOXϥhms;T. 1֜6훝[wD ?slƱuco$NDoY"8XYh-x)&ʱ@q!fAc]0Q#$@-L1[ 4 Y!" Cojԇz«}꽻zv[]YY[tsXsNFf)SX=2u9}E؞9nImWxR~u{L:Qݹأo{vHse[~vP2m!mT]UvZOkO/} 5YhsC:I3?6Q2qOB"7!ǿ̒&]u|;!2ǖ1Ց;{n?ڡo 2x-GS"KSV^k~=E{N 7*1mAS"\1?G;N;]Ns ?2nnT~T˞k\ L#w.~ FVx^]s:Kd|!Lgy,q~ivYCBdL"2>$zKIp4))j?KDX'RuĀ'A'A)uHW]T]/t- Z=8ocY[Z [.N=Dgݐq։v#kD )WNY+8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG QualityAdobed            @"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?BP)_j<Х F)hJx )hRF$0)BQӓ8Mu`rh4T^eq|O-667kEÏ5rɭ.ҐBS'nȢ;&wNu)>ݔOaT 8<ԜG<'HIJ@8CGo揥یhJdT ?D}#y{\xPsSW8ьjJ5R%1J$%1<'TG%%1J $\'<$% )$ B*b)BhILa(RM )% "S4$)4${7>OOz╝l|y(ð* bVvOcRXqEv'9GRRth>%;wL\^CF\jwg:8Ԟ$ W-xJ }F]r.RBɡI$(I1J!-RSJJZ(I a(RM )hM IB)bKD%(LBJc BxHJc B~<%&"!%1M&RSLĄI brSJ> 1RM{$_%.մ][R8C Ώ#sUYEr%:O&׷tʱee=N<I2IL!SsÔxc@@[{= ׹?65Xn۬LW jC}X?G) P5ք<'҄&(O )$/*bBJPJc IBJaIB$hR%1JBJc$BhILR!H!%1RЊXb;)BI)h(LRCtILHL$!2LRC4)&ILa1 E6%jBJc C Xp* a!J[#^.qLR.X^Sy}_!Kv⒗3(s$ihLS$8:$^:#`9fGB΁A<%Ē{yxh=GLU. ^\x-*&ge1<ׁe_kɖ=V{+: a]ay;$B<"ؤoF`kJuz:NQ0sARcL$>LBcs[㮟$ޫ.hi) АnD}Sn#? GE~a$$쀘-)մ>+,+BhRȡdI(ILcD)&IK%'R)<% !dQS<% ZI:d2hIK|BxK1Mԡ4x$AR%1)ԡ2*bS))J%1L|$%2 ))o4))Lhiq ĤW1,iW=ZD&PⶆˎrFTI9?ܚG˄_knn LoS\qLWޖLQx=eI:!Aб$'ӬxrTyS>}ǂ)g<(yJeoPsc B[[9r )oa$[g*V[*asַQLM3ȆasKMxt6sSumܬnߤX9*XOt[2[ee>/o;}8 <1x 2eKZ$sܭ@9%mgUލq"ƸγŻ ~%Eă)[Eߛ]NJgJtq?#M|Zt DCugI׻:*)V4 Kr(iJrR$RmTZ&JK匧XZ6s?'1XYH$Tƙ$Oz6N%)%hZRJRFШ7t)ZEJL4JLE,rd2JY7t1IK|L)&(HRRFT$bS%IK&$u]KV{/?>,q }볭Y[xcCG*|1s9a=2.P'p*i*iy%]t&SHbF"ݓ*Xsc!-5}n8Бv:8LAFRԡ"i7P_c4 ϻ6;kW@ϲtG̷"̏ms]]wEX =fj %݆6`CgVT~㹆cCU 5z&^ [T̝4=xj4Ji%5c M!)iUmz=wh׏S4wryX` 7nrlֲke60k~kmҖ\\ ;-vWk/!a?}0zRQ- jSJI$ҕtɒER4DJiKTLJIRH)*L|ӔQR1HiITM:NG"SbR%6zmBYt}ˬ%sWٻ1woY |_r%C?ĪKt>J3Gh\u9G"ϲѷK?śz0jmF?yDDJMX,D1? &n{'(yyIsɲO cKL4b3-YfAfEYut_;{k:w9jO)7k͕ivCHOI$E 0) w-w6~hF̆T:s$Z&{F "7T8ncƧqA'"Iv܉x@Pex',\ί*]{X]Uk ?]}6mzkD\\&?pLtZߴ\ـ8uLnwMũ8yf͠Cvc9TW^v3ߊۜI:pqto#I p{!k}Qݡq[Ch%%?sֺ O{f+1l^6ܗOkZj76]͠=x`@j5=+rG8!V`دO!3d">v8mnĺ?Wh9vll8WEƜ}(uBjƪnesҵՔ1klA$IcYP}5aR1۪v.hͦ-\[nSF7 9=λFUFUuƋ-k.sw(?d57&=aVV]>hls˜ wX쯷cEu/i'c\=oƒYѶxw+J]gú~~!HߎS. 7{Z܆Z9j%G ћӛZt> T>1Sj:jbaOKlAMhWw{b7~=Qr1Tt4@>G}%w)4pugTߕ)jQ-+wO) Jc B9<R;IKr+%6D9Q;3.I{xq~܆-h?xI!rgB N=gjN L?;}2Ctϼҕ c{~5W5PɹDϰ^5]m5>CڼPyrmy{z휛`K{Ac]yPz}̓<}'#7u sATscsd1$ >Wg.Y&S kӀHk Y M)U9Ոh|Osjg++v=a>%* "$>py Zk4S]ᛏE-C8E..=7k+i8Vy;?)1cCntjרmk@@ďei6O )&yv;ñy}Vx;4g&ͩ= 5}%WM svkM"*kOI4:m{h/nFų5m{ K7Ko[%;{H5j7 uҵX9k_s{=VNW:̵ }@Xϡnݿ)cAi+?ՠa +y=/cx{;4A(`4Bcu!埞[?Pzo]LD.vni*;n)e)IQ.M)!%1rQS-ɋe4EɉQM>))yM40.M1!1!.\F|\G₞YK.FmҶߊYaӽ灵,'X噰IƬ 6zn]>O}OEͱNy+K?q6lYLMqIK d9q[s>CG${%L9EjIS۰I4 Nu>r '$+Fܞ rd$5(p6ˎ${d:& uA[-m ڵaK{rl?%wmFߥX/DK)q{I/6sMnk 'pdαҮ lRC"$v5Eo.`+X376c{*w? s7`j=y>3S}YƩKۣu|ˌ=4 O}JzwQ -Jb{Kn`>=- g/w+TO:.d?@7fEpnUN-a͠}uꗳh.-ƧBl;EO7Ϧ+ƺ׈mn58 A/\(U燉:uD=c-sC-ASmlYiX2oh {B()iv@.?yKrd14k%$~$K6qi.p=r-h68s[2s\ϵhh;w6+LzN?%?M4/YV?-jyTxݩOgHd澍Ψ44ޛ^{OYv`ElgOOO]/gln>aE]N=jb' γګqmA>[iógIG8+ׂɷV } ˮsֵ=߼lZ杗 Rulv%cU!ht@sLJɶq{l(467鶏5c^[}*54w2ΈkCm66!l9Oa2۩ecYefcp5 :JucZ Kv۰M_U;hӲ>ao?jz[]׆[Z49,=[_0CA}(k ƱWc~H德{ispkN[5iӨ!`*j`s+ve_xsvWNk~˷*]Mn>E@6ߤhg{:"BgJқwu[&K)on}`,ٷ!`Q/&D#Lj\{ǧ KO@=vE8ջԦ4Q MU6l|<yCMYkrb~IIL˓nPSnI ˓(n6v21{cN{?ʹGSrHDxЍ$̫~oi?%ղ!? vw\m@@3kOΉvEh Uq-i"ֆ75*eڢirTuJOEnMlƽ)#h;G&5 j:dw/RpyiBb7De"h'5qœVO8t cQvMǡlpk9$HʀeVYz9eoFZ1TxKC\er|@WTRH?5HAh!TfX]065G߷tAXAncc 'EYhZL Bl iu`<@oAv *tqO;*ȷ8^L\c! W|d-zN0nl@fMeQ3{?natVNѺ?n YҜ`c[R kWmiaۀŤݯ\|BoA94Dk\Qޢok0p VF;ha=v} MD}m,VgWc6Am[^]]/"dWVsQe"Y;۽~Yn4J<#BuI]EeBVڀqi7moq]gMv-ҹ+[sfRs;/id>Zل$ +Yr4󰰳wv7۹Yn;2, ]M~Qx'NߎY$hOD7_d;;_Eu4!k3"$G==~6$x}15I|]eV7;OwB(R]ۻv gЫ~rs'OOwzg5oUF9xjRY!5ݜd%eL.KrJg))lp.kI H B{d yh)P]6 6@I~flgǩgsCncq'c0O.`+J {kՠߔ+GQ#h$5F1)٬Gy= n'HP&L)58 Gf%Hnā'CUu"{0D~:%Jua~XN'Su^~O7^Ĕd{6f33?Tp$/tGr?pvA:xHȧ;W'gEPJB#@TGnZ A=faÂ?*\K"OajYso}u~c{pv]'[c.XǷ ~9˴~>;\Cq\zkk{K.sRvQԏ;lu'sX\0w]FQk5IԱ4>Go({w5qv}+7Wmsi\CݿG,|vl{ֵ)l8ޞWsY?H22jk1Kiq.w3ZK3b`"B~(/pBƘh@<@s\1kGk KAv@A8ʵ`Ӽ f6/)l%^%lDX91Ѧ<!2\L䍓uV\ T A^94uOA5Y{oll.=?]k1M^̉ -]]9mk[eXHkv2_)so%@ :_ljڣ&tױ睮A$9Dޖ6N3zheItVGF8[@2Oa(7ځv+[^J.[]V3mC,tfZd[WOu`:VvOCVW-'ߪ;ʽ鬙h!ѧ;>R 5 NmMhWu'Q]cXpAxPϯpn\uK}Ш>PK#q 9thb7ɏ5 m&aZu|-yec>Yg7 l{,t["HV^ H-c6n[Ѷ@zϬ{^܊YcdDhoՓK[:v۔'Tf\I6+Ek`w{]ISfQeFܷhȠ"o}ZZ]s}Ʒw/ƥ v2wKłC 'ێ0*NhpL~j[q%Zx(i݃gw~U@tX|5ױ{5ճEK.-{^5nԼ4P7 3P\H"#o.{^!m Cӵ0nv}ԼQ84[FKKܗckEpRD$h2EdR5R}34E(n0/kyhc 26}U{~R?=,CF5 vS1h`k/j=*uG4 R}bE%?q!EmiIM\$Km8/VᶶOKmIsztmT}Tp{]|3{uX ŲO2T50+kLy2XBDkU%ړeYn *{S,1M;x!Nc k|>e;kwWl{lƲƒ 7m{zN#+vߟNزN1z;vj]F5b mU\sQ>_t hx3`ܼ S[\C\[??]? ,{)nmMݛk ldxwճxIIjRba{'qZܻnʗ݀DZ`^Mq>A>1uV^?;أ-kMt[%89;Ps<ҁ}XĄzWTI@ifS/!?omjΫ)m9ÃL:>f\]fMddw>\ TuNN/U▱;qvo~b10Di#7"ܺ+m w7E :-p3$ZDY. qAئ_q:K歖O}o-ml #K`lSvUqJ ycqφGdc[S豸~dd pb#N{%:j`sѺ=idѮX3L\Kj?*jGryOSw;oS<|B|2|"}$P¦}sRk^'CW/잋 έ&kBLU ZRh&OdGxMXЩ.ƌuGdAe>)X&GdplvgvPwa=#$r74䲜 YKI< bϔFKLȅ?"I5x,-"?j4xGWŃx'?VZ~v?bpk.;01؂}'R1"=9J^WLi.'q~MF2@;! 'R ;y 9ln2tVь&)nAu+h4GQ֭y=s4 ]4}.3vͭW AG,\t}v=}ȧ8yl-)~& >(q0y#N ez:xS u}'ljK E<0ٍ߲#zVeZZ%=?b8c'( -o(ͼ6Hl$s>{~ 5 K&`6V{ M&B7.EG[A5WAU:;$pD'ğ5 1oŰ04ٍAu5ƻ Đ> Y mn:7+#_ীuՓG?t&p3f 8Hf vmB ;1I˼8[k`^dmY-*@DN+ 65I0 +ƧQmև@ʰk3[k GfXq{s8:WE@FF<7;rgwhhNQWo?Dr&|l5 ]XCZ}\:>[neOo*}aaf`-[Xl=(圚ᄵ4DcSkV˄njn{։PVs_0l>*.n}lj2z_،`uǼX#E40eocDQl@H9 fF>q'C*5&P MnzS\$5;xkUj-xghpM;^qځB>BޞH)rɉ DrN $?KZ|uD-,W Fr%'RyC$ mvɂ$L L\o'-~2I:jTAӔ2yQI Aw !"F5I*lj N!%3/ԟksOti!+]Iq INKMod:P7% %JvoS O`e H)A#%*iv'N:tLdϊAq3oOqv)"H~Bv HV@LJD#skR$S"[ƈe)% o=d IK"D֭c=4fߨ m8?%aJ dlE/?$+:OQc[KGnֺ>}b[XNG |tW\c`9JnD(?Pp-qkh M3 #zut;? Kt?$(;$;!,aOkcK1{o6Ph/:BD$H.u_e9  rA#D< MىP(4spZFWps< Pۼ$U?bL3O%%6(o#$eDJm"0)S>BGP1qII?]$)G!%3-GKIL[[R JV1IJ4(RJZ|Q%))O=3$]tCN IV8w)H ;E%PɤYfLwM&" {'2A(<e$)I) .oI,"b|QBlBo9M:m#p!%5M;NRB|7TIIL˔QK_Ȕ~y$i J{JJP|S{@j|5O)sJ[N~}8JJX@KoJ^O} ILIkII7 8AL T#QH6$miOF}dK_m{RJyHꔦ;I%:$V|2)!I\&:j!1?4,SHIJ#T)HIJLa9 y$%)J*\$қBH%y*2R (a!^d5MB$$IObatik-1.9.orig/samples/tests/resources/images/sm_colors.tif0000644000175000017500000003245213063003311023523 0ustar mans0954mans0954MM*@@3*S$TU******************************************************************************* *** Processing History *** ******************************************************************************* IreFastScale: X-Scale: 64/256 Y-Scale: 64/256 ImgInfo: Size(64,64) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* Info From Tiff File: /home/deweese/space/permImgs/colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* Uniform field: Size: 256 x 256 Colors: 0.000000, 0.000000, 0.000000 ImgInfo: Size(256,256) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* This is just a test*$  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||   $ ($,(0,4084<8@<D@HDLHPLTPXT\X`\d`hdlhpltpxt|x|       $ ( ,$ 0( 4, 80 <4 @8 D< H@ LD PH TL XP \T `X d\ h` ld ph tl xp |t x | ļ   $(, 0$4(8,<0@4D8H<L@PDTHXL\P`TdXh\l`pdthxl|ptx|ĸȼ  $(,0 4$8(<,@0D4H8L<P@TDXH\L`PdThXl\p`tdxh|lptx|Ĵȸ̼ $(,04 8$<(@,D0H4L8P<T@XD\H`LdPhTlXp\t`xd|hlptx|İȴ̸м $ (,048 <$@(D,H0L4P8T<X@\D`HdLhPlTpXt\x`|dhlptx|ĬȰ̴иԼ  $ ( , 0 4 8 < @$ D( H, L0 P4 T8 X< \@ `D dH hL lP pT tX x\ |` d h l p t x | Ĩ Ȭ ̰ д Ը ؼ $$$($, $0$4$8$<$@ $D$$H($L,$P0$T4$X8$\<$`@$dD$hH$lL$pP$tT$xX$|\$`$d$h$l$p$t$x$|$$$$$$$$$$Ĥ$Ȩ$̬$а$Դ$ظ$ܼ$$$$$$$$$$$$$$$$$(((,(0 (4(8(<(@(D (H$(L((P,(T0(X4(\8(`<(d@(hD(lH(pL(tP(xT(|X(\(`(d(h(l(p(t(x(|(((((((((Ġ(Ȥ(̨(Ь(԰(ش(ܸ((((((((((((((((((,,,0,4 ,8,<,@,D,H ,L$,P(,T,,X0,\4,`8,d<,h@,lD,pH,tL,xP,|T,X,\,`,d,h,l,p,t,x,|,,,,,,,,Ĝ,Ƞ,̤,Ш,Ԭ,ذ,ܴ,,,,,,,,,,,,,,,,,,,000408 0<0@0D0H0L 0P$0T(0X,0\00`40d80h<0l@0pD0tH0xL0|P0T0X0\0`0d0h0l0p0t0x0|0000000Ę0Ȝ0̠0Ф0Ԩ0ج0ܰ0000000000000000000044484< 4@4D4H4L4P 4T$4X(4\,4`04d44h84l<4p@4tD4xH4|L4P4T4X4\4`4d4h4l4p4t4x4|444444Ĕ4Ș4̜4Р4Ԥ4ب4ܬ444444444444444444444888<8@ 8D8H8L8P8T 8X$8\(8`,8d08h48l88p<8t@8xD8|H8L8P8T8X8\8`8d8h8l8p8t8x8|88888Đ8Ȕ8̘8М8Ԡ8ؤ8ܨ8888888888888888888888<<<@ batik-1.9.orig/samples/tests/resources/images/hotSpotCenterBig.png0000644000175000017500000000115113063003307024745 0ustar mans0954mans0954PNG  IHDR@@iqgAMAXG cHRMz%u._:oi+IDATxbϠ$cbh 44 04h2PРq@ @!e/@  4h2PРq@ @!e/@  4h2PРq@ @!e/@  4h2PРq@ @!e/@  4h2PРq@ @!e/@!@L4 F|Ј@44h>@#>h@B F|Ј@#>h@  C^4({h8dA㐁 C^4({h8dA㐁 C^4({h8dA㐁 C^4({h8dA㐁 C^4({h8d O v @#>h@0h>IENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotSE.png0000644000175000017500000000050013063003311023402 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; 4w@ 1  4Q@pЀ; 4w@44w@ h@B4@-H9?IENDB`batik-1.9.orig/samples/tests/resources/images/png.png0000644000175000017500000005177013063003306022321 0ustar mans0954mans0954PNG  IHDR,dcgAMAG cHRMz%u._:oi+SIDATxb? F(P@ Q0 F:L8 F̈́` 0L8 F̈́` 0L8 F̈́` 0L8 F̈́`8`]D˄eQPd=4UDA6#"#|4}; ʚ_f2zy2RH, F\&7w2{  Lb^dDdDyRs倿D~ ^&54T1fBP>$(Ȅ3LH W$%bZ[{_qS?ϫg@{`O$̈́u]kKbdW߮lPsῨ&0j[0p̄>FFQ>a] G8=&(ER<߸#6DB{ׂњ=V^{߮%;ykjFs u&?|P?0׹gwfFv٬Zg"YZuӹ+`-g44/?OdBys#پ`?v؝;cwxbrIgO2}  Nā@I0'4AGV+ODKpP-+~o]8Xsf6 ?,h_F (~/v0'xr#^ eB܁p}bGFIAБ2zǬ^0>0|c\Ⅸd' 3@<5_(`j>3 #4GcBFdg3Na)P7@[ rDN@@(xA ?;i('@wb1lY>yF [{} f%µ 󧂫@k]0`Ƴ{&`d/a6lwf f@d)}_~x&99 x\MBL #$7'h&LgpJ2\Y 2S'0̗7yW^! A20q03(AR3reb'az/1bT tF.ʦΏ`ӧϟ?2fK d֦ԝJTx3u nxZxǬY%=eyȤQSˍJr@fBzFwWҕJ`n7o?{Ɋzp8Ng 5WɃO>z'O_>}ICS{f X )VCf#`j LW52ncPZ ?A*Axi}۫W^~͛o߾{Ç !~"FZsOfC`~f/lou0+`# 3&'L2XeҺqQ4ڥ"{0+Hτ`2bTG/y틗_Oo'e 23df0[ R{-{ֽ[޽`6x=0ArD2aO -7p Tg{ɤ .1j`TɠA~lD*ЂƇ>zɓ'O>}0OI|,o_V B|zH3(0 ]=ay i"yI5&L'Վ071{L(hQL|@8,aT~s۞z ߽|E P2a%p,Nc Uavk.߼zlK`9<# Q ӷ)'@u&h5FM`EAy=BY`{AxϞ=֍DLZ>zXa!@ L&yf(dB`*la*)oMJy$ X6+C ߗWu uNokנ=h޻ 1*8T As9\ |z zp3O-&Xv"h&ė '3H[M *Kb2n޼ ,ݡ/^ 7!%rQ320f1LKVJ2`AȄ 3`_ gvn}\9nFT+0G14D%Xbׯ]v4 l:.(T#`Tבls\}7#ݹP6ADNr<Kpi jWu6  ҝ|*GlF1hV^7/j̈́jB`X!F=Νz*))/v`AP +8!&eC`]t K^gBop&uۢ%IS(&J`l`7 *$z޼y .\t)0+nڴ !] CX*[dB`+ubpD΁/PIm&\P1Qp3"H8(sB)$tO!w1*mePw%xA[@ݹs׍Рn>˄aSSϙZiw  pL+h5<2 \$t\)tmSF Rgٷeۑ]{N8t Ȱ0C`XgEFh-xFBFA^_| m? 0@:fRD&ʘ[}ou3EX G: N1(, = ͰLX>u3f̝;w|R`Ape`+ӧzerp+2jvM~0N0$g`,&~0dT9 ʖȹJd}ƠAa<ЙZ$o3gV/  B]?2aLڶznyjA`C`$mCeBH>fNF9=|a6ڹ Xr[PbX f&6 5!0şcfE XBE>}}}'N>}:0C`?pd`KׯCFE-!@fB2aԊ6Xsƃv 6P ^T3ڌn\r-,'x :2Lx a=.XF2{tvv!>Km:l@!U1"n_? l,185xa-&-x0 $naPNaYzzE5^X\ $dlQ[^vq`X|Hq̈́fB JfM]5e+v KHO 2p&W) B˪͜zkmxRApeB`s0ͷ!] X"=p1>|L0(_}J rPH+;R ΁gQ۟FM3Zpq929 Z An%8Ί!UaXJ 4Ma- [6 `sAXܸX:+KaLHB&Lg6^0mJ`kp `$ K`LnCe JDULl|`R A$] ]}ہɓ̙lٲM6߿-+Z v%dRCr _ UZC*KeVPuAX_-g 2dfy 2 d3s Zq;JXpI>A kD[m+vfPE*̴S`FZ "`KegfX ɇMȬ,|20pȄ% " "9 @ \ ,ĀYA0A(A: {!#;w7!2a=H)pH{֭[B`,!u2dǎ ʄY. ---]]]L8k,H&ܻw/$+ax&P!hK.RCgfgL:wA#1x ́Og5Pf>XcblV `%6A Fj֜[Ap'30_)5##$ ܻ W\ Je@!CMJd$BbJf1*fB`&NMəyk׮ݱc5ͭg#2ah5HPVuv ,ϟ?!ӆ_gB/jdB`p„ X3!R`&FfȜ!xu$BGaW`94G2[eNPnTP2LQ`!0&p~ l|P@[7 _lrh"Ȭ,| 2$;GpȄHTЅr% *+Ԩ>CL  LF6 i-Y~0!ǏtW:`eHL R kMWX,u2d( R&<677̄Cǀc\as{N[H92sbRoVtR * 6HM4t4C 5`"i tf g`// L ^'`wɒ%vlkP2 `2tUYU[fw(ɄFo@jMlRcb:dťX!05"E B {͚5ʄ6ɄT@GKT BL:wD'axJ] :]*찥r`Eq rD_`F1aj+ ; Ge`F0e1c- lTw`5ڬŚFք@o3!dydm**BVK2K5`tM!wA|Hq& ewVSLv/_}p\CLɇe b^ >z2QZd·@Aj737V ~A`  n"* ρȵ$Azf`9=`7V@Cb"l]kJZi Ar F̙3!Q`>F h8d8LɁ" =9y#g]ğ~fDH&tVŋS?0;T[tȄS2dt6Ԫ`rټy3dҥKOgBOؾ!4ʄ_+6g&A/tb,W{Mic#xj os r {<M)`L!K*ҩ6=&F`~kZnЃSNݍkP4ǟ h8dB`? !9,+!E1޹'}9 Ʉn~}}} Hwξ"O&D·d$T-ZϜ9`.L:?1$b&~ԶOOtn1i^E |Sn؎jA apl" r~0sa`Τ)@GΘ19 Z9 !=L*؄l;(08Fʕ+Q֮L n҂) } 2 yY;s35P&|DLnFAۢ=.(x8(4ۢʐ(|c3hۤh4D!u $ld`?0;k lTf ̥@@- r+$'3*<~ pժUܳgÇ6. C0Q4MF>% s[igϚ~úoPj/GI&v`0&M1d!%0τ@{d;k&Xx/9V1ti'0Ck0l3 _< :J:A}W@Gڀ N: OH W:`;0_3 0Xl`tE-`:Z*WaȆFyM;wܿ?+xiș:Mh+)τ42a>$<`5,&M8sƌ ܫHtJ2ah RɄAD, l8P{jꍤޯ|tʄ6LNvsSäuD- BAn2{h9Xs¦էk_Jj~=VV;9}d꾑y5rR󅄆squgbjNEU<QA@6P(~.||+R[of0IQke7l 2!@ L؅ !mഩSΙlR`|W /L Z&%( L3{ g™ r4AArS\ew~KO&Pt>C7l ڸqnFM#mfÎ`ME d,h5 w/ _tt ʅB9PrGEAOT_'{z/[|*/ȇ42a%x&,ft 0oL7,XֺtBк~J2a20E3!0Y3!]L8 0!Q:SqgNY=_y yO/ ;T;Hȣ2@BťH"h8EjlvaXvVnn]zr oPor %Y5x]}8mi2({V?o @ Lxl͌ 4qvWD쮊:| (E*X$%`/ =aFFhB`PBF b(A]IP3( jV}}){lPY61*"#Kn` rYujlOr'2B;o -{ O< ̈́|۱t $j&BΕitB!]A`m_xqFq d1\털/"( 29 Kk!!Ȯh瓝h8dzW'f cA@[)˄ ar& Ⱥ6% hbV;s'U]yTƨ r&+!lʄ3!r5L<{lGZf5gB%6`w6! 7fC(b1\ΨX !ˌR-go%]P`Rȍ U" C&ƬY.G0^-5z0< τ'lpd½F+68eylTgH2!|Fd-:z,a`1WY [p^jՉ;6A/@z %UV ~+UFc`PZ >YDݻwqpOƦ o2b1bp?pozq/2!h p^`kudf£X sl5<'LLLQ/HL8f]6,Bf! d%;6PCv- (I5 Q{ >{ ^*]๓๓:p#hfqЧׯ_y;w߿~\7ygpɄ,Lx7_p> *fB`K)ZZ-ҢOʁL*e&Yt;'0fNU !OAG}O g ^h9Zovtt@J\r֭'_~,73hu0;=^>*\`xIx& FܒӧO#ߊsm٤g" hfBd6Zvhf,zɤ2i"sHNŅ r(A(<TW֖ŗ Ma C3Γ5]%ftI}5 tI ]uX 0!#4S%^r ACL |-ܙp?R& 'C2!^~]WCbWr>&L-7@!Of+J؅0rߊ̊|.jh&$ !90 CE+ |MyA㢠K ?g҇z )y@KV'-Y^3Be&[q""%c=@fBea&Xy~!djBc9p"8b ɄUlF& Bvրm> Atl yc.+Iة@ELx rN]Bwu /bKgBNsf`{w޳gϰ_MEȄ2^p6,z FFC`(v Wb+|>4 OXѩt w@` 2ed>(2[ V(Q"D]oͿF ?3DT8Ǥ.s4 V&|78 X;2!|*&< Cwu ;1D ^ndݹDet2i]BʁAmkB/N MAgM531h)x9k88d䅜=?y"y5!@_&@`B̄o3ht5Ȟz`5NޕLʰA,A2= nǏ7o30柃:ςoܕ .rWXB!Iq:|6D}` X%9XBN|EL@_&D΁nh ;z/_yf`cg*d L\ Wf`hpfgKw/[eBn \G"ѭ2vÀ}WL)sĉ{s7y̬w~;t={`z l~qb&TݑLB#Wf#`}HL8 | e0&01ʪۡecM3/,1y9/f@FhS}{ݰg`T / &3gE 2[h1VBЩ Fy`w9x6 ԅƚ GN!ON4O Q !WSAХ:PQ jp 6Ar}km@Rͭ4p+-(Aͺ܆-!òvF2bY]BSFM&eB`&HȄ,=|ÅMo>\mPz&H"Bzy ]* lfqJW!I LÇ޽{5`cW>P8?6zhqcdBm9Ha,FQqxsOH @LX= | &` 9%B`?>t`5{-3aS^9Et/Jz4jtvp ~<YR:}mG ݻ (x`^}f7@oVrk"_v %x\X !ȁ74iON(@Ll##`KaOQɖւf? *d?H+R"?r&,YGLτ9-Őjpol၄I49 A711LT&f> @-a&3HwILW;#!EA,K.vQ/ӫ wE+:Xz4bfGG΂2!R-^ABj'O]j _Y W2Ƌ ˒`HK@`6ߨ]_?6#A%R u>|^(cvf~{x90q)@LX"rd0QQ`xqPANY3;yҤ3fdȩ۶mF`@L#<_|$xz̈́)LP{{ڥ{Ai)3N1K[ >` U0^]b @3%?B v rcxbj0|z#$"OҠ͚\rX!%&GȄaCɎUBEEQqT<&%QU^2jlh&`~@?'MgϞp˗Xs H` Wo& Ly+Vͤ3ys0i c0]43!,F'$''T$BP]Q Q[k+Q6;@X8LvW޸q#s | 0iz&fO|ނuV3glV@+ɄL N/΀vXc&?Vsmp2Oh/ I33>/EjBWjr1$"Olٲ2?=zED~B0 )f"r`lby\0U%WdԤf֦e5WQKEVV\O3^_Tf`&5ʕ+qٳ7oC6S%&f ]3'LZ0}6XI糲qWp&4 {L3h;Z& Zqg(=[yFsiO.`J:l@GڂCsYOA o B́;1+a8WB1Cvu@֬]p!{hhXeB`dBPX\ {u @ԔU]GSL6u*M6mf<`\f͆ VǏ|>Cl@H9pƬ o^ *TM6Lx6Y qۑ?Ϩ~ &65Ofu&x(dv\N! m?drrG*&:@@%`FFh;w3(#& d -^QY |6/mKxrw0lQ+:`~[n`:`O`̙3v8tYw''B˄ (|bIrZYjFef t3ylu{?R2Buh?怮q YݸC;>0#LxRF)Ō' .eR(+CN+>=p+M_kQo&_НkD!߼y6ZL@*g3!dy'$4,9 ̀`l lZlVzyX?~r:i2!0.H8B@|"d\wx[2ClDE I&рT9&u&`f3`i^ѣG ,wIșv \` Q$A7AQΙe&LA9pҒ'Ll3!dB`} 3!J\V6} ȸ(L-mQ22!@ L +rfϞ @s kVf9`N-`Np o G޸q;$9`(o @>&LOLθ3%O,>mʄ_w"`>eB|τ02!JN J sм ;7 b8"ulX <S  "_N ^ "YJ(ɄhuN>tkXx ؎ߝ;w{ ~9`,瀡L"Vp&M^&L A`|9cɄ >$!}Bؾ>k'si ."ZVZ~\֦"/T`RWv-NXSa9r/"l(W22$iCV,2:Πdʄ$ZQo -H=x dfX:O>`d;n]>`;t9 ؙ~XAr0%A20dy~虐LED&uڣ;=x!Y'崡E&" "%CԷ _?~[?КhBsYh*] GHmTVw+u‹d2Lecl& r d8kC~X=`ok5HB8 2auf.0O py lI=\x6VF̈́A9(Ʉx3.9{5`5i S%%3a6hL+7^T?)n&C\w[;2(ng (() dcIdl"_ /! ټ|;V >49 !۽B`5 ]`7 =<)X&gB_Zg»oH ;<Co2łҋP[U]`r:s _j!̈́>Lӓ>?>)h ",NeH夔eBLOs/ P>tHILIn&hZfXeHLx@.zV}Kgk Sc0&(XL7cTFFk0LxP&R/MJ+OɨAK!Kl!C-Lv9xxC^S ]&7GNs9|3rぼ4rJLd><sǁ?n>HL ˄-X3!|K+|Hd L*:|aܺc۸h ͤg¹Jg2Tp7}?H~i)"s`CC|r` Ç@@ %LX ̄*Ivݺu$'RSL+[vgJ2a,{9x|: :ɇT̄C0Lχ@]W;.+hz~0I2!r>X`er~k7Zz%[f̝>5dS{^SNf&вfv !]`ԂD ^t*M@x  0M[j6:r |U|l* c&̄Vnf5&U$ A(Xk J*ڪjXY@ɶKbj#[)!S@Ɲ)7&^XyugD`ef^oȇH D~0F;KV RA+;KD ЩA{卺 e :%uۄ:dYdژۙ@[oA[!rIE*8e8d #xƃ=H=@`C&(_f5k ;rw9>P%gB fS⁙pwT`&ljjc{H `-0@A %e> _.i/!6Ͼ: pwLnZ]a|TO dVȸ0$ZȊKșaS]MzYG:Z9Q 2G `9?j=@`B6cǎ={X rZ)LɇL3'rG$NVPɇ&FvLvR`GM]W]Cs+p^x*A.8HOaτs}"gy=̇5Q+>@pe*2 Y~S!VX>2@A Y"jc d2jY9m;Lf>w80^ݹ–|,$yQ`|عQ*qY)$" !L؄>^@@le@*@`  C:BZȁ@@ ,Z&\0/ vot0`Ro !0Ř:Q)*3sihml&։S;W[nTBEOeIK:TO}n&#$(+CPw (H;!ڣu#8  jOtxz>O:h|ȵ]/m۽2:0`I".qmt}(3~\??bta`4NC+[^l)W9Dx7:b}A[M&&)[Mm,c;?}%q (R9J2eQK36@Hs3$k-A @I$ey6ɼ&"S3B&>tP_/㛄uϢ+&9"P"Tg:X5斋o8Ter|SwK"b ^b %9iքxі6@@1JMK{598l ?1<`m J; 0%|)6zQ#'b#0.2"7 1ⵟbXK*F+UʷzѼ+P6(5[I3rHZf0-dDId')G.6%/,BH'sZ,]Ir0ƒ/5<_%h!q t명uh@_ƭg&ܮrqѹU+XwYNnC!Ð矜|mz#QtL?3vcBJ6:qRG4,H @BX Qм Mr %4|Q/a{@ @ݝ@$p# VTbJK ­M]gf`l4^JF6Ո4VlZw3oD.\`݂K %>,,ˁZ5 qU$iQli685Tr$&S(c,YXe$˱3d;H(z3z|(E(hQV4$N!.v.Б`XXXWf y@mAEa}$ߨH~w~m, ${4?4UXz4,U@@HN:Pd|=O3sI5B Զk?t&]~/uvۨL1&n(=WNTwG OF]n{D+ 8qCk`@N=Ҭu ˄\Ó 0 )r8x&yM'ҡeOuOQ#M> 1TKa 9VpsVb6>G$c 2,Dh? 4:@Zx<O tC^%Ʃ ,yU:@*m⏱ĕ E&Dx@.vdS҆(rJBvHJͩhVpI*FnD3c, Y$IENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotW.png0000644000175000017500000000050113063003311023302 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; pA?>LkЀ; D4P0@ h 4/h@pЀ; 4w@ h@Ȍ40/9{'OIENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotSW.png0000644000175000017500000000047713063003311023441 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; 4w@ 1  4Q@pЀ; 4w@1g4w@ h@"Z׆40F9fIENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotCenterSmall.png0000644000175000017500000000034613063003307025321 0ustar mans0954mans0954PNG  IHDRagAMAXG cHRMz%u._:oi+qIDATxb?% (5 :&F (6 (6 (6 p*Ϡ2 p^  (6 (6 (6 (LDgh/5IENDB`batik-1.9.orig/samples/tests/resources/images/arabic.png0000644000175000017500000001162413063003307022751 0ustar mans0954mans0954PNG  IHDR:?h5tEXtCreation Time%3V6tIME-\=t pHYsodIDATx]]l^E@P)ED uԢ "9<8:#)*P,@HFC$R;})R)&8R"rv'iҤsgfgg{;;;sΙ3gnMTƏ&3F!͛ǯ<3FB9Ma#T!,+Swޙ7YWKOr" 9È%2r8/Q$r:od۴kjʛywLW&5" 9È sXR04Tjo/Iss41Qj }exiStہXKHDRWhjDA@%BTj 8E |Ab f LaeZЖ+85lꀆP5Fo8Rjl0sxD>I2DP+j㉱b%oU-?^/2X9Ȳ)ț.ՔL:yAb* + 9b8 TQ쯤. cĚD g[@o ހSqKU'xFԵ6S' "sw RBXr'VsѺ\a-A$Z%~٩߁DDqSo%C~jk7߄F{2=YI 6oVC2Ҟx晙 S7we`kޱc)чh>[قg<.-*2E{E@,ohW' "K1)1;c)TO\8,ym Is:E1*<#l^綾f &br_D;K@ro={v/5ȞocN$=KK0 $F>]J"Bnۦs36æ A7I*~;aU(˲Ő, 9GxLli) FE [)cUiʻH$o;6&ٿ;;5_w}GWߡ`wtz}"kT Sa_u3(< ^+Oւ)-d϶ MBOB"s駁 %]{WS/7hAci) qFof~vI}}A];#1ho$\J5jR'l1@;e\ [&96 mJx򛄞T uZ["=/p!39 h0"X^h8Қ$b &?SmU棌cP/uќWcdï%=)i9.knc*,ɖ +:A#$igUM;/+>ZMDIf F'-"rmAM)2/~r*1 l*2ę4nAH M!YZ_[&&bpB&AzxEd$j9jRS YhZ olYbRAL C Z 4d2EB~uKrT97VOQz,ؘaGS͕u,04<#be%?UZ`>H4x]!bhb${b+)])H;1<zh$9Xnh簟4/W~,L'|a}'6$юJr m_jy2 Df֠ k2ɐ^![EWpqp䈷kWtmm== b8J¦Mg3K@1mݪ٢Wq4Ѭbr8U'S8T{X+C) g #B#B#B#"7_>7["op(2.G@F:7QR%⯸暋ix_g斢nu(2ovCwe<8~_B59iY@R;Xӹ{- xe%c XS7?-2$(ꫣw7ev S~(.Vt!S|K0R[p >{6k!չNckS8;Ϯ(\X[U3eWQ(l idEڵ}J^4kbbHS-I,wv_ eG~clj?{tB{e2 Dhk WZ'n@1}"%ݑ#^vu8R ~},JO7Rj\p "Q idA$ MV *ܹsYGgϏm%cǤ2UO={Radi칑]k{sg‰ 81:šqCt~J#&%Bx; -N'_8=<| $Ӭ2#P@+pWC򂍠;mj#sRP؁Iu5覡)}zk9--2"l\m#CБokNE!(%{ ~K4y즥K/:uI-~/JhF_&^0 ߊX EEUs/{+hC@9z1RRYN Vgjo!M٢Ej+¯:)\{\hQL]wb Udt)mM|8DʧF|]Il]q]!4u6G`Jj=@ޠp d nJUėZQP9eх>={gI"hwRLû_>>Raw.<-TDwS8`%N BD9pZ.ԏGT+?H:FC2.X )$v)7A]'*EmMġF%N:wY琅Xx8,Ts$Eu,(gzpï=8 SHEsIx:hwVyX.XGd !IPKuR5J*D@L--4JSxPMT{`A. dؠR)~خ)KIO(_[a!]y&,ww=J D*23gHm 6p5$ޡ{6ŷ.ON^WFqX)ڥJFT{1TEm"RA6, ~Qhj+/>PP`m՚>Q-Wl1N(@qEZ#⛽{ !HzYG~SF"&$qmL\S}}2#kK)!jk* R{#>J ljSuMw 7e2')Ƥ~ 9(AyzԊ< fvv" B;h0jf`Ԙ9*mŢGKolih4d6񯮫 ,q#qhIM|?~ߺu ##Aܼ5kӇݳz +6<$p/>]N i'q_"Ypx۶ G( +S805.P ]ckħBQ~ڪ]gB͖- iS|TPґ#/~ ֑/6n룏RxFƨ5M%jSkHC͎Pl١HώGz).^_i'CT{d:?ftĩq&e2\BS.YYj3 Hг814s(5Z?McGTY *6F@ ͊!_.nOЂ2^aPj>U0PAlC!3rpp(DC.&IENDB`batik-1.9.orig/samples/tests/resources/images/brushedMetal.jpg0000644000175000017500000027120313063003311024137 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2Adobed@9     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?*$]Li+68? gE?~K!<_֝_[m<}8Co~NY9亟V_5k}oujc͈b~ K#/uޜ|d_rߏ~6,A+ŵSH>2?׺kCRI -BZ\Rŀ\%Bn Zęk#c{F:I~4QB}u:#6 [!2@%dDk_?+0Ե$0ƗPo8>׺qlNċY-VH_^A66{^JCQKVy,l~AߺߧR ׿ = ÏY3bX,t鶛% nZҖ;.&JMT>R?~z{ c&኶"k_V:O~:J\=: 56>m{҈א?uҊWJ^c.MƼ,[=dQ _P3p?>׺x{H*J~^I2T/q?>N>ؠ$QTQvP ߏ^Nqmf"G@lq玽^& y!ΰVE@ǺNc5EHފgŕcg}y74[ }8O4wTʱ|@x B+/S5gX)G%mszPB}I'={˧(hkAiw+[B4,nm^\:Q#AAPgeD# Jg={)pL`Pp~zKG}@H,"\xuﳧ81aQ5=ZZ7<{^NP 2eFO eQzOPS@ %&o,48s{\~?:xXcoHKU*mZ=u QVNNL=<q׼4Գss:R/Ss߳hĞkJ%lA"KZ^O>abC%KZݪb js߼}k;F}3.qsׯqOj⚤bO#sÎӢRGzy$(- \}.9gWFz?"H?޾;CO@vI㯛?Z:CKJm)xH6oz~}׍@=oשDhރpG}CRG>>Xg! Qq§u'߇3j%CUa <9 -?U~&:G $h1cֱ$?~Zj6&fc U{/=׭ӌa[)ؖP^_z9ƾt1B um!{dqƤ!jMpSM-PRj#Ozz%>Y‘ wRV27e\t4-$P갹Xr E1>A׺wEꉴ =jPR~ߗ^:ÍjpJm\~iB>.ԘuI+T0H*6TcpjB:'va (.ct >یئt 5e?˯~}}:w jpoJSxum=ESpiF})=5 zoGN`b #´=h ,tdhoMNR'Lj~]?i#o!X.X…ء]xtMRIf?߳z}8tK+HY~ڵ[jnY saL^=|(?&VL`Zr_o~N∞\vӓbEޭ[׼N0RȪ --]sf*4Uf߽E1׿< +_yBլO?+VSaOpZ*)6yPǐ~ӑa܏~[4:R؛䣸-al yb_g&k?߳^zJERCS߱ӭr .ˑo{^yުIO, ;j6-b:~=DBXc* ?Cř<ߝz.ӊ,Ud^1>9gXPύ {e޳:ߝ|HjKzW{jF5Sd4 ys׷z׸lTDJ ?Ojx)ÏZ>N0QDXh\#S2M{pJ:WkhS}_WUFذ/@έq ~ ?6[ߺ^ln]).m`=K!<O~d b/*'w?򺦕?u>ӌ/UUxTߺXg6=[ocjU5/ q{^IlL NP<KRA#ot$[p]*ߓo%I?ӟ~s dj>ԡ#ӌ{go'c`5ģ}HKPzuCT+pqi$qvs<{^r.P\x^ > ߺY Sxj'W*Hō:>_zxuVf/R@&76uU7 Q+Ik8ō ߖzSTNTsk]m{˩y_ "@,xll?[:4gf)0}=kx(k$[pڐ=$,.~>oCKA#WB9'Wb997kxѠ#WURHPt7V\ Xq{^COM--I&.cTJH7fAbAͽcӧ!$WC#ZI =,kOuNS@[{ܦ E~ :ttv_19xsߧ^|N&尺x;Sn=˯>FeJ'F~Qq_~׼bMJqp0J>8z9A3?r+_(Qp/ϿTg׿N"!`Bx~W:y ~\]V{hqg|:rUsI[إYk}d~_.Hb`*(^o{޴➒#c~&F#_2H s{?W -$<[F^Hy*Py{_߫׺PSQ f=-ca:U؅}_ӯg>=C@ 9\rUӓx]D߾}{O MJ-+qQ{()qX){ߖ::r3p ImV|o^N٨6ipcQ:sgyRAo[.?^=={9 vP>ci$ct:t ōG6-c~?֝d)*SR7ѥo>~_^O1 q%[߱ׯϧcR4{}:W.X[~ ::̕zt$Ũ޽׿Ե&9mpRi(߿ykJ*G7cĊr>(0Oi6h~?yZJ:#{f8Y׵oG׿zS^>%V1.'#($i?9= cp{ٕ ‘k|m"T-zj#χ'O?}ת?D.qj.Pɂ]#^1o?_u=IUo6cw@(܌M^~X_{IV662Xq{Bzㄎ ࠧ(,ǿu"2 E](Vq -qo~9$Sy)RMLr\^ {Y$$)XZر>O.Ըi2t$:v$9>Dh o$ %-GJөT܃Ѓ׼}H*v"*ˤ>=zЭ:>FM>׼M B:vr.$4 prx׀ IU,Z!VUc{Z8t0-N/[}}:>)F3k27 &)5,,$*T-ط:u# 5>"5:$SגU P~F{ӔG #$r>z26O꜎M]>:r>~}x9DU#ҨoѪvbl}}:ߠ#=?RrE8a~Ճ_>1KME]5hǖ\&~ߩӯc9 Jx#X}?^=(@UF<¤F8o?O~g˧XZ03p'[E{}z׮q=EdaABU>8#S_Pt D`eU-ku!~jf~`|x"ciQa㞵^i1-kEe^XG{ߦ:DtRUKss㟯޸)|OJ:%/q5boo߼}k˧ESو*B6/?bN?ϧH#c maʒ -~3׫tN^ 0kzY?޽^y IeĩǁIk|ut>qk o,oc GZN*ȉl4p9y/N@Y+` {~{ʹ:tZ:n2oz uMݿ׾CSHFi5ΪX~xԓy{׫:pZ:ǂQZcx@pg(e>VJ"~7_}gz[ɏk1qq~n s߾,~Yc`ҁ.9oٓn>ԅ|>Yl4-"X7$Ck^d0/eQQO{ǯdVO =ӯU}:zo$j~cڊM#I]}k ?3Qv?o۟u=6QHK(K0IzldjZ/ =OJWPG?]4<{^5%^Z@Rɗ@V[6?u*g d&PnTSԤU2f+Y^UߺRᢂFjo/Z[\ uCaTI>VϩG߫ǯu-pTSSf-Q,I׏Y@uְӤ(:Ao}}y| 8?}$aߺt8j(̤J%6*Hks~8-9 4`m"0*@_  zֺ" lŵ_ĩPƛY}oN=oөpP تCe<mǯ}9H`.QjuC6Qv_ʸ枊FKR %XВm¨ީNӜx̆5G8'o~ïzu"<wDmr@RWm=tMM,^r7!RY&xAvae.!ufP?{ʝ{өiMrj,W 1Z>Ӽxci*2A&-I <t>&e>MT=m{[Rlx~׽zQQ!,S*B%bI^N8x;ŌGJ A*t@w$??׽6J:I%jaeX \I[߽:ח˥EU $keіӤQ6u'AqaLpϽq.ƛ%JZ5"[{ï@t'Sqc([@Pz4[*Xوk29[}CӬP2ؽP߾Cϧ$'pqk,U$oŇ=<^^B]0tlOE9 G5 OjNA+1AH, T~>z5WV}8G@fZ Rҟ[rx"z:LX) +ǏשA_>LJVܝq~ rG:(`Ğ?zA~>@ W$-H:@na؀GJWϯq?. [i`M$*ܐIxކI'pGTP?W[?OUE={̹o׺n Y\}bK\?{LQͅkWCTfc<U0MIlq~ߺ]CE\eltT5xG_<uw!Mr~quu5(&V8BDabG,>ߺRUOH%FF 6_6Z h` YCڰ, utHD1=4R9Po}8XOQG!@j3q8^׿.ǵr*Ve3D5*(J s{^tX 7-T^ 7l}4sߎ:x2<]j&&KD.x[5& ,N^i(H5; Ͻq^jP֣^\Xe)I&׿ןϿuԢLO~lN E b<\ƽ׿ԨMM ai~]9S.BFTOsrHYn}dc7i*XLp߾g^4Ӽ!tLֱqL#(on}x1i1k FjUR\׽kǧj|f@_[RȴG{z]=CpSiznGէ>ǭ:v "+KC(-rcX?bO{OZpS BehyL6iE`_{ֿ.Z"#Dx,n.H?:u.1 $ ч6LAӝ>:T7"sqA }/zt:@0O$}~?؍yzyly N?G Q#{߯^,=*M`\|(l =oO0ennB&,[Bzl>}tOI@ޕ_O>íyR?PSS(-9_zt4<]:'I$ ȵԜmc}=GO"P)aaT5%ֽ?~ޜa,l`X {^};Db^@GpW}?ՎӂSc", n9z4Wuyu-ͩObxjO^@Rfcp,`U7k JqnM}:tPcXM}Gz+ >;SҒaEP>mp>ި@U5,x opx OE{:;z&j ^䀪ߓ\166Ojc7P@Q^i8tBQkG _߇=kNr4 H:sCW^OR1䚜~gqfngZ:(zp@&O +y|ϯSSéѪ 7?~zjeKtCz ' I׉8^6uyM<CGӯ u"81ɤ* 75PN> =o3ԻNH>:_I7_FXE6*v|ઍ]O׏~DkKNoO$Upsi}=t66*96EKW0{{^M4yU?ՇQr/¥͏ԃ{}}zt)no$(e~={*tmT3ԅ:\_nyDM떓!(X <1%as[ߺ:$B&@U(QvÎ>׺pOrej\ykxcki޼R%lk)|Ӗ\a?{eLv$N.kI.! " (<}~z瞦ÊĩRs (j܏ǿu=:A[SQ`O7 R~[J*Q( D4G:TO Xr?gGɆa*b݁>-%E8}oTxڈ9Yj_XHi[M_#W?_~GϯtU2 RF l}zt6XJ]M=;rOLG{^ԨDU-Z:TE&ç1(JPEfE* AzӼ @We/M>F#@}:)O RM9P?Gu*@ =# f \q_޴x\edź5+k=q}9AFEzb䙭8_߱ƽ{zuD\,V[NyFl}ZuQӌT<9M޽:jO xE){^8tMcXePƧ`֮s?Ԡu>)׎|N W ,THDŽ<˜Z:,Ub9wk}l]o~`!Ӕ8jI)E-VE?9T;GOc5\#B_^Ylx"zΘ %' }={tK JsmGL*I?f>:ׯOpco<꤁kAynޝ;MߓW?Bdz[Na]G ^޽N.4"[]~$k׼<\[#Oɱ<{yz4aIX0G\w̞=xRZF>X>J~l|'0? [!_eB9'@:Z笰FHoa15{94ϩkL42: {j~]xPjU2bcO.n?q5Gut!H'/oߩ\qH=˭LPTjϪlH?0 z$9!e y')ǴS(]MIP ץ?S{^PYs?1cޗ5=x:?Wh_ uOMny!1nmsoyW׺'p ACbʁUtoߺR*^ܙ @^A7xV7?Sp=t 4J3z}V"#^:,~ן~|zOAv[p)1DM?^í:'dI"c6?NVơG\q` Sr7?zϩTȟ)Hғr??A{]94RUz@q *.Z#7mTI/K1p?{^SҢB?xoJ"X^ŠFXp=[NI)ծJ ZÞQ~>ϩJ \Qf}(-ߏ^:t@ž3H?P?ÍzpHMpMƒ "RCX` ^*v!Y[I54Z߅01zԸۍU>40J<{}kzrHV HqǿyyuL"EP]?~^d`lmJkB^E *jBuz~d\_u|N"x5ORHoSz˧P771?Dt/08 ٿ^,?_~3ޚZ*8$VP:xD IoȞ=<ЪG,L~Xƶ%*.|fS8Zl~s]xyM>y*pۋ:o Cr>>]{ӈl]8+A,"s׿ӌ+P4$ď&Λ{>}{q갎$\"o-߇ =x ֗$JD@yԑA7d Wqǿ ӄTu"Vc!^”^kӀE^n?6k׆[mKX@ꪫV{Z9=IZL5`855J/'BOz^ޝgQb^zv"'V6T!珯?ĚR,CNZI*?>ǯ )>}9FL)i1Ґ kKG<Ԡ֗z?A*t{oQם3lWEW[j0~63{p4>"; ߺ\`:ZJ.5^#qHu)UKW!XjS1uԀuey)lqf7u.*X亙rO+]no8n.x׺Q+RISccpЕs_޺NW#PWT#96ԁVS}{, 9}>U"4`jn}<:zX2jISa r9[UӯqBTk\d$p[̠{8uO`#'L9$ޣ˭ǍmP?=׸% zK-HaHiϿu#Ԉqp[ ͽ&Xفkk~zNb,o*MY~_(YHp؀7qٮ?>:SVP7 5?g?^?ou.ö<;XYGX~dOPm}cA75V}mL)r䭮Ey䈀je7ױx:*%,ArQyo{~=X6RdR{^=}zz ! =꽄޽z˧a( ]@U6!{#׺> ?A<y?O=o!dOW^]hq TɑSiRu_c5*"<7BMSſ7z>,¸ѪA!PnG^@roz_N!4nUqf?[8Wo?Od$lR,# SçHoTks?=8$ ܍+Fy#! [?`/>!Pr0Jt$k߼x˩댯jhU#Uqj,9% թoW#VYHbuu-C[FsZSc!f@8ӜC.8GGZ,*HH!^oNTR R0h6- ߏ~cI<$d߫Đ2[cNPH|=g^q->tx~T!h~Y'KL.(l>OSH~'aɣȣM:-R@=N(/uQ.`vz'u~?ϯ'UmxdjE{v J>xx[ߺN櫥NG8l=MR^q:GUT/ ׺7)%$WR[̡l-qߺԀ_:5{ K}{^Luhe%:)[,t0 3_S*DS-bozgYP"sNjaӬ4bTZ7~k_o[˧J\Fú+s:TX}kzrܰ,HO*ΐ^UR9S֒dʹ?KԩNpV!~FMB\_߾ֺ%luR}.dOp|~ާG[,R*ryY!m[߳ïcQQ`$kg_V=={C6xK4h ]Fr~!H{i<}E{bE R&!9AA{~E~]x>;CK*V1S<\MMutK9рHeMGן`(E+Í$lz>>詒Ƌ?6_Dn?ïW=)b5ȩ<)lÇ^R ƞ9 )\VOM{^Nq 7p[q}7{}9$R\F }8:]{N0IX7,_XvO\['Nlc `ZZÅ@mŇuQӝ<Rk-uJ6zss~oО⩪,OJVN\svX|:!u%ab͓>{z.eRӃsj\*Nׅz:r&BP$S{\YֿZ:t%-Ŭ4Wއ[iӜUy~T--xZNj sZRfu#4S )%WA<>cS>: Iks^5V'yֽz>SUf ˦5Ӛa4}Ξ]x>ys/*_O:tOUP@Y$C3V ^^$NT 1̿<Vm{{M|rEfP͎SnĖn?O~(:9'==X84nOcnß~uzt?1ǀA1P:G_>i׸B@y<0-po~<@^SaL+i}ԟ~hsI&P@8-@UӇntE#[߿[>C˩ܖ|3XGZX1^xĸ<+X@'ޏ=l.x:JExn j?pK,OHt&E$7S@QiחLJjNa*Z ɿ'GRFCn*k[Dɷ{R8:! 5ls\{ߺ}/1?_#?T]Mmٹ _窰f ܁oP>׺M x2fK}fj-'c<~KN`,X{%6GzS ew*n7W3<~ux5`ж%1n~{өW[;ƺ/oߺSȅ-!6J:{}}^6`Ec]x>I\T{.psŴͿ׺>^\nbC1yߺRE=D~IZpbH_~^Z'MK"%xQd??_}:SQRZk?q%Hks鷿uN!4 -bLu^)F8gӈt6ctOU"7p"e'}LuJeˊk ?~^1J tRJIXq=Pp=oONNA%Lgi>X"ߺ˧JzZw,Dk N.~}{=;Í%,S26 W-'nO|}N1PMB:i2L/EzW)AR'zsk[}˯?>"pMWѸ ۟>:p(F* aBX"\yW|y*/ ݨjC -^↭6bqHځ/X[ӔTTc"7؏Rzϧ$~o kZ{^=8 1^{X__ϯb:s ʄz~P- *t[o~+׫V'YPZ螙 G~C=O)Ejc$SV-ߏ: c⊎Ҡ<>߫uӌ5q[pAgmթu:2Smc ?OϿzJ:+&u rHbV jkxӬXB\{_"x(ORC0:(nSXdҰMYn(?F{^ߥOo/mԕ32(75>^I4]$24B=_R(qǿ?[8fbS( 11kF:q pTI,j!Q_uNu: PI̯?K2}|]Y eN=@q8.8^5Emé>g\\]SQ7wx'Qߺ:t_λz h#k\r?qZtߩq:yg.@u9jXUc uMnYUO"Aw_qeZB/(EA"U?ޏ^:iK`i"4e}$D@?O{é&* ɐ]"ЩUᴨkͽu -e%2[-գf#ǿyYEPntrA_{LVEoQӐ.-CB׺qLSq&:# W7Z_~}L&r$-!}<>޺S mO< T_-` <}z9LJ܏<EX>2HJopWac>^]9/HbnڔMj`^_>. x:`b>l|%?>׺t ɔ |.C>N+NԸ CנQ4ىѣO˯|RS)#«͹'U;5ߺӌttYSnI|Ux&@ ﷯zc)ཱུ"-7ooE'~=y UVa?BB.?3׏RҖP4Dy۹Kqk\$noz)*}:s,[ {g$SySDe2,@ o(,A~>)ǭ|䔂0~se' O~y2kӚS*c 鿓P2?{ZR,(lO7,[NCǧ(5YI/׋ ?˯|tIBZZd,x>N鎜`@uT,?7D$uN"*5B /_d*PM(n41ō {׸q45I0~?M/&,M-x ^&Fb]x3袠s{O{K*~ZdXK 4C\E)7_߱랜bbfCG(@_8u>r{p5,q\/uzzy9-V#{k$ xc$.I=p^xZYO0Buc1ЯuJ6,_`Q 312bG~^2sӝ>NbB #67c[Shz0p,W>+ǭ-kQé3RT>W7>qͿ/ZY0@/掬~=e'#J=@ڐONTbMzh6E^[×Y PLp"Z܋}xoӼu5Ԙh"lG 5?A{he)hoҋOD,@aIG޸u˩Hqoo^xjNG׺"ƲȬ,j\)/u,zi[UBԛso<{u%Zֱ kqja׺IMQ%oB~˥inm׆z:5]fʁcpؖzׯcEFYO-ͽ2G_~oө051XrtʝNX#Un@\WV?>_^Ӥt (*VnS` G[<|:3zGaA_~{d]U@~ISʀ,CIxzt"S-rXsdIVs^\Q # Hn 6R/}z7cp Ll,O U_g^>Q4b=rchnOu`\A4+Z bP-o{dOO6e =8?G^ONSD$Sؐtʥ~o޾޽:*?̀4jEOǽ׾]9C i ;( i#J.~h>ν_1ӗkZXJr$n8E}ׯu**I`1H?Bu2}8S[:tJz@]X^/ŅId_o{XSUx$r@$矧E\.M#޽[z*>ݒx\75qN#xJ*]۟{BS֒[lɰS =jzZ(z9CXR,ߑ~'׭t L0(2  dz#Ӭ4YI>l$XYM߼^>];GI -U\Qrk)I :?L^tTyW#]f@~Z2ƽ9>zϩFuE܃OϿ yu,u=)'%y%mo~xǧR-l@O\~}{'MM, 2䛰P#އuマOJ _v-3Á>#Vdt߅4Q$HׇNAMFR$ߓ^{1*}zGV*4fB 0 kO~hR]^< j-^z2YD $}Jc?Sǭq=d9l޾U6..J EmϽ:Ly\FTݚ~Ǘ^R!]%U)ږZRMEca=8y\0o&K'%Է֗NdR,b. sJѭ[cuç(IBAYhoxM@RT:1-&t#kM֔yu7H{zoƜXZZ)uŀũ5ڷ #qbF9Ӕxjt4'щuCpkiBBY6߈{҃PQIsk3d[so$M ܗ2rx6sk^`)P!u' $@8.{qď݀$1±$}OYiǩkZe2+~J] ~'pٹzϭ=K;.2j,X^2&߂}u:"j2DM>{[S&;Ax Ãt* )@ /:t T]G Ek~Su68j,#xǽ|}8!뎃oxvZ`Y@_{N-M@!6q F?[Drܾ4˫nI p4ߞ=u"&?ZzNrۓp(5Ÿ߼N9*>ްIr9߼}z=91_y'*S_SӯygzHX-+OФnݗ שǧP _V :O?^P 5i2KsblTQ~?^MnYKf+="@y{ׯ^t1UmXU5X߈+@ZL]-NAR/Nӄq¡ upa`l$R\>]{=9S}!K?TEG^>]:F)?WU&& ##p^NpkrLjߓ?}zKV)'HGzo AFj[_N%c0 V7 \OEa!ָשqH-U!A6>To3=~K0O&gĴ3$?K[߿ָt܀e`Zi O~<)ϯRچ3,XҀmŇd{z{@qq]q~?1@%͉8C%a 59PNIqQ~0:iԫur&VIyu玜錱z:IɅP^^'AY,ZAJ?{VcCxqY#-r }lib`P|}f9(XA݈'zu|8[cPI䐢s@16M#"IP7$`%aekd(Wժ4KJ2:fXO-{Vӟz_׺pD_-#VOЖ Qc'޺NJTWV$gcЏLѝi@\j`{^J׷#HRkg4\OoߺR+X~*>ֿԅ2BIQrqj>HG[V7 Ÿ&PT!krEVGd ` ?@E@8Pn ~RňZJSr0P _߸uNH$&I"W׎H?>CGI}+P ^dSL4u"XJ,TF mjzpTecg?KT.n8>NbJ4]S/Gz- >krxNE> - k`X}Pedo.RJA MT9+O?79?>Ģ`41S/Osb{zzreTݝ#c6C-8Í:!Xyi v?m_޽,Vl +bJON68Ӂ߾~}{s L#+`*R0ɿLuOQW5Ll#jߗCӄTURzu^:K_A^ӌT.?r 7< [lB&Ͻ=oקJz)mou9,"H~zt(a ׈{g'ϧH w>:w $~Kybݼ^]HզQ@Afps?އz2Sa _A.{zjAt1W!eb8*/N_>J`WЩo`ro~׭TƲ6lfd *0Fx¦A<=p'ϯyөQ֐EUruRnׅ|Qy6+bx?^zRO+ #X-߿ O^SQb+o [Q2G{^Sֲpk+X Zq{~^(k^-49@S57R׆MOS TUƺީakYERXlԁG3!XrTr=hu(ݸ0tbxWc{^=Tj`WpHDXԳXQlF뿷 lܐk筐zʔ`k)b5@-o~a^GSz6?nnHZZo-uhséUP#:6_)C6Z@[49טP#&7?wڣתieddi9Xԁ:|J~c~^KKrHBlC[5㋚zTQa~(%Z:MbO7IcXo~׺~$YlS0lI\ӏؒՌO1,H5{{ZT4POxB&`}uP䍃PEqUM"ߺbPɯ֓8 Vח[Mz(*Hgȡ?"_߱^׍ ,ӐT>7VM{u,VzM~|`^щ, ρ׾ΜcΡYT p43Zq~=={pj9: yj+n/~=}8.rr q$֚g4O͹I؏ȺM:ϧ*p|tF5_zpZ{2+MRlk>׿>U hmK{^?m#Sz>:`K54L$$Ga~f9tP6j ar>}{u.$1F_Mq0_M?CW[Sb M@BX}R {^H&rBR剶EA忧N鞤T.I!c'3'EGu=8u-*@WeMa략u!k7$" K;BOϽq:NQf-?%`KZڽp^:1 $TKź kT . 厽Ӽ O8J$ a ؁p$U {}U'o{|!'jXl&bO}I:'W*&RMFXeXm_.i7o~ůWG}}_M: X@mn%iP&ǃ{$兊g#]#ЁìrUecrH'}u/ԅdfnO׺K'T=AUuk@""}IJ'KW)asǭoϽyz O9~&7O{IGd]XO6kZm?ǿu2-U5(ԯ$lGoz-daPHfj~H#[ )fl-x>׳ӧ*'<{:Eӟ>׿hT <\ՐtL@qaϿTW<:Ԁ6 zB 1{^ǩU,0J-u~?Oz׽3֞EZnQQ͹|ʸ:-4$k\L׺Zo#-"iIn=ׯyu2:ƋI m )Xϯ|r#crT GpR{N]kG%Lďa"{GM:IO '`\>η˩VE"ck}tS3Ͻ^NbSZ|>ӊ6 V>F&(O?zjsǩI5A6#K%NWny^=Mq$`}HVIe:ӬR|GU)@JXr|Gϯz#I~N2 Ͻpz'>'JZOo,{Aר4׬(j(I RHO>瞼itHVEnnšG?@o~?>zp[Ngcȸ:h^O߇SNtmq5c$ZF{> #Ң%c[o#^9lqրo[OksϽׯӼ 2>#Ïׁhjdڏ..$8׸:1^?&b? )#Ǩ{`b5Ty $=:R#zLPKGz SŰbAk\Py$8M?~w^>Ter-luJ`g[@Zž#í֟ X*AHy!h Zlo} Qx׭btUr嚞-$ߐkhM!i MA#BM\U5蕁:O?!VpO?_z5Y+é -RBZR~#؟߈Jhsé>*oO/ʟ?Z?_6k{FOmu#Qqj}~J UcȆ&3~ Xïykh[DMUo´ ka7_[Z#2)#ARGۏu) JzfoKX=r~ֺȩ":yi# U#Oz~]y)fgTQ @@b}q]HH.X4h{  !Tj3Zq>EUP5lIzE]kFPKxF߀E [>ԸvbNjm]O *Z:T.O_u'u:8VF f~M}ׯpSVӀX,->ָu!1E)ؐ}u/N)WY. S߼NTH~H&B?}={Y)& Q9^,V2D"Lmn?>^#KuqKJt0^k<=vKv~_~[SV5ZJ`xݭ#׿Ԕft!b`D&-rIxNN讖b RZl/\3׺uRIiI6!P ~>]{N z}\nIe]D3׼SbP  ` 7i'\kNG6UJnloKV.׾]9džSA\__?>NJhΟ7O{_S2.=Ӊ8{^@}~b-=5^lX-CLX\=Lt=  RuQ6.Lt3TmiOiQa^Wa묭`]NGH]Uh9 mozU#dG__Qb??ϭyԁM!8+}*n3rxP^^isK;^Lf ڶWJXAǭR=ej.7Pony:OSh"O)I߼8=KJ F%~[xx iV476Si>Ե HnHax X6}>ٍ ?M8ؕ%M~]thmu RQ$#~pDŒWiKY2Tu1"k^5QӀ I, Uzn>Gu,Z%9*@׺j)$᧯#ĄߺYTQ5Y~~uud !R/TOb>ֺubh i9oԕW.sȯ/ǩQM@|>FZH_ϧVf_Sx5lA}}={(PMLcs ][{^aMOũvo'c]{<EO3 v?4pO"߳uǂPu~1+$ #Ou﷏NQ4OH?r}?_NN&&~sf5ߟ^z7}ʨ,|~ 1rǩpPeZ3TAopzuW66rjpoʋ.=ׯu=)1F/֩t8W8{ϯpzOAqZά9 i&/^* 2u p8 mDE_~5G8(b)dXMjY/j?Ӽ4[XNSVƶĖ'ěqx㌩ }8>zMZ)--t?P?އZ,UEWyoxuY:bGL~7W"cy|HTEXԽظ ӎ}<˪qf$mOW[op׭&iP^KX*Q{O5D؟=SU2*;9,(c[rp7[=~U:TU5V#_ˑB[k,UTϽ`Mzx-1b͇#^5ӄM\V/}0`Ѓ{߈W92QIcXo"8B"x`=b*-WQR16~ϯ|e(?Pbrl~.ïySc0ԥT0.8Ǭ("snX8Ƽ8כ%o{ȼ}.B>.Y : T2~-ΪBpm}!ƄWhA+̷7^hJ9uza c?݈^cadF/Jsſ8u>$ zUp${Р'=xL{_UUkـ>珧yn<:"jj8<a,1׀_ :d<uS?qq^9㎜R M""5R_}{1תip2:D71/sqr4zR<ʙ %AIx@ ~[iOT2?~wzu9QJIq܋iܦX>nƨX{^é㔁@I׺g6uluZ)lN1CcN>ǽf{MAqj<)WQ/kY5 X xGD6=uhԢ {(? u'}鎌\ [?'#޺\! o*\ziPޘ^2ZLtj %*OxA^H`kCPb ~soC߫׺r ]mA@\ߋhP.=Ϗ[VI{gkN=~}Or*9=(ߺtV"--? omSォ*S #؀c^}z}MEQcmcq-ō4maϿSzu^u7"WR炔!~MI ň/`N5y7U/Ѝ6 z{[58*ߦ?U5i}u!RA-޾g˩G pU2O!PI{Z=KUlL,ݎYToJJQT~2,pߍ=zߗG]Au> Uok=+nmǯ f1khREom$'Z<2:k/dPk>f]g)6;>:&TSc˩4uH/og(/#ޏNE^lL>@[ANQV@ıJ<}*2 Fsn=uTu1'[ro8dtZIUʙ9}:^аEdNDml SZԥ lNG@k>EN8Rb\#EZ&\J-7E2GRGpkeK 1۞0lo}\zȯu&Nx?Ɂ ^=IGF@?Դ1K{bF=pE߉t=e3` Qliހ>t%1? lml 'u>7Q74O}?ڽz:tc%vlnň07Ӝ[0MI9 m7yuxTcJ|0ZJOM*JJkoue9 Jo% zQQ=7ߺߨDu%X9g^6$`@GobhT=KZEeʤp$]_B9!EߺaELH*~e7uឥEK #̤Y@, HEZ̕3 (=u*(S Q%>Wx^ $ni$Py2V7?ם:: 4$hu?߇^"}OX"܏k$8)&oGzu=gHk+S&n^lIJYMj(nX?}˯y-`IWamW @Ecyu.%]hV= 8uO^G.޴7?>Ϳ S ۭc׺w6kuTߙg:,cgc%+#\\k_ӜUmjBozߨ)Jcyө"x⮍/HWpzu>9@v)OuJU W/FÂ?{ߘC֩ʼn:H^@61m޼1N-LrLdP" ld{'kFGRuRT -s߁׾ޤE=zhOji]IPy?OϿq[SֶHgj=F i:A_~4{ˬԖƧЍTr6IZtG{8֝Ob4@&Pթ+Ӫ8\ORz0đ'Jqk~)kn* }z}8.Z_~O!qn<^e#`Em2NN=菟[BQJQڹH{ߧ^됪b+)dZ34r?Z9 =˭5+-c4YZį!`g_'ߺΝvrOMXXoL ~Ԩj.o$M XDB9:( #+ -]c6& ޺Y7d`yf9.o#O.ādUk#޺ߗ˧8XՌ HZ ٍuq}{(gEU+,ߋ}O <'{^Co!A?NMX:\X16@a{hAV0ԋK?={R<{E-1Ao~C׼!/OB$cc~ 5gR8u4O `Tx+^z{ZSi>*&m0~Ekǿg^$`Q)$F K@V.66cq5;?V,}4#ϭ+_.R9β<_ տ?/.ԥs]E)ީQJcԘY0No(ׂ9,}>sM )׾}N0xj*yqa-)5mp^ǩLr0TXj`/{=lzyu6QH~ 򵑞[(?z>xy+ɑKy0+[j{]{^Kbc-`tZ^/B@@$u@߭j#VmbHoU2qoOWO1"?hP ٘nOׂ} =jzٳ9. 8 ծYdfJֿ>oV}?z>Ilic\\[hDP&ߏz=L U'V1A8?={鋣D? $ a߿>ب$Qa,O!??_z}:HPaOu^qpzy, g+g_!{zCNǂ2E<e ܖ6o{N$Y#sn?$^덜ǜ~*[r)o~<@{f8ܵD)< =,g))VE0n, hR?^GևԈ(6ʀJـ>Xx_z_^#ђȷ #TZK^<Yv&g0>pJA#{^^"zu6c*q'nD 3^OJ2UQuK/dǯS=8GU:kʾ9ͧPIs#_.Mp jOat'`EyXV bꯋÐ97$ [߀zN^Bǵb*Nlx׾n}u{Ck_khQjPS SNM1px'=I"E6u%7qDnp:|RqGh1 @@aou̸؁In=JɽI~=ʝ{ԨqJNE*'O}}pg [ @/ߟ~CiB>ʑ{Pq}{<<3/ :aC`,,y c؁ïu%k\E.1F-^)")\zť/oNޝ{i\[K+}R\ob©>=zN 98W/@zNoS \׼{LXA ׳ӌIz[z<\ƒzYS_kcF ~zIy qsoQ7?s{qJnN ʮQ׾Υxd["S''Sx}CL\8# GK}6K{3_>\u>i@,h&szgϯy L"~7[~8ypi}SELÑvU?>O.ԘKFoܐA8ßz>}K`<6\{tOJ:%1[i2Z T9Ziq IhM-~?V~xJSP[-#DONuc_>ޥp_UA 7{5x F~ߟ߿`pRSSJN(L0u=KX ljxY_joT~fNRAYWS@WraTR?,?﷏ZY"dJa, m8Wɺdu9qH coou,u1J3o4$ـ~u)qUމ)7Hv,/xށx_.-Z\ zZBr:Bx )[I8qdy)Վ|K=#CCXcWzJZc=xyu*ؚƩA G\>`G#:KbdlzytT5c{:k=dc (~O/P׿{{)뎤(kVO#qzz[k U!RxU%-~}{ʇˬ|rh[L{ub$Ż{׳#ko&Z6+~2o>_ߺYF#Jη$;m}|L$h@<؀rsp?><]P~չ PHԨ0c v'~IЍNpj*P Ɩ?Oz8uYE:W{k?޽W- \t?<}:8IRH1?'zLurar*u 6}=aME_d~xnoz^LqDұ'SuW}kOIcOH'޺zM cͲ4I?>Ըt=/Zi=upPK^ܽ{-߽}zR5>*0*׿K"Vd`:^ƙ|PHYo]7!nV1>׽s_e_50߁p}ʶ# =xu-'T5[ǒA?UH#u ׺Mm5]^)&PEu"&~ޝgҒe'%`mץ?׸);XoP׺F<yk)||eY :*@$܏>˭#x-,mo-oLk?C׿ԸΠ ~ZH|7 ϯRIYL@z:!2 {L&=W>٧˩q2V?E(?i=hOPÊJJPAԨŖa V@ ߽}xIVOՕ_H*9Xa<뎼02VKp~o[=(h:A<឵52*Ï}uB9?:uoXĔX_ߎ>޽Oז-!u?.H~xgO.9 @,ccqesku'ׅ gVгUt,HU ߸yu㚞!-:U^m8cH:I:̦)ה9kX~1ױbHI^ibx2))=5}=" /Όyzά+kHh(H{\<ێ<N / _˭yu'Kd"U"WDNI?Y~iS _~QzгXخW8IXE =׼" }-#A^S~zեO~(zhzFȅɽ7O}xS?gN(`]:ib`yc'.V|n-(po) ߼\23ֵ }׾}KRI%q0ISa#UB}Hdhݏ׺Sa ~[y^:)F:%-3q]'W߾c:"J^RܛزR`M.A}|GY%8N8VŭȴC}PqױOS*>m{TcP >URe *S\>} ̗c{ϯȢAOGsžB[{ ?>:~ΑptekէQWcbY5p=u)|DGSso_z3"%_Q76PbV'[>}cRn)f>{ZDRL K.c~:SҠ-IZz_d{[RVKa8[}ȎԨR 6ZVHuNq)_(E=TN/f b~ه7_~z˩ISK{}]Q# Pn},qin4R:PG'~>0| iXdVK>Bmq/.=9<<|~q`OR/sq}/jכO:^~oiֺUQ̋rRrk}D}yaC?g[u:* 2G-LI>γ#f)6mjGHyZG[6mcW\+^}L*EK]?~Oy.;+ VG/޽{JdY!n5i$rMׁ¼zYW%cyQ{Xt[ߺ`kx -60d߿׳Eh K _ymu6{::(8q5X^}oʕ똨H>1/ BT2{ߑ^|3ׄfSbI>+p=™Y-sqL_ M˭@Ms \8Ll%ZgF`II㛲~>X[Schqr̈́{ߏ pGRQk,ԨM5M{jq㑞{ק*s#_ @+G ߗ[;5B.AHMx@ZGSf?pwQ[ #[޼a U@?O)?E߇ yu>=;oZIGv?O{{NRNGbZ?MqAǏY/K o%]~#uNJPH/m4 }^yuS܌Tmƪ 7߁&xӒ<֏uRHHq~Z; ^ΝxuƢe0Fx*T>zQlgk[r5d}'zQJq 4ٹ E"&f/PE~}::60Ь9jn~^A#S"Tұa >J<Ԅ,Ԏn \qz:)P/Q~TRR xz@뙨jfRN:k^}}bi֩GZg%~o^{ +ײx|䁸V,AXQK-X$}m~ϙƜ@]9f?ҷI2o'܎I}}{fR4KX Crw`_1׺#jVXsq~j:^:QJR o>9b {)GI> N92b׺fmVz`,-aUk)i KFi-zz'u6>.4}k1X`G6LA&i _.TŰZJ??벑~m־t_G@,ȴ5 2I6u\uPNm0pޔֺ!6&M~}fHQo-߸`u=9E .!#ǡm?DĐ8~^RV9YGI*]NnM?=kI H? Lǿu'bjbH֡^*Cii4qŇߺSq,QLuLO6é P qc0l$g{"z)snFy׸}Ih /@ZK_L[, e1(S#6~z:i("z1Q?]C\=ycz˭׉LYlM:MJkSǽ}:Jذ?n yXb\Xq[&gҝHV)8D{ǯPB:F#猕-Q{׾CRR(0ٌІV㏯q^JfKM=@yǏoSF.NuTVx66W~ kOY%J'6' C~־μ/PmVz)`=q`zꕱeU%P7_F4؞}T 6zGةSfA]^w'l/K/t^~GMRZG?F7-|\fu}cSR??ۋ{><:pĚZT#DI$ C}Qz?Y:V-)?cs6mǿw zu9> U*+7[_T5 UF?޵/|ӸcQa={[|Q{^=q!%$\ x^ 4U߮:j2lU$<a ϝZS_oZRVl~Hd}o^9 o&UKG0hۏǽq]g2dԠHJoڛryO]iy+O^=IZBR~Zc,B?:qZwNiTc5,c >o_ e"}׺ 7I6؆3 ?|zR3GQ?:u RҸ62{)׺'MJjǽyPR[GL/mZx?ߪixej kbO?{LJZ@Jl)p'ItkU׫TX.! juR*N[[Z_r~{@cS O s*z:>B7ImztDĜV/WM$J܏4}KVQa*\x#J0o^cӭpǬ{1Oɵ ?O?O~.D54_Rk:uOR0PzqkGk}8&k lHڌq{3שY-= _8 ߸}oF:șogDB:O9 LL),?T,{1ϕz2TFR}sÇ2T\='? _ז8-La ?p=ӯ}e'^2cBM=uMRVF}#u5xMb?ߺz晬L|Hz|`{mo~?.=zKM`-!d9$~4X_{^|9I5ۑ=׭u,dŪ* @ߺYNA@Ҵ(6&[N+<_~[zt,eHwqk5 >u؊j^"o-; ][WfXjAƷE )V㋓F8kˮk)%<:*#i.?7^$8l0QBG?߇^#Dž,Y製Fn"q\z 4T ROT^[-4~?Աߏ^9"Q1\>xϑއu"*HAxᩬS}OˮdpNQSեtTʿRGH{׾ަjme}K M9ׇZui>%ӏǿy٧ˮKEXqb' l.#x}_RI Z.=֏ u!$<sp, aqRR@AeJtqze<~Zu:Dd^ ?CR>h|zGqZlpD}'u53ؘ@P~=Ν{YW?6LZұMŔH<{cRW;/Ε~<Oz>}{ΧǕX)?~`~ǍFz̙[Ĥ!b9jjo>LLuÏ]hBj l [G7&OǽǭDo80Q-i_`0xiK[x#o~=m*U R؝X?Wߏ^ԨZ'אO7GZ2-)%sn? {iFzE+9_[?:b U^*V\r{-o[މ4Ǯ&5-Q =u2~o/$lzu=JJLnC!6 6a~G84\{-fQp-aZ~~NuLw)֮YQÏV8O?ݚM;>uNշ‚jcԓc};55ozu5[5P\Ͽu'RfPx&P9zT{FO_ߺYG0/ͅ` XzR@AeW[,\ZuT>ڦ_Ǐ뭟>#F槲`8Xk3/=oYZ+iTL8]$Q{TA3{{޼YEU6K#QUu!h~}u UҲlt$=QX؞}gJ&Qkn,H{^Saa!8ҁ<O6ïz!+iP `M8 Zn=ӯyuUD="3ѵۯ~z`ܪ$ ]O}|caeɼ >:Y%HZ4ZiEyjUNO:[}>K#sg={:kX֩\S=H4u&VTX~I- oϽyWuW^-K5=Ň?ǿ|[9lx䃤Q{z|5{o0j(zLj^:R}`PE BM&aK^o^:̉Xl~ҝ_0x7+ K}Q i~0 5H=W*~4d}?{Z׬%j -EϦX /tk׸uڊk}$4t# [Ogog7 fĀVÁ)׀Ղ ko?{ׇY=`#+}W_4tDѭYUAu>qg:)*X)Jև.l׀#5DtU)Ɏ#dERQ?_z:=:)&1caؓ׳뎤, L}?Ӈ!RExZ+ƾxu$rhSv\j_ l׫yLHR.\^*[>Oz֜:QO5EϞ eRmǽ<׆Ou VӢ2 },_{O.GϮ+ZN#P?q\Oв>gR}Ot5~~-߫>zָEɓ~"ǃ+<}u$a*UE[sx=?^EŐz6?UMj_uY1p*#-E}lIo^>NsϨY_?cYs}o_fbk*~1ſ!"'y{Z(풯 +quqiejQ[K x?l@ԥ(g"e""Q{o?o[8*V"3.?܏z.$$~E< e?O{RMML/d%SueU:S,O~>_*h_%Ϥ^3ZcĩOu8oǿu:̦@q$.IUx[߿ֺ^Q|+Us{nO"]oJJ>n(K{^dSե5Fk,+rOߏZj`-b8&[Mo{[SU[r 'pp˯pPR (,p}5ϩ *$tonZ>WIEPsce x?>}\BxUo{^Y@e)Sʉq$1'nS޳ΥFX_QQ0Zdn[$Z],[{kq^}{ʝJ WB?}еȱHS]{:oU5Hy^=I:g{R|q\ᎷS\%u?:^>*E?nɴ? 4x?#߸q\)bMe#Pi~EGZuS@6H?O{xu=w%: Dq+XBAek{+שZi.nmcȾUס{'Ϯ :7 n9+{ ~޴=X~ҕlL8]{[Mƚyusbc _~kN={Yj'JGϯufUXq@pПp2=SPB Ϯbt$SZX~FA{sO>^3XSSa,o*={1*Uny%(_ߏ~]HIՍkEOoMk?ߘy-jYXJn>{4u6*,6^P Hr ͍}ש!X4- "oŕ=N,K%kߨk_.q%7P_#]n8~=hqʈXW$q/8~]fXm ?4Oj;:u$`EO7(.{ ׅ)^"HoI'GםF>8ESs{=&?xϭ҇SVL=s\݀XK"fF<_Z\s1{˯uIܖ9~ `,omcdoǿu4sL5IH<53)Vx< #QuO-ǑE y>׾]JO3jJ#{qozfU{P𴐲{[]]?)x5ͮԘ㘒b?u=gz{HWj7~^I\2K~:D^R3U1 ԏֺͦeҺV_ W߼T'6Y@tzS4ijVU j~}{B 1ȱ[Hz﷯u!V{${CV#cK0zSR嚵XocI=cdSש盥Ee$'߿̴ֺGLkXj~߿qK;+5Fܒ>_~׺1|Wry+-X6pF"_~^uZ N,o)ow}8E =l8S˧O[e̚?|iT?9!bo屷>QZpfg"n /z?԰O{z>hV߳r*{OŸ]/Fi^p~}z={>}8q}Jm?v=}zN+Aԟj[R}?䟯GQѹx*Ѣ ;OɨE` {HDH"j}[-r=~}9%Ek(DZlX'޺RHG*j?6a?SňH?~ufH g}uj( u7Nx{ח[46i6A&ֺW #pO6CߺRB:^8_>ԕ:(*Ԙqt~ UA~H^\|cm܋9~}{ˏYUh؁p7Ӑy[$~]KDǒ5S$v6Ǭ<_IT?21ׇ\Y(ԤVߺ^~KpAhA XgS=JHaMɰ?}=xq2 8%8\9߽+׺ʕ V},Y5NE>i'Zſ{[Tu5\y/?ko+ߟRuA_>׾}gZ<~]{\u"*RJ~?s~>g, ǤmzB#߼^#ۓ EZXD~޽5q{CԲ.VA~ǀ:TWAGr_JyC-NL`K#={*dyTcjwVsI^\s%$7_ [.ϯ}KgqV{^ԤSڄゕ,Q?޼׭ԕ5Aj޵(WڤWrn j1ԁ!\-U"߿ָu*2ҘRf ~˭0=%$7^51{:xCD?Xn'Z}uYa+K~G% -%W/T^xp^Vu^<8%QjiNު$b/r!7#ך$ (k^,Rs׽ކ8 c3 -#;$}}'˭e [ţ}m`P>]kB* g,\Mǽ)xᬲܨocs{z)n?OWGmTZp86UT"׸fF^&bMt PIm`|fB R5K(kojGzMNz U-e}U][~?_*A$gRGcXߨ[=qlPeěm#ibȱF>s#[j@79o?~{Yuһ*m D jhIX{[Bb*?.Dw_~ZRcA +sS8ZʪxğڱǽU%ܥ<~|dG>׿EWx}/';Ϭډ&&V qc}ǽp.mr3з\HeױCQzafe޺/4w2> m6Ͻ瞻XAؙ>AcI>_N%_A *Ki >׽z!r+M:~fZz%M*>io{5]M Acf>?C޴׺̫NT~y_.E*ܑf#6ߏ:&A 7r ~džxu,ME7a9~u^G+;Ջ<(_~r~Mឳ#bSqLL6Zׯu SJ,$%oNEz擂opkTħ>x1ì,W#_kߏ^똚ʢL,<H>S׼\u(<}tjTu\c^E8-q"߁r4>׺jroHwvJ~HԱS靯{p~u0+@GK/$o4^?oR!hT*xUp?N ּz>TZc ^Hfc,$=<VߤJM*I:p2MO#k iǞ5>q=n}L@XX |Bַ~Rq3 ;j(5\_ziӍc)@?o~ qjj(YަSoߏǿ{ԕ@Y.$n*+\>:̐MPD݁Zqs\[U_~޲^Z}Knu`jUӏ"RI38>0Z5-SWo<^1UB K#}z`@?o/=$].@OZ0ExI{׾֔nu^zFX)n{^SSd#R8{[믵!P 7ԥ G]{m걨GE=3 @oϽu=g4ns_>K^Q}}jYɴ E=oMRX$ۢkߺYYW[h~E[@~P[-pV_>mnJ4/s~ÇZԟ;GdY1d~n?xlOc>ǩC"Ůy׺a,1JHߺzU'^O!RxL#gu!i2/~'PT@7߿׾ޤ-=o JĀ-so~)׼]KTzdcCoì:׉c\ݪi"}ǯ}KI4FxԤ>}{ZTK.ZX}unxᤤq3q={ϮbpXV_Ac|y WΆ]5 >ϯyu*Qxo?6@:\ူYo.cp}ϯy u: 7ԬseyOOz9#fe?e_XA^JNyS.(qo.>PӬtu#א)?_~Z됫ͺx c^S]Mu3m8>ԴjY֪7ShXԧS*j`O_>I{~HQiV?4M`WHY !kK]^@&{z<Y7O9}< އ[88'>~t-PXpH_ߏ˯`Ԯ.grT~=$#_Z\_<~ <蓏SL\@5@qvj^dk9^rz"Cp*Wߢ_R },=iNX9x /O~4׺ʴ,>!{Usuﳮo֒q8ͮQu y.ZH{.a&~]s /cL?Ň@AuˬHJF ?#G}{ZBK)pָzJb o,g_~]x“`=3-οAoE J`PttcauYjO)$I:רYJr>:\X$ p "}uQb3˯u)K?^$DuRYcT+u} ׾޽4S=՚}?+ױԅJu[TTauxſSkܛ,ǯc-kB9ޑ ~ԧYիg'$ HލxT P—$Z@5Vw䁎b }<=g+V&Cż=ZSM',5Xo9e#߸p:)炌9ּǃ#߫Zfm%'SaLP iONON=IdEҭG` <77Ў?1R8u?o\|R.٨$~XPc=:O^lISVOϙI}=<|ם|%`IQb/pu}3ԃn4C_ll?*z}x|]|/ǹc [Lg|Ez1+QX^s N=pײ>Χ ;8CfH[ߎ:'^1  ފ.9'=\tʼ"mz4lOϿ}}ePM<RiS{_z[C{l/c^C:5SW{ZտFԀOlsrq p1G>׺%*~[CoϿuֽ.[o:iz~,PZ\ٌn/u?}{[ % \]NH%~{^ @y_:eֺ駧[IuR~~muJui2': #.N%LܢykD7~]J qa"o%cuA!LBbƌ5{Z^3qm!}VRP^UrH1l'od[:Zu1fk[#"+o{gYUQY'r|$}uj#* \c>utf㟮BS -AN+&6y׺#*)խ ^\~z0>MSGub(?K z׼u?$ 1Ԓu;ֆyY`ö́W=C60齮%^`W:K5ȱ?߸WRIH,tY[^*) }x'~u8:v,]?[}>xPRMR5hGЏ׾ާ$h`2IZ#׼r" 4oqqgzRDGN'߇dJJ0o\u z*B>~q7u>~ε9D#H&sQR﷯z ,Jܰ P|>޲%3BG,I97<:P I0@eHވ[1sk n Nm_Ni?<@7>QDsv;_[&?۰RĎ4Rc{'dbdZi+TH sͿRկ:@](S ߆|U{S7_O~A7־m,R/Oo~ߗRW#6LFN.|jm߼YD8E=6L^m©ur>?7H܎uK׌>Z [71=ui[$Ӏ X _} ?EzM ؟~]ph%Ss34, <)﷯uڤ  TWt?u+8  Qk> :E ~[t{^sSf {H9/Ru﷮_q9w"4@Jַ@4}9k#Q`oa]oT{sb`x8>׺P@[XZ eh#Jk~3˯xkV'ְ ׾޼mz:nn#k,HϿpֺ2B}c?oRn q`(bKaaԴڥB@?Ɣu `KBxN [Ql,*@;d3? ZUFobA'SOcZOt+)o{}p#oP2~.d k@>ߺYPGzWQI﷬."y +?O~Z57\Hϓioz[ԕ?J*_o?B a?.+UmU~*VSSo{HJ/(p@yoޥe{3_>urX5xS{ׇY%L[].xDߩ%N59qjd]xdhATΗvMk 4>}j]s M~*lq`-p H4H~p'Dq$qnmio_ޅG^E,*E&TmtoY+Η?KN\6\} Ɲi:J(v?{{>]Xv륨4!0ҫ,R_ 519L>k_׽T_.^0G~}hIO`cR[nڹO<_㌓YWKXO-Cկ:XMH'11>Ѓ[~εQMz7f8K V ׸dupSl 6zZ˯\^bZssNA2a)dxyn}ߗYV-/~m MotRRJx8b'k6  iX_c[~~ Ӟ s{XjeR@HS Zq׾޺ZRVOۥܔK?{^!_!{ǪO# @^>(osq}{=v&N-L>R,Gpߗ\40?i귿uUz*Gڦ7{^u$c)Oz摂n ~Ԉ[XZ/n=:"K:$[ILOyӭ*FE9EyY,uqdː&{:kuYI?C@WK_߾}{zMZ/W?,zR^5S 9?O{]{=dZl/6-n8 _޳Zu vK ġA_A6Pu|ȕT6ORG:-ki|=zù ߛ@Y+׸&-Y@PG6' E#ǯh\啛QP=={Uv2@ lK $+]O ߨ|u($Tor>oMВtoz=pQ\lijt!OIQ$?Q] jͿj::Ȱ/0c弗u:a |pK5/k cQ<Y⥢bʐ#oEoߪ=zpӄTZ?J6~=buC\6z)Rߨ?Z}88)׭/u*?_#տyᓐjlƕ@?,j׺r-䧱(a>׺р~}o-!sPqzod?5oAZ끉so{^ĐѨ{ן^Sk5 ^c۞-roϽ}sW _޽G[TH;!UI i@m{{iOSͪ}n[{GPQ#.O~o6>k_Vmkoi^],ui3{:Dt2mxQoCϽ}z,uQ 5mR$< ǩ HH5lt8ʼ$u߆ex[PL߱׾γD .iԟ~{׉ɏUS$b-{^͒k[/?پ׏\xVoԲ?7 ڝX߽:z)>Q; <[TI4So~]tHǘ _9*mWpMJ)V^ @ jBu>,E^c6 ~?W޳"Q ꮥ_Վ>GWPZ!qdҘKPEU1{0}}spQBR5R^DkpODռ]} ܋R?N.YI u_Y&(7pQn/t]g e6sHY48OMq_{:XJX$Ono'~[:Fm" LK9[h):qǬ%Z'隴ا:G ӬFx=W/Q }=g\vTꪮcȆ3xs65OCHHXf B=uN4wa ׾]{LG6&n~C~ϗZWT qs%cc{˭eaqTl=Tl{^uTf/}:u~}z}qBv'}u/ {~6Хh:A$PmH]z: <5E[pzzQk\ Sjª{^?g\ dױ<!\V\z>~}U%Sc}huͤiɿdߏu$uqJȪGSz^N}^bGcsJ%Uk_{u.9c]o#xS5=K8,oU< m{^R<3\O ݦNWǮj)qXaΟa,s| A?@u׼GԃŴ)垵GzuP~a loʎ}=gV'Ef/҇% ZG_., Nj Ԇ\{*O[qUdJ~43[oo{1־u5f#OnOԪ~,_:ubnm&`=c^ǯY/K![#LQF`2P~}}N{YDHQH"Ʈ)[ߨ+_>O]1XTӎmcɹ zGהbo,oYoBGg׭e *z?*Gaǿp}kk]Bm9`iR~=x|TvǍ_"y@.JMWE,G > }o/?O1~n%R@'}{>/^:PPN[ GZ`uzOZW;QU{uz_GWN^!>ON,?%/R*]e)Ƨ܏R+c=ꞝooW:쨉m>_g[hh_.{?>eP[n@^;mB@I{1N@z9GK+muuUZ5" ?>4}-w1I[SïSӬe_a 5}{Qաۅ<}OT ~xq^2JԊ1o^:H_ЊQܑb}dW˯u2?m!_U,JǤz:|0$žZǓc,gP>PQ/uo0BG8}}_.FQqbD zTs^Ax}/b*e@mS_1ױa@0mԃ}ǬM0,?-I_{/ cEje6?AL߫׈4|*唞MmT[x }<)_r/>(Zzʴ{4 {hO {rHwc&Bވfzө [o~ON#q X->:XswSkK;}>Q{ѯW*:hІZT؞H什 :'V_{ZءtkRdMx,T~G2([2ߺXT}4?_&>_ [jco _A׺Dlh<,. =u31~c'߾}oybhpX_T~Gy䔷-?Q{wk*TR"x]{K% Z8Gτ{[Rޤ n~=z\Kb|@}>֨ E׺RĊp>sGTGDO~|:1*2G%E%G5S~uﳮոǏPQI~]v%et?A G?ߺO"68:@=uثJm_Y*?qrSf\[Za;{]rI\j) ?Ͻ|;khKCQZH*뤑>׺SvP[I8Z{Z`%Px WM ߺxu ő$4T W׿~X-[pߺ\zX$[=F5$׿uy7V:/8~I x}^׸[ M+PjO]{]_KFIb/ddSL$Fqxb-kܨ}]sLơI AQ׳Jyu)K6ƿǿWucv0Վ<#Éqա{Xń}=^?>X =S ?VA?[ѧx.2,EHk}o}> ^뿶Tf54>j3Lu=xefsoA,t5e%H7tТnRE9^[%+-huʼn)kdeѦc *1ŽNE%(TL o@^mGMFX{_]@L#%l8ߖ BoMr'7~}z3 mV%MO 8ujjsKJgfasaBz:AK;A`so}֣[sQ)-aiZ궄x=>}TZ"t~?͛椞}g=g]a}#/9ؒ/Gu*rzʏ"cѫڮ?R4׭GYU([#O{kֳi$38ym׺VG# %׺iߢqΪyf׿.Iԩ7ߺYR#IWZ"]r ~yX}{dnWߚbI#S=:YBC/ezno5߿׺א/X4 s,ronֺ ꎜ=F(.GzX"cov{^뒴 x:1zu]xXbQ U ğuK r?ozH[NSێm~}f Q`?A5<Ҏ?>׼/ZaŅEO>׺L_ꕏU{Zoo~x rXZPj{zzL z)iG&s%kǬ~ 8E}[맥X`k`߿>: )iJ?Bm>׿ז4=qz,Ûi9 ǨOu¾}u=AG{^U"\fp.8UX}{v%D-Ir}=[p(P ?Q!-Ucom ek_ǽunF O]XT2Pu#í6c릩 ղ~y}=u,:oq?[{zYR ZI}H-co׮b5& p?$߼]XZ0){:]k~AO5~{]sjrhx-S\ǽu^bNu^uV妨 2JqϽu눎#Ȗ~UfkzR֎y 8OֺhĹ%}I_Mǿ> zu8*X\i}׺ʴ u[o-sj?ᤎBEǿyuu)XN?䕉=:] ~63b[ΟS~O9jRboJ}uSA1G?O{m?¡Oqk}٧^lUͱ*O곀 aƾ]{Ycyo+;o#p4능!!$ v<ުzzX@O6{Z]54~K)?1S"{t'BPM O9+z_M/ڂ8 m{;x[Z?ׇY1%-*y<^'YG7$&~b=z^ńS>^8u| o%X_P/{ן|=wUxbW>몡?[zYSNTnM=9f`4'ީ\Ny?0de@WjS"rMaHjh8 tYZ炴16,,?qX#Z 2D>{Mi׸u K^ : ۏ~i=b?uX),Oħ?_{O]xzFV H`U}z-'#\4έǿ/Z=GaCᜆ|zܬ oׅxߒYCb?^ zȯjx׬O@Ϫ'J0x׾~}dYil~VtX[ߺ\Ӑb~m B~׺Zbk^r}>|^'xPHǽ~LGDjP4VO̫k{Z#qroն߽:z&]9QU־޲$Dێ 76_~[zQn~O ?)=q34 OЙfSOտ>׺̆ڨ1S*-}yu+TEqGl/kz{<\-Hyia[_0 ]@_`o\ɡ ZEհU@׺KJ,rooqA5?D\<z]voZyQBs"jzYQ&"S0_V ~}oĶ%7,H"B oaȿs{$Կ#~O|S4KoSuXCqKPIZ߿yӯp?p,lZ^?ֿu<럞&Iё6y^ǟRQ$Dܟ$^]o߾޼~޳EO nbߏ8{׮_gP<^꜏#R>ky5LU6~yG[8îK}>Z`HO _Zq:rĠI[ʄ{yQȚ@mk #GO!ކx:%rVf"z`8 A}רzEPv+z$'[.\׭g+d~H }:\DULxs&<;MU{}u~]gZz P*v"mcǽW׸u!h#Z㝾klWe?~]{mG9$@l@mW8>G$KR@cް<:TSV \9S:A%6!ȿ*M7cuįqȥ>ucoʘ]Gy!VlŽM`@+Q=3Xz q"m^Z)>wd-6-~zU{O얥ƨ_/V3G|g_v[eb_~^M\4dXra{Lk Ɛ*[T^n7"i~}{ulȄ?{^뉆:"_{B*{%< X}NhMǿu/)?/kV.c6 Ouid-Jԅ}uSԒIfTn*o׿yӯu-#@m7uSxM,[K\/>+ì%?Q6f#߾=kj?7{y}?6{[뚴`ߥ,gFk^k[V{ˬ ?P~\jR<ߺY,=/ݿZ"G|^:@wX9߄^ ASN ?Ϯݥ)#}׺Ӳ}*I#к}Vߏ^QI]#dX Uck~u5tEeO׺7X9.e<~ا\&LzXXptG~^\}A_k~ֽ: I]w7Uac =.GLǏO^]:?\?:]{Efa߰z:TCM^>}?߿׾}p3KcΞqkH?pvP0_{\_PRErU%E" >)d ~?߼G$TfVPkf{hX2-zo~^eZ86Jܭ QozzY|!y s7}N}k6N:d>V4?\u@K_룸{Y8K]--Dmſ>_:]HsC'^ǏYY[RjHcx?ֿ>;Ua1BX :z<+1̪>’saf=x2}8yvvVCT;ZSxuVIc42p뀧>$~-lzix?f:׺cUP#%>5m$οQJR>_r%iV\[1!Xx;O~]վ[9?N)m"uUѪd{QxM @* .ďz^jR2HA$dۏ?{oY O!7ߺ?,*@:Z@_~S`u﷮i#o1{r8o߳ϮޢD*Ƙg/e[^uWd`K\?X^ n9گ͹,lA:u }Z d9 zNr}:ȵ[oH~}s MWփ*FZ}^=pc{_scϠ{u,O1Qd'֫=zu#S:@~,a}ׯ]\@h~+־λJcȾ4u`_BHjͯߏu[<+(*YTZCD_nuc񑬋I$G_{ϭz&EolE6/A4?o^ǩ?kSh':dkZny NUIOZyc֍<*\媚|VZSX'vZ;!e^d?ixck{^'?)?}?WǿW~}.>y#}@Gu]?hߺ^t$R㋋lndo~NrbI ^k׿[M0XM6gY5%R؏ɾ߫׾a;|OUa 4_ǿuu -4NEM\9kۉů?ZZ̖Tے*'< P?|xEF_F0<ʕJC~Vhۓ橔uܲ흏8>kaY׸X|ب 7kAX%O06 paa}h#ag`P.OM~Uy5b{\HX{ko~ֺ̫7N8?]U-Ͽq=zgPdB~c+۟ǿu}s Ieլ89~ Oϯu@B~o_z{O]Yz>}Omu7ߺ\v>Cq XI?{^(jb`M%\X}4$ŏ~ˮB9OG͹4\.o <^S7 O{| <>p>#N^{^됢C@׋K=uX2瀷c)]}ϘX~E0^(6safa{b(!*.H7<Y"]o)KM@i᡿P-n8o ?O޺]h`l%H뢉 n}]yVҭ*\ZYhׁAKj~޺X|66&+h{^oU2Oks޺bY!c_sZ}r0#D`5Uǿu3N9v$?5S)?pQa]olk~xozzzsb`kj[V#{]sWHnmto0j"`?ߺ?.+sM(է bν{sA)pq?R^ǏEBT~ "}-"mzQ~}xun{=z][]m\>׼[03}-S{[/ᓞA6A"4>׺j2yzGԚu'qߺ^"hy~=׼_,M@OEH{c6jM[{^uț+~2Q<a{ϯWӬbjO*W#xu^fzc@C>ׅ<@-ML,>p[]׺o[o<5qAb~so~7_LBKf{ZSf VO~vJHqHk}ߩ׺Y:%O5ֺڦq]C'߰:Xbղ7?䱨ӥRSc~^f+jSD~g\:ÑUU'CxQԱ"-zg#)\\H<_{잲bOۛ}l@}ï~U( 7:yS;< X~QSz\E-B4V}{uF[ $ܟ~{YԂ~EQ Ho^PjS:?4?ߏ^ូU> #Sk1'#BYG;}Hɟi%^:fZI2I =|bV@<~]vK-'?XpXT0zyuU0?mߨ:I돎?[%żDl?Pˮ_hR+8%_͹ ^JU9EYƗ%*zSO{*2:|sk R>8#'>8$u5*P#X>6 [{ϯuŨRnǪ&m{^GR rb)uZ믷G@&Oߗ[Pi5_O^=ks]p a !׽:ȵYVQ֫Mߗ^:R*z }|Ȋ ԰}{`1?Ju:Ԑd&@uP$ꚋU_ߺ^>;ݦ^bL_2}}x}Y,xZ렱 _E->׺{z~͘_n}wVʉO.okc-`T6?'m{O9'#߫׏Xo`>׺Y>RQcNn=$o`<^k׉Ԥ}}u,U:}[j54㋐Uߺ^Uba}{-U ?.3(X^랺}4bS{Y|BM1aR}luڳ(HT~[͸>0҂ u>)Tp~Zā?:8PӪ5գAתzP-h,-o{˯uؖ8E(^-{RsSbx6Ν{x-;>!ǽ-%1?"_=1}JiMe>yHˮmMpP>N@A,_~ԧQژ$A+?-WP[@uFYdO75p<%Zuzu$}hi06֫:b8jrOu|kYTɸQ~զ(:q'"*G <_$A﷯62u P,/?ϯ6d.+?ҥ>}z\>_Y/oՊ#߫dkٰ ?אğuTTc*ܑxu%UJX~r O0?\ߺ\kAaV^7#`ϮL}n&?z|:LcyxK4֋^5f<!<}"}=ɍI } koXZ&)?q`01TRa`?G"q:?XhT)b'߳6,>\M܀?ߺ]O_'g98>׼>eXcu66^%ן:mnee@~=u!$ӷ<޼}o׬bM 8DW^^_uSjD]l}yՇB~{]qA}toƨ6矵[{=:] :E^<ׇ]<HV_XSu (x $\U[?^=TCjP? O%Q6?BϿuvt?YͿr~d(-Oy Sn*'88[M_ d_ N$~o^=Gx(֕ #ߏ^>V@?X^ez˯W/薑C"={\ĵDr m'Ud sS"W jiFUZTխ 2\$ӂğ߸*TG?fߺYEL4wQ[߈zRdkbjp~ߟY91:6Ss5gԒ?'dumޚApAkutK[x}>_1CDx'[׸U l,H0<ǿPIZec# W'kanOpz>/&7kV#qu^{?,y=FG77ᗎ}^q/64[\r%GĔ&{{{^~ dF~.ФM;?\^@}I>׺i^zЭp{؏96ߺ&B ~>ߏ{^E5TxYx#rO~o\ςl>yG}uKX[׺zp, `XIjķ_o BǏzcF E{]t{uyE+< :PCpm_}u<&*a uʄuK}#6hy:oﳭc!6pO}}uH(]}/~7ߺ\LHoK~ ȧkϯuhϮ(sp?~^륣~݇'KUX}b>Ey8ꈏVۛ/կ^Qބk2qo=<<+3 _H>cyA6QHßp~}q0aZ8Zߎ=V?>׸uЧů֟ccr^?>_YUqX5 ޾gW>"ȴOK}}P(`?߰:]G{PMoO6<5 5Qe{W} EX}AmO5O6P#}5VXd?M%Ze6p:5Jj0$[S A>Gx-?N: 䗍}~^OX&lwz{ZN9}U\r k~KH 56x@l$[C"׺[ P`}׺!${[0T}E[qߺ^0,ZT;{^땤Xuxe )!oF[Gu9ŴBOM%{){ 8 }A~}u׆FQߺ]i8-g3^\~ ZOP>_Zƚ?Cj~Kq=ucO ߟߺ^TXe C~q@F;Hmo\s׺=o$C{OO3/oo?X@8E?z}{;TFl_}k=v?CDGa_g^~Yn_߸@?OTO޺C$#N9S{n-:^U7f~W׾νg[~p\'Dx5p!~^ c_Qo~j.RO.X2 ' '߳שSJOo ?lF{ˬk?A$ yIb>}wzK+ A,}^S%%+f~u>F/"܁A׫OPi3Soi`1ϯye"|ҵ.?~?>.0d (uT[ߏ^H k *_5)װAׇr$2URx?uuk+ާe%e?S!Rc]8&9íU뀬0_a=I qzLeЊy J+_~^=r8F?nooީk}S/I{ի8h?"֗ߺ\8 K&M~O,akX}I'ߺ]D8U64/d*Vn?>>׺*PI0 }XͿ_߾]{<V?puy7_6Qoԋzg"5I?R8F[߫^˞4op=P1b ] _TK$sNO'=u!XL@b`\[ߺ]cOl?m{wv㉩ s8{A_)aZ-9_$I?h)G$) {Z랆4AF=u1~ÑF>׺L-"kr=S&y06Hmz['")n8R0~u훆SM6>׺WQZN SnuNm uS;)\ͽ{!̿To}{Q3۬"CX $bZQ<~Hǿp>Dv$:A'>DYz!hDl~G^ E-)O%ZQ|zekk&8pH?nI>ֺ@icBoX]!{1ז TR7,ן ?=GBϫָOu "O]B?|\]YI "_BΠ< "* 2 0o_WS_,OOTomUT?jGUߍ+%ϯuePVe؟h]s T-5Cȵ}8?ۃ3N/4H܃ƾ{]5:*j2ZK׳ǬBX7n-oϿuﱕ ?Jz )Lz<@=l}bjy U51WjCK!p뇂O]j;eq8d'4{%2.>~? 052_Lu ax׾􆜷L2nY>b.?^eapUr!PTW:qo~f ^?/?P_~w'ok?^ڟmK y>>~6î%e7Ek{n?=uJ8H(-k!HqZ8ȿOv@ ^f?TQu~?kK{^zk3n?EaS}l׭%ǐMq<hNzf jBejG]_9y c?J]tbOtS&^A&ׄv+렳OF}o?O{Z%` -~A'ߺ^jU:Tީ}yjG?_Mi=~}rɎ#Q?O~qjobeoԃkF\ J%_#'޺=zj)C{<Q[끚}3Msp/{ZV' ׍M)T+}6SQi[l{[ϯ]TtlM#o7`߿.{ p%o%߫ïyuPEM7w _ߍ:\JЦğΛ ^î̕enJ y$ L:mo"դM$oTq>׺Ouěy *|b\tߺ]"s5Ey\ԏnq&P4_Ĵ5ſ XsZ%g[Asu'+fmB&RU}IVyozֿ>uCUpH-'T{qn|U\7~uJWe}={:Ӑyj9+?C`[uHYCꮤLu<QL_Dr/6_vZèK TqCNN.20&p)oM<O~}oI3&VR98q#~^X~O>?Oש!j#ё*䄫<{^"* ^0}uMu ~M12_{hf"Hj'L=u%R%Ă׺|gR?u>.-$>׺ A<t=u|Rtno׺Φ6oK>׺sG=u\\]ר{zXEsc}{WAo*V>íӮ@58Soܧ+ |qozuI No<{˭т6VLkܹ^] Dn86G7?KθǮ%hxc݂OutiRGA]{&p 0k﷭:ѕ*zsL}{pgk Loc~oi\:Q]5zzCT?tϯyuDG,xX)t{[B>1.Guuxom"H>E#޿ʪF>۟~^\Jθ'u? _Z\SpuXJ[]oASŕɰ2ߺ\ZhOJsL{c+L5C^* @?hᤆË~%?]F$za0+aYu~ϯWb8TqT?z׾βD3^!d5w߰:Y #>IbSTo:c ſ:&||p=>]x}y[ I-:O$M5`?{^=c:jJ]R5w)׏^ V>?@&U5Moh靅H^!=ϭE3Tk={\M,oy?'}co'+80ʍ/kǿSWuH>d+Ŀ_{tLA?OHKߪ>]kܟ aܐ=׭-}Vaɷ$}j@a?=9끆!*fK2?==zEҿTϧ׺lP$1S,ro@׺e ":y }}u6*zFXs}IBOţ~NBO4c~wTG7f6u$@yGֱmNߺYbSk"޿׿^P5aޚ׾}qElO~뫒. m]{֛^K{dO-@}U`}ϭ65?2}~uϊ+S!'`uo/pKx~߳~l"co~]pdoA.o'T.I7W T<_~gc שS ?_/\'Bg_>־޲*ґ?L9.1-S[@GЅ?n}:\Kc奐lDs)7ԙױPGS0^e! ږɋ~`4=MR>H_~]`jBm<%nnmp){ zJT2.E{[@?LZ눢@Nvg>D{[Ns߃~o_*@NMF"*bԴn3ߺ]<}?K]X6u#)qMNc` Fo~{"{qAF,?Ja`uVM5INE5Ogϯua#OO&j?_P~]kmTqO67uuaackob{Zi6Bm%k{=:xЖ1"׺uteEe ׺rȡQcַ{^)ԍkr #$_~e@vVX~9_A{^Riqkkmɺ^_~ff|'޺\΂`{?_{xǏ-} 8{ˮ oX_ߺzUo 1Hsߺ\L21EzAb{^돈PxQǯ N_Guh\V"oԉ<׺(}"Wo<{^ x`?޺\L2"tt>_khccEJA>׺qJM=7~c+-#a] Xk[ btCnH4}@ߺX[͍exu Q@I׺D@Ԕ2oqcu$$ ҩt#<s~ֺ ?m}/&HԐ'Tb {~A5H>~p>D.{^뉰׸:k1Ź,5ߞo_ߺ^1ow\_~gׯUo@Z[Ⱥc:uoߡ/[Q(O>9T\\~OuhD!(~<8u]4 b?C8"'}׺cri?лQ{ioLj2O<uX4M=@g}uYÃ͹0Tuu&G#km.-\7%:Xq {ǯߋ[ bv$y#M5nѯӑZ-B>]lu5nΦH'} ySM75_o[{]D4y`<:\%~Jvu>.@z OZ[}j=ϭpz}L,ݙ&q uENKYH6n$c{ߟPުA6y+(6a_zpj_Z;SuooY=uy4j~H :}ڽfo}Ou~_߿׽z~5~}:'oMߺ:>H?7_?=?ˬ?ͿF}Ə:~}^5}O [ݼ]ί?׳N?=ϯ^??zo>u??W9O{Go?ikckzXɽ:UΏMco >iN.=G6 1-eZǏozmqίzϕ+^|w׿ZaouakX[1\-ǿu~}q{3ǟY'mӯ~νm_{WK}xjyN+u _}oϿb{e5H^?%V{^\O_m:uo{f?.x[_zufa?ôkzZ6=G_q~oax'o_m{-O7no^b:دsܿao}4ݭbƝq~5batik-1.9.orig/samples/tests/resources/images/operaSteps.jpg0000644000175000017500000007773113063003311023657 0ustar mans0954mans0954JFIFHH)5ExifMM*!(iEASTMAN KODAK COMPANYKODAK DX3900 ZOOM DIGITAL CAMERAhp"0210x    |Ƞ0100pld8 2002:01:17 03:30:182002:01:17 03:30:18K 2  I KDK INFODX3900 p#61Q1Q//JQdd dx{~nfn >p+}U&&; ;P.22+2,wGGGKQQPRLRO=UJQتUUUUUUJQ8u[PC :(Q" s3Fe𹑪UU/k #}FW6,z0"q3d('.1  q\QE<'q\QF<3\/ d3\3\3\ w :mnL'nLnUUUnLn w :mnL'nLnUUUnLn w :mnL'nLnUUUnLndR980100( HH     x! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?YFSؚ5O+8'at??jqRa? oEOD>7@}S?Z_t,_ȇp0 ? }wAxoO\67nsڷ>,_ȇp?uq  /aV7G@][n?P/TC/ uot`տ wbEOD>/aV7G@][n?P/TC/ `տak wbEOD>/ga=}y_#.}R% cҞӵ2mҜ#ӹ=ӚP;SvoU.OPL/ ҀlI~1?t'>Y! ڜFZ )?Zb;=Gbu4i$v Yُ*INJ)MF1MݒKV譸$$nRvնf=ݽudKh\7#>Y`q&nJ,>cPo rK~l: B5NI-̺lݴ_/Nףs Rǽ]+t1c‹]1)3YݿG|T1ڝO b릷Ze26OPyff8UUbUevXwnnr@iCȫ*5UMUI?KGaSХF\xE]QzG rXn;}H Xv(3+<7p]RF۴ 94Cd]L6(EU[e٬++Ƨf>t֞z_KW?/.lRҐ:qi<.]&.q6{S }H!cq$>f7ӜONɀ\FJj,\`aӖ\Ok D:jF]K4:r׺(6v%ռ7F?:U.`QUNڤ#5$ӕ*)GNrx#Kqߧ&M)ҝg }ӸL1.5U3zԂg͚lp[Qap vj>gvuO@ Vuj*Fr7+.:Щ^:40󓲻0U;~VV%o-UUH|>]W9E>zxF#eƧ2g~nG7LĢ <:k-aF U=թnSG ^\?Tpx `;**Cx<,j-.OK,#QN<СAUYrOωΓދit.u\ԡ;cn؃Ea)Q xRqgEp9_\,-hG݂_;w]P6{lt_ O)J)4eexO9?u54 diU&B~fw,ǞIy]Fiki-c9rSy1_EfN1m9iw屽'&lAkQDu%`u-KQS'x';I )[#Ef)ݝݭF`I7t/Fd k`Z,FL(@zq S," p-p_烖ZOٸ'WwMZSRIOekZ_s"2@bsn99oKצզ*ZG.&x5f1UU\V/\|kn1hl=/ӥNe(RW鬭}x f(m?MI漐A}Hd(UP@"r,0\0$"I_h~/v2j6y-I[Xw?FVQQ&! S LKω/Oe@ 7,m{ZSt(m(U=܊V1:poTוpo_Z=mk.讷G@//o'#(1'=k>/8"4;8t h2Aq,pHT%QMRkVZg-?'^0iFc-攛QoZc<`&e&n!d;zƧAp2j=#YK {+vo![*G . o%Oڬ*+9jOݴo1iQs܊z/!R#~kxi-}f+#iUh('qp:c'y+֕.ҭZIE[)ӧ T>In i:*Ē'xތs1[)N 8P >]#SZVrIN v2-uZQ@nbda$XFU@\0*o%)/+H#ȁ݂ eBbrN(XP5gufՓZ֋{-%S>Jb03-y~l7@JHe[3WEܥ,s'v | ݿZIK;@l}j߽m>M-[b[GW T 33QӽwUۮǕk+v} rIi GaLubu:M6 Y$ymmfH@>byNFg8רF3c(>m);ziԔ#OJ0IZ]4^f ^V5($8>r9Q6q9ClY""${c]" =[^1=q]ڼ8oZ>XUeYTiEZ #gIѦ]6:{_"5%pd&ih R& ,K8<8.XrI$ko_V՛9rvOWʯ^5/)HdKb`0Y{zW_c.4cGX2.v `NJ5*rڔܔk]6+SNQq6sRI[Yb٧+Sҩ*0U[#R5O9|0Ϩ^ U_Rzѫ]]oe|&+WV.i9-7Q[i.kk/9WGMrwX+<'i;sv >3+ /w PӊᄋgW"{X#wp峊IY=t-(<+q@qf7ڳOc^"QogM7wӭ@$$99y_ʦV08-'tkrw\}mC#?S=|<[zz}=g/%F?($ˌ}?׷Si~mԌo  ;{Sf7B}? 5m6{? ՝_G{Sx 0(c;K c۫Z 8c$H_\iJMJQnrmQM|2[;2OStYA<  ίA]K|m8OϏcK}S#CO m?6oZ]ƗG?9ۺ5_m)ZՇ\^GV?9]]cU?[)Z? iϪ=_S/޴?/mKcTۏ9G> տO_ WsZljۏ.>i!z/c:?\OoT{j/oʂ}OR]:g;gEpERI48&j)5T6y6,:n85z$7SF>\RkX=umLo':TܥNݸՊJ5&)4^Photoshop 3.08BIM ResolutionHH8BIM FX Global Lighting Angle8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIMGuides@@8BIM URL overrides8BIMSlices@200201180523201@8BIMICC Untagged Flag8BIMLayer ID Generator Base8BIM New Windows Thumbnail pKPbp JFIFHHAdobed            Kp"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? N1t"0ᨡB=vƥ>m=*s N/nRGdžs<0CZ3~L0K4F|9yV lZ~\7F̍i|MsU?ήFާE[wese~Ķ%jk&,V6&,J3B5J빭cn.tv g鯱k 8IŊYf!c3miΦ*̧k5UM'!p=sUumc[ܛ;+%vG_O:[;^,s!wkl C=et쌲C:hڱLg6_?ل#=R,ƴ ^;I0Q).ݍuncf6z]v/CnulvoV8 ]@|w9O j=WSku5t۶Ϳb~}bɳ;2ܻ!l8 O=5u$lWf.o3(ʿxr&bczȋ"_eTzflmm`ssş?_kwq Ǹ5m?9 DMM?HʦJW M?.GO?wHhVusCh-cwݮs?;/_]6ŮX]>D%wpaUVc UnןcQYkAޢ?*DpLZ_N;*$CSZAThƢk ucQsXlW=JU ٵѻo+J+pLsf?H[d%hJPhJ(ILa(RJRД'I%- BxJSO ҄% ҄% (IKBP$% $(JSJ4$0)% )% P$)BI)Ԯ% o8:P҄P% PJZ(JRВxO !'$<'RО(MK^1Q P3Z/ǎY$#d*ח8xv.Ws1x?Itíen~̏Ms*7Hy=Wowֺ_[ȗX΍]j繎g/9?_6O/×d;+r(g{ 2vߢ2ƜN%Z*`0w]>NS{MDwTϱG)"dlG[k)wU"7lq?zվ[{kƢZcWqXG_ǗlՈM`hqɬGb.wխBgAnfD t]%uG#ˮ[ wkotLòҥ{ pTKkoW}Ec2@ig_~}.[kymY,?]=-q\;3qDz?NOqTerRi9BI(IKBI(IKBJIBJc B% )hJP<% )hI<% )hI<%)hJPP B b)Bd&R1IJ 0%I<- hJxIKBJP$(O %,$)hN'BP<->juNpĘl9زb, zoKm9ygìnspg|<\of>ˋ\59w:83;=JXo{'5CLu ޭ쬷HVkigIsqKӊ?,YÂ!f~i&[;fk>-,z|~eŒvI*Ig+)a%yW~kbY,l7rDc.]o6aғ+?Up[`>_j:Tnv>B~V]۬Z#qpذzxwY9h4d{lxe`HӒZ$ƥEhОJ.5A 8UnI4(ФD:v.}SrU3'TkGn5DԨzAtJXO:e2Fpf䘩bk>-MR򙽼=1sXr/H$9 ȧ<'%- B% )'$(O BJZSJ(ILa(R%1J(M )hL BJb&hR%1JBJc B&IO֌% P- hO (AK'J*Y(O %- BxJBPO itQa79:?,s4#dŊyd!GW?ٲsy8#Æ!dw,ss:YtZ>7Bvl>kK?J}#nF@-o[Y0nlYR Ń0)3YqcƴLjyoWߑml/{O{I$&I:B$q5'yu,SA%{4RkAUg!(RJ&cB5G*>GC Oa6c`Yk7HlD1< #doF9T?xp+TCú%Iԏ!5Eo ?wK\, j{趺cgYMt>O/~ա(RJJ(IKBPJc B% )% P$0PP BJc B% )$ BJc B&&(JSJ(IL!(SВhSВt8[JKjJbԶ':JZ J”+7}O^<4'3.XbF+IY*=eO\ʏUٍ,¨ìxn}cn ˳]#-Gḏ>I 7;;+圜XgsyY8#}8!CYHrS򲎼5豽nt.7'1_5;OJ7DMe7NkX[> oLVd4/ު }ZD3P_[v!zT?zL;xV1QRrOޘLTL. AJ!R*~VܬckB[$/ ~ U̵6Ӆv5oppf^ 8HP:e;3Q54>K;ǧ]App'te504}!oūW h- Mi|/-K\ ?dJP-!' ZSO (IKBPxJRД'%- J(JSJ(ILa(R)% P$0)BhILa(R$$$u)AH8w JS)op4'IKB>**%w nw`Hb,2E :{,SuCu,wbgDܗk?=OrlEt gRp~ّ~boWhdׇFg7K(m}__w-9W#zN{iq[|?]BanNSu溝v* ̑haQvV:k1lW쾶}k65WȽ~Uz%O`bF I8 ." pte"ՓɔGS[AoGLˌ46 a?6䆲REFCѨS~"(ckmy@pH*Poŭt(杇P +V mw,[#npK% >QHn ,OWkZX_g:L!8ItrK.}Wx䚮f k@gd#J[."AM,>>46W_?5C!pJ~ KM7̱A؏+nNu K4?IrSgQ8s{,;Y]q4{]O}#o.:.oR,YI9(m@~.IHh>:Z[_7j|XluKֵ؟pԢÚ V(Z<ƅ.mn.<'|}WESk/l|"UԲ?U9-ȪV9q8?4?Za; Ly|G@8~}RZgWp/v=-<7$liL {=>z]~+n_(w;qcğ9O1mю2|<*{ЯGنk#Tc[|F}NZ ]$N23Z?ʚjU`n]vvН{sl-yr>f rw10F1l7}vxQh>;\6EȐGrF_U(O BZSJ(IKBP% (JԲP BJc B&La(R%1J(JSM P%jc JIO:xI<- I$)hO BxIJH¤d{h2G?!Vܯmj84YY}"Y)T1GĹOݱN%q~r~ s>bkwݮ]BͷNgZk #Ύjк%F&.wl}at\C]8`YҰG瓤?~_@O!88nm F9y?S{{yI%Οs=ا3":BdIOȕ38G࠮aiǽ?I9޴rhm.Ѭu~Cm[G<_Y[NWSKi]iW b >M qccA:w[y]9Y7]h'M;v/vJ=u.^(;[) ;` Ha=_0¹tXӯQ¿Ii 0"Ԏ?U#$kت9'?"t#*Y?2G⌍>'{C'(u F HF cէ'2x5gCj /Gϴt`;Y'oߕN3Qb虢[iZYO|5T"GAR/ X # cZw4~@cUfz-SmG@(qAҏoIOY.Hh4|1&r~kugƥc~-?,Fu[_Ѻ]AFEi=:VYͰG_ Bq*X8!_i?*qZ:V$K␼QI(Rma<'%- B% )% P 0)BPhJP% P$0)BPhSВP %1JB*c B$Ӳ>VݸxIJ '-3W }ǹ߀WrǦXveM ޏUs8 [=nr\.)7uTخʹ~W #K#}*Ik:{KZxUUY^5zTum]^FB~V69[?Xdz r~.t٭պEV6c4b󜼫,~l;G2}Fhī80bβ;,> Ix .2S]'LcQD_16jZ4]jU> :V*k]f8&l,W5Jc+k@Wc1om@.}Ki(؞!ht6ph=rqn]54xCwb~R"c3&?PU ~;N#?j 2 ?.S=ӝ_TWY#-W#g&c)J&◧k*P;^d~T)&UޗI>I#VXѷĕ ~ 2(Un7kkҤ|JqG.3G K}(obkǑfXرu]Th]L 6TvT#+0% 1-ֻerN&·|b,_O<جs6?Q/\){{'ڱUv)\پ^)>ä 2ӫtm|=<Ew&5i3r6g5ry89rxO- hO (]-Д)BP% P$0xJ(I$J(JSI:PP BJc JLa4)hJB&OԶ% ӈN&x bs.iqk#ޗ,݊zZ˼KϦγ?#:U}{it9ȱWX>nMlteg~"/DmϏ]mwfKW7<29Ϡ~]xqKѰ2:n>?=r[EzcLyZ~Ѽc;*]4?ksN?M#=g.g~|P8 GDUO)Rns[?!9OݳUXwQlh,&全DָGQ5ݯ0dG[P|-sOclh'pd 3ߺq@$ _p0 ūN369ǓWr+N'"6>a"ngIēW˚ .v'OuLV~T*۫"k ?Y YTn<k:&N8$O'!>Awm5];*z_X =BSԀhQ@LP$St9C(@Mx 9zNˁOSS1pbK{`تi׆4jVNjK#d:S<<_UҦjƊSUbc;}6"d{j/݊mB?m?}+/`'60;q<@].{~5HGsp_ s~U乥܍ߞ,?X8n׌1igxdz ikw.:uɘ1g\1$@9>Ntp>1殰2h]k'S·ҩc k۵M\ēzuim욜pzu5s{?ţ:`Ƽ_v-vi6hT"JR!Hܛ|@:M_MJMٸ]|S^4mqѭHʨwAjQ'1nWmc5ph;Jݑ&K9v9ϥh=緹o QmμPZZfַ馒_uVF8 ml`Z? ^c\m\iT98j pYbxh8ǃ?b `sog?G]nqf8=\ԉ Gȹ`p!ZxXFĆggzVG~dv(+p2by=ST$b}Zw5AH?`GpXM*ni_]=hٝĺ~ w p}&rG{L >a99y#|XdV8*N-xiU^ 5aQWW./DNfG-)RbݶAPCuMXƠK-׏sʴzUvV4j?ܱ}Fns_ѿbҬ,}~m>oƪ}MZm*!k`X1?AyЃIݷ|.XCoU\?MŇ VFORqz$}~eGKY7a՞E?"K7#ڏWWR MY wǸXoܶcQ9  `FYY^~A# nAĔLI Pk\rQBĆ&Cƹ9"`YV8?77d0r5үf8>ck8 f> Z$ණ{l7>kv!s$)k;cݎ~9/tBr⌴+0րmBP k+BP 1JLa(R+U1Ф%jc JLa4)hJOWYvnO?:"mcTCixeuN[zُ_>=I?!iu :.ݿdL,ڻ'ZԲ: +5p`t-pk 1.{un=r?˱fc ?wnfNvKovm:-Zնuϼ ,}olYX|{C+0ĆcFGou8#}A.Ï|$c!uⵯy`][#YW[_Xڢ<8~ZFEcp?Z8yU4 ol͞Qm<[U9gլPovk[ ї$\1 CWwm71Ot?R.C ZN1v#1O?J.97Pk_Q̴/QvE[=7`Mw[>4 \>hώ؅yq8hiul|tWݙ[3gc}ί=kIW]ȵ&H\ZZ#:ԜB=K׺:i(qюmwXV4-*qОAΧ.dwsu;]+  #OhGRZ2F#PEm-.چjtS"F0C@;gr'JùQN; |LRcsCC[{~I M}@>Hf]u.EVP-$4 `p\Q5n׎\5󥊴 njUI6N >]"N˱-ӬemhȾ.o_|jeUyXGFciHpYMߍOva>rXַ"꒐uc?p~]EԲl5ZǏmr:n?y(voo\jnˉvF#݉GZ7,]XxOW:G(+ݸ.-ֽQ[^K jHUhTZhŬM17HO ^s?H+9l(ˮqy>YGb!d]egmu?K )x̽]!&vjd>#9 }5%Х BuJ"A ;GVhUq59͝na1( $`jh֬a4)hN%['2k*c"ls@dLa)$遼ת\VV$qܫםs3ls[eK&?2jvq_z@$/Uldu\aak&^+!5b;ds--S hI% 1R}c\, 4ݠ y ga{NfAOEZgpTwGcʩػ<۰zYhgJ ugWx(p=qG;gFϡ@ 9B"PНf;cFCf"՞}wf4A7u Zm/%uL:1w`1C,-.ܣi~6?I.k-W-^}=#˃7t <>\b2V!< SCe NϥuYo%ݥ{~]dSSy[?EI(B\"T|dO5R̽0 *-}9.m5w{6?zh[ĨyyPɹAeN^=ৰ(X٬5^0 c AfS^jx{>=EcukEƗDiLiTl$@x~gX!"t(%DGs |~ 'tb(f,>jA]B)4yj{9Ԛp1s|M%pY)ng8<&3c撓H tH_}! U;4M#K>h%r$Q MEI`ґ/ބISw IKk =ԁIJu:Y@t 1tD%W;~ 9۪,c([ZV#E[8?)q /5@ƵY{Ξ 70K4%!p-G!E*s?jϸc薋_7>f*q$COô}DS;R NTKuI&>TMzIwK碇JHYix ~9$I<#JzpFq8{T)I!inj!c1%LY]<~D;G1cGLYSm׏Ȝ65 [d:@?LGo $;_GqCHt fI3#Q!~DRcShQ{Dʎ'~䔰'Kq mQKx#OHeg~IK{&hi#_$@<u_8cNzFPRڨVVKk÷njNMhv$Gdp~sD"63lujǀx9۶ot~ޕ>OfC6PÝq@_.;OD݂t๙8Ʊc j5Zn{mp kOx]5y`f4SA{Nuͭm kÎGsTMGǎu=-ux.u- k}CC'ۭ:GuhHԺd]7S#i1Kw '6/oA]3ցݾà3v-Qm9f(9E[l;7%HKm[cG>IpXb te)J@@0y_5~6XA-׽;-C ^j3!Fbc!>b I ߕ]C _Ȑ-DP@>i|j69R*Ӓ;L'w- Rt ! ۷~jfx%RŎ&F&|eXG(K\g)xEHq%jb>\>Di'wYX1ǂE"O[~ Bc-&IH})?uM59-ʂQYGܐ5i"0a?#%r}ԍ4'%4IhF$gSo|wl:RMu%m̒ ̧.iI^R' AH)r@I?8 'ܖ]y =lIK {ZIQdŏVp-:#䥶.tO$))X#t;&mNY#X2Z$Tk'?88nB~N[߸JgMN@L<גҕ&RN>-*EJ[~R4k$pmJ3<[Gdȗ3@t.M:KBC$, ABp 'D Rȥ4L]I|ܕ%ck#}N) ԑ ݤ8P ;'<49K;)R>) L2DohQu mym PEZGgE pK\Dn<59a L'q)hVC˽F9*9usLk{cKli$g Xeg_h㘒-X965?SO 'vt>Lpu L#ũ%|jͭGi ؘ:|Uɳe {gjg6wZPSbatik-1.9.orig/samples/tests/resources/images/sm_colors_tile.tif0000644000175000017500000004724413063003307024552 0ustar mans0954mans0954MM*@@nrx~(B@C0DESTU******************************************************************************* *** Processing History *** ******************************************************************************* Info From Tiff File: sm_colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* IreFastScale: X-Scale: 64/256 Y-Scale: 64/256 ImgInfo: Size(64,64) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* Info From Tiff File: /home/deweese/space/permImgs/colors.tif -------------------------------------- ******************************************************************************* *** Processing History *** ******************************************************************************* Uniform field: Size: 256 x 256 Colors: 0.000000, 0.000000, 0.000000 ImgInfo: Size(256,256) Bands: 3 Image Type: Unsigned Byte Color Space: RGB ******************************************************************************* This is just a test@@@@*$$  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||  $$((,,004488<<@@DDHHLLPPTTXX\\``ddhhllppttxx||   $ ($,(0,4084<8@<D@HDLHPLTPXT\X`\d`hdlhpltpxt|x|       $ ( ,$ 0( 4, 80 <4 @8 D< H@ LD PH TL XP \T `X d\ h` ld ph tl xp |t x | ļ   $(, 0$4(8,<0@4D8H<L@PDTHXL\P`TdXh\l`pdthxl|ptx|ĸȼ  $(,0 4$8(<,@0D4H8L<P@TDXH\L`PdThXl\p`tdxh|lptx|Ĵȸ̼ $(,04 8$<(@,D0H4L8P<T@XD\H`LdPhTlXp\t`xd|hlptx|İȴ̸м $ (,048 <$@(D,H0L4P8T<X@\D`HdLhPlTpXt\x`|dhlptx|ĬȰ̴иԼ  $ ( , 0 4 8 < @$ D( H, L0 P4 T8 X< \@ `D dH hL lP pT tX x\ |` d h l p t x | Ĩ Ȭ ̰ д Ը ؼ $$$($, $0$4$8$<$@ $D$$H($L,$P0$T4$X8$\<$`@$dD$hH$lL$pP$tT$xX$|\$`$d$h$l$p$t$x$|$$$$$$$$$$Ĥ$Ȩ$̬$а$Դ$ظ$ܼ$$$$$$$$$$$$$$$$$(((,(0 (4(8(<(@(D (H$(L((P,(T0(X4(\8(`<(d@(hD(lH(pL(tP(xT(|X(\(`(d(h(l(p(t(x(|(((((((((Ġ(Ȥ(̨(Ь(԰(ش(ܸ((((((((((((((((((,,,0,4 ,8,<,@,D,H ,L$,P(,T,,X0,\4,`8,d<,h@,lD,pH,tL,xP,|T,X,\,`,d,h,l,p,t,x,|,,,,,,,,Ĝ,Ƞ,̤,Ш,Ԭ,ذ,ܴ,,,,,,,,,,,,,,,,,,,000408 0<0@0D0H0L 0P$0T(0X,0\00`40d80h<0l@0pD0tH0xL0|P0T0X0\0`0d0h0l0p0t0x0|0000000Ę0Ȝ0̠0Ф0Ԩ0ج0ܰ0000000000000000000044484< 4@4D4H4L4P 4T$4X(4\,4`04d44h84l<4p@4tD4xH4|L4P4T4X4\4`4d4h4l4p4t4x4|444444Ĕ4Ș4̜4Р4Ԥ4ب4ܬ444444444444444444444888<8@ 8D8H8L8P8T 8X$8\(8`,8d08h48l88p<8t@8xD8|H8L8P8T8X8\8`8d8h8l8p8t8x8|88888Đ8Ȕ8̘8М8Ԡ8ؤ8ܨ8888888888888888888888<<<@|C ()YÐh*Fj0vdU 3| mT twͨ=}qaxJ)Sͽm}0F91|IY1@' ?o27uz-8h;.?, FOBTʧ3K @ BS׫tȈY<?;ktG=(0h?w/7O|9ɶ\pܔ%?嫣Q 6StԷ^H#c@ɡ-&"82G88/HlQXPs( WK78]ޝ!ctg '!Xi.٥CeNC0z7U): TJG?T2~XF)0 ߷e#D`+6/S^IپU),۹L0T /lU ӽ`Qa^OQ$ ܈txcyR, ?nx9 Pl)c:a}0 raЫ[ D vE=v4{yK h>jg˜1 0*~2X(8(fHc)ȔYa)X枻,nRĊe&p`^na?2M2SX\7C`P>\ngX ( .y,%4wY%2C2:6a(j װ2G!'wXq.]gkNKi(E{.L`~q)Dß"PaMρ3 F 10RhB ~A:h Hc@_(;0Ha.oи]XD].#a)lK1rPe/WiL"wb?UI )֩C}P(UK#.)]#0BIOB pL/mX#CFpť`&+y͕~bRԲ,e WR -(@ ~5f``9ͥ9޳g1ka @! <b|ls?Y@C^EV]n  nZ>vnlBX55;o|?V)PL`+F 10RhA@"4G~F 10Rh?C'`#?C'<<> @Bi|jb`b0)4H9F -W s2añ dF( @?{6!f~_(iCtk~.5 vto]CuiC`ÖKlB:t8EgF,&e%Fwtp.?4 6_.5cUyVAɩE!{xV%:v1P [3~ eb0W<9 07d;>H1:EW`󄃯?TJ~S) }enR.2٘E*cd0v-FBN\2y.3* _\D Zg3O] wrRt=֥c7 Pq&NFF 10R8L `'C1N1>=  PGq H4A)F 8q1ĀÑPA!0)H") !ˡˣ1@2zaz;':pX4"Ë#t#'D]P2c 1- M1 Zgto1{N  0b$T`tx`}<)FX ;]=wQ:0[3jݩG q}4  ?ȗx^tS 4HM:)4HMpBKlĆ8c` /?_.`%!DS݋nBk#ʄQK5Vg7B-5n  0ݤ6)A '.S8'lu>0BIwXPn1#BauP n!'ertIS#xH=<=e&Q(BQ68t̤~5JE~5J5e,#B^r5jf/F>ݐzW]G(Ie\9B^354ZEG( !8jxt?>t6*`V(*b1+ jX#`bHAƬh]zjF X )5ЪHIENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotCenter.png0000644000175000017500000000050413063003306024323 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; D!4ä: 4 dQH5 4Q@pЀD4w@ h@pЀ; 4 dƀ`p9Q'IENDB`batik-1.9.orig/samples/tests/resources/images/svg3.svg0000644000175000017500000000405213063003311022415 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/resources/images/hotSpotE.png0000644000175000017500000000050013063003310023256 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; DsgЀ; 4@(w@ h "pЀ; 4w@ h@p2c@0@  o9taIENDB`batik-1.9.orig/samples/tests/resources/images/svg.png0000644000175000017500000002207513063003311022324 0ustar mans0954mans0954PNG  IHDR$|TgAMA|Q cHRMz%u0`:o#IDATxbtbC@;`P h4 <( FpbhP021׷?>+XL0sqq31 Q@׷o>|>L,l<|<"| 4s} Üz6`>S◖gbdb-@@C2 n}zL,,`q*x\g|Oq1qrih(E!8wn{OH:濿~~𖝇9gM @C$ AY>z/o^@208P3++7\߿S?H7#330c@ (#0~}woEU%F-(;(45},0_Hֈ$dmޣdQz`.X ET0q ) *s 1T"4εn qP#*)#. rQp~'|xƎV ؍VP6}`3# `B`3痏>3#jobSHI4H ~C`Yla旔V6m ʝ`5A l:)UщE8 }`d|? ?|׏_(pe d8ƘOW6zo^/NZ3~|ֈi3vЕ4BjPU.AQ`U/h)0A 5P=߿X9!uiQ@F`[_HAO׏i PNAa6` 1@(D(f}?Z9} p6.`htާ3?#hOв@Q!'80áY KZP):Ȣ F XN~ FpB,էO!x*GDR;D]{`珟?_?YxE%$Y8iZA0&[4l|Qک޽͋~& /g*4JH Loݿ&V6R%tl|\p#@ ("߿6+''4A#L}v̏EU^h>w}н0Z+&%(X3@ (__>wO"J2JJco3'|C0q hBfr&Ȓ5hF~-jKPD@V y}s@ (?r əؼ{͝~|־Ghmq"!nH 9Uxx] BH,35TzO/2طR 7/XqN4/-l矞=Q w/,4t2-@ (/<|f ;+?>ϯ˧* K%+WV.>>~.aNAVNԮޠlp4x 3f.!Q _?:?!۸Q Vv ]f<4" [Dh}- Fg*<( Fp!h4 <( Fp!h4 <( Fp!h4 <( Fp!h4 <( Fp!h4 <( FpdH.] :OŌ~`dӗ?zw6n>1q. BFf/{|~/EQUm!f.\* Y~7n||L_߼|{:4(}gA7?xw&ff) c?>maamg|~~ x៟_s  (AQBC yZ=?ߟ? h&`az˛̂rEt_ˡ] 4(?߿WM> |h`٣ޠgGРBH :NHrQoleļbs+_߽VuXBfՅRBbhhPD!9Lf֋~O?|^K%WPؒrĠOHNE\]< EB5-,:,IxA*W L:! ZU (QI>)9N6x07РBH Έ*/?' b$'\ 5 W*-$t' QC %y9]4>;~F? 4>h-ȹ]'%#.9oAYٸ@?Ԇ &o^ U&s!Y&f`ó~|ø+/0ĥxE%4X-rpKq|Ɵ>|yihݿ޽v$~G\2xgA A ×s K09ݠ(an}Hv}{tv:9 \BB |y^ WB"_K/ #+^l|~tO1a8E(bhpE!^\"v ze-( !#+h,[`@$m1B T׭BxE(03sŠ5#w&5##ۻW?6֎,l!pjԭ8 LL,|2>zK1?;֒$@]&ϯ{x_h8a+*X(.@1 AK21s :h@O{[w4CM"`dd ;C# hPF!07 r?_ } }3 !ĄlW\Z@N 7QSv^>~iy6nn|wo} βDX}pQg$@cAE@7( Bpq% jܣ,!)b\r/AQ!N~anaq^&qAhF!#& lܣe p. l011ŰqHs+ˡQ"Q, .X#z@O?'8XzSP6f?X/hF!dyĥAhSgv͏@}DPWLJ *Iɲ+ȡ E4ȣ?0Z8x9A+.c  {'~ ,B1)j q 򌰙!hpG!f`Y%$hCR dA#|F[`_Ө3u1J|FA >b5@S ]}UST~//+l2xuiyVRG Р΅j 쏣<,i?>k#ҤV ~A)y!2 B`JB*bf$8ٟ?~{& fcKX[T}@ J26QNOI0Bo\b]X^B/{t|"ZG;!%#"2Z @.dkrLl>0 ~zۻWtUs'ҘXـ C; hhD!x?77 1&Tl{Pdag?(kM9 X9ȃC; hhD!8s(<55\g??; (GWb0gQ)% Ye,l~" h6ЅBbrtxD!@ 5RGX秏`( 㟟} ."GN.ЭA ߿Aw96Y TdJ;^< X3 z/_>AhPւ |p=0!'0χ4׏/BhP|.n`L4Bl>l>$xU BPN-e&6.čm0IIV2 \ Z#X#qrv[J1ca*"~zQed-%U7g$pJ8U|Rr#&4&nq!y5`sgh.$А̅PZ̆m߿E&d|g@Ik@C8 m.)yN~!< SPA[L48L prS1INȦh>)YQ-`N08@ ɺ{ ظܻKп,lUDEKPVߟa#4e_JA@Fח?? 522f0ډ44ģ@`:n p]8 Fp!h4 <( Fp!h4 <( Fp!h4 <( Fp!h4 <( Fp!h4 <( 6w?>O}:Oz_& @! X@n~ã{_޼m_->|amr᣻hG!v߿}}G> \5ཿ#~s9nl|\¢", @ (]ϷcHi >2Ԫ#s\P^KH r\"-O]@C. !'[|}F)YYO/K +r %4|n~xr=u`^MT,)/:y@C# !Xlu7,lh# @%eyD*>ۻ7H?mX-6T l2@(4lW (‚%ۙܢ"ʚbhk ۗߟ?7#%$ l2 2h(D!#w^ݸ 3 @9 %u~i9^xo>+ <}`KxťUt`0PdpNhPG!0ſu_+.--$Jҙ _ Q A~|cb ,=RQ \Pq[W>xƁ%ֈ@3ͯ_wC4H0de޳gfVvL5 0IjrH0 h0F! ˟?>}m``i )q g h0F!0k_c#b$ X9 p 43fA X.`mRPev6 @ )_&ffP!bIPCtA`r jIɁ?A m`o^c~)Y% u@wn E.֯˧mVN.~)y9ev~A48|O>1.j perPZg,ϟ?~/}eT@\|bTȃR JI4QɅ_wBKHKXDF!0~}`h/~|LF~g_\;/'e k"@ t+??|_ )(+7;#?x>0xӯo_[ .!# @_^?OtBt7Z@,<'/?^/~l~y:Y6Z BFrM`;, _HHs?>}Ā]E^&##&>.-HA B6ڂԝr <٣Wg490O@H^Y@V tA .dk mAЭ0(At/0`./3++f8ZZZj2I`z~fu0G@%-HV .-=J Rp.mYRGbܜPwN~a.!QV!l\<V12Жo_|ϟ+Qq q 31_@;H@ |$#".m%ȚĿa#&-$! ĄkkS`/gF)ρS@GD #${mM@ (d%+! o|7~0`C t%dmf%/'̅r8s9zQx7@3~|xGҗ m_6`TXSPX05jPhPh)0 = < =hc@ dndbf !&& ~WR />꜠ma9Y_Zo0߽ @ 0'J" yQ޿̍)(((r? υL|l}Ҩ>VW0 >3^<ocܼ2Jm1: h s!E! h* EǧAmqˀpX{Ó N-lJh.C  %vՁU`mwnGD1'o h{__^={{6+ dög &{Ce6@ t]k~̄hYxϯ@e<,>珁_P̌z6#F@;s2I+|{W`X~y"bR, ,ZA蘛7A` >޽CPk6sSS E4Q# >`9??] Y32 :@'pL)Y`ۯ_0gqIEPSHAETUh쾼A hD!jK3gX8cE; BV9`<T|ny4(/$gb7wD\<#:ΗhE!tPILM_RG-d57|b䔧@ (p+'$/}z7#9.PB|,%$dᱪ cB$KIH Y߿j^ZX"fV FfN釼@AM6C4xbORv3@ɦh4 <( FpD]IENDB`batik-1.9.orig/samples/tests/resources/images/tiffCursor.tif0000644000175000017500000001174213153020772023662 0ustar mans0954mans0954II* ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))        ()>8 ? IH HH ףzTLff&(\ PW9T8BIMHH8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM 8BIM - ` JFIFHH&File written by Adobe Photoshop 5.2Adobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? >O_.WԳչg_lg-?^@y;ľ_^vݵr_@ӱ:&6E~m=}n{^v?\zSU;]hߏezL{WwWHɇL#x+ፈ}^RzLަFN%ZﭖXnVߨ_TG<Ӱ} =/NVn}ͽ}qMTv?NF=vd^z=eݾ77}Π=7_Qx9z;)E=k{aYÒXdžq(ؗ8EWoԾ12r,mcwYcmcvNO1ű˨!sN=]4udSHӺwGW\uֳU/ջDf~.\`^[gG@@"&0\RoT%_oxX_o1eX^L.ٔN.=d[U@rpf&6E~˪=} v+c^v՟G_tf?Nd[*[믧s=Wdzq/_~y;gzw^~̝Skc= 6L%,*_batik-1.9.orig/samples/tests/resources/images/jpegCursor.jpg0000644000175000017500000000654313153020772023660 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2Photoshop 3.08BIMHH8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM \ ` @JFIFHH&File written by Adobe Photoshop 5.2Adobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? >O_.WԳչg_lg-?^@y;ľ_^vݵr_@ӱ:&6E~m=}n{^v?\zSU;]hߏezL{WwWHɇL#x+ፈ}^RzLަFN%ZﭖXnVߨ_TG<Ӱ} =/NVn}ͽ}qMTv?NF=vd^z=eݾ77}Π=7_Qx9z;)E=k{aYÒXdžq(ؗ8EWoԾ12r,mcwYcmcvW鸽&zetτ۫[1eU[bN՛Ӻs_vCZ>[S}/1U]e`]oNNJ2hv;2~ScM+cnef'o ElrG.)p7*6~ox}˃m)VztQ$_zGՁ;KǥV;*uguE%RgK'bc׏puOɧd:o{Yf羌˜͗bzy'*?Z~}V0G9kfNWkE{ULuug 6L%,*_8BIMCC &  $&+ "$'ABCEabce ?}WB:v^?eMWvH;xu?&& XRr͐OLpu3\[M^Mc^6ս b)c{H@ޣ\R5?ԥ>l {|p8Z=5T$قVFE%a['QasfQd :T)O}Iɏ@Vu=K=k,h~c_FxQ쑏e%N<?$Z O]ÛMMٮ~M Ė:l1W83wT XJB|}B7Dqx3chn'q5eʬ5I5Z 55tu½p:~<y(Ua|f 9ّG씚URД#,};vX[pZ:C[ԆȐ;/LӶjmYEkF_Lk:Yh (#)>Nٸ#6k^y<r8s,@#uz-*8֥ [yow TMR%>{Tda4qɋaKP& 4.ĀvE-\D؄DU;˕tt)`Óbp|pAg1iJk`J?Cp%e Hd]#)[H>҅/P'N:l_ 89@3UԽʓ)DEN" Rm>퓼}As8V\,P4twW,crHzF0gƮr?{iW-yHgرݱ3M_:R59D/L<ɚiާH@洿%GzeӽFDrO4K`H,Y3Zݻ@a`M1uUHBP<5" b[;,:.]֭ճCdHmM˗(nӺ'f:4ф?)bPq"s`ɢo)`Go#$-Ȝ8D:ZR-aC.%ٱQ7Pf\&J0 "|rȷ#9skBc[_p/2e]LD,T:CO*$A5o$n*SWY12h56 !jzRv7HJUN%E]RCő>DҨOd10HY-ASceZɣ,NY_d{mXuH?}jHDBୁHƒzKo1N퍧@]?HM qx3IK~gW batik-1.9.orig/samples/tests/resources/images/canaryRelief.png0000644000175000017500000000573713063003307024144 0ustar mans0954mans0954PNG  IHDR\yÕgAMAXG cHRMz%u._:oi+ jIDATxb N-@8e.(ďIϳw( 2o&@h. @@ilS-@eL9@@ <(&́2g! C ,@>?@AdpB% 4G0UfM ZZZ @Z-8q |'p6]×@@kE4,ʁ` < H~[.v  c 0@ -D"Y˟D-d-K_Z6@$j}hyCpq@`-b@PӒo~[[.PӒ<1fɏSՒ{'=5Ժ pp˕06@-]Ι*@/턳a `Rz? "iĎ:m׾w@a Pme|}^K>B闳Va /@}*~>T7 ^uh` 0@/zW)8ض-@8,~2oB8o,@-=gw5NC1@ad¢Y!oNc`if@,}jδ/?Eѓۧ0Ze%0@a^vK6ѮGDDnCӧoVD%߰}@dXc5h ho@,}EzXd .3 V@K~7'ގ6^@@KNQL aE@ t?Iv \w@ѥ@t GhxEЬ@ hxh8x?0ȯo@#.Zx=@ T.=|4=f<Pȧ{y{~AP Gvۖ'A|hzd'hHzwE]5@X=t) _ }2Kot_tG}vw='O\ @1'wϜ64E*vO@ 4| lHUQvcW@wk͊&r;` )5)^Ҩs筯 wKuFLQΦƞ97+%;~=1B 0=zY'CԘ킉3g݂k<1}DݚѤӧo%v]}>}ӻ1@ȩ;i@uc+ 9"#[NZplqԳ>e9uDG~|e7l"mtŒB܊XϿbή 'MZcۼU֦Y@$y7ڂ^7/;a5+\;vyǪ7]Q)w7?@w?> Z.h/Ÿ]n=| R<#{4ߟҜ&N>oRls(/4Q< )w}lrXpM˔ S.Aksɴtp>p'Js.1{3KXw3Xm[l964_\>}>`o OZ^}_lX'7)ZDGKݲ'@#/?~βYODF>@{F_xաϟ߃TGn,h JW_^?xo'{u7 XG9iӱڳh;iА G|p̓=Ž?o}8 N@`{qrc'tM&iɠhHbc4l<`S>IENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotN.png0000644000175000017500000000051013063003311023271 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```O Ϡj@1  ` rw@ h@pf%zh@pЀ; 4 kCjcpЀG@ h@pЀ; 4w@ h@p2c@0@  X9 (`IENDB`batik-1.9.orig/samples/tests/resources/images/hotSpotNW.png0000644000175000017500000000050213063003311023421 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxbϠf``) v@t00C! 4w@ h@T14w@ h@p2c@0@ h 4w@ h@pЀ; 4w@ 1  de9Q}IENDB`batik-1.9.orig/samples/tests/resources/images/svgCursor2.svg0000644000175000017500000000265013063003307023621 0ustar mans0954mans0954 SVG 2 batik-1.9.orig/samples/tests/resources/images/hotSpotS.png0000644000175000017500000000050413063003311023301 0ustar mans0954mans0954PNG  IHDR szzgAMAXG cHRMz%u._:oi+IDATxb```? w0 4w@ h@pЀ; 4w@ 1  4Q@pЀ; 4w@l}0w@ h@p2(L@99KIENDB`batik-1.9.orig/samples/tests/resources/images/operaWalk.jpg0000644000175000017500000005310513063003311023444 0ustar mans0954mans0954JFIFHHExifII*JR(iZ@@@@02000101p Photoshop 3.08BIM ResolutionHH8BIM FX Global Lighting Angle8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIMGuides@@8BIM URL overrides8BIMSlicesg@154@8BIMICC Untagged Flag8BIMLayer ID Generator Base8BIM New Windows Thumbnail 2Kpc JFIFHHAdobed            pK"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ? R E S Z} R E RB1HVĶ+^HkMYze$[ФkN"!Z8HV H!Z\JkzIzjצ^@~OћZ{E aA:~*ml=޳[#V MM Ig1]jqȫU^ _R `3+'73)"LkHxGWxc?_nhB#0|a1UUN}@ KHp7bvٲ촶wa2?2a6}V""#Q+(L)=b+m=?/M`43>+eEuL{ob*-ZߣcCJ @w"kO =AmwyxlV['oܝj :=m R4Wk/ `6ưU}Gs=[rgU9^t=1{M:{Z?ի3Ho둣]VϖS"5[p Y SUoʻ%v>?;޷-=;Ta]W}.f湭n;N=vWb£>]MFW\PK+ϠF:~5a`o_UHf:kX-9Eg5a˻oݏ?/?ܫ~Eek^N箷'"MwW>l nֵHk[ ]ea}Aͺ-c}ޘ~ߡܦԬ5xfvcNtsWVTlkmcFs=׮}n7Ƹn," v֛=>~zOMYnAiO׿{>bd5?R$;v{Zk%nSp?ePu /sLGg,fD=JvSvN=1́XjCrTi`wfo{I#wE\ 7 ݦY?eS:.0v/OtqzMce=0s[f~+3?4umci{h=bN+drZ[k^ =6}o}>C9U4Q}QnP߳[߿Xz53̴2׀XN_Sg;Y7hi=1Oö{mqhc'sCA{1T&k_з>q3uA5ZD9׵ճ߹Yg_?GmO dE?FMY@?c[K[GߢIt tη\n{EƗ5mՓwٙ;7G炙3o]M:8O;?L'lw>k +#Ugkua}B6O#,ueYh$m~jMp?(ڗIAF۰e.;D'_6JˆNIo䦢8QX9y({'{g{ k2@?}4;r-uu^lԶw(ն`l =tfmʿWK{{go.?H,^9I2?{섍 $Sܩܻȟd:bx?Z ?J[ܕx#3k$~Fܼ5 A')2OԢCmn- y<>j66ck+nwHѭ|kq@R XZ'j@klgs?e5?+@Z6kIh{ 'yd⊗#TGGO8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG QualityAdobed            @"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?$ %xO )dxILSxI SIbT$(JR'xAVR$,'O )JP$Jc )BP BHb%% P$))BhALRJTÄZ(JRД)BPR$- B% )d:xIKBPJc <% !hO (IKBPJZSJ(IKBP% P$0)BPХ BJZB% )% P$0)BPP BJƄZxO !hJxILa<'%- B%dJ% <$(O %1Jc <% !hJ(ILa<'P BJZ(JSJ(ILa(R%1J(JSJ(ILa4)hIOʄ<'jBPJY(O $- B% )hJxEKBPJc <'xO !% P$(R%- B% )'(JSJ(ILa<)BPP BJc B% !% P$0)BPP BJa B% !̈́O j'<'$<$0(ILa<'xO %1Hc <'(O )% P$(R%- B% )% P$(R%1J8JCJ(IL!(RBP BJc B% !ԡ O j9BPHZ(IK'O %- B% )'(JSO P"0(ALa<)BPxO %1')hN!<'phE'ԭHa(DѢJc B% !% P$0)BPP BJc N8JSթ <% MZHZJ%- <'xOhJ(IKBxO $1'P %1JJc BJY(R%- j b)BPP BJZ(JSJ(ILa(R%0NBHc B% )֯ <'i[ O +BД)”$JZ(J- 8 +SO <%jc J% P$0(ILa<)BP'(JSJ(IKBP BJc B% !% P$0)BPP BV0)BP&q is%N<R>;oҞ^mLNgL|RڧO'K'8 ZVJNchIF{*5NMV~!R?Eǽ"kĄ 𨾷1^ y~SO#šة B'La(R𕩌% P%jZ(JSJ<%ja B% ZBP BV(BB% ZBP B60]>**wϘhO <+SIh|a8 )+mB $pa Ba98pPE JPhZXޝ[ϐTkO{5u_!V Kj'Ycۛ8(/ȐhQ -w#B W7Ql`??w߸ksLkrϻ?ik~AJ?ؚ>O ;*C# s|wZ3?GVY9-8ƕ/I4^{=Qō-pIa+jF2^a u*<76{2CNQ菚N>0 @y*yy{6kنi:N?.T:/F7ZfOW?j:WTded4ֵ7L1g ȽO[>bTԫi囙kV`-HO1p 8pC!% P'c B% Z'(J a Bԡ+U0Oj[JVYVo R4ҷ-HOYj7ٻݵZzΧkrrHmޣio:UKϭek e w~CcO1e}dְV,,~O b/+X,4hb13`7ou(s׈84*e(c Im|=ʑn;_SDŽ % ٖ75t?^ޚ+AG6#g@Aۨܯwx9ߖPxSeV/AIYzOу<8rJBI'S[- BtR#)$pJRH4o"pPS0R]A9 ؕ˘["GP; naV h߂=g mm/{ѵ$j~cf[#\Lo( F& T 'G(TY7$0$j}OfmXz5sNyʛ;KrKSm%0%;#  k]hH\N? }z ?+Ks,sO3Dž?Re\;RZ CEH4l`[ |99GUG+Y>*~k'G X6T6c^_dcVnw*i]ƼpޢMqGn?,Ө*յiI)BKRTd$ժܚZlTʪ5pq:e1ϥp;*`1ħ9y- њ ?(%tPc׋G^~KZvĺH 3UYhkkuBd,A;cvܹ!C~9܈O̴Bak2 5ǩя|9ۻqrX5?,zkC2%gȓobl}scx>O/;Kɦ;݅a1sJjbqGޟp 93o^om[@tuEz|:]-``GFuv01athG&f$ʨUm;Z9 }dv.$8dž֏TGM8 v}%5v\Lp9T1s7[E&{wѫu?Px3ܖ4`g_IV?V[%qhKO-7[X:yRd "܆}[}/5aWSu#{W9׾eknkm~ǖվn/~ P < !4MrtgY[Cj^>{zSx*Z CN'%Πr%4-hB kUvu}+c58.7A_w}[لڛ[ih6U׹s#u;S2O?ǎ6LȡAA,ǒK6I@$BK@nn<:t p]l7w"v4!ޠ,!%:^c5X5Q%Jk[qK&Nhutmc k=q𝩨qV臏Q)*-FQ?e$ԫ}CL9|@u!Z^;mlvs\ y^Z+O.@/v-0n`$eh(-vjag%v< }8'[!жN{1anǵ^үnGNǹ tY:/W*'8@l~ۻrl#ӗQ{JW9_c|Gm %?܈K),: 4Q>n}ʿFXC%3!K+3gQwK܏uRRoj6M{dktFe6p O){j] neM󧐟Ȳ$}(16_V3 62EAܐN˨"rmXFL"g)&t㓢n9贀~[ 欺&7={gAvhQީA8sMˋ w"umuTHt9Y {-^~*`էQTDe6cuw@; .c\_} H}&~ɧoK;Gd.eV x7VxQ h{ cmU5}c6p?GG$3  39gag"x8RH ݹOO[c.ahxk5$#yUvSӢh_ʓkE?5zsZ]m-wq=暛}Kï;}^eD7}&rQ2 Tw.]}7 1sm}UzH°5~EJ!M?%fT9G~"gHt2'eckzo5 Vf%vOev9KH}*Y.v};Nѯd_ 9̱\gۺa*wZ:a`'_kDS\%1ΑU~sEn-c[q7n.>w+];W;g"pk[X}..j}VΝ$F_s10:*%!kSױյ?_XX|=mb[sQu6n2 ''sV^V&F#8'V[+egMEnE}';gh`a̻չmy$tXR~t cep?H=~ah?U"Ǫ cZq-p e4Q=kű9HjZ< Uxwx> mQ4F Jsqx3o jtFPv/:ٖOX={ Ñk7L?ܑ~D"cM.>Ljw\@ ODB kuO}\+}6GFc5@p)8D "H QCkcK[ǸC>!|׈pʃmn62Ht(RIPv<#H'T׵;Ihb}.ɨP;gyDWOHpU`M}*;%bsAǴy8ykN *:9Ga*k=`uT O`۲;C$j~X9k9ޫfDHQ:/m:WD`đ'QkSqq %7zƯ?c,yf>(]Ӳk 1wsY )+V6كC$߫$$KLipU݁isa@B=(˭H'r \@]kOHhp"[ʷ0ВA%9,7U99K88k *wH{o0~\v-@ms%0kfh#C5G:y ]o#ZXX[Yhn->{xX{ɨ004= .;[' Wu[j5q{ϔ;suԠ1n$GN>Xrzn)-y;uwu۽߷gu9ecv9eܻkMʤX g$&^K!F^o!i 0eł\ف]ih*e,l>)3#XWY#Y]ck/;ZZwi-^묭y ڀ??ǹzbrƶ5Ve]S IZ=wN6'w{t51Ȱ[K(wgҺnemms0#}65vOxJqT/;쾛p,f4_s 4L%˥{,gqd^54#RFƉ8 n-YV[F69q?K@<ֽmn?l헷_V~^ˌ j]~QDyc:8N3z1"Źyu岺;wop'Oj3`? /MvmU7ݭs$];5Ɖ !ӨuvM#E_؏PԋqrC& F8n,a?{(lV6+h47_Ibl3'n" p`/:cESxN(XC^^]il2_?xGSPD'UTuY_cY['pk0#iuNgųP<h('fbz&ikUSNp?g+>7lKOg%GW*4A6I,e e㳂δE: xIpCWP͚2+ smvwwgt1X/Ϊ<9oo榡yCu@ӟr'Tȹ[Kl5p"\#n2F:/Ut^{[X s"p:-ew fs\X7>6_jߴ\KadzQ^I;3=*OwKԥx{\}bOL{=' k6gs.uNtn]U/V'2ZSH hp;̞fmۓpLp|6V-=۝&AC(KXåUXTX4>gc~oTN"ߓ=MGA*mcMAǀvm$mWQ% /çՔ po9AgVhe,X?5$'Z;C̚s&H{O?MؾGV}IǷj+06X9w߼x m kfug))c1tPwS +PXAZ[L*f\Z5>r&Ƌ#rgG&o:OnЬ]̓&e9}"r2kn-Kd;J\g=Qp'GeڷZWnSC-Iuw;׌żxUưCy?Qjf,mOgN&<<h_M@w}JFF8槹LJ9aSd~7I<9j@? ;%)Ɖd#Z&`w)`>o e(mL:_>>Z(ۛC |Uk jnǟFa"{/FcK >F3$fpX̏fM.'EKNn4}AWYkj55ޛ6}' 6u1/a+{q̸8 lc W'*^ˏ"Z.'B0{~dzcqqlotx?o7id{d%0% y:]e徳zVK\hnZVzק- /xڈ${NN7ř+}{^6CNp>݌=zwɠ߷eW;'?Xc@>Y?}{.߂evkjqӝ4{y'OEXȝD^I#W0QO]vDEC{>24_j&(6f5f%º[&KAǷ>M>?en" *]@5k+ۿ~r2D/;:%65i' cc=QlM@i7wg\mXYZӫsG=mev֖6I0kocƂ\rQZSm9ְ4r=ջkU==4[sJ MkwǮo 'JYYe6YcN(upX[1kd^>8nځkߝ\6U's}w]q%q.w?Ei[_Xe!M{)74~{7#e1*"۔\fqsK\GܲLTS2;gNU32r]DR&Z :+{qH25Rtm}2[Z\Y X pom5hԽأ-Nn@1o?H7?Fl8 =F:EK9 F28 msK?ݾ˭ʥ˃=;> w-tx)Dq|Y'`̪ j19U{l%1c`-w:(X7glUmuǓ%5ZލL"C%"״&, BKCA%쪼 FE0 SΩjTfAVS|XI qA1(!A}B ez!iIߝ($efsHud<{ؖ{o-}_<9w D85$Vd'eY1a܁)ۖʚ.џH󮧕*$h )庲JъLuS=<(DQ0;{_%3A!c]YA~DNWֱōq!&}Okz 5;HFK v$u{wӣÚ7^ =f:tiWfMN,lw9Is['[ljEn6,4 uؾZ֛}ŕV|4"! Rn CIU5>CpS5"ZVh$E,]QuV^[-7ȥw*= fIīڸ cށ 6Gi}"UEբDž|aHsM ΩSVop1Xf6?cO.?h,D<XE o'C(ٹ|Otu*+kμcR6;z~ψ,n-iřyMš'*g/AvѴX uĨVکU0\wi YI B,X Q_mnLN, @'8*UTlmlO0%^=mhp'--U+V D|5,"C,#ik9I};)k6`#pڐfU<VEck_o#!g@s8RQ+y x~/J8ncI*)c%HJyP(v±%;m^ZUl0|[smA*E,wZ'l= {ܬQ[X#Tҹ2,i?zleWYq![Ѩ$GpxLGS+?㸩w\VIkD48JLmzk/0FʕJ=淏tz6<|oW 6UǺN֞'Z-׹< dd׸rFRb8^K,|L0pT2GE@g'=FUmm1iU j!@lWE]d4HTZ)t•mph1-&X$Ţi1 5ooN2! %ІPFƗI<կ_JOOS1)eIvF '"d,hԉRKܤ'_Hhh]AMlk@MmU s$@S"5@Ef ӽV1yv\uq)uiº]s=LzT+Q![S[)UQǵVɺ DG}SX[]t6^x#[P X}B,uhvphq}77Ffx9(JKgnAcdԾoGi9sEX%Z3_\]c?FC7GqDf>6';хolۺӴѬiXmyxiԮ"e(zv< *.{G&R$P@leScB'1Uv4j)>;9q!Hp-%-8OܜM( F<);3X#&/`+ƾ%x$%8||W.q(WdUP;*9f:y{j ǿ&,;k^9sˎP;?"oR1Zݠx'5h h'OEsg@|7 5.ȩaբ@O[ ' ﳏN=Cג&HN8n;".Z|64$$"^K p/b7lt?4gGVS>IUU19,&>',>ID?9yN.椈h1r I?)RZ<Nk5\/*`VvS>nU.Uo"Of>ĪF`}_ϔ!<$/wzznl%]ܢ)D jg `kOMF@~q@x]'FJ&]YcR n4g>I#Ry%E?(2H #VXCx#Tk$d)Xx7]G uսCKaw={NЍ]P5KTZKB|? Lr KQ w*+em?2]4JXŖ%^ݵkG)X#Silel8 R09(nPZT} z@cӰC} %ntРۘC!7Uu;' oxvYN.lk#k<\k2_[Mr5s;JZ;g[VA5Qyq'SKBu"~Cu.i %ǰ֋I'K> Jt4%3i۫ŧMO9q"/nFe{dBXJ@%aIN֑1߄Zhwò]JcܔA٭FV쫮5(Bm3&~7Nx YݷA:!5G vY)29Q c]Opn[#l6>oZp p](5*K:D; dD%4PdK@*&kF4A)w~sB%Axڱ9s.< v/jke]iհ+~B--?R"C^ !Eif70srZui>",}ۨd8s2CT//v>kOI IEQɳV8G Wa!#kZ='DW&5v[@Iğ>J`@~bVlmbl;|5Q9nz 2NH +oܪەeM*x&>IKT֎ڨ9X1ϧXOrSL:[LVbN\hnJ#U2G !y8N<5K|!RM A;(J*aj+ֆ֤VJ@ohC.qp9vBs*:[kDI"i@Z̨k:%)1FhˊlQ%s]llQq$S>*vC4ȡ''fGTRRC-A w0{L8;)0^ χ&A3*Z%D,<쌫b4s' ^dMS(Ww?&<DyILxNu )jwOWu%@9L]˙&!h[q)'׊4/35 H Vb<ԣգ_|H R<9L{$JMgKQ%Lkܕ҈ˡ6+!^@q?,̍gH e. "1;ȿhE(HtVcAR26W d'A **L]g3i6\TIQsJwf<Տ]ѵhD]K5mM hyL^!%.Bڸ4;#u9=BRIAL&bIL}Ôr#1(:Sn :RCrFQc@**cF_'_-u0/qRw:ܑ1w!Ka%/b;M=N I0G@R8&=1pIL9poti<(gE}q#XSmdtN u( Փi3ZGu+-eB~ -Jt e1]-%r%0߽=u:î\E@Z*qYk@ \F }S42{!j^xSd( pVe .5焐pP$E~'AKi)Ko4RSDKTT)n'k>a5yN *>^ 4f!/>JRpSs G)8IKd(~J.úɔA)ghg_v԰ %R;ICR79P{LS%Rsײr) ns~u?lp;'u[D.Hv kZA   N4 $af%Ǖ.*`mGdnɣ<)PJJO/I)y$2I)[uLA4DILj>J 'R$\"u3$2߇40;S*batik-1.9.orig/samples/tests/resources/images/jpeg.jpg0000644000175000017500000005160313063003306022451 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2Adobed@d,&     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺^׺u{/嵸_-_:bo;ft8U.&\vrjJMxJj |}:b~f~zZؽk.,rVhw UA5JW4@dzsKaN'P4A哿fl_=ryj~9ώϠ~;Mv%5#+O5-eRUmb!Cr8x%嫄".KʀP2;Ujʔz54O'4ݽ npl Fb@1h:rVVCȘ8u`ﶟrl<%vn-)#p{$tоIz9nW]I@~:MI%Wym*}Otb5_ҿad{a+:fʭr{ckEm,s:z̈ }Nhp93q sTi!,=4%CPu7AoBQ|:dY{XٛC~1y?=ʫ}X6 |t}b;~G=YwÖ镾{lGO!7&m9^g)c_~^~?I;Z!8ڙ!I\$*deYcKI[j#㢻QܦUI>ekPoOݻZ$lmP4˵]oܑc7K@n-kϾ7n|}qoʼ_[m幜gנ[̠[#?fwg$u)JK-C$x%tio{q[~iLA– ;*Hoۧ2"~@_bofӸ˧05Sd*z0jUy!hЅ܎t۾}Ked2Kin^4-"[N:rݯ.midT-O^:P;ǾDL})?C_?yПvyO=Fl~_;Ͽ}5?Sg~7p7^:O`'݇^}Oca?_??G}&yl׿1~|__/Or/\,mݧW=G4 e:#&/B?|y߭tJF K0]Uҹ<HGl缛pRt4[}I ׽u~Y4o#껫FJVO G|&xTQLUj)v&^Pi!U ]{s_@]}^ *Q䷍B8kwZZ۵?i(':G+QQ|&c_zC^ *ZQStuh^[[E< ^j>}𖴴ZSQZpHrEϽw$sEO[~kVUHoLثSTzOL2 S)$p wyF}d? # yx">ۭUo g=|>9Qjv^lǽBKQ']_1CS /4h+0Gܩ[\ێy;f6nU_*u6@`BjB qjAmEo-J:M#8MMu*s.>cx&a0ztBN};~w*s<`!G8wX 5c`^[uQ)@y?Q=dW/g+(FunzfB)PӣG1GZ6%z-yf8[dW6#3W#:`b Yu|1ٟϼ6+sSI] l!F~ASwG U+rO'sG.}9'>D8F^! 7od~}}*# bk  =*/Y8+^]ݺk( O1FZ&%ڢ ^hD`}mdz=kٙ^E>G⃠^Өy *X(iW !I{',t#z8:g$f 9QzʬVU5֧%@a+jeKZ'vb|z5x_&zӫIܥ :u-}DOVI֎?ho̊?;+Ac ASG`RXCl>wQf(#XUTU/Nfo9MM{_r'&,DzrHK-54Q]2Phh)Zt(e֠Z 2}}]3s]}9Nb~j2Qw|E_/ -N:֨$]uX/đr1Ԏ! I6_ӷ Z-?Ϩmxm6BG#+WQZϤz,MTRK5,xm{}-K6鷖$V]׽eybcp\f^~"Mo&H@u-ǟ@ii,/qzЗgP\YQ݂(,l.Y>HPYuI͹ߖ?oin,^:]| 6k1{$Fcp # ҹQQch?؝{{nN߸ZN|NoUgY`6hЕ`}r2|˷sD$EThU]XVXPKm,LeSB:F{=鮽{{^^׺u{\gOh?ue M6/~x]wu\$yn[M{l_~L<]A6{}/m"'G!Jo-ߺV}g̓miٿx'{Ͻu['?'v27Jo.?.ۖM,%:8xP;?wwpu˘}Eɯ?^=\v:~*G ~o{}xuչ\Y%u'4=z9 Cn?_^6v/|iA?v:÷^OWfo+1XsFޅ;ԆQmeU?Uae?ֲŒo~'Ÿxu;7N-QwܗNClV8zzuZ.eۖ?ClN7-w(>.#a4~ys3&uFr[DtSq|HE.Փ(; (Md bmv仏dw3ELJ!7HWt rofSfq[LUCQ]vedP礟STTT"F6T}Y{mcniKyUg`9 cle8V*aqC^%7{^׺^׺u{\gOh?ue M6/~x]wu\$y/ܺqO.2S^Ug<?>ڙOQ?k'cq8obp]o-2S^궾J\I9? U&&);pXHVQ{Z-O0^ QJZċ%c 9?z҇n|>'un>o?vWEK X䙠lh䞢9"xPG'kvͳ`^d+oIH_ *0 -"a䁼[O]l~>_9;#yZaQ6ʯكږ0*"ۀ=oRVo1p%IcX|@g<[=[pW;/ܝrԌF\Db)TyJ,49+1sj4uO^}~ܩ+n;]xxj"ѓme|),n:^l>-LSɗD6h窖2<7m9"8FˑKt+p!H j~}w[|I_Ai讳331fbY,M17$y>@:.{{ߺ^^׺u{\gOh?ue M6/~x]wu\$y/ܺqO.2S^Ug<?>ڙOQ?k'cq8gb7Kj?.ӖNNklftC 9zjIiFfRj ŁY˓s8^Ht>L3 OX]zK~[rv_iL~S;J()c@+-$sLx$|i Ͽ=?m;E[KOZ[_06oO˦c}kI÷|=Si# 9 bOfJ.19qG@B, ZO:_s,k$9>jX>膐./WŁ-B^C~u|ks]#Ij .4= Cvw?=mU3R02%P]9AtyGGv FfT #Og%,? G{Y-rF[Z>P;J|G#m;voBqPuAFP}~ tO"/04or/eGc#x3ҟ'rGp/GZzO`L);?~}?o׿{c]\`rBi⍚*S}ewqO}3Y{lrߡz.ą?Z;λS||}ӛ E6E-d+)ruB\T5U :1`Ơ{"7<\}֒n.KhֈPHǨKu<Ǫtu^׺u{Li]=?ue XOƳߪ6} G.n:Ȟ_4.C/b7KT]>\e:T[xx;?M~yz L}ژp7Pׯ}}Y]|c"W㾿ga'biχOisLxae PQ޲xcP?Z?o^O} !na:%oA$T&] LG#G=0XզGwE) KRo;u)^~@Z NI66H}{X6yt]ZT?zg|ٰٛk^JY*zࡒ8#XF_,č0mDC~M.[捹OUjϕ4,p '{gx aea=|>]mݧOpKO:o YGRRQ.:k^ֵy[u}iFlQ11Z qWH:Þ8n՟=U]ЬěIats'GcmbuJٲmôZ=DG}c]^\˩Do˟5K4}-?O{{,jz޷OPeG"yE乷ج(^+z^_,; ت䭐?BI=6Y ,]nS9ٷ(|Pj>j;Wgs(#$_ ,Hs]!OxGۢ(~ʹP2ɯp$u^׺~׺CT$ deq}wc6W`ÃM\ CYݯ[KPi {vsoF?- i.,>dI]K<{nH!7*@`|7Z08u:m6ka;:Is4̲c![!USk샗e +љ4Vɺ]-,j?g/jc7C?7+Wn);|ZHٿcb lЕ#p}bPѼ)޾:/yoAje?G#z:-}/]P]w-NtUuL4˔S- Xhzr-lrP"-E\2Ξh@Cwi6Fܸ<ۛOG,jEUC+U K@, n(y7؝ٶۍ9xuzJE1t8עaѯcR)PSKƶSiksӿ%#'݇9&n :7&ڔج骆BEO:i(4"33>ߺ5ޯI܀ xtm M/ꭾF3 [ql뚈R<޳Ȓ VeK;W \aT7oEoh,sP(B=w FDW(|=:װ M;<>)Rem2VPe)*,5.p?-r,rF`xLeIYXI#*Wi^3:J5?:3̳z;.};`}ޑBؾ P]d=Qׯ}}L^ G=vv> xudk+1La=My{2j|C^]CM/Gl߭wf$MAuF35?;Yl̂?uO6D}ح۝7+~em؍F]{Olr%Nد cNwGj "OE4~0<lGYϼOir_ZO?3bvX2Ct20]͡xn>ٍu6[*ݼ8ޟ^Wz'/Eۉlϙe6f۞qMjXqViUCʡHݳKk e[gYB#d_dZT[*}U&~LO; ǯxi%ln|=%>'y=qnjљ1҅ iXXZ)~>{+_>^wb,2[ji6sI^#v{,,o@Oa5G64* 5-\ majW3dǟLAm>V[nzu:S_c2|ߴkꧣZ]XI㢁H!K9?"R2CYTOlޣ[^aI=7z#;msp"ӹG̏O?.4 _8j| Qt"wne;/l6.7sKڴJl9$;{riid2)q'u|%p2dШF=lmg #5QLJ[#.l<~cuvջtagv*Tzƥ&svoZhJ 9o_:~܋8#͛l\a;AE3Nx诪8-2DHez2n6Hv i ~%Pd ubahI`#JkXo>x9nyhb@=L@HE=݂Y$p?&-&Tt('jٴŕ]4 ^?5O%KAᚻWtlA;cgY)sA"qp1&:,3TqpE1ˍ,enĺUOUixx: õzcwFS=忴'̷T ])i?>k!tKBb8͙0L5Fǡʆesz~|vkBsqQ-qI3뿹x Rlx'{m#z GS)?׏GOdLN'qՙ7}/)ucˍKqէUo%']u[ɦgyWU7SIl?>7 ~!֖̓|Ȯ_~_nFu&֒mݟ/G>ܟ_hEԿ#8:#`֧O;?O(nk?%2UQ}̞M_w56{8>oՠSqO=4joHm:lm{ 7@k=b~X3id=Qd_&.~?âO]a?a|=-w5_^+&OO!;-Oǭ]hoA731SARSz%uFJ!QQ` VpUsm Kr蒨JAJ 'oXSGG}@('zؑmv\n)?N4t\Il^wn7-\;vP@GaYqXYt#{c.c[o;_% &I8X雫d WH$ /g_ooxrkr퟼7nۏoJEojw?ݟO45~.e_ 5iTZ'Y1OVJzJW4mZ{:ȷ^w7syQcur~IQMY4) QWF0>zt ooއ+eE,-w& ,ZGr2 9|HMDd?ğ>u#;1Y$SI 9f \aM<*iRW{̋Psfn$zCPn?=ܦi*ӡ1zOSS}oNRTomwDo,etF=fNkg7K$ja'S?BFn$vdp$"SLϤRF'luN.#9q OoA# ,lXƒ{;wok,QDǨ@r;e-p~1^AU<{{r.K9&XdFbf1#ÒH*U# *-鷾=˞uEos3U(JԆ PxF;5,L@6?:=ލ>Hcn\+ [__7O,Jo Gb⡥ɼ.졔K"ZӢkv[n`ymBq|Hˢ;chT_?C̜֘O| lN*O}ۏml0n?:w8i{{ߺ^׽ty?y|L=zsO4ᇿݦMK[GEWTt?I٘ؐ?_SFʽ=drNcv&ե}I.i㞛1UO,b*%0#%!E =\{ߺxATy:4aH- .ْsA&Ӛ/cc?O3nzVh3$ܩxءh% N#H5hZ#}[ JnEFTךּ2)M >ɛ$<KLoߝIW7=? ծ}<_>mR~ˤIz%#˭F'W_%mUdU˻k #ԊYyDi%.yrKgGbZ;e() S6kZR?ڙ.ܛo-0q9NJHk1 `>eV{Zx_>}jڝyj̝{՛8Y)qX蘱ǒ^Irǰܡ;/$lVn1V?G ϛ5@ *#{ni5c:'鎽{{^^׺<~hnܝԘw&\]VQ./qerۧfjJ}v|yX2G#ԼB't^rvM-qHU9Ls4c)p䀁!1ѹϵ\ź#;!^H*|[Wo{*{/elߝuuWKv2y e#q,%:]G>{^~`%A,R!"X졦' RF@%c\w#RĢL~Yb=O=}i ;ZQ#ףHG&hpy:7 fx$IǗXc?c-!7?!?TubfҿW/z0n:lv3> T<ѡɢ(c3q>ڹbl[a WQ0Pq=obJ}kg'Ohv`7.bRQ,Rᱛt)n,g^r&o{@ztL]=<)~ƨu?kieUj'Րҽ}?{ڇ:o}dzbb+G-rQ NRQH ɜ[uϻ̶7V*BC 22&1ӫABLҼ<% J &qZWDu6~da>H裧UshI%32}S}m[}5L HQt ;ϊ>aEVIWILUª5T렭C\iȻݗ6.-+ܱB|gϤSoHD1{[1{+eTpML*Xc`qZT+mGn=;OU; d\1 EIL8ULJ@渹rTϠuV^׽u~O7G4hAF-sbM;#mdҒ 3&0{i1|7[L>輠7r>־y?v>yhdYhgΕ8d'?w쯦jBcLI%+ }_p*ܭhıTUolJ*re!(rIH-`䈬睖c]eMUm0[J-M2iA_*cVp`;M_^XtfV ) V9z AujOT4bMݱ#mvUe~KENTx]L, IGV+qF!{$CKvAsOf%$h'f5vn{w4n #|XGd jHbqL5caP]k őiu# 9g~\+L)>U 48ង,Vdt1-VQG/qR.hݙjlFQVHVY.Z/ޗ6VW1|HmC3{ohGWTt#P?f3IMAM <˯oM ;KC :1Hh`wqU_77\^oper|j̖Njڙw^ʠ{ jm (#P99>1wbX{ߺ^׽u^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺batik-1.9.orig/samples/tests/resources/ttf/0000755000175000017500000000000013153020772020353 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/ttf/glb12.ttf0000644000175000017500000015032413063003306022000 0ustar mans0954mans0954`GPOS˼LGSUBtPOS/2_1Vcmap᦭cvt Dgaspglyf thead!Ę6hhea F$hmtx9<"locaN 2maxp@ name_ =mpostBP ,latnkern "(R|*-7W /7Bb7d7e7f7h7p7r7t7 /7Bb7d7e7f7h7p7r7t7/7Bb7d7e7f7h7jknop7qr7st7vwxyz{ /7Bb7d7e7f7h7p7r7t7 /7Bb7d7e7f7h7p7r7t7/7Bb7d7e7f7h7jknop7qr7st7vwxyz{ /7bdefhprt -BGQUWXZs ,latnliga^ L mj "(gmgjmjg k kgjfPPfEd X@^z|~13:>DHU[dq~7    `|~ 039=AGPX^nx7   jbchpi VX  *0<BNPTV!"$%&')*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\^ bcdefghijklmnopqrstuvwxyz{  _`~a(狩!!"$%&')*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\^ bcdefghijklmnopqrstuvwxyz{  ]#|}a(û_`~DDU./<2<2/<2<23!%!!D"UDN.!'+&'&'&'&'&0#!3!567676'41&'&'&'N/&83fPI"J E[t9 5 )), //0 3 \7;e;9R['&'&767676'#&'&76s@##/A."q(#z78:' /$2:"Zk6:>'&'&76763#"'6%'&'&7676#"'676%#6!65s8"9 ?>-  4&7 >>-  X, {$T :''; (!L 9(': ('Kx=Zk6:>'&'&76763#"'6%'&'&7676#"'676%#6!65s8"9 ?>-  4&7 >>-  X, {$T :''; (!L 9(': ('Kx=Zk=AF#"'&'&'&7676'#"'&'&'&7676'#6!?5 h/ =>/   &&6 % =?0 ! $8| oh.-C):%  :6# K!;& :6 746'41"95&7676766'&'4565676=<# B-+- ^ E=8e;=3 31= + $ /-M *'C'( !a601'1&74576767676'#'&'&'&76767675674767672667676?676;  @-+2+fP^$K ;!;9K(- ..E O:/, (C 2T=%   9<4  21; &t%5lB43-`9h8K@ '  * VoQ:x U!L.0:+"6'&'&'&#"'&767676?6 -  " /)#= k k  "5F3#N>x767676#'&'&/&'&767/&'&#3'"#"#!567676'!!567676'#763476567676#&'&!'4767'&'4 EsG-"  *J@J `  G@%r G@%{ W %PSS-4 \B1$H J!(!;>"", Y 6>3))%8v>3))%8v11(8: N 00' 4&1$Nc47456767676#'"/&'&'&547&'&'&#!!567676'!!567676'#?0nsD%Z  'I#P h1{ F@%r G@%{ o+>3{PP 1  , 9 $*' E.1. \D 3))%8v>3))%8v1NBX47676767632322?6?1;633!567676'!!567676'#76!4'&#+"@:nP #FW? M @%r G@%{  N8C)%'oPH? 4 ))%8v>3))%8v1x+/X`N+676#'&'"5&'&567&'&'&#0!!567676'!!567676'!!567676'#763476567676#&'&!4767/&'4kم{AN  )HE& _ 0 +> X { IB#tQ G! p G@%{ W %PSS-4 \D1#%{% & 0:6",, ? jG\K4))%7v8 5))( =p>3))%8v11(8: N 0  2%2$N+^w676;216?633!567676'!!567676'!!567676'#763476567676#4'&'"+"&'&!4701=74=67'&'4W$[A%&q?$PB#tQ G! p G@%{ W %PSS-% -;H /&4 \B1$-U !B 5 ))%7v8 5))( =p>3))%8v11(8: 'x-%F\ N 0 4&1$#3676?63!56767654'&#Q/ 8 "G# V=  + &))* -/9#%67676?656767654'5&'&"W/&L03:2jDgY? D _)Ih3f'>  <\X&%&/&56@$IDXC)R'$#\rX 76oO0#uX(3'8]+#676?676'&'&'&76, $ ** * ZF /24 \-3767653'&'&'&'&#)]&, p>+)XUm,(, `͔\ sP]mLVY+6!21#!"'&'&!!)! AV16'&'&707676"3676'5'5'&'&'&%N$&$  = (*N ",2d= +$B## KPL,MTNG.CC0 <;< ]5765'&74147476327676'&'&#&'&75476 %>C@| '2J 1# Z3QS1. HA; %dM$60#"'&7676?6 !E 5e#    \)9-'4767636&76?673#'&'&'&#:2:B;h+!C4#)B&(=<$C4#9W5" 2,P 1%3\8  11 1%3\+547676#33#2'&'&7676 9 C ]8-$/s `,6!!i P@P.)NFCl47456767676#'"/&'&'&547&'&'&!##'5676765!3!527676'#?1my;.Z   'I#U , v, { ,u'#m*)r A<&{ o+>3KT  1  ,!9 $*) O"$. a-GHOp;;9F{>1))$8v3##+%6'&'&7676!6'&'&76676?61236767=4'&'&56736?6'&'&76737;7;7633373676767670=##"'&'&54'&'&3<$ :;<# ;Q/$6! 5CV@ 3-$ gig1g7&B=% />++ F,GA"X);<3 9620;<3 9623 MZ-@YT%<(  yY V% ',"]Ry`A, {@;O( ?,<*6'&/0&5&766'&7676D1%4  F;$&+ %B+* 4&5e) $ &K)J /@. 52< * #'5?5/5%#'555ww-deF !"'&7676763!2#;676754767676!27676767676!213#!"!2#!"'&5767!'&706767!&'&756763!27375756?6%!!7676   8  3 L7  "R  7) <#) 29  j!GC&& @&7 w  h %  ,*n '"    ) ޾" 6 >."Uw54737676656'&'&767676&'&''&=''&=&'&'&767676'&'&'&'&7676&"376?67654'#5+'&'&'&'&/"'&'676767674# Ga -:. 4 ' < PA,2E `^.9-!3&;F"4EP#C&GOY0   )X$ 9MW,  % SG*Ѡ& " )-s @JG <% ! H" ]8A+Y' ")-{AJG <%  I #-PXkF9p5 $(MH Q(  S7 V W,0d&@\t6'&'&5476&53 7#67 7676767656'&"6#'&'&'&767632767676'&'&'&߁n0!7 $sAOp^ wQ7A#7BzK$ iR[hK # `Ysph ,L pP&r=efL0 ]Vq C:]" &NO".N[+-yB& OCk-[? +RB 1V S'1*''k7) E&-#/uOHLGr-h>jL5V,812pJ&* F+54rPI1c[W*Sqk}'5&'&'&76%676'&'&#!7!#6767676367'&''&/&#&#'&'&'&5476767676&676'&'&3'0/#"2767'17 %Zn6C *+ /#'))i@)X- (B  ,Z;qG(%).N^-B  FS B["!M * d) +(,?0lI d_C!jchc&JspR 떞=!" hh1*  T &  1!( +B 0x40` :1Too 3!!#!5!9K9Hof7b7%'&767676&'&76sX2-5 =,k,( u 4.B; .:@!fB!!f$9%6'&7676-=$ B,*;>3  42=(\'667!;K;t"1-%38K8V36'&&7767676"27676'&'&!:R" T(:OeuL1G&, B#5,+G&+ {,CiƓF*9%\uR 5=4I܉J+%3I&} #3!567676'#'&'5O F#  BB 4 ))( /{O67676736!276?676'"!671?676?6765&'&'&01/&.5;?"[;sPA s 1?$"Y , )#  ; y' VXk{.X?2oaD 3h% K?PIN1/ >%=>9lS)]FS&Yh67676;6'&'&'&7676321?67676'&'&'"#&#&5&76?67676'&'&'&#V:%OY4%V]I d#0WOxI. 8d+#'D5/ >"J[FO/ CI)<5X<  8Cx`F3T }eZwB:6o1L#  8 7+!2I_M  TK>Q"dV$677637!33#3!567676'5V 7 '@s TM I"b6E4: 4 )), :}F!&'&'&'&+676'&'&7676323767676'&'&'&'&"#A=mL%NqY(7ABYlw> g1& !W& 2 _5}  5w{.\ dOĹC" ^0G$  Y; *986G<%T(@632'&'&'&7=45476763767676'&'&'&TkJ$3nJ9M; bzH4̍='* !8 L'X%,#:$DL3:$)-]Kg;έs_) /QbmZ(6^)-MyU:{,!1'#"1676?!"#?) d $-g- <;c. /'"?mED< "v(` =#U3Rq&'&'&7676767232#"'&'&7676767727676'&5&'&'&4'&'&/&767676767"J%%a T|`Z#'cBAibn%%J1UR 'l&+ &0 #!6%.. &8  i+1P $;+D->$%U '\-,u\zTJy^R_= V uu ~('yQg% -8kp2$* (;PI)*$j< &4aE0#I$U!9'&'&767676#5276&327676'&'&'&!\uNJt}bF WYlY&C&9(F,7%&E& R1A^ 'wf& U"- ) sW )/ ;]jJ/6]JdsEp&6/&7676766'&7676-=" B,)3=$ B,*m;=2  42; + ;>3  42=(p,6/&767676'&767676'56-=" B,)3JX2.7 >,q4m;=2  42; + 4/B; -9AZ/6'5/&/&'&71?076= X/w p! {0\ '%- h!!!!##h9:[,61'5&7476?67654'&'&'&'&H4!j#w? k ' dNH&k)  $/'vsO  <N6767676;6#"'&76?676'&'45&'&'&'&6'&7676 1r 8(%M:"86K(. 18*fVsA@GP XQ]L%@K38sP5$ 0[,0wj>8)K'*g?    ">Z'  &(CN>2)@"4wפ9 o sYs+ Q  &F,`۸漪L o/&FMh&/0*d&9wu.)\# A "04k2 C 3;5276767676?673!567676'0&'&#!3!!&n2T+ 3pQz9 2p7  K9'N `)5E  L? 7))!  !n2 )w@/oHC-X!2##!527676'4'&'!27676'&'&'&"'&'47677;6767676'&'&'&#"+Hi D)F ?:Ew+&*3d0UH.rd& 40U cYhH==&P+\7cu ^u:1J, /LzwwFT )#O4:Aj`Q#&LtD"O_"# Ll%:C  &%o\%'E J  Jd Jv* 0{H&>!220#!527676'4'&'!2?376767676'&'&'&'&+H^_[WW//P H.r4! K RA FP]#C.Z m_Se)#O4:U(&b=H>!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'H}# E8[:P ))LA} Q$U0  #"H.r4!  B>4 )#O4:H?!&'&'&'&'&'&#!27676727673#&'&#!'5#527676'4'&'H! (G9<*"V ))W?'%jM H.q. CD- :) )!P68hX\#"'&'&'76767676?&'/&'&'&'&3732767674=75&'!#6g" MfYsdgP z%렏!%D)Pe43F2Kd(2OEL!C9. #d9>91B I6"1+Lś4-0 "&pp Jd^'  ]xkV. $M C1)H1;!!4'&'5!!56765!!527676'4'&'H9p  m9^% rr_rH.r)6&'3))*N2 8))80#- 8))#O4:H)3"!'5#527676'4'&'5!276N,%jM H.qf'  )%D 3 :) )!P68)##!"5$76/4'&#J7Z'H>Rjr) i)* 3 /*$a))OOb)-5HP!7676/#'&'5!#1+03!5674'&&/&'#!527676'4'&'H9p 3/[K5 &  TR%Iq! uH.r)6&";$))*% ;3;)) # ". <))#O4:H*3!2767676763!#527676'4'&'5!276p 5#t %!H.rf'  )62sA)#O4:)HX2767023!567676'5&55&5#&''#3!52767665?5&'&'å+&GN2m 3o _T #+I\Zf'4l.' ):.X #?))/3 #=+e>))1 A5 :HQ&5 34=&'4'!"'"/&'&'&/&'#!527676'4'&'!q5|dV)!/G !'  mH.a NhM A))'>D*!;*&4 :))!P76)h)@6"'&'&76767672"7673?676'&'&'&'&;g}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aH %aܚ/ qᙕ( <&H s5%H u3H.?!2+!'5#527676'4'&'!2767676'&'&'0+H(xSP+*B"(4%jM H.qZ$ ,Q*\13h /,Vvt$Y / :) )!P68 'OsA9S/g)7R%'&'&'&'&#&'&'&'&7676%6176?67676'&'&'&-Cj5-4 6M$^P8/(Vx:8N8v꫿sb&Pe^ ,:Lod?)"EKm`Lq^%  YVI  au'#DK"$W!\)Tp,,Tq/HUn!73#'&'&'&/&'&/&'&+!'5#527676'4'&'&#676'&'4'&'&'&'&#;67'3H|N3/M>M$$4y]C '47Oj NT@b@3 X%jOH.a .E  +`$(LT )3UyfI`' ]ۡ, *FA  9,pR +v<./ :) )!P76#Vs$" Z,hg6;76767654'&'&'&'&'&'&'&'&76767676676;2&'&'&'&'&'&h , ^=[HK1 O Dq'$ 1ckM! >)<-Z??F4')d JXq! 4>qZ % w)J w"M [oS4 G.?]%0:EDWoR' XPg3 >k3!.*/'_@1B/l j h;!+&'&'&'&323!'5#527676'45#'7327!2736B$ JPSdO a$ \@L%+*  2" r7 5) )05#1HN3"327676765=&'!""'&'&'&7=454'&'5!276f#:UO#BxD "gdk"@PUigbu?'ff'  )3"|G1B -g)-6W>3));"3!g/"q=N7q  &8)5!#6767?6'&'5!"##"'&/'&/&'&#94P #.Pt2 7 s72t)#;-B9))5 2EOH -%5 5 sT!0 674/&/&'!66?6?5654'&'5!"##"'&'&'&'&'&'&#91j 0x90X G 5<Tl8  IJ&a+ 8l)-C 3K5))*+-)))5?`B  1 f=5\!&7676'&'&'5!33!5676/&'&'!5276766?654'/&'&'> (.@ :$  3|D  }#f">y *8  *% rH !{#"<{)!>.Fb1))9  /49))!@U41))8 )  0=27M!#36?67676?56'&/#'&'5!!567654'&/5&/&'&'&'@  ! %  # 8~C  !jj! !\ C~) &:21 /));<) #4))4#K )} *;V!!276767!!"'{VB9<)#;>)TNU!!!!+>9: #5#5ww-ed%%%!!5!!>+::+"6'&'&'&#"'&767676?6 -  " /)#= k k  "56'&'&76h<" : ;<4 882-[#"'&'&'&'&76# | ,n4*4.$ ; =@% *9<7 Ud%'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!'/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))#0M2767676336767676'&'&'4'5&'&"4767676'&'&'&#c+! D ;\X/D,'JDK2E8& z'%V%"/ ?,. 3#1 G'3}' 3K*  ;:zsCA>*,9 +%5g]2C e%F) 0X{m<UqB6'"'5&'&'&'&#7676?632'&'&767676 e4 ,G8-  G #!322 ;Z5N3  9i%EaR"/&:N$@!3 0   K? '=g.)x %P; :i/ UG|FdU#V6733!'#'&'&74767676"/&'6'&'&7676776'4554'&'&)CA JjC#:.,VO& 1  &U1m$=O$#VD? 0 )^> a@nc?| $=3#" 6F"@U$ H[ > U^a#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7s /6&0M2(#L*EHR *{  \Mc{+ cdYm>   C  R'P/(b |=!@O15ו  #(f#&30  NH476767276'&'&767'&'&#3'&!567676'#? HDD  %.HD#&*J b G@%{ oBB72/& /2:,6 9CK, [ 6>3))%8v1U#W76?1'&'&'&?632767676'454'&'&'&1653#'&&76767676y' ;clNc9 ( 4G%)>! $D F -!$=#1;6}84JPvHtL-S9!{`I% 81VyGNV5 #?y7@?}/6e ;u y4 ))'  /bgY.D  (-3))17G >#3*06'&'&76676?63!56767654'&3<$ 9#ٰQ/ 8 "G# V);<3 973.  + &))* -/9#+96'&'&767667676?656767654'5&'&"/<# :2 W/&L03:2jDgY);<3 962$ D _)Ih3f'>  <#^N276?03676'53!5676/5"50/&'#3!567676'75&'&#a)/)+ mM#D/ "/ 9o+ "+: PO!k {* + ));K44K @))B V$ 5 ))17G >#36733!567676'7&'&'&#)PO!N%"yEB 5 ))13S ; #h2767676336767676367672!56767657&'&'&#'#&#"3!56767654'&'&#51!56767654'&'&"##i( ?7PLP3-A.dL DC# D#3!M K A#2"J G#  [ B( D2  >%*f(Z4h/ # 8 ))(  0gO00]klh- 2 )), 29 R//Zi~ j*3))* -./#LN676?6336767676!567676575&'&'&"1!56767654'&#Q/ FF[5`C$ F#1"J G# V= I2  b5G I F+ 6 ))'  1iQ0.]gqj*3))* -/9U /6'&'&767676&37676'&'&'&30YI(:=+ Rdx_.<+ UW'<)G+E@2:"'D/E%609&C~Wi]G~XU;!6_uVA"4fdNA!#F[2767676336767632'&'&'&7636767676'&'&'&3!567676'7&'&"#c-% @ 'NUscPS( 6  ["*A 1B1W PF# k B& G*Mkٜw%)?/ &Mħ`+"DA7 5 ))) 2= ?UF#P76?3!5670167654'&'&76'701762#"'&'&7656767676y'M C$ 5A4"6F0+6 0 ,SU!] h#J`K2J8 ߋo: 4 ))'  3v8=08 6IgRD$*1/A4 X"r!+F&#J&7676'&''&'&'&11!56767654'&'&"#52767676336761M1#=+ .J G#  [ i( *\ a&6  -1Xm_h-3))* -./)( 2 V_7767676'&'&'&'&'&'&767676676/+'&'&'&'&'&'&&'&'&'&'7=| 7(#O%5iQ u`~z3; Lh4( Px =  08==,bb5 '1)HO! <\'4a /1c6+j> TL)%3 **#I+}H :'*e N%33#767653'&'&5#527676) 9L&H3{hXc:q'E!+?mL&_'J7m)Xa#LH676731237276765=4'&'"56767673233!'##"'&'&'454'&'&#i'="A$WQ&6,J5PH + V! ?&Rd1 /qk >m2=(  ) ))-j)HBx m-Aq-!6676/&'5!#"'&5'&'&'(   - !h0I  ( 0hq)&^4JO'))>P J(ia>q_!36?075676'0'&'&'5!5676'&'5!#"'/&'##"/'&'&',d):" ,l+ +`!c1:J  = =  H-0hq)" -dAI V >))" 1j1)):y! AOIp3> oU!16716?670156'5!"!56'&/&'!56767656/&/&'&'&.o]K$_S(:_+% Z ,dJ!Co-AXo)+ 8}& ))8 w>2))/ ,4)8 dA 44o=!#67#65&'5!'&76763676?654&'&'+  .a. r .,=(" :<5  @  +bo)( js * )).6!*3+4<! $; ).Vo!!276767!7!&'u/\* 8)S% )oUZT!!E9!!N99- !!9+)@'"Z<9-'4767636&76?673#'&'&'&#:2:B;h+!C4#)B&(=<$C4#9W5" 2,P 1%3\8  11 1%3-'6'&'&76%6#'&'&76y!@%&0 @$i!?$!/@$?C;/>BB;+ >B"O_"# Lls(-w,)O%:C  &%o\%'E J  Jd Jv* 0{g?c633?6'&'&'&'$&'676767667676732&'#'&'&'&76767 :   ;= `/KA "O_"# LluZ& G "%:C  &%o\%'E J  Jd Jv* 0{H&Me6332717376?36''&/&!220#!527676'4'&'!2?376767676'&'&'&'&+. &.  5  u^_[WW//P H.r4! K RA FP]#C^FG  .Z m_Se)#O4:U(&b=H'f6276760'&'&/5'&'&!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'   + (}# E8[:P ))LA} Q$U0  #"H.r ] _#6 /4!  B>4 )#O4:Ha!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763&'"2#"'&'&767675!527676'4'&'H}# E8[:P ))LA} Q$U0  #+>3? 3  5>3*.KH.r4!  B>4 w) < "r O?N). )#O4:h"{3767676?3'&'&'&'4'#"'&'&'76767676?&'/&'&'&'&3732767674=75&'!#6(  7^45_; ) d]d$g" MfYsdgP z%렏!%D)Pe43F2Kd(2OEL!C9. #d9>i2[ c/5QUS , F 1B I6"1+Lś4-0 "&pp Jd^'  ]xkV. $M C1)Hu 8767673!2767676763!#527676'4'&'5!27669%j57#>p 5#t %!H.rf' u(&X ;'C=) )62sA)#O4:)=!O6332?6?6''&'5&3!2767676?6763!#527676'4'5&'&'5!276H. $/ 5  m 8#f% "!N,qf' ^F G   )78s9)%O1:)HO3"76!2767676763!#5676'5'&7676701=656541015&'&'!276r\ " *5#t %!l! ": $9pf'  )981!    A)69   :D ; )Hs ]76767&5 34=&'4'!"'"/&'&'&/&'#!527676'4'&'!HZPq5|dV)!/G !'  mH.a s(2)[NhM A))'>D*!;*&4 :))!P76)H!%s603760'&'&'&&5 34=&'4'!"'"/&'&'&/&'#!527676'4'&'!6   &4  & q5|dV)!/G !'  mH.a I w +>  +NhM A))'>D*!;*&4 :))!P76)h) )J!!6"'&'&76767672"7673?676'&'&'&'&?)?$g}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aH %aܚ/ qᙕ( <&H s5%H u3H=6'&?6763"!'5#527676'4'&'5!276R=" C+*N,%jM H.qf'  ;<3  42=* )%D 3 :) )!P68)U3767653'&'&'&'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!')M%0!%"p=,)Q&&hj&4 #/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6σ]-sQ^j#+1/NPI"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))U'&'&'&76767"76?6767627676''54=454'&'&'&'&#'"'&7676763!'#2#"'&'&76767JW Q%"=7.:C /""1   1>A)!GOV>j,X!C% @+PS),K T"!--8?   -1HQ"+b\ 9)#&- n.  l*/Yq0 6 )}- +T!9 o[ AO&- UXP2"#76767676#"'&'&7676767676767676'5&57676-3.92k`t( V, %5%';!TB#  +j"& L AF   ,09 0fNe# 7r# , #TB xA 2 N@Ic#U#"y6767676'&/&'&6733!'#'&'&74767676"/&'6'&'&7676776'4554'&'&!- &b`  #" & )CA JjC#:.,VO& 1  &U1m$=O$# Z,0  &' *YD? 0 )^> a@nc?| $=3#" 6F"@U$ H[ > U&6337676'&/&/&#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7  %   /6&0M2(#L*EHR *{  \Mc{+ cdYm>  l l ( P C  R'P/(b |=!@O15ו  #(f#&30  Tx{"'&'&'&7676760''&5&76?61676'4'&'&'&76?6#"32#"'&767677Nh$&3,e_{D9 /5,(  U,1 @#@E*X+1=y`AA87@A ;$ J,"1< !* YIL Pf, A -  &hB" !>fɻu="%XG_@ `%7"$y mAP,) U#u376747653'&'&'&76?1'&'&'&?632767676'454'&'&'&1653#'&&76767676)D&5 $|K)N&jk$6#y' ;clNc9 ( 4G%)>! $D F -!$=#1;6}84JPvHtL-S9y[4 FLj) .33JPp!{`I% 81VyGNV5 #?y7@?}/6e  - #LXT7676?6336767676!567676575&'&'&"1!56767654'& J5E  L? 7))!  !n2 )w@/o %Ya673676767567476/&0276767676?673!567676'0&'&#!3!!&PMUG/*;&  :OQG0+B#   n2T+ 3pQz9 2p7  K9'N `R&@7 7l, @6!>5E  L? 7))!  !n2 )w@/o-ai6'&'&75676%6'&'&76276767676?673!567676'0&'&#!3!!&B&/!A#!^B%/ #A &!Xn2T+ 3pQz9 2p7  K9'N `>B<* >A;4 =A<(>C=45E  L? 7))!  !n2 )w@/o*^f6'&'&7676767676'&/&276767676?673!567676'0&'&#!3!!&"!I? #)'S'*$1^5!,9K-'n2T+ 3pQz9 2p7  K9'N ` 3YX; MQQ G-(5C; AE5 5E  L? 7))!  !n2 )w@/og?|"'&'&'&6767676766767636&'#'&'&'&767671#&5&7032767676'&'&'&'&7զYUX& B$(W{ *(M I S [>"Oa!"%Gk3<|?=C) :!qH- 2  ! _YQo-%#n(E  M R\ Fs( 0|$:y*G *O+)k,(A9"Hq J%'&76!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'G0%!}# E8[:P ))LA} Q$U0  #"H.rqK6)))" 04!  B>4 )#O4:Hq K76767!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'JV4P}# E8[:P ))LA} Q$U0  #"H.rq'2n0)[p4!  B>4 )#O4:H$c#'&76?676320'&'&!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'I  > "0Oi}# E8[:P ))LA} Q$U0  #"H.r)N R  2>4!  B>4 )#O4:H/n6'&'&7676%6#1'&'&7676!"'&'&'&'&#!2767673#&'"'&#"#!2767676?6763!#527676'4'&'96A$b85A$}# E8[:P ))LA} Q$U0  #"H.r'GG( =B=/ 'GG( =B=/4!  B>4 )#O4:*u C%&'&'&763"23!'5#527676'454'5'=&'&'5!276+961X R+fN!O,of$ u=<'4# 9 ))E 3 9) )'J28)Hu 7767673"!'5#527676'4'&'5!27669%j57#>N,%jM H.qf' u(&X ;'C=) )%D 3 :) )!P68)<,^6'0'&1&'&7657547676?63"!'#5#527676'4'5'=&'&'5!276Z'  (- (4N,%jO O+qf' 6  Z  1E )%M2:))$P28)*T6'&'&7676%6'&'&76763"!'5#527676'4'&'5!276?@#"6B&?#A$ 8B&?qN,%jM H.qf'  >B<.  =A?- >A=.  =A?- )%D 3 :) )!P68)H !%s47676&7673/&'&&5 34=&'4'!"'"/&'&'&/&'#!527676'4'&'!@#.:CIx( C3&)2#5;DEC3'5q5|dV)!/G !'  mH.a T]538\ 3&6M9%454&5NhM A))'>D*!;*&4 :))!P76)h)s *K %'&70166"'&'&76767672"7673?676'&'&'&'&{!(g}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aHsV))$ Q %aܚ/ qᙕ( <&H s5%H u3h)s )J7676"'&'&76767672"7673?676'&'&'&'&}ZPg}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aHs(2) Y %aܚ/ qᙕ( <&H s5%H u3h)?`'&766?636/&6"'&'&76767672"7673?676'&'&'&'&HF i% # $hg}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aH'?  %. LA %aܚ/ qᙕ( <&H s5%H u3h) #Cd47676&707673''&'&6"'&'&76767672"7673?676'&'&'&'&!@#.:DK+ C4%)3#5;Dt) B3'g}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aHT]53:! 3&5L:%4X| 2'5 %aܚ/ qᙕ( <&H s5%H u3h)0Pq6'&'&741676%6'&'&?54766"'&'&76767672"7673?676'&'&'&'&'97"A %$[97 A$'g}fBc X0+~EXȜMV.+{DQ| \D$!H|W{ aH'FG'>B;4'FG'>B;6 %aܚ/ qᙕ( <&H s5%H u3Hs Y %'&70163"327676765=&'!""'&'&'&7=454'&'5!276{! f#:UO#BxD "gdk"@PUigbu?'ff' sV))$ ; )3"|G1B -g)-6W>3));"3!g/"q=N7q  &8)Hs Z767673"327676765=&'!""'&'&'&7=454'&'5!276HZPf#:UO#BxD "gdk"@PUigbu?'ff' s(2)[} )3"|G1B -g)-6W>3));"3!g/"q=N7q  &8)H!p'&766?636/#&3"327676765=&'!""'&'&'&7=454'&'5!276D i%" #if#:UO#BxD "gdk"@PUigbu?'ff' &?  %*  LA )3"|G1B -g)-6W>3));"3!g/"q=N7q  &8)H/~6'&'&?676%6'&'&?54763"327676765=&'!""'&'&'&7=454'&'5!27697 @#'X86!A$'f#:UO#BxD "gdk"@PUigbu?'ff' 'FG'=A<6'FG'>B;6 )3"|G1B -g)-6W>3));"3!g/"q=N7q  &8)u\76767!#36?67676?56'&/#'&'5!!567654'&/5&/&'&'&'! T/"57#f@  ! %  # 8~C  !jj! !\ C~ut7'C=)) &:21 /));<) #4))4#K )} *;UXm%'&56'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!'{!!/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6XX))#z"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))UX p76?6'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!'D UK>/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6XY5 )\E"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))U,6/&/&#"'&75676?576976?676'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!' .   3GH86."/ ~/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6>' /)Z )>"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))U(47676376765673#'&'&'&'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!'=$/:CEA4!)B&(=<$C4#u/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:69Y7  250$1\8  11 1%3"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))U)6#'&'&76%6'&'&76'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!'?#1"@$d?$2!@$ G/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:6>B;( >A;3 >B;' >A;39"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))U)6'&'&7676727676'&'&'&'&'&76776?6762"7676554'4'&'&'&#&#"0#"5676767643!')H$)!))P ")1fD#" != /^/\#a7F,:  K%O/&8)>IR3#3"/  ! =]3W _b>50:61YB7 NSNH+<;<  D(%/A"r -6U#8>@%" 8@1JQ8 &[gAA!%+ O84 7H0))Uqr"'&'&'&76767236#"/&'&'&'&'&76?6"##&'&703276767676'&'&'&'&5}<`'1&"E\YC6 F!B'  [  7#53 &F'!%l2  "?j.-A ' 6! "A1 ! ELg !v   Z@9q"a2)u '/_&G *L-*j;A9!UXmp&%&/&756#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7X!,$ /6&0M2(#L*EHR *{  \Mc{+ cdYm>  Xa)'" C  R'P/(b |=!@O15ו  #(f#&30  UX hk76#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7HfA /6&0M2(#L*EHR *{  \Mc{+ cdYm>  X'B ' C  R'P/(b |=!@O15ו  #(f#&30  U 6/&'"'&7675?6?6#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7 !9 )+  $'t /6&0M2(#L*EHR *{  \Mc{+ cdYm>  $L  \  -3I C  R'P/(b |=!@O15ו  #(f#&30  U46'&'&701=7417676%6'&'&7676#"'&5&776767016765&'#&'&'&7676?67676'&'&'&76767676'7:(."; e:)-#; /6&0M2(#L*EHR *{  \Mc{+ cdYm>   *I.B)'3  *I/B)& 3 C  R'P/(b |=!@O15ו  #(f#&30  1X /3%'&'&76676?63!56767654'5/&9Yf@ 4-8 "F"  UXi)>#   ) &))(  *-:#vX (7676676?63!56767654'&saHQQ/ 8 "G# VX(<)Y[!  + &))* -/9d=6/&#&'&74167676?667676?63!56767654'&7. 1 2  )W/ `D#  V#? u!"t  5y  + 6 ))(  *-9-L6'&'&7676%6'&'&767667676?63!56767654'&#@%,  A$<%?$, A$<W/ `D#  V?C;#?@<0 >B;"?@<0   + 6 ))(  *-9#Ln47676&175673'&'&'&676?6336767676!567676575&'&'&"1!56767654'&%<$/"8"@$i'="A$WQ&6,J5PH + V! >B;' >A;3  >A<+>A;3&Rd1 /qk >m2=(  ) ))-j)HBx m-A4XM7676767!#67#65&'5!'&76763676?654&'&'9:#h<% 4+  .a. r .,=(" :<5  @  +bX()V <'N))( js * )).6!*3+4<! $; ).4#a6'&'&76%6'&'&76!#67#65&'5!'&76763676?654&'&'!9<,"< )]!8;*$; )>+  .a. r .,=(" :<5  @  +b*HF(C6/8*HG'C6/8)( js * )).6!*3+4<! $; ).A _<)) s t svDSN~555~NNNzNzN~#~pp777N#,CU ~11]9~f~VVVV{VYVVV}VTV{VUVU~~r rHgHxHSH(hxHH(H(HH$HhHgHh|h$H t(VXCX~ Ut#UtU$U~NtU#~#~t#~###bUt#tU#VN#V+ggHxHxH(h(H(=(H$H$HhH U UUUtU$U$TtU~#~~##bUgxHxHxHxH*H<$Hhhhhh$H$H$H$H U U U U U UU$U$U$U$U~~#~~#bUbUbUbUbU####+++tH&&Lka  b  . \ M l'A>D;K)<HFiQDT ! { !C!"W""# #8#K###$o$%S%&n&'b'(.())1)*`*+<+,%,,-_-.:.//C/P/]/y//01412`234&45?56*67b777777777777778>8>8>99:Q:;<=?=>4>??????????????????@sAAB]CCD5DE@EFNFG/GGH]HIRIJK=K=K=KLELMN5N5NOPWQ(QRST/TUVVWWxWWXYYcYZx[[[[\\]M]]^e@.$&:ND  '<K\ $ & : ND    Bert Bos 1991-2003GladiatorBoldPfaEdit 1.0 : Gladiator Bold : 6-4-2003Gladiator BoldVersion 001.001 Gladiator-BoldBert Bos 1991-2003GladiatorBoldPfaEdit 1.0 : Gladiator Bold : 6-4-2003Gladiator BoldVersion 001.001 Gladiator-Bold2? A_Ca    !"#$%&'()*+,-./0123456789:;<=>@DEFGHIJKLMNOPQRSTUVWXYZ[\]    !"#$%&'()*+,-./01bcdefghjikmlnoqprsutvwxzy{}|~GammanotdefffffiffldotlessjslashshortnospfjijAbreveAogonekDcaronEcaronEogonekLacuteLcaronNacuteNcaron OhungarumlautRacuteRcaronSacuteTcaronTcedilla UhungarumlautUringZacute Zdotaccentdbarabreveaogonekdcaronecaroneogoneklacutelcaronnacutencaron ohungarumlautracutercaronsacute tquoterighttcedilla uhungarumlauturingzacute zdotaccentbatik-1.9.orig/samples/tests/resources/wmf/0000755000175000017500000000000013153020772020347 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/wmf/batik-rendering-nothing2.wmf0000644000175000017500000000140413063003311025642 0ustar mans0954mans0954 ^  4L^C 4L4L(L4p ?L?s㇇?㇇㇇㇇cccc cpp0 0ccc0c0#p#0Ç㇇g????batik-1.9.orig/samples/tests/resources/wmf/testChart.wmf0000644000175000017500000001015013063003307023013 0ustar mans0954mans0954ƚ$mVT g )-  VT$m.(-->L3 <>L|g <8"g8A"3n.c"Arialwww -2 )6Metafile Companion Test Chart.?"Arialwww - 2 ,AObjects 2 ,E;Colors 2 )=E;Advanced 2 %=Fills-? fJJ! .?"Arialwww - 2 nDaRotated.?"Arialwww - 2 8,Text--8QBFU@YBFWSEU BXETDU*CVD-|1|1----))-++-x/x/--HeYD -H`YD-B( -UC9)>$-^ Z-X |*-H\YD-d `x-x-x-!-)y)!<-t+yt+!-X/X/!-\1\1!--UCe> -UC >-UC`>-UC\>-F  B-@ <-L H-R M-H YD- % o/>w% D D-$y$Hy$&9*)'(-63&?"Arialwww - 2 'Lines 7|g&8 2 (i;Fonts 2 ,TBold?"Courier Neww - 2 3U Underline?"Times New Romanw - 2 0TItalic?"Arialwww - 2 ,e;Arial?"Times New Romanw -2 0A;Times New Roman?"Courier Neww - 2 3e; Courier New--E@@;-DL?E-CFHACCFuNAI.YTimes New Romanw - 2 JaText 2 HaRotated. 2 H: Background 2 J{<Color 2 IRComplex 2 JkSPolygon 2 HD Transparency. 2 3 Patterns. 2 4 Thickness.2 K*Bitmap Fill Patterns2 J1Basic Fill Patterns.--B( -H9)YD$-B( -H/YD|*--SystemwH((w-batik-1.9.orig/samples/tests/resources/wmf/negApmText2.wmf0000644000175000017500000001302213063003311023204 0ustar mans0954mans0954ƚ2Hq   2  "--:   "Arial- .2 ' CBD_KM * number of cars Crosstabulation    "Arial- .2  Count    . 2 75    . 2 49  f  . 2 Ze17  d  . 2 d10    . 2 151  {  . 2 |70  {  . 2 |74  {f  . 2 Ze|39  {d  . 2 d|13  {  . 2 |196  h}  . 2 {}i51  h}  . 2 {}i56  hf}  . 2 {Z}ei18  h}d  . 2 {d}i3  h}  . 2 {}i128  Uj  . 2 hjV25  Uj  . 2 hjV31  Ufj  . 2 hZjeV19  Ujd  . 2 hdjV6  Uj  . 2 hjV81  BW  . 2 UWC221  BW  . 2 UWC210  BfW  . 2 UZWeC93  BWd  . 2 UdWC32  BW  . 2 UWC556     .  Q  . 2 YQ1.0  {Q  . 2 YQ|2.0  h}Q  . 2 |YQ}i3.0  UjQ  . 2 iYQjV4.0  US   .2  RVCBD_KM  BW   .2 V WCTotal    . 2 1    . 2 2  f  . 2 =e3  d  . 2 d4    .2 number of cars    .2 Total  "-DDddDddD-: :9D "- E E E E E "--"System-'batik-1.9.orig/samples/tests/resources/wmf/imageWMF.wmf0000644000175000017500000066076213063003311022525 0ustar mans0954mans0954ƚ@1S   --$--'A 9G(`!!!!!!!)!)!))))1)1)1111119191999999B9BBB!!BBBJ!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!JJ!!J!!J!!JJ!!BJ!!BB!!BB!!BB!!BJ!!BJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))c))c))c))k11c))k))k))k11k))k11k))s11k))s11k))s11s))s11s11s11s))s11s11{11s11{11s11{11s11{11s11{11s11{11{11{99{11{11{1199{1199{1199{1199{1199{119911991199119911999999119999991199999999999999999999999999999999999999999999999999999999999999999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999999999999999999999999999999999999999999999999999999999999911999999119999991199119911991199{1199{1199{1199{1199{1199{11{99{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s11s11s))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9999991919111111)1)1))))!)!)!)!!!!!!!!!!!!!!!)!)!))))))1)1)1)11111191919199999999B!!9B9B!!BB!!BB!!BB!!BB!!9B9999191919999B9BBB!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))Z))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k))c))k11c))k11c))k11k))k11k))k11k))k11k))k11k))k11k))k11k))k11k))s11k))s11k))s11k11s11k))s11k11s11k11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{99s11{11s11{99{11{11s11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99s11{99{11{11s11{99{11{11s11{99s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11k))s11k11s11k))s11k11s11k))s11k))k11k))k11k))k11k))k11k))k11k))k11k))k11c))k11c))k11c))k11c))k))c))k11c))c))c))c))c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!B!!J!!BJ!!BB!!BB!!BB!!BB!!9B9B!!99999999991919111111)1)1)1))))))!)!)!!!!!!!!!!!!!!!!!!)!)!)!))))))1)1)11111111919199999999B9BBBBBBB!!BBBB!!9B9919111111111919999B9B9BBB!!BJ!!JJ!!JR!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))c))c))c))c))k))c))k))c))k))c))k))c))k11c))k))k))k11k))k11k))k11k))k11k))s11k))s11k))s11k))s11k))s11k))s11s))s11k))s11s))s11s))s11s11s11s))s11s11s11s11s11s11{11s11s11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11{11{11s11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11s11{11{11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s))s11s11s11s))s11s))s11k))s11s))s11k))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11k))k11k))k11c))k))c))k))c))k))c))k))c))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z))c))Z!!c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BJ!!BB!!BB!!BB!!BBBB9B9B999999191919111111)1)1)1))))!)!)!)!!!!!!!!!!!!!)!)!))))))1)1111111191999999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))R!!Z))R!!R))J!!R!!J!!J!!BB!!9999999B!!BB!!BJ!!B!!J!!J!!J!!J!!R!!J!!R!!R!!R))R!!Z))Z))c))c))k11k))k11k))s11s11s11s11s11s11{11s11{99{11{11{1199{1199{119999991199999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99999999999999999999999999999999999911999999{1199{1199{1199{11{99{11{99{11{11s11{99s11{11s11{11s11s11s11s11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))k))c))k11c))c))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!B!!J!!BJ!!BB!!BB!!BB9B99999919111111)1)1))))!)!)!)!!!!!!!!!)!)!)!))1)1)1)11119191999999B9BBB!!BB!!BJ!!BJ!!BJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!R!!JJ!!BB9911111919999BBB!!BB!!BJ!!BJ!!J!!R!!R!!Z))Z!!c))c))c))c))k11k))s11k))s11s11s11s11{11s11{11{11{11{11{99{1199{1199999911999999999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB99999999999999999999999999999999119999991199119911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11s))s11s11s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))c))c))c))c))c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!JJ!!BJ!!BJ!!BJ!!BBBB9B9B999919191111)1)1))))!)!)!!!!!!!!!!!!!!!!)!))))))))1)1)111111919199999999B9B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!B!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R!!J!!J!!BJ!!BB9911))!)!)!))))1)1111919999B!!BJ!!J!!R!!J!!R))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))k))c))k11k))k11k))s11k11s11s11s11s11s11s11s11s11s11s11{11s11{11s11{11s11{11s11{99{11{99{11{99{11{99{11{99{11{99{1199{11{99{1199{1199{1199{1199{11991199119911991199999911999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999991199999911991199{1199{1199{1199{1199{1199{11{99{1199{11{99{11{99{11{99{11{99{11{99s11{99s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s11s11k11s11k11s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11c))k11c))k11c))k))c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB!!9B!!9B999999991919111111)1)1))))))!)!)!!!!!!!!!!!!!!!!!!)!)!))))))1)1)1)1111119191999999B9B9BBB!!BBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BB9911))!!!!!!!)!)!))))1)1199B9B!!BJ!!JR!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!c))Z!!c))c))k))c))k))k))s11k))s11s))s11s))s11s11s11s11s11s11{11s11{11s11{11s11{11{11{11{11{11{11{11{11{11{1199{11{11{1199{1199{1199{1199{1199{11991199{11991199119911991199119911999999119999991199999911999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999119999991199999911999999119911991199119911991199{11991199{1199{1199{1199{1199{1199{1199{11{11{11{99{11{11{11{11{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s11s11s))s11s))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k))c))k11c))k))c))k))c))k))c))c))c))c))c))c))Z))c))Z))c))Z!!c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9B9999991919191111)1)1))))))))!)!)!!!!!!!!!!!!!!!)!)!))))1)1)111191919999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!R!!R!!R!!R))R!!Z))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k))c))c))c))k11c))c))c))c))Z))Z))R!!R!!BB11))!!!!!!!)!))1)11119199B!!BJ!!J!!R))R!!Z))Z))c))c))k))c))k11k))k11k))s11s11s11s11{99{11991199999999BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999999999999{1199{1199{1199{11{99{11{99{11{11s11{99s11{11s11s11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))k))c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!9B9B99991919111111)1))))))!)!!!!!!!!!!!!!)!)!))))1)11111191919999B9B9BBBBJ!!BJ!!BJ!!BJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k))c))k))c))c))Z!!R!!JJ!!99))!!!!!!!)!)!))1)1199J!!JR!!R!!Z))R!!Z))Z!!c))Z!!c))c))k))c))k11k))s11s11{11{1199119999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB999999999999999999999999999999991199999911991199{1199{1199{11{11{11{99s11{11s11{11s11{11s11s11s))s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z!!c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!BB9B9999991919111111)1))))!)!)!!!!!!!!!!!!!!)!)!))))))1)1)1)1111919199999999B!!9B9B!!BB!!BJ!!BJ!!BJ!!B!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))R!!Z))R!!R!!J!!J1!JR)Bc!9Z!9B!))!!!!))1199B9B!!BJ!!BJ!!JJ!!J!!R!!R!!Z))R!!Z))Z))c))c))k11k))s11s11{11{11{99{11991199119911999999999999999999999999999999999999999999999999BB999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB999999999999999999999999999999999999999999999999999911991199{1199{1199{1199{11{99{11{99{11{99{11{99{11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s11s11k))s11k11s11k))s11k))k11k))k11k))k11c))k11c))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB9B!!999999991919111111)1)1))))))!)!)!!!!!!!!!!!!!!)!)!)!))))))1)1)1111919191999999B9BBBBBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))Z!!Z))Z!!Z))R!!Z))JB!B1111111111111)!)s!!))119999B9B9BBJ!!JR!!R!!Z))Z!!c))c))k11k))s11s11{11{1199{11991199119911999999119999999999999999999999999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB999999999999999999999999999999999999999999999999119999991199119911991199{1199{1199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))k))c))k))c))c))c))c))Z))c))Z))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9B99991919111111)1)1)1))))!)!)!!!!!!!!!)!)!))))1)1)111191919999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R))R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11s11s11s11s11s11s11s11{11s11s11Zk19911991199119911991111)Z9R!R!!!))1199B!!BB!!BJ!!B!!J!!J!!R!!R!!Z))Z!!c))c))s11s11{99999999BBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999999999991199{1199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))s11k))k11k))k11c))k11c))k))c))k))c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R!!R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BB!!BB!!BB9B99999919111111)1))))))!!)!))))1)11111191999999B9BBB!!BB!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11s))s11s11s11s11{11s11{11s11{11kR191111111111111111111111191)!1!!1)11111111))!!1!!))11119999BBJ!!JR!!R!!Z))c))k11s11{99999999BBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11k))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BBBB9B99999919111111)1))))!)!!!!)!))))))1)1)1)11119191999999B9B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))Z))Z))c))Z))c))Z))c))c))c))c))c))c))k))c))J11199119911991199119911991199))!c11991199119911991111!!!!!)!)!))1199BBJ!!R!!Z))Z))k11k11{11{1199999999BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99999999999999999999999999999999999911991199{1199{1199{1199{11{99{11{99{11{99{11{99s11{11s11{11s11{11s11s11s11s11s11s11s11s11k))s11k))s11k))k11k))k11k))k11k))k11c))k11c))k))c))c))c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!JJ!!B!!J!!BJ!!BB!!BB!!BB!!9B!!9B9999991919111111)1)1))))!)!)!!!!!!)!)!))))))1)1)11119191919999B9B9BBB!!BB!!BJ!!BJ!!BJ!!BJ!!JJ!!JR!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))c))c))k))c))k))91111111111111111111111111111111111111111111111111111111))k!!!!))119BJ!!R!!Z))Z))k))k)){11{11999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99999999999999999999999999999999999999991199119911991199{1199{1199{1199{1199{11{11{11{11{11{11s11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))k))c))c))c))c))c))c))Z))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!BJ!!BJ!!BJ!!BB!!BBBB9B9B99991919111111)1)1))))))!)!)!!111191919999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R))R!!R))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11k11s11s11s11s11s11s11{11s11{11s11{99{11{99{1199{1199{11999999119999911199119911991199119911991199119911991199119911991199119911))R!!!))119BJ!!R!!c))k))s11{119999BBBBJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BB!!BB!!BB9B99991919111)1191919999B9BBB!!BBBJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s))s11s11{11s11{11{11{11{11{11{1199{119911991199999911999111111111111111111111111111111111111111111111111111111111111111!!9!!))99J!!R!!c))k)){11{119999BBBBJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZZZZZRRZZZZZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{11{99{11{11{11{11s11{11s11s11s))s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!c))Z!!c))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BB!!BBBB999999191111))1)1)1111919199999999B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))k11k))s11k))s11k11s11s11J1119911991199119911991199119911991199119911991199119911991199119911!!9!!!))11))11))))!k!!11BBR!!Z!!c))k)){11{119999BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999999991199{1199{1199{1199{11{99{11{99{11{11s11{11s11{11s11{11s11s11s11s11s11s11k))s11k))s11k))k11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!JJ!!B!!J!!BJ!!BB!!BB!!BB!!9B!!9999999919191111)1)1))1)1)1)11119191999999B9BBB!!BB!!BJ!!BJ!!BJ!!JJ!!JJ!!JR!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))c))c))k))c))k))c))k11c))k11k))k11k))s11k))s11k))s11s))s11Zc11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)!!!!)1BBR!!Z!!k))k)){11{119999BBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999999991199119911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11c))k))c))k))c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!JJ!!BJ!!BB!!BB!!BBBB9B9B999919191111)1)1))9999B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11k))k11k))k11k))s11s11s11s11s11s11s11s11{11s11{11{11{99{11{99{1199119911999999999999999999999999BB99BB99BB99JB919911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991111B!))9BR!!Z))k11{119999BBBBJJJJRRRRZZRRZZRRZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccccccZZccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZZccccccZZccccccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!JJ!!B!!J!!BJ!!BB!!9B!!999999B9BBB!!BJ!!BJ!!BJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BB99c9111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111R))9BR!!Z))s11{119999BBBBRRJJRRRRZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZZZZZccZZccZZccZZccZZccZZccZZccZZccccccZZccccccZZccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZZccccccZZccccccZZccZZccZZccZZccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BBBB!!9B9B1191999999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11k))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11s11{11s11{99{11{99{11{99sJ199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991111R!)19J!!R!!c))k))s11{119999BBBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB9999999999999999999999999999{1199{1199{1199{11{99{11{99{11{11s11{11s11{11s11s11s11s11s11s11k11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB9B999999191191919999B9B9BBBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11k))s11s11s11s11s11s11{11s11{11s11{11{11{11{11{99{11{11R111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111J!)19J!!R!!c))k)){11119999BBBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{1199{11{11{11{11{11{11s11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BB9B9999991919J!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!R!!R))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11k11s11s11s11s11s11s11{11s11{11{11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBBBBBcB1199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991111B!!19J!!R!!c))s119999BBJJRRRRZZZZZZZZccZZccccccZZcccccccccccccccccccccccccccccccckkcccccckkcckkcckkcckkcckkcckkcckkcckkcckkkkkkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskkkkkksskkkkkksskkkkkksskkkkkksskkkkkksskkkkkksskkkkkksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcccccckkccccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BBJ!!BJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!c))Z!!c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11s11s11s))s11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBB99R911111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111!!19J!!Z!!k11s1199BBJJJJRRRRZZZZZZZZccZZccccccZZcccccccccccccccccccccccccccccccccccckkcckkcckkcckkcckkcckkcckkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskkkkkksskkkkkksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskkkkkksskkkkkksskkkkkksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkcccccckkccccccccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11s11s))s11s11s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!JJ!!BJ!!99B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))c))c))c))c))c))k11c))k11k))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11s11{11{11{99{11{99{1199{1199{11991199999999991199{11{99ck1991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991111!!!11B!!J!!Z))k)){119999BBJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999999999999999999999999911991199{1199{11{99{11{99{11{11s11{11s11{11s11s11s11s11s11s11k11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BB!!BB!!BB!!9B!!99B9BBBBBBJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11{11{11{11{11{1199{1199{1199{11991199119999991199{11{911)1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111))!!19J!!R!!c))k)){1199BBBBJJJJJJJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BB!!BB!!BBBB9BR!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199{1199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJBBJJBBc9119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911!!!)1B!!R!!c))s119999JJJJRRRRccZZcccckkcckkcckkkkkkkkkkkkkkkkkkkkkkkksskkkkkksskksskksskksskkssssssssssssssssssssssssssssssss{{ssssss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssssssssssssssskksssssskksskksskksskkkkkksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkcckkccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{11{99{11{99s11{11s11{11s11s11s11s11k11s11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R!!J!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJBBJJBBBBk911111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111!k!19J!!R!!k)){1199BBJJJJZZZZcccccccckkcckkcckkkkkkkkkkkkkkkkkkkksskksskksskksskksskkssssssssssssssssssssssssssss{{ssssss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssssssssssssssssssskksskksskksskksskkkkkksskkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkccccccccccccccccccccccccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!B!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k))c))k11k))k11k))k11k))k11k))s11k11s11s11s11s11s11s11{11s11{11s11{99{11{99{1199{1199{1199119999999999999999999999999999BB99BB99BB99R9c{1R911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119!)1B!!J!!c))k11{9999BBBBJJJJRRRRZZRRZZRRZZRRZZZZZZZZZZZZZZZZZZZZZZZZccZZccZZccZZccZZccZZccZZccZZccZZcccccccccccccccccccccccccccccccccccccccckkcccccckkcccccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcccccckkcccccckkccccccccccccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999999999991199{1199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11k))k11c))k))c))k11c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BBJ!!BJ!!BJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))k))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s))s11s11{11s11{11s11{11{11{11{1199{1199{1199{11991199119999999999999999999999999999BB99ss91111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111))!!19J!!R!!c))s119999BBJJRRJJRRRRZZRRZZRRZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZccZZccZZccZZccZZccZZccZZccccccZZcccccccccccccccccccccccccccccccccccckkcccccckkcccccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcccccckkccccccccccccccccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11{11{11s11{11s11s11s11s11s))s11s))s11k))s11k))k11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!JJ!!BJ!!BB!!Z))Z!!Z))Z!!c))Z))c))c))c))c))c))c))k11k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJRRJJRRJJRRJJcJ91991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199)!)1B!!R!!c11s11BBBBRRRRcccckkkksskkssssssssssssssssssss{{ss{{ss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{ss{{sssssssssssssssssssskksssssskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!R!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k11k))k11k))s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRk91111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111B!19J!!Z))s11{99BBJJRRZZcccckkkkssssssssssss{{ssssss{{ss{{ss{{ss{{{{{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{{{{{ss{{ss{{ss{{ss{{sssssssssssssssskksskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccZZccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!Z))Z!!Z))J!!J!!R!!J!!R!!J!!R!!R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11s11{99{11{99{11{99{1199{119911999999999999999999999999BB99BB99BB99BB99BBBBBB99BBBBBBBBJ91199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911))!11J!!R))c11s11BBBBJJJJZZRRZZZZccZZccZZcccccccccccccccccccccccckkcckkcckkcckkcckkcckkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkkkkkcckkcckkcckkcckkcckkccccccccccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999999999991199{1199{11{99{11{99{11{99s11{11s11{11s11s11s11s11s11s11k11s11k))s11k))k11k))k11c))k11c))k11c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!J!!R!!J!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))k))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s11s11s11{11s11{11{11{11{11{11{1199{1199{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBB1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111s!)19R))Z))s11{99BBJJRRRRZZZZccZZccZZccZZcccccccccccccccccccckkcccccckkcckkcckkcckkcckkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkccccccccccccccccccccccccZZccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999119911991199{1199{1199{11{99{11{11{11{11s11{11s11s11s11s11s))s11k))s11k))s11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!c))c))c))c))k11c))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRZB11991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911!!!19R))c)){99BBJJRRcccckkkk{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11k11s11k))k11k))k11c))k11c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJJJRRJJJJJJRRJJRRRRRRRRRRRRRRRRRR{B11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111!{))B!!J!!c11s11BBJJZZZZcckkssss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{sssssssssssssssskksskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))R!!R!!R))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{11{99{1199{11991199119999999999999999999999999999999999999999BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBcJ1199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991111!)1B!!J))c11k11{BBBBRRRRZZZZcccckkkkkkcckkkkkkkkkkkkkkkkkkkksskksskksskksskksskksskksskkssssssssssssssssssssssss{{ssssss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssssssssssssssskksskksskksskksskksskksskkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB9999999999999999999999999999{1199{1199{11{99{11{99s11{11s11{11s11s11s11s11k11s11k11s11k))k11k))k11k))k11c))k11c))k11c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s))s11s11{11s11{11{11{11{11{11{1199{11991199119999991199119911991199{1199119911999999999999BB99BBBBBBBBBBBBBBBBBBBBJJBBJ111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111!{!!)9B!!R))Z11s99{99JJJJZZZZcccckkcckkkkkkcckkkkkkkkkkkkkkkkkkkksskksskksskksskksskksskkssssssssssssssssssssssssssssssss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssssssssssssssskksskksskksskksskksskksskkkkkkkkkkkkkkkkkkkkcckkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999991199999911991199{1199{11{99{11{11{11{11s11{11s11s11s))s11s))s11k))s11k))k11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!Z))R!!R!!k11k))k11k))s11s11s11s11s11s11{11s11{99{11{99{1199{1199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBJJBBJJJJJJJJRRRRRRRRRRRRZZRRZZRRZZRRZZZZZZ{J9911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911)1B!!J))Z11k99BBJJZZZZkkkkss{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{1199{11{99{11{99s11{11s11s11s11s11k))s11k))k11k))k))k11k))s11k))s11s11s11s11{11s11{11s11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBBBBBBB99BB99BB99BBBBBBBBJJJJJJJJRRJJRRRRRRRRZZRRZZRRZZRRZZZZZZc9111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111Z!B!!B!!R))c11sBBBBRRRRccccssss{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccccccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{11{99s11{11s11{11s11s11s11s11k))s11k))k11Z))Z!!Z))Z))Z))Z))c))Z))c))c))c))c))c))c))k11c))k11k))k11k))k11k))s11k11s11s11s11s11{11s11{11s11{11{11{99{11{99{1199{119911999999999999999999999999999999{11{99s11s11s11s11s11s11s11{11s11{99{119999BB99BBBBBBBBJJBBJJBBJJJJJJJJJJJJZJ91991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911919!!B))J))Z11c99sBB{BBRRRRZZZZcccckkkksskksskkssssssssssssssss{{ssssss{{ss{{ss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄Ƅ΄{{΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssssssskksskksskksskksskkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999999991199{1199{11{99{11{99{11{11s11{11s11{11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!R!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{1199{11991199119911999999999999991199{11{11s11s11k))k11c))k))c))k))k))s11s11{11{1199999999BBBBBBBBBBBBJJBBJJBBJJBBJJJJsB1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)B9!J))Z11c11s99{BBJJJJZZZZcccckkkksskksskksskkssssssssssssssssssss{{ss{{ss{{ss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{ssssss{{sssssssssssssssskksskksskksskksskkkkkkkkkkkkkkkkkkkkkkkkcckkcckkccccccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{99{11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11k))k))c))k))c))k))c))c))c))c))Z))c))Z!!Z))Z!!Z))Z!!Z))s11s11s11s11{11s11{11{11{99{1199{1199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJBBJJBBBB99991199{11{11s11{11s11{11{119999BBBBJJJJJJJJRRRRZZRRZZZZZZZZccZZccZZccZZJ119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199Z9sBB{BBRRRRcccckkss{{{{焄{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999991199{1199{11{99{11{11s11{11s11s11s11s))s11s11{11s11{11s11{11{11{11{1199{1199119911999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJBBJJBBBB999911{11s))k11k))k))c))k))k))s11s11{9999BB99BBBBJJJJRRRRZZRRZZZZZZZZZZZZccZZccZZkB1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111ZB{BBRRRRcccckkss{{{{焄焄{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkcckkcckkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999911991199{1199{1199{11{11s11{11s11s11s11s11c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99999999{11s11k))k))Z))Z))J!!R!!J!!J!!J!!R!!R!!Z))Z!!c))k))s11{119999BB99BBBBJJBBJJJJJJJJRRJJRRJJRRRJR911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199J9{BB{BBRRRRZZZZcccckkkkssssssss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{΄{{΄{{΄{{΄{{΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄ƄΌƄΌƄΌ΄ΌƄΌ΄ΌƄΌΌΌƄΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƌΌΌΌƄΌ΄ΌƄΌ΄ΌƄΌƄΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{ss{{sssssssssssssssssssskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999999999999999991199{1199{1199{11{99{11{99s11{11s11{11s11s11s11s11k11s11k))s11k))k11k))k11c))k11c))k11c))c))c))c))Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{11{11{1199{1199119911999999999999999999999999999999{11s11k))k))Z!!R!!J!!J!!9B9B9B!!JR!!R!!c))c))s11s1199999999BBBBJJBBJJJJJJJJJJJJRRJJRRRJJ9111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111R9JJRRRRZZZZcccckkkksskkssss{{ss{{ss{{ss{{{{{{{{{{{{{{{{{{{{΄{{΄{{΄{{΄{{΄{{΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄ƄΌƄΌƄΌƄΌƄΌƄΌƌΌƄΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƌΌƄΌƌΌƄΌƄΌƄΌƄΌƄΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{sssssssssssssssskksskksskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c)){99{11{11{1199{1199{119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJRRJJJJJJJJBBBB9999{11s11c))Z))J!!J!!BB!!BB!!BR!!R!!c))c)){11{119999JJJJJJJJRRRRZZZZZZZZccZZcccccccccckcZB1199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199{Rkkkkssssބބ猌猌{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999911991199{1199{11{11s11s11{11{11{99{1199{11991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJJJJJJJBBBB9999{11s11c))Z))J!!J!!9911199J!!J!!Z))c))s11{119999BBBBJJJJRRRRZZRRZZZZccZZcccccccccckckB111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111B9skkss{{ބބ猌猌{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{11{11{11{11c))c))k11c))k11c))k11k))k11k))s11k11s11k11s11s11s11s11{11s11{11{11{99{11{99{1199{11991199999999999999999999BB99BB99BB99BB99BB99BB999911{9999BB99R))BB11))!)!)199J!!J!!Z))c))k11s11{99999999BBBBJJJJJJJJRRJJRRRRRRRRRRRRkB11991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199119911991199B9ZZZcccckkkkssss{{ss{{ss{{{{{{{{΄{{΄{{΄{{΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄ƄΌƄΌƄΌ΄ΌƄΌΌΌƌΌΌΌƌΌΌΌƌΔΌΔΌΔΌΔΌΔΌΔΌΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΜΔΔΔΜΔΔΔΜΔΜΔΜΔΜΔΜΔΜΔΜΔΜΔΜΔΔΔΜΔΔΔΜΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΔΌΔΌΔΌΔΌΔƌΔΌΌƌΌΌΌƌΌΌΌƌΌΌΌƄΌ΄ΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssssssskksskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999999991199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))k))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{1199{119911991199999999999999999999BB99BB99BB999999JJZZkkcckkZZRRk!!1!!!!))19B!!JR!!Z!!k))k)){11{119999BBBBJJBBJJJJJJJJRRJJRRJJRRRRJ1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111191B9B9ZB{RkZZZcccckkkkssss{{ss{{{{{{{{{{{{΄{{΄{{΄{{΄{{΄Ƅ΄Ƅ΄Ƅ΄ƄΌƄ΄ƄΌƄΌƄΌƄΌƌΌƌΌƌΌƌΌƌΔƌΔƌΔƌΔƌΔƌΔƌΔƌΔƔΔƔΔƔΔƔΔƔΔƔΔƔΔƔΔƔΜƔΔƔΜƔΔƔΜƔΔƔΜƔΔƔΜƔΔƔΜƔΔƔΜƔΔƔΔƔΔƔΔƔΔƔΔƔΔƔΔƔΔƔΔƌΔƌΔƌΔƌΔƌΔƌΔƌΌƌΌƌΌƌΌƌΌƌΌƄΌƄΌƄΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))k))c))c))99{1199119999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJcckkkkkkkkkkkkkkkkBB1!!!!)11B!!J!!R!!Z))k11s119999BBBBJJJJRRRRZZRRZZZZccZZcccccccckkccZB199119911991199119911991199119911991199119911991199119911991199119911991199119911991199ZBssssssss{{{{ބބ猌猌{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{11{1199{11991199999999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRJJZZcckkcckkcckkcckkcckkRRZ!!!!)19BR!!R!!c))k)){111199BBJJJJJJJJRRRRZZZZZZZZcccccccckkcc{kkB111111111111111111111111111111111111R{J11111111111111111111111111111111111111111111css{{{{քքބބ猌猌{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999991199{1199k11c))k11k))k11k))s11k11s11s11s11s11s11s11{11s11{11{11{99{11{99{1199{1199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJcckkkkkkkkkkkkkkkkkkkkkkcc11!!11BBR!!R!!c))c))s11{119999BBBBBBBBJJJJJJJJRRJJRRRRRRRRZZJB911991199119911991199119911991199{JRR{RRB11991199119911991199119911991199119911RBkckkkkkkkkssssssss{{ss{{{{{{{{΄{{΄Ƅ΄Ƅ΄ƄΌƄΌƄΌ΄ΌƄΌΌΌƌΌΌΌƌΔΌΔΌΔΌΔΌΔΔΔΔΔΔΔΔΔΔΔΔΜΔΜΔΜΔΜΔΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΜΥΜΜΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΜΜΥΜΜΜΜΜΜΜΜΜΜΜΜΜΜΔΜΔΜΔΜΔΜΔΜΔΔΔΔΔΔΔΔΔΔΔΔΌΔΌΔΌΔƌΔΌΌƌΌΌΌƌΌ΄ΌƄΌƄΌƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{119911991199119999999999999999BB99BB99BB99BB99BBBBBBJJkkcckkcckkcckkcckkcckkcckkccBB!!)199J!!R!!Z))c))k))s11{99{119999BB99BBBBJJBBJJJJRRJJRRRRZZcRkB111111111111111111111111111111sZRRZZRRRR999111111111111111111111111111111J9{ckkkksskkssssssss{{ss{{{{{{{{Ƅ{{Ƅ{{΄Ƅ΄Ƅ΄Ƅ΄ƄΌƄΌƄΌƄΌƌΌƌΌƌΌƌΌƌΔƌΔƌΔƌΔƔΔƔΔƔΔƔΔƔΜƔΜƔΜƔΜƔΜƔΜƜΜƜΜƜΜƜΜƜΜƜΜΜΥƜΜΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΥΜΥƜΜΜΥƜΜΜΜƜΜƜΜƜΜƜΜƜΜƜΜƔΜƔΜƔΜƔΜƔΔƔΔƔΔƔΔƔΔƔΔƌΔƌΔƌΔƌΔƌΌƌΌƌΌƌΌƄΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkcckkccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))9999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZJ))19B!!J!!Z))c))k11s119999BBBBJJJJJJJJRRRRZZRRZZZZcccckkcckkkkΌkcB991199119911991199119911kJss{{ss{{{{{{{{Δsckkޔ{甄kkR91991199RBkޔ{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999{1199999999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRcckkcckkcckkcckkcckkcckkcckkcckkcccc{))!!)1BBR!!Z!!c))k))s11{119999BBBBJJBBJJJJRRRRRRZZZZZZcccckkkkssccB111111111111111111RBքs{{{{{{{{焄{{ޔޜ甌{{{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999k11k))s11k))s11k))s11s11s11s11{11s11{11{11{99{11{99{1199{1199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk99!)11BBJ!!R!!Z))Z))c11c))k11k11s99s11{99{99BB99BBBBJJJJRRRRZZZZZZZZsZ{JcBJ99911B9R9Rkckkcckkcckkkkkkkksskksskkssssssss{{ssssss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ƄƄƄƄƄΌƄΌΌΌƌΔΌΔΌΔΌΔΌΔΔΔΔΔΔΔΔΜΔΜΔΜΔΜΔΜΜΜΜΜΜΜΜΥΜΥΜΥΜΥΜΥΥΥΥΥΥΥΥΥΥΥΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέέέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥΥΥΥΥΥΥΥΥΥΜΥΜΥΜΥΜΥΜΥΜΜΜΜΜΜΜΜΜΜΔΜΔΜΔΜΔΔΔΔΔΔΔΔΔΔΌΔΌΔƌΔΌΌƌΌΌΌƄΌ΄ΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999991199{1199{11{99{11{99{11{11s11{11s11s11s11s11k11s11k))s11k))k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkJJ)!!))99B!!BJ!!R!!Z))Z!!c))c))k11c))k11s11{99{99BBBBJJJJRRRRZZRRZZZZccZZcccckkcckkcckkcckkkkkkkkkkkksskksskkssssssss{{ss{{ss{{ss{{ss{{ss{{{{{{{{{{{{{{ss{{ss{{ss{{{{{{{{{{{{ƄƄƄƌƄƌƌΌƌΌƌΔƌΔƌΔƌΔƔΔƔΔƔΔƔΔƔΜƔΜƔΜƔΜƜΜƜΜΜΜƜΜΜΥƜΥΜΥƜΥΥΥƥΥΥΥΥΥΥΥssRBBB99911JBB{ccΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥέΥΥΥΥΥƥkkRBB1)))!!J99cJJssΜΥƜΜΜΜƜΜƜΜƔΜƔΜƔΜƔΜƔΔƔΔƔΔƔΔƌΔƌΔƌΔƌΔƌΌƌΌƄΌƄΌƄΌƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k1199999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkRRR))11B!!BJ!!J!!Z))Z))c))c))k11k11s99s11{BBBBBBJJRRRRZZZZcckkkkkk{{ss{{{{甔甔甔甔ޔ9))R99cJJkk筭ƥJBBsZZֵޜB99΄kkZ99R11{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999911999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRZZkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcccc99!!))99B!!BJ!!J!!R))R!!Z))Z))c11c11s99s99BBBBJJJJZZZZcccckkkkssss{{{{甔甔ތޔ֌֌cJJ罽JBBB99ƥֵƥ罽1))JBBkk猌{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB9999999999999999s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcc99!!))))1199B!!B!!J!!J!!R))Z))c11k11{BB{BBJJJJRRRRZZZZcccckkcckkkksskksskksskkssssssss{{ss{{ss{{ss{{{{{{{{{{{{΄{{΄{{΄{{{{{{{{sssssssskkkkkkcJJΥΥΥΥΥΥΥΥέΥέΥέΥέέέέέέέ911εεεֵε911)!!έֵέεέֵέεέֵέεέֵ!J99έΥΥΥΥΥΥΜΜΜΜΜΜΜΜΜΜΔΜΔΔΌΔΌΔƌΔΌΌƌΌΌΌƄΌ΄ΌƄΌƄ{{ZZ{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99s11{11s11{11s11s11s11s11k11k))s11k))s11s))s11s))s11s11{11s11{11{11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRR9!!!!))))11B!!B!!J))R))c11c11s99{99JJJJRRRRZZZZcccckkkkkkkksskksskksskkssssssssssss{{ss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{sssskkkkcccccccccJJƥƥΥΥΥΥΥΥέΥέΥέΥέέέέέ{{kZZεεεsccεέεέεέεέεέεέεέRJJkZZΥΥΥΥΥΥƥΜΜΜƜΜƜΜƔΜƔΜƔΔƌΔƌΔƌΌƌΌƌΌƄΌƄΌƄ΄Ƅ΄Ƅ΄J11B)){{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999911991199{1199{1199{11{11{11{11s11{11s11s11s))s11s))s11k))s1199999999BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZB!!!!))119!!9!!J!!J!!Z11c11s99{99JJJJZZZZkkkkssss焄ޔޔΌ΄{{ssssss)!!֭޵ZZZkkk111111cZZZZZέRRRss猌{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBB99BB99BB99BB99999999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRZZRRZZRRZZcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccZZBk!!9999111!!))11B!!B!!R))Z11k99{99JJJJZZZZkkkkssss{{甔ތ֌΄Ƅ{{εsssRRRccc111ccc!ƥcc{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999s11s11s11s11s11s11{11s11{11{11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZB99ZZkkkkkkkkkkJJk))))19B!!J))Z11c11s99{BBJJJJZZZZcccckkkkkkkkssssssss{{ss{{ss{{ss{{{{{{{{{{{{΄{{΄{{΄{{{{{{{{sssskkkkcccc祥JJJέέέέέεέεέֵέεֵ999)))BBBJBBֽνֽνֽεֽεֽεֽֽƥέέΥΥΜΥΜΥΜΔΔΔΔΔΔΔΔΌΔΌΔΌΌƌΌΌ޵9!!΄{{΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskkkkkkkkkkkkkkkkcckkccccccccccccccccccccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{119911991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccBB!!11B!!J!!Z11Z11s99{BBJJJJZZZZcccckkkksskkssssssssssss{{ss{{ss{{ss{{{{{{{{{{{{Ƅ{{{{{{{{sssskkkkZZZZ{RRΥέέέέέέεέε!!!cZZννενννενεννεέέƥέέέΥΜΥƜΥΜΥΔƔΔƔΔƌΔƌΔƌΔƌΌƌΌƄΔZZZss{{΄{{΄{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZZZZZZZZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk99))9!!B!!R))Z11k99{BBRRRRccccssss{{焄甔ޔ΄Ƅ{{sskkccRBB999ssscc{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskksskkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkZZc!!!)9!!B!!R))Z11s99{BBRRRRcckkssss焄焄ޔޔ΄Ƅsssscccc{RR111BBB!!!B)){{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99999999s11s11s11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk99!!11J))R))c11k99{BBJJRRZZcccckkkkssssssss{{ss{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{sssskkkkcccc{RRsRRcBBZBBJJJ)!!έεέֵεεεννεεεֵέεέΥέΥΥΥΥΥΔΜΔΜΔΔΔΔΔΔΌΔΌΔΔcccssΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{1199{11{99{11{99s11{11s11s11s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBJJBBBBBBJJBBJJBBJJRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccJJ!!19J))R))c99k99JJJJZZZZcccckkkkssssssssssss{{ss{{ss{{ss{{{{{{{{{{{{{{sssskkkkccccRRsJs9!999{{έεέεεννεεεεέεέεΥΥΥƥΥΜΥΜƔΜƔΔƔΔƌΔƌΔƌΔƌkJJ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11s))s11BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZZZZZZZZZZZcccckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkRR)1B!!J))c99s99JJRRccccss{{焄焄甔甔֌֌{{{{kkZB99ccc!!!1!!{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZZZZZRRZZZZcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRR))1B))R))k99{BBRRRRcckk{{{{焄猌猌甔甔甔ތތ֌Ό{{{{kkc9))9))J99R99cJJkRR{ZZccss{{ƜΜޭޭスJJJZZZkkk֌{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssskksskksskkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZRRZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJRRJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99999999s11s11s11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkRR))1B!!J))c99k99{JJJJZZZZcckksssssssssssssssssssssssssssssskksskksskkkkccccZZZZ!!)!!1!!911B11J99RBBcJJkRRsZZ{cckkss{{ƜƜ޽JJJ{{εֵεννRRRZZZֽνֽεֽεεεֵεεεΥέΥέΥΥΥΜΜΔΜΔΜΔΔΔΔΔΔkJJ΄ΌƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99s11{11s11s11s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccJJ!)9J))R))c99sBBJJRRZZZZkkkkkkkksskksskksskkkkkkkkkkkkkkkkkkkkcckkccccZZRRR9!)!!)!!1))9))J99J99ZJJcJJsZZ{ZZkkss{{{{ƜƜΥֽJBBεεενννJJJ)))ενενεεεεεεέεέΥΥƥΥΥΥΜƔΜƔΔƔΔƔΔƌΔ֭!!!)Ƅ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11s))s11BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRZZRRZZRRZZRRZZRRZZZZZZZZZZZZZZZZZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk99)1B))R))k99{BBRRZZkkkk{{{{焄焄猌猌ބބքք{{΄{{΄{{{{{{{{sssscZ9)!!1!!1))B11J99ZBBcJJsZZ{ccssssƜ֥޵絵スRRRJBB{{{cZZBBBsssΌ{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZZZZZRRZZRRZZRRcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccZ!!!19!!R))c11sBBJJZZccssss{{ބ猌焄猌焄猌քք{{{{sssssssskksskksskkkksJ!)!!1!!911B11RBBZBBsRR{ZZkkssΜ֥޵絵ス{RR{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssskksskksskkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZRRZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJRRJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99999999s11s11s11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJBBJJBBJJBBcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkJJ!!19!!R))Z11kBB{BBRRRRcccckkkkkkkkkkkkkkccccZZZZRRZZRRRRRRRR{RR{RRsJk!!1))9))B11J99ZJJcJJsZZccss{{ƜƜΥΥέεֵενֽεֽεֽεεεֵεεέΥέΥέΥΥΥΜΜΔΜΔΔΔΔΔ֭)))!ΌƄΌ΄ΌƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99s11{11s11s11s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBBBBBBBJJkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcccc9!)9!!J!!Z11k99{BBJJZZZZcccckkcckkccccZZZZRRRRRRRRsJJsJJsBBsJJkBBkBBkBBJ1!!1!!1))B11J99ZJJcRR{ZZccss{{ƜƜΥΥ֭ZZZεέεJBBνννννεεεεεεεεέεέεΥΥΥƥΥΜΥkkƔΜƔΔƔΔƌΔkkƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11s))s11BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZZZZZZZZZZZZZRRRRJJJJcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkBB!)9!!J))c11s99JJRRcckkss{{ބ{{ބ{{{{sssskkkkZZccRRRR{RRRR{JJ{JJsJJsJJ!9)!!)!!911B11ZBBcJJ{cckk{{ƜΥޭ絵999)!!ZRRƵ{RR{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZRRRRJJJJBBRRcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkZZ!19J))Z11sBBJJZZZZkkkk{{{{ބ{{{{sssskkccZZZZJJ{JJsBBsBBcBBkBBc99cBBZ99s)!!)!!911J99ZJJkRRcckkƜ֥絵絵B99ZRR{ssƵ{{))))便{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99999999s11s11s11s11{11s11{11{11{99{11{99{1199{11991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBB9999s11ZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk11!)1!!B!!R11Z11sBB{BBRRRRccccccccccccccZZRR{JJsJJkBBc99R11R11J))J11B))B))B))B)))!)!!9))B11RBBZJJsZZ{ccssssƜƜΥΥֵ911έֵέBBB!BBBνννֽννֵֽεεεֵεεέֵέεέΥΥΥΥΥΥΜ{ZZΔΔΔkkΌΌΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{11{99{11{99s11{11s11{11s11s11s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{119911991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBBBBBBB9999{11s1199cccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccJJ)1B))R))c99k99JJJJZZZZccZZccccccRRRR{JJ{JJc99Z99R11J11B!!9))1!!9!!11!!)J!)!!9))B11ZBBcJJ{ZZccss{{ƜƜΥƥJBBέέέεBBB999νννενννενεέεέεέεέέέέέέΥΜΥƜΥΜΥsRRƌR99ΌƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s119999BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZZZZZRRZZRRRRJJRRBBBB99{99RRkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZ19!!J))Z11s99{BBRRZZkkkkss{{{{{{{{sskkccccRR{JJc99Z99R11J))9!!9))1!!1!!)1!!R!)9))B11ZBBcJJ{cckkΜ֥絵ﵵ111RRR{{999!{{{{{{{{{{{{{{{{ss{{sssssssssssskksskksskkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRZZRRZZRRZZRRRRRRZZZZccZZZZBBk))ZZkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckk1B!!R))c11s99JJRRZZccssss{{ss{{ssssccccRRJJkBBc99J))B))9!!1!!)!Z!!!)!)!!B11J99cJJsRRkkss֥ޭﵵス祥ccc999RRR{{{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBRRcckkkkkkkkkkZZJJkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk999!!J))R))k99s99JJJJZZZZccccccccccc91!!1R1kB))9!!1)cR)!!1!!B11J99cJJkRR{cckk{{ƜƜΜΜֵJ99έΥέέέέZZZ999εֽεֽεεεֵεεֵέέέέέέέέέέΥΜΥΜΥΜΜΜcccsssR99ΌΌƄΌƄ΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999991199{1199{11{99{11{99{11{11s11{11s11s11s11s11k11k))s11k))s11s))s11s))s11s11{11s11{11{11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBBBBBJJcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckk11J))R))c11k99{BBJJRRRRZZZZccZZZ{1)1!c!)!!9))J99RBBkRR{ZZkkss{{ƜƜΜ޽ΥέΥέΥέέ筭{{{JJJεεεέεέεέεέέέέέΥέΥέΥέΥΥΜΜΜƜΜƜΜkkk!!!999{{΄Ƅ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999911991199{1199{1199{11{11{11{11s11{11s11s11s))s11s))s11k))s1199999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkBBc11{BBBBRRRRcckkssss{{{{{{1!)!!9))J99ZBBsRRccssƔΜޭ絵kRR{{{))){{{{{{{{{{{{{{{{{{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999911999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRZZRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkBBs99{BBJJRRZZcckkss{{ss{{{BJ!)9))J11ZBBkRRcckkΜޥ筭ﵵޥssZZZスkkkZ99{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB9999999999999999k11k))s11k11s11s11s11s11{11s11{11{11{99{11{99{1199{11991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBRRkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZc11k11s99{BBJJJJRRRRcccccccc)!!1!!B11J99cJJkRR{ZZccsscc{ccsRRJ99!{{ΥΥΥΥΥΥΥΥέΥέΥέέέέέέέέέέέΥέΥέΥΥΥΥΥΥΥΜΜΔΜΔΜΔJJJ{{ƄΌƄ΄Ƅ΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{11{99{11{99s11{11s11{11s11s11s11s11k))s11k))k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRRk11s99{BBJJJJRRRRZZZZccccJkkkssΜƜΜΜΥƜΥΜΥƜΥΥΥƥֵέΥέΥέΥέΥέΥƥΥΥΥƜΥΜΥƜΥΜΥΜƔΜƔΔƔΔ)!!{{΄Ƅ΄{{΄{{΄{{΄{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k119999999999999999BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRRcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkccRRRRRRZZZZcckkssss{{{{s9ZZZBBBƔB11{{{{{{{{{{{{{{{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99999999999999{1199999999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkRRRRRRZZZZcccckkkkssss{{{{J)筭JJJ9)){{{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999k11k))k11k))s11k))s11s11s11s11s11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZBBBBJJJJRRRRZZZZccZZcccccc1!!!ΜΜΔΜΔΜΜΜΜΜΜΜΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥΜΥֵΥΥΥΥΥΥΥΥΥΥΥΜΥΜΥΜΜΜΜΜΜΜΔΔΔΔΔΔΌ1!!ss΄{{΄{{{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{1199{11{99{11{99s11{11s11s11s11s11k11s11k11s11k))k11k))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{119911991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBZZcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRRBBJJJJRRRRZZRRZZZZccZZcccc1111RRRccc֭ΔƔΔƔΜƔΜƔΜƔΜƔΜƔΜƜΜƔkkccJ99J99)!!ΜΜΥƜΜΜΥƜΥΜ֭޽ΥΜΥƜΥΜΥƜΜΜƜΜƜΜƔΜƔΜƔΜƔΜΔƌΔƌΔƌΔccc)ss{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkcckkccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))99999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRRRRRRRRRRRRRRRZZZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZZZZZcccckkkkssss{{{{{{{{B!!ccZZZ)ތ{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999911{1199{11991199999999999999999999BB99BB99BB99BBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkZZZZZZcccckkkkssssssss{{ss{{{{c1kZZޜcJJJJJ!ބ{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999991199{1199k))c))k11k))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBRRkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcc{11Z!!99cckkkkkkkkkkkkkkkkRRBBBBJJJJRRRRZZZZccZZccZZccccccc1kkΌΔΔΔΔΔΔΔΔΔΔΔΔΜΔΔΔkkkRRΜΔΜΜΜΔΜΜΜΜΜΜΜΜΜΜΜB11ΜΜΜΜΜΜΔΜΜΜΜΔΔΔΜΔΔΔΔΔΔΔΌΌƌΌΌΌƌJJJkk{{ss{{sssssssssssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{1199{11{99{11{99s11{11s11{11s11s11s11s11k11s11k))k11k))k11c))k11c))c))c))c))k))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{11{1199{1199{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkJJ99RRccccccccZZBB9999BBJJRRRRRRRRZZZZZZZZccZZccccJJJJZZƌΌƌΔƌΔƌΔƌΔƌΔƌΔƌΔƌ{{ΔƔΔƔΔƔΔƔΜƔΔƔΜƔΔƔB11ΔƔΜƔΔƔΔƔΔƔƌΔƌΔƌΔƌΔƌΔƌΔΌƄΌƄΌƄΌBBBccsssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))k))c))c)){99{1199{1199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc!!!)1J!!R!!k11s11BBBBRRRRZZcckkkkssssssss{{ss{{ss{{s{!999{{!!!Μkkss{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999991199{1199{11s11{11{11{99{1199{11991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRZZkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRR!19R!!Z))s1199BBJJRRRRZZcckkkkkkkkssssssss{{ss{{k1ƌZZޜZZΔkk{{{{{{{{{{{{{{{{{{ss{{ss{{sssssssssssssssskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{11{11{11{11c))c))c))c))c))c))k11c))k11k))k11k))k11k))s11k11s11s11s11s11{11s11{11{11{99{11{99{1199{11991199999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkccc))!!19J!!R!!c11s1199BBJJJJRRRRZZRRZZZZZZZZccZZccZZRss9!!ΌƄΌΌΌƌΌΌΌJ11sRRkkΔΌΔΌƌ{{ccZBB!ΔΔΔΌΔΌΔΌΔΌΌΌƌƄ΄Ƅ΄Ƅ΄Ƅ{{{{֔RRsskksskksskkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999999999999999991199{1199{11{99{11{99s11{11s11{11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99JJcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkRR!!19R!!Z!!k11{1199BBJJJJRRRRZZRRZZZZZZZZZZZZZZZZB!sscc΄Ƅ΄ƄΌƄΌƄ޵sssZZƌΌƌΌƌΌƌΌƌΌΌƄΌ΄{{΄{{΄{{΄{{ss{{ΌRRkkkkkkkkkkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c)){11s11{11s11{99{11{99{11991199119999999999999999BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRJJRRJJRRRRZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk!!!19J!!Z!!s1199BBBBRRRRZZcckkkkkkkkssssssssssssssZ1!BB))Z99kBB{JJZZkkƌޥ絵kccB))111kkk1!!)))cc{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11s))s11s11{11s11{11s11{11{11{11{1199{1199119911999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJRRJJRRJJZZcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccZZ!!1BR!!c)){1199BBJJRRRRZZZZcckkkkkkkkkksskksskkssZ)Z)1B))R11kBB{JJZZcckkssքބJJJތ)))ZZZsssΌ)))ZZ{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssssskksskksskksskkkkkkkkcckkcckkcckkcckkccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999911991199{1199{1199{11{11s11{11s11s11s11s11Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11k))k11k))k11k))s11k11s11k11s11s11s11s11{11s11{11{11{99{11{99{1199{119911999999999999999999999999BB99BB99BB99BB99BBBBZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk11!!19J!!R!!k11s119999JJJJRRJJRRRRZZRRZZZZZZZZZZZZRk)!)1!!B))R11kBBsBBRRRRccccssss{{ss罽!!!sJJ΄Ƅ΄Ƅ΄Ƅ΄Ƅ֜{{{999)))ccΌƄΌ΄ΌƄΌ΄ΌƄΌƄƄ΄{{{{{{{{{{{{{{{{ssssssssssss{{999BBkkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB9999999999999999999999991199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))R!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{1199{1199119911991199999999999999999999BB99BB99ZZcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkRR!)9BR!!Z))s11{119999JJJJRRJJRRRRZZRRZZRRZZRRZZRR{9!)9!!B!!R11c99sBBJJZZZZcckkssssssssޭB)){{{{{{΄{{΄{{΄{{kkkJJJ)))RRR!kk΄Ƅ΄Ƅ΄Ƅ΄Ƅ{{{{{{{{ss{{ss{{ss{{sskksskksskkss{{999{99ccccccZZccZZccZZccZZccZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999119911991199{1199{11{11{11{99{11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11k))k))c))k))c))k))c))c))c))c))Z))c))Z!!Z))Z!!Z))Z!!Z))s11k11s11s11s11s11s11s11{99{11{11{1199{1199{119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJRRJJRRRRcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk))!19R!!Z))s1199BBJJRRRRZZZZcccckkkkkkkkkkkkkkkksskk9!)9!!B))Z11k99JJRRcckkss{{焄BBB!BBBJJ{{ss{{ss{{ss{{sssssssssssssssssssskksskkkkkkkkkkkkkkkkcckkcckkcckkcckkccccccccccccZZccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999911991199{1199{11{11s11{99s11s11s11s11s11s11k))k))k11k))s11k))s11s11s11s11{11s11{11s11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJJJJJcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccRR!)9BZ!!k)){9999BBJJRRRRZZZZcccckkcckkcckkkkkkcckkR!{!19!!J))Z11k99{BBRRZZkkss{{{{JJJBB{{sssssssssssssssskksskksskkkkkkkkkkkkkkkkcckkcckkccccccccccccccccccccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{11{99s11{11s11{11s11s11s11s11k))s11k))k11Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))c))c))c))c))c))k))c))k11k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11s11{99{11{99{11{99{1199119911999999999999999999999999BB99BB99BBBBcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkccs))!)9BR!!Z))s11{11BBBBJJJJRRJJRRRRRRRRRRRRZZRRZZRRRRJ!))9!!B!!R))Z11kBB{BBRRRRZZcckkkkssssssssss))){{ss{{ss{{{{{{{{{{{{{{ޥ֔΄{{΄{{΄{{΄{{΄{{΄{{{{{{ss{{{{{{ss{{ssssss{{sssssssssssssskkkkkkkkkkkkkkkkkkkkkk֔ccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB9999999999999999999999999999{1199{11{99{11{99{11{99s11{11s11{11s11s11s11s11k11s11k11s11k))k11k))k11c))k11c))k))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s))s11s11{11s11{11{11{11{11{11{1199{11991199119999991199999999999999999999cccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkJJ)1BJZ))k)){1111BBBBJJJJJJJJRRJJRRJJRRRRRRRRRRJJ9)19B))R))c11k99{BBJJRRRRcccckkkkkkkksskkޜsssssssssssssssss{{ss{{ss{{֔֜{{{{{{ss{{{{{{ss{{{{{{ssssssss{{sssssssssssskksskksskksskksskksskkkkkkcckkcckkcckkcccccc֔ccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999991199999911991199{1199{11{99{11{11{11{11s11{11s11s11s))s11s))s11k))s11k))k11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!Z))R!!R!!k11c))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJJJJJRRJJcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkR))BJ!!Z))k))9999JJJJRRRRZZZZcccccccckkcckkcckkccccZ)B!sJ))R11Z11sBB{BBRRRRcckkssss焄{{{{{{{{{{{{{{sssssssssssskksskksskksskkkkkkkkkkkkkkkkcckkcckkcckkcckkccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11k11s11k))k11k))k11c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJJJJJJJJJcccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccJJ!!19J!!Z!!k11{1199BBJJJJRRRRZZZZcccccccccccccccccccc1R))Z11k99s99JJJJZZZZkkkk{{{{{{{{R)){{{{{{{{{{{{{{{{ss{{ss{{sssskksskksskksskkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))R!!J!!R!!R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11{11{99{11{99{1199{1199119911999999999999999999999999BBBBcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcc9!!19J!!R!!c))s119999BBBBJJJJJJJJRRJJRRJJRRRRRRJJJk1R))Z11c11k99s99BBJJRRRRZZZZcccckkkkkkkkkkkkc99sskksskksskksskksssssskkssssssssss{{絵ޭ{{sssssssssssssssssssssssssssssssssssssskksskksskksskkkkkkkkkkkkkkkkkkkkkkccccccccccccccccccccZZccZZccZZޥZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999999999999999{1199{1199{11{99{11{99s11{11s11{11s11s11s11s11s11s11k11s11k))s11k))k11k))k11c))k11c))k11c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!R!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))k))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s11s11s11{11s11{11{11{11{11{11{1199{1199{11991199119911999999999999RRcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckk99!!)19BR!!c))s11{119999BBBBJJJJJJJJJJJJRRJJRRJJRR9{)c11c11k11s99BBBBJJJJZZRRZZZZcccccccckkcckkZZkkkkkkkkkkkkkkkkkkkkkksskksskksskksskksskk֜ޭ罽֜sskksskksskksskksskksskksskksskksskksskksskksskksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999119911991199{1199{1199{11{99{11{11{11{11s11{11s11s11s11s11s))s11k))s11k))s11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!c))Z))c))Z))c))c))c))c))k11c))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{11991199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJJJJJJJZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZ)19B!!J!!Z))k))9999BBJJRRRRZZZZZZZZccZZccZZccZZccccBJ)BBJJJJRRRRZZZZkkkkssss{{{{{{{{{{){{{{{{{{ss{{ss{{ss{{sssssssssssssssssssskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccccccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11c))k11c))c))c))c))c))c))Z))R!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k11k))k11k))s11k))s11s))s11s11{11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJJJRRcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcc{))9BBR!!Z))s11{1199BBJJJJRRRRZZZZZZZZZZZZZZZZccZZcc9c)JJJJRRRRZZZZcccckkkkssss{{ss{{ss{{{{JJ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{sssssssssskksskksskksskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkccccccccccccccccccccccccZZccccccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB999999999999999911991199{1199{1199{11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!Z))Z!!Z))J!!BJ!!J!!J!!J!!R!!J!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))k11k))s11k))s11s11s11s11s11s11{11s11{11s11{11{11{99{11{99{1199{11991199999999999999999999BBcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkBB99B!!JR))Z))k11s119999BBBBJJBBJJJJJJJJJJJJJJJJJJJJ9ck199BBBBJJJJRRRRRRRRZZZZccZZcccccccccccccckkcckkcckkcckkcckkcckkcckkkkkkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkcckkcckkccccccccccccccccccccccccccccZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99{11{11s11{11s11{11s11s11s11s11k11s11k11s11k))k11k))k11k))k11c))k11c))k11c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))k))c))k))c))k))k))k11k))k11k))s11k))s11s))s11s))s11s11{11s11{11s11{11{11{11{1199{1199{1199{1199119911999999ZZkkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccZZ9BBR!!R!!c))k)){11{119999BBBBBBBBJJBBJJBBJJBBJJJJJJ9c)BRBBBBJJJJJJJJRRRRZZRRZZRRRRBBBBs11J!!1)){{{BBccccZZcccccccccccccccccccccccccccccccccccckkcccccckkcccccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZccZZccZZccZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11{11{11s11{11s11s11s11s11s))s11s))s11k))s11k))k11k))k11k))k11c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!JJ!!BJ!!BB!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))c))c))c))c))c))k11k))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199119999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJRRkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkccZ))Z))k11k)){11{11BBBBJJJJRRRRRRRRZZZZZZZZZZZZZZZZZZZZZcZ!999Z))ss{{{{{{ss{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ss{{ss{{ss{{sssssssssskksskkkkkkkkkkkkkkkkkkkkcckkcckkcckkcckkcckkccccccccccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99999999999999999999{1199{11{99{11{99{11{11s11{11s11s11s11s11k11s11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))s11k))s11k))s11s11s11s11{11s11{11{11{11{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBJJJJcccckkcckkcckkcckkcckkcckkcckkcckkcckkccccc))k11k))s11{119999BBBBJJJJRRRRRRRRZZRRZZRRZZRRZZRRZZZZ)!ZZZ)kkssssssss{{ssssss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ss{{{{{{ssss{{ss{{ss{{ssssss{{sssssssssssssssskksskksskksskkcckkcckkcckkcckkcckkcckkccccccccccccccccccccccccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{11{99{11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!B!!BB!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))c))c))k))c))k11c))k11k))k11k))k11k))s11k11s11k11s11s11s11s11{11s11{11s11{99{11{99{11{99{1199{119911991199999999ZZcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkccc))Z))c))c))s11s11{11{119999BB99BBBBBBBBJJBBJJBBJJBBJJBBJJZ)c!kkkkkk!RRZZZZZZZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccccccZZccccccZZccccccZZccccccccccccccccccccccccccccccccccccccZZccccccZZccccccccZZccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB9999999999999999999999999999{1199{1199{11{99{11{99{11{99s11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))k))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BB!!BB!!B9B9BBBBBBJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11k))s11s11s11s11s11s11{11s11{11{11{11{11{11{1199{1199{1199{11BBcckkcckkcckkcckkcckkcckkcckkcckkccccc))c))c))k11k))s11{1199119999BB99BBBBBBBBBBBBBBBBBBBBJJBB9c1111RRZZRRZZRRZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BB!!BB!!BBBB9BJ!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))s11s11s11s11s11s11{11s11{99{11{11{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBJJZZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkZZ9999BB99BBBBJJBBJJJJRRJJRRJJRRRRRRRRRRRRRRRRZZRRZZRR9!)JJJRRRkkk{{kkkkkkkkkksskksskksskksskksskksskksskksskksssssskkssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssJJsskksskksskksskksskksskksskksskkkkkkkkkkkkcckkcccckkccccccccccccccccccccccccccccZZccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB999999999999999999991199{1199{1199{11{11s11{99s11{11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!R!!J!!R!!J!!R!!J!!BJ!!BJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!c))Z!!c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11s11s11s))s11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBJJcccckkcckkcckkcckkcckkcckkccZZ99BB99BB99BBBBJJBBJJJJJJJJRRJJRRJJRRJJRRRRRRRRRRRRRR9)J)cckkcckkcckkcckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskkkkkksskkkkkksskksskksskksskksskksskksskksskksskksskksskksskksskksskksskkkkkksskkkkccc))kkkkkkkkkkkkkkkkkkkkkkkkkkcccccckkccccccZZccccccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11s11s))s11s11s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!JJ!!BJ!!999999B!!9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z))Z))Z))c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))k11k))k11k))s11k11s11s11s11s11s11s11{11s11{11s11{99{11{99{11{99{1199{1199{11JJcckkkkkkkkkkkkkkkkkkkkkkBB{99{11{11{11999999999999BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBB!!{1ZZRRRRRRRRRRRRRRRRRRRRRRRRZZRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRBB!ZZRRZZRRZZRRRRRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999BB9999999999999999999911991199{1199{1199{11{99{11{99{11{99s11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11k))k11c))k11c))k11c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!JJ!!B!!J!!BJ!!BB!!BB!!BB9B!!99999191919999B9B9BBBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11k))s11s11s11s11s11s11{11s11{11s11{11{11{11{1199JJcccckkcckkcckkcckkZZ{11s11{11{11{99{1199999999999999999999BB99BB99BB99BB99BB99BB999c!1ZZRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR筭RRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{1199{11{11{11{11{11{11s11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BB9B9999991919B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!R!!J!!R!!R!!R))R!!R))R!!Z))R!!Z))Z!!Z))Z))c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{99{11{99{1199{1199{11999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBcckkkkkkkkkkkkccJJBBBBBBJJBBBBBBJJBBJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRRRs1)J!!kkcccccccccccccccccccccccckkcccccckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcckkcc{{cckkcckkcckkcckkcckkcckkcccccckkccccccccccccccccccccZZccccccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB9999999999999999999911991199{1199{11{99{11{99s11{11s11{11s11s11s11s11s11s11k))s11k))k11c))k11c))k))c))k))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!J!!JJ!!B!!J!!BJ!!BB!!B999B9BBB!!BJ!!BJ!!BJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s11{11s11{11s11{11{11{99{1199{1199{119911991199999999999999999999BB99BB99BB99BB99BB99JJRRcccckkZZJJ99BBBBBBBBBBBBBBBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJRRJJRRJJR!)R!!ZZccZZccZZccZZccZZccZZccccccZZccccccZZccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZZccccccZZccZZccZZccZZccZZccZZccZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99999999999999999999999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BBBB!!9B9B1)111191919999B9B9B!!BB!!BB!!BJ!!BJ!!B!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))Z))c))c))c))c))k11c))k11c))k11k))k11k))k11k))k11k))s11k11s11k11s11s11s11s11{11s11{11s11{11s11{11{11{99{119911{99{11{99{1199{1199{1199999999999999999999999999999999BB99BB99BB99BB99BB99B!R!!ƽkkJJRRJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRJJRRRRRRJJRRRRRRJJRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRZZJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB9999999999999999999999999999999999991199{1199{1199{11{99{11{99{11{11s11{11s11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11k))k11c))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!9B!!9B9B9999991911111)1)1)1)11119191999999B9BBB!!BB!!BJ!!BJ!!BJ!!JJ!!JJ!!JR!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z!!c))c))c))c))c))c))k))c))k))c))k11c))k11k))k11k))s11k))s11k))s11s))s11s))s11s11s11s11{11s11{11s11{11{11{11{11{11{11{99{1199{1199{1199119911991199119999999999999999999999999999J!!R!!֥ZZJJJJJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ{{JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999999991199119911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11c))k))c))k))c))k))c))k))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!JJ!!BJ!!BB!!BB!!BBBB9B9B999919191111)1)1))91919999B9BBB!!BB!!BJ!!B!!J!!JJ!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))c))c))c))k))c))k))c))k11k))k11k))s11k))s11k))s11s11s11s11{11s11{11s11{99{11{11{1199{1199{119999991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJc)9{99祥猌ccZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZccZZZZZZccZZZZZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZccZZZZZZccZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999999991199{1199{1199{11{11s11{99s11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11c))k))c))k))c))c))c))c))Z))c))Z))Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!BB!!BB!!BB9B9999991)1191919999B9BBB!!BBBJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))k))k11k))k11k))s11k))s11s11s11s))s11s11{11s11{11{11{11{11{11{1199{11991199119999991199999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJJJ{1J!{1199119999BBBBJJBBJJJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZZZZZRRZZZZZZRRZZZZZZRRZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZRRZZZZZZRRZZZZZZRRZZZZZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{11{99{11{11{11{11s11{11s11s11s))s11s11s11k))s11k))s11k))k11k))k11c))k))c))c))c))c))c))c))Z!!c))Z!!c))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BB!!BBBB999999191111)!))))1)1)1111119191999999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z))Z))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))k11k))s11k))s11k11s11s11s11s11s11s11{11s11{11s11{11s11{11{11{99{11{99{1199{1199{1199{1199119999999999999999999999999999s1cJ!s11k11s11s11{11{1199999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99999999999999999999999999999999999911991199{1199{1199{1199{11{99{11{99{11{11s11{11s11{11s11{11s11s11s11s11s11s11k))s11k11s11k))k11k))k11k))k11k))k11c))k11c))c))c))c))c))c))c))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!9B9B99999919191111)1)1)1)))))!!!)!)!))))))1)1)11119191919999B9B9BBB!!BB!!BJ!!BJ!!BJ!!BJ!!JJ!!JR!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))c))c))k))c))k))c))k))c))k11k))k11k))k11k))s11k))s11k))s11s))s11s))s11s11s11s11s11s11{11s11{11s11{11{11{11{11{99{11{11{1199{1199{1199{119911991199119B)c)cs11s11s11{11{119911999999999999BB99BB99BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99999999999999999999999999999999999999991199119911991199{1199{1199{1199{1199{11{11{11{11{11{11s11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11k))k))c))k))c))k))c))k))c))c))c))c))c))c))Z))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!BJ!!BJ!!BJ!!BB!!BBBB9B9B99991919111111)1)1))))))!)!)!!))))1)11119199999999B!!BB!!BB!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11k))k11k))k11k))s11s11s11s11s11s11s11s11{11s11{11s11{99{11{99{1199{1199{1199999911999999999999999999999999BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJk)BBBBBBBBBBBBBBJJBBJJJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRZZRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999999999999999999999999911991199{1199{11{99{11{99{11{11s11{11s11s11s11s11s11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!9B!!99999919191111)1)))!)!))))1)11111191999999B9BBB!!BB!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11s))s11s11s11s11{11s11{11s11{11{11{99{11{11{1199{1199119911999999119999999999999999999999999999BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBB9R9R!BB99BBBBBBBBBBBBJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRRRRRJJRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJJRRRRRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB9999999999999999999999991199999911991199{1199{1199{11{11{11{11s11{11s11{11s11s11s11s11s))s11k))s11k))k11k))k11k))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BBBB9B99999919111111)1))))!)!!!!!!!!!)!))))))1)1)1111119191999999B9B9B!!BB!!BB!!BJ!!BJ!!B!!J!!BJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))k11k))k11k))s11k11s11k))s11s11s11s11s11s11s11s11{11s11{11s11{11s11{11{11{99{11{99{11{99{11{99{1199{1199{11Z){{9B{11{99{1199{1199119999999999999999BB999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB999999999999999999999999999999999999119911991199{1199{1199{11{99{11{99{11{99{11{99{11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11k11s11k))s11k))k11k))k11k))k11k))k11k))k11c))k11c))c))c))c))c))c))c))c))c))c))Z))c))Z))c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!BB!!9B9B9999991919111111)1)1))))))!)!!!!!!!!!!!!!!)!)!)!))))))1)1)1111919191999999B9BBBBBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))Z))c))c))c))c))c))c))k))c))k))c))k11c))k))k))k11k))k11k))s11k))s11k))s11k))s11s))s11s))s11s11s11s11s11s11{11s11{11s11{11s11{11{11{11{11{19B!)s1J{11{11{11{99{11{99{1199{1199119911999999119999999999999999999999999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB999999999999999999999999999999999999999999999999119999991199119911991199{1199{1199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s))s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))k))c))k))c))c))c))c))Z))c))Z))c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9B99991919111111)1)1)1))))!)!)!!!!!!!!!!!!!!)!))))))))1111119199999999B!!BB!!BB!!BJ!!BJ!!B!!J!!JJ!!J!!R!!J!!R!!J!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11s11s11s11s11s11s11s11{11s11{11s11{99{11{11{1199{1199{119911991199999999999999999999999999999999BB99BB99BB99BB99BB99BB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB999999999999999999999999999911999999{1199{1199{1199{11{11{11{99s11{11s11{11s11s11s11s11s11s11k))s11k))s11k))k11k))k11c))k11c))k))c))k))c))c))c))c))c))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!9B!!99999919191111)1))))))!)!)!!!!!!!!!!!)!)!))))1)11111191919999B9B9BBBBJ!!BJ!!BJ!!BJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))c))c))c))c))c))k))c))k))c))k11k))k11k))k11k))s11k))s11k))s11s11s11s))s11s11{11s11{11s11{11s11{11{11{99{1199{1199{1199119911999999119999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJRRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB999999999999999999999999999999991199999911991199{1199{1199{11{11{11{99s11{11s11{11s11{11s11s11s))s11s11s11k))s11k))s11k))k11k))k11k))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z!!c))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!BJ!!BJ!!BB!!BB!!BB9B9999991919111111)1))))!)!)!!!!!!!!!!!!!!!!)!)!))))1)1)11111111919199999999B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!B!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))k))c))k11c))k11c))k11k))k11k))k11k))k11k))s11k))s11k))s11k11s11k11s11s11s11s11s11s11s11s11{11s11{11s11{11s11{11s11{99{11{99{11{99{11{99{11{99{11{99{1199{1199{1199{1199{11991199119999999999999999999999999999999999999999999999999999999999999999BB999999BB999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB999999BB9999999999999999999999999999999999999999999999999999999999991199999911991199{1199{1199{1199{11{99{11{99{11{99{11{99{11{99{11{99s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s11s11k))s11k11s11k))s11k))k11k))k11k))k11k))k11c))k11c))k11c))k))c))c))c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB!!9B!!999999999919111111)1)1)1))))))!)!!!!!!!!!!!!!!!!!!)!)!))))))1)1)1)1111119191999999B9B9BBB!!BBBB!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!Z))R!!Z!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))Z))c))c))c))c))c))c))k))c))k))c))k))c))k))c))k11k))k11k))k11k))k11k))s11k))s11k))s11k))s11s))s11s))s11s11s11s))s11s11s11s11s11s11{11s11{11s11{11s11{11{11{11{11{11{11{11{11{11{1199{11{11{1199{1199{1199{1199{1199{11991199{11991199119911991199119911999999119999991199999911999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999119999991199999911999999119911991199119911991199{11991199{1199{1199{1199{1199{1199{1199{11{11{11{99{11{11{11{11{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s11s11s))s11s))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k))c))k11c))k))c))k))c))k))c))c))c))c))c))c))Z))c))Z))c))Z!!c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9B9999991919191111)1)1))))))))!)!)!!!!!!!!!!!!!!!!)!)!))))1)11111191919999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))s11k))s11k))s11s11s11s11s11s11s11s11{11s11{11s11{99{11{11{11{99{11{99{1199{1199{119911991199999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJJJJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999911999999{1199{1199{1199{11{99{11{99{11{11s11{99s11{11s11{11s11s11s11s11s11s11k))s11k11s11k))s11k))k11k))k11k))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R))R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!BJ!!B!!J!!BJ!!BB!!BB!!BB9B99999919111111)1))))))!)!!!!!!!!!!!!)!)!)!))1)1)1)11119191999999B9BBB!!BB!!BJ!!BJ!!BJ!!JJ!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))c))c))c))c))c))c))c))k))c))k))k))k11k))k11k))k11k))s11k))s11k))s11s11s11s))s11s11{11s11{11s11{11s11{11{11{11{11{11{1199{1199{1199{11991199119911991199999911999999999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBJJBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999BB99999999999999999999999999999999119999991199119911991199{1199{1199{11{11{11{99{11{11{11{11s11{11s11{11s11s11s11s11s))s11s11s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))c))c))c))c))c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!J!!J!!J!!JJ!!BJ!!BJ!!BJ!!BBBB9B9B999919191111)1)1))))!)!)!!!!!!!!!!!!!!!!!)!)!))))))))1)1)111111919199999999B9B!!9B!!9B!!BB!!BJ!!BJ!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))k11k))k11k))k11k))k11k))s11k))s11k))s11k11s11k))s11s11s11s11s11s11s11s11s11s11s11s11{11s11{11s11{11s11{11s11{11s11{11s11{99s11{11s11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{1199{11{99{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{11991199{11991199{11991199{11991199{11991199{11991199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{1199{11{99{1199{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{99{11{11s11{99s11{11s11{11s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s11s11k11s11k11s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11k))k11c))k11c))k11c))k11c))c))c))c))c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))c))Z!!Z))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!J!!J!!J!!JJ!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB!!9B!!9B999999991919111111)1)1))))))))!)!)!!!!!!!!!!!!!!!!!!)!)!)!))))))1)1)11111111919199999999B9BBBBBBB!!BB!!BJ!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R!!R!!R!!R!!Z))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))Z!!c))c))c))c))c))c))c))c))c))c))k))c))k))c))k))c))k))c))k11c))k))k))k11k))k11k))k11k))k11k))s11k))s11k))s11k))s11k))s11k))s11s))s11k))s11s))s11s))s11s11s11s))s11s11s11s11s11s11{11s11s11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11{11{11s11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11{11s11{11{11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11{11s11s11s11s11s11s11s11s11s))s11s11s11s))s11s))s11k))s11s))s11k))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11k))k11k))k11c))k))c))k))c))k))c))k))c))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z))c))Z!!c))Z!!c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z!!R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!JJ!!JJ!!BJ!!BJ!!BJ!!BB!!BB!!BB!!BBBB9B9B999999191919111111)1)1)1))))!)!)!)!!!!!!!!!!!!!!)!)!))))))1)1111111191999999B9B9B!!BB!!BJ!!BJ!!BJ!!J!!J!!JJ!!J!!J!!J!!R!!J!!R!!J!!R))R!!R!!R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!c))Z))c))Z))c))c))c))c))c))c))c))c))k11c))k11c))k11k))k11k))k11k))k11k))s11k))s11k))s11s11s11s11s11s11s11s11{11s11{11s11{99s11{11s11{99{11{11{11{99{11{99{1199{1199{119911991199999911999999999999999999999999999999999999999999999999BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BBBBBB99BBBBBB99BBBBBB99BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB99BBBBBB99BBBBBB99BBBBBB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB99BB999999999999999999999999999999999999999999999999999911999999{1199{1199{1199{11{99{11{99{11{11{11{99{11{11s11{99s11{11s11{11s11s11s11s11s11s11k))s11k11s11k))s11k))k11k))k11k))k11c))k11c))k11c))k11c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!R!!R!!R))R!!R!!J!!R!!J!!J!!J!!J!!J!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB9B99999919111111)1)1))))!)!)!)!!!!!!!!!!!!!)!)!))))1)1)1111119191999999B9BBB!!BBBJ!!BJ!!BJ!!BJ!!JJ!!JJ!!J!!R!!J!!R!!R!!R!!R!!R!!R!!R))R!!R!!R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!c))Z!!c))Z))c))Z!!c))c))c))c))c))c))c))c))k))c))k))c))k))k))k11k))k11k))k11k))k11k))s11k))s11k))s11s))s11s11s11s))s11s11{11s11{11s11{11s11{11s11{11s11{11{11{99{11{11{1199{1199{1199{1199{1199{119911991199119911999999119999991199999999999999999999999999999999999999999999999999999999999999999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999BB999999999999999999999999999999999999999999999999999999999999999911999999119999991199119911991199{1199{1199{1199{1199{1199{11{99{11{11{11{11s11{11s11{11s11{11s11{11s11s11s11s11s))s11s11s11s))s11k))s11k))s11k))s11k))k11k))k11k))k11k))k11c))k))c))k))c))c))c))c))c))c))c))c))Z!!c))Z))c))Z!!Z))Z!!Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!R!!R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!JJ!!JJ!!BJ!!BJ!!BB!!BB!!BBBB9B9999991919111111)1)1))))!)!)!)!!!!!!!!!!!!!!!)!)!))))))))1)1)11111111919199999999B9B9B!!9B!!BB!!BB!!BJ!!BJ!!BJ!!BJ!!BJ!!J!!J!!J!!J!!J!!J!!J!!R!!J!!R!!J!!R!!J!!R!!J!!R!!R!!R!!R!!R))R!!R))R!!Z))R!!Z))R!!Z))R!!Z))R!!Z))Z!!Z))Z!!Z))Z!!Z))Z!!Z))Z))c))Z))c))Z))c))Z))c))Z))c))Z))c))c))c))c))c))c))c))c))c))c))c))c))k11c))k))c))k11c))k11c))k11c))k11c))k11k))k11k))k11k))k11k))k11k))k11k))k11k))k11k))s11k))k11k))s11k))s11k))s11k11s11k))s11k11s11k))s11k11s11k))s11k11s11k11s11s11s11k11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11s11k11s11s11s11k))s11k11s11k))s11k11s11k))s11k11s11k))s11k))s11k))s11k))k11k))s11k))k11k))k11k))k11k))k11k))k11k))k11k))k11k))k11k))k11c))k11c))k11c))k11c))k))c))k11c))c))c))c))c))c))c))c))c))c))c))c))c))c))Z))c))Z))c))Z))c))Z))c))Z!!Z))Z))Z))Z!!Z))Z!!Z))R!!Z))R!!Z))R!!Z))R!!Z))R!!Z))R!!R))R!!R))R!!R!!R!!R!!R!!R!!J!!R!!J!!R!!J!!R!!J!!J!!J!!J!!J!!J!!JJ!!B!!J!!BJ!!BJ!!BJ!!BB!!BB!!BB!!9B!!9B9B999999991919111111)1)1)1))))))))!)!)!!!!!!!!!!'batik-1.9.orig/samples/tests/resources/wmf/black_shapes.wmf0000644000175000017500000000434413063003311023474 0ustar mans0954mans0954ƚ@1S g"& &&#TNPP2OMit & TNPP &&TNPP    - "-- !-- "-&_a& - &_& - "-6----- !W ----- =@ -- @1Courier- . 2 20+).--N i -- @1Courier- f. 2 ? SHTZ&&&&. f.2 ? ^1500 &&&&&. f. 2 ? FT&%.&  \ \ --"$0  M  [  ^ M 0    "      $ 3 # * 9 ; t K  Y H A J ; $ Y ~ L r K r ; 9 * $ 4 ; J A H X  $ "    .  .      $  b e j n   " 2 / %  g  j  j $L > K ^  p  |  k X $ # 2 6 B L N = ; 1 % $ F  X 0 Y M X c T ` C M F 0 G $ 5 F B 6 ' % #     % 1 $   % ' 1 "     $ 7 H L S n S j X M X I F I F M A j J j B g ; $ F  X  X  S S L G 6 ; B J A F  $  . ' %  r  ^  ] j k      $ H : ; 9 *   * / ; J A H --&--"System-&TNPP &batik-1.9.orig/samples/tests/resources/wmf/negApmText1.wmf0000644000175000017500000003055413063003307023221 0ustar mans0954mans0954ƚHH  H  "--Z   "Arial- .2  OCCUPATION_TYPE  { "Arial- . 2 {37    . 2 3.5  t  . 2 hs3.5  r  . 2 r3.5  {  . 2 {1    . 2 .1  t  . 2 hs.1  r  . 2 r3.6  ~{  . 2 {37  ~  . 2 3.5  ~t  . 2 hs3.5  ~r  . 2 r7.1  k{  . 2 ~{l114  k  . 2 ~ l10.8  kt  . 2 ~hsl10.8  kr  . 2 ~rl17.8  Xm{  . 2 k{mY53  Xm  . 2 k mY5.0  Xtm  . 2 khmsY5.0  Xmr  . 2 krmY22.9  EZ{  . 2 X{ZF61  EZ  . 2 X ZF5.8  EtZ  . 2 XhZsF5.8  EZr  . 2 XrZF28.6  2G{  . 2 E{G3104  2G  . 2 E G39.8  2tG  . 2 EhGs39.8  2Gr  . 2 ErG338.4  4{  . 2 2{4 2  4  . 2 2 4 .2  t4  . 2 2h4s .2  4r  . 2 2r4 38.6   !{  . 2 {! 229   !  . 2  ! 21.6   t!  . 2 h!s 21.6   !r  . 2 r! 60.2  {  . 2 {40    . 2 3.8  t  . 2 hs3.8  r  . 2 r64.0  {  . 2 {112    . 2 10.6  t  . 2 hs10.6  r  . 2 r74.6  {  . 2 {123    . 2 11.6  t  . 2 hs11.6  r  . 2 r86.2  {  . 2 {12    . 2 1.1  t  . 2 hs1.1  r  . 2 r87.3  {  . 2 {28    . 2 2.6  t  . 2 hs2.6  r  . 2 r90.0  {  . 2 {1    . 2 .1  t  . 2 hs.1  r  . 2 r90.1  {  . 2 {25    . 2 2.4  t  . 2 hs2.4  r  . 2 r92.4  t{  . 2 {u80  t  . 2 u7.6  tt  . 2 hsu7.6  tr  .2 ru100.0  av{  . 2 t{vb1059  av  .2 t vb100.0  atv  .2 thvsb100.0  avr  .  }   .  }<  . 2 D<|   }<  .2 D<|blue_c  ~}<  .2 D<|clerical  k}<  .2 D<|ldirect  X}m<  . 2 lD<m|Yedu  E}Z<  . 2 YD<Z|Fexec  2}G<  . 2 FD<G|3home  }4<  .2 3D<4| manag   }!<  . 2 D<!| prof  }<  .2 D<|publ_s  }<  .2 D<|ret_d  }<  .2 D<|self_e  }<  .2 D<|servi  }<  .2 D<|shift  }<  . 2 D<|shop  }<  .2 D<|student  t}<  .2 D<|uwhite_c  a}v<  .2 uD<v|bTotal  a>   .2  =bValid  {  .2 {Frequency    .2 Percent  t  .2 B sValid Percent  r  .2  rCumulative2 rPercent  "-ccrcr-Y YXc "- d d d d |d| "--"System-'batik-1.9.orig/samples/tests/resources/wmf/textGreek.wmf0000644000175000017500000000207213063003307023020 0ustar mans0954mans0954ƚ@1S & &&#TNPPH2OMi & TNPP &&TNPP    --- !---&_a&ww@ ww w0- &_& --+ -- @@1Courier New ww w0- .@@@1Courier New ww w0-. 2 @s.-.--"System !w-&TNPP &batik-1.9.orig/samples/tests/resources/java/0000755000175000017500000000000013063003306020471 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/sources/0000755000175000017500000000000013063003305022153 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/sources/com/0000755000175000017500000000000013063003306022732 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/sources/com/untrusted/0000755000175000017500000000000013063003305024766 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/sources/com/untrusted/script/0000755000175000017500000000000013153020772026301 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/sources/com/untrusted/script/UntrustedScriptHandler.java0000644000175000017500000003602613063003306033625 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package com.untrusted.script; import java.awt.AWTPermission; import java.io.FilePermission; import java.io.SerializablePermission; import java.lang.reflect.ReflectPermission; import java.net.NetPermission; import java.net.SocketPermission; import java.net.URL; import java.security.AllPermission; import java.security.Permission; import java.sql.SQLPermission; import java.util.PropertyPermission; import javax.sound.sampled.AudioPermission; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Window; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.apache.batik.anim.dom.SVGOMDocument; import org.apache.batik.bridge.ScriptHandler; /** * This class implements the ScriptHandler interface and represents an * example of untrusted code. * * It creates a number of Java Permissions and checks that access is denied. * the tests fail if the Permissions are granted. * * The only thing that the class should be allowed to make is a connection * back to the server that served the document containing this script. * * @author Vincent Hardy * @version $Id: UntrustedScriptHandler.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class UntrustedScriptHandler implements ScriptHandler { public static final String svgNS = "http://www.w3.org/2000/svg"; /** * Path for the file tested with FilePermission */ public static final String testedPath = "build.sh"; /** * Host which is used for testing */ public static final String testedHost = "nagoya.apache.org:8080"; /** * Table of Permissions which will be tested. */ protected static Object[][] basePermissions = { {"AllPermission", new AllPermission()}, {"FilePermission read", new FilePermission(testedPath, "read")}, {"FilePermission write", new FilePermission(testedPath, "write")}, {"FilePermission execute", new FilePermission(testedPath, "execute")}, {"FilePermission delete", new FilePermission(testedPath, "delete")}, // 1.4 {"ServicePermission", new ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate")}, {"SocketPermission accept", new SocketPermission(testedHost, "accept")}, {"SocketPermission connect", new SocketPermission(testedHost, "connect")}, {"SocketPermission listen", new SocketPermission(testedHost, "listen")}, {"SocketPermission resolve", new SocketPermission(testedHost, "resolve")}, {"AudioPermission play", new AudioPermission("play")}, {"AudioPermission record", new AudioPermission("record")}, {"AWTPermission accessClipboard", new AWTPermission("accessClipboard")}, {"AWTPermission accessEventQueue", new AWTPermission("accessEventQueue")}, {"AWTPermission listenToAllAWTEvents", new AWTPermission("listenToAllAWTEvents")}, {"AWTPermission showWindowWithoutWarningBanner", new AWTPermission("showWindowWithoutWarningBanner")}, {"AWTPermission readDisplayPixels", new AWTPermission("readDisplayPixels")}, {"AWTPermission createRobot", new AWTPermission("createRobot")}, {"AWTPermission fullScreenExclusive", new AWTPermission("fullScreenExclusive")}, // 1.4 {"DelegationPermission", new DelegationPermission()}, // 1.4 {"LoggingPermission", new LoggingPermission("control")}, {"NetPermission setDefaultAuthenticator", new NetPermission("setDefaultAuthenticator")}, {"NetPermission requestPasswordAuthentication", new NetPermission("requestPasswordAuthentication")}, {"NetPermission specifyStreamHandler", new NetPermission("specifyStreamHandler")}, {"PropertyPermission java.home read", new PropertyPermission("java.home", "read")}, {"PropertyPermission java.home write", new PropertyPermission("java.home", "write")}, {"ReflectPermission", new ReflectPermission("suppressAccessChecks")}, {"RuntimePermission createClassLoader", new RuntimePermission("createClassLoader")}, {"RuntimePermission getClassLoader", new RuntimePermission("getClassLoader")}, {"RuntimePermission setContextClassLoader", new RuntimePermission("setContextClassLoader")}, {"RuntimePermission setSecurityManager", new RuntimePermission("setSecurityManager")}, {"RuntimePermission createSecurityManager", new RuntimePermission("createSecurityManager")}, {"RuntimePermission exitVM", new RuntimePermission("exitVM")}, {"RuntimePermission shutdownHooks", new RuntimePermission("shutdownHooks")}, {"RuntimePermission setFactory", new RuntimePermission("setFactory")}, {"RuntimePermission setIO", new RuntimePermission("setIO")}, {"RuntimePermission modifyThread", new RuntimePermission("modifyThread")}, {"RuntimePermission stopThread", new RuntimePermission("stopThread")}, {"RuntimePermission modifyThreadGroup", new RuntimePermission("modifyThreadGroup")}, {"RuntimePermission getProtectionDomain", new RuntimePermission("getProtectionDomain")}, {"RuntimePermission readFileDescriptor", new RuntimePermission("readFileDescriptor")}, {"RuntimePermission writeFileDescriptor", new RuntimePermission("writeFileDescriptor")}, {"RuntimePermission loadLibrary.{library name}", new RuntimePermission("loadLibrary.{library name}")}, {"RuntimePermission accessClassInPackage.java.security", new RuntimePermission("accessClassInPackage.java.security")}, {"RuntimePermission defineClassInPackage.java.lang", new RuntimePermission("defineClassInPackage.java.lang")}, {"RuntimePermission accessDeclaredMembers", new RuntimePermission("accessDeclaredMembers")}, {"RuntimePermission queuePrintJob", new RuntimePermission("queuePrintJob")}, {"SecurityPermission createAccessControlContext", new SerializablePermission("createAccessControlContext")}, {"SecurityPermission getDomainCombiner", new SerializablePermission("getDomainCombiner")}, {"SecurityPermission getPolicy", new SerializablePermission("getPolicy")}, {"SecurityPermission setPolicy", new SerializablePermission("setPolicy")}, {"SecurityPermission setSystemScope", new SerializablePermission("setSystemScope")}, {"SecurityPermission setIdentityPublicKey", new SerializablePermission("setIdentityPublicKey")}, {"SecurityPermission setIdentityInfo", new SerializablePermission("setIdentityInfo")}, {"SecurityPermission addIdentityCertificate", new SerializablePermission("addIdentityCertificate")}, {"SecurityPermission removeIdentityCertificate", new SerializablePermission("removeIdentityCertificate")}, {"SecurityPermission printIdentity", new SerializablePermission("printIdentity")}, {"SecurityPermission getSignerPrivateKey", new SerializablePermission("getSignerPrivateKey")}, {"SecurityPermission setSignerKeyPair", new SerializablePermission("setSignerKeyPair")}, {"SerializablePermission enableSubclassImplementation", new SerializablePermission("enableSubclassImplementation")}, {"SerializablePermission enableSubstitution", new SerializablePermission("enableSubstitution")}, {"SQLPermission", new SQLPermission("setLog")}, // 1.4 {"SSLPermission setHostnameVerifier", new SSLPermission("setHostnameVerifier")} // 1.4{"SSLPermission getSSLSessionContext", new SSLPermission("getSSLSessionContext")} }; /** * Set of Permissions to test. One is added if the Document is loaded from a host */ private Object[][] permissions; /** * Reference to the rectangles which show the test status */ private Element[] statusRects; /** * Runs this handler. This method is called by the SVG viewer * when the scripts are loaded. * @param doc The current document. * @param win An object which represents the current viewer. */ public void run(final Document doc, final Window win){ int nGrantedTmp = 0; // // If the document is loaded over the network, check that the // class has permission to access the server // URL docURL = ((SVGOMDocument)doc).getURLObject(); if (docURL != null && docURL.getHost() != null && !"".equals(docURL.getHost())) { permissions = new Object[basePermissions.length + 3][2]; System.arraycopy(basePermissions, 0, permissions, 3, basePermissions.length); String docHost = docURL.getHost(); if (docURL.getPort() != -1) { docHost += ":" + docURL.getPort(); } permissions[0][0] = "SocketPermission accept " + docHost; permissions[0][1] = new SocketPermission(docHost, "accept"); permissions[1][0] = "SocketPermission connect " + docHost; permissions[1][1] = new SocketPermission(docHost, "connect"); permissions[2][0] = "SocketPermission resolve " + docHost; permissions[2][1] = new SocketPermission(docHost, "resolve"); nGrantedTmp = 3; } else { permissions = basePermissions; } // Captures the number of permissions which should be // granted to this code. final int nGranted = nGrantedTmp; // // Build a table in the scrollable area of the document // Element securityResults = doc.getElementById("securityResults"); statusRects = new Element[permissions.length]; for (int i=0; iChristophe Jolif * @version $Id: EventListenerInitializerImpl.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class EventListenerInitializerImpl implements EventListenerInitializer { /** * This method is called by the SVG viewer * when the scripts are loaded to register * the listener needed. * @param doc The current document. */ public void initializeEventListeners(SVGDocument doc) { System.err.println(">>>>>>>>>>>>>>>>>>> SVGDocument : " + doc); ((EventTarget)doc.getElementById("testContent")). addEventListener("mousedown", new EventListener() { public void handleEvent(Event evt) { ((Element)evt.getTarget()).setAttributeNS(null, "fill", "orange"); } }, false); } } batik-1.9.orig/samples/tests/resources/java/resources/0000755000175000017500000000000013063003306022503 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/0000755000175000017500000000000013063003306023261 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/untrusted/0000755000175000017500000000000013063003306025316 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/untrusted/script/0000755000175000017500000000000013153020772026630 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/untrusted/script/security2.mf0000644000175000017500000000012213063003307031073 0ustar mans0954mans0954Manifest-Version: 1.0 Script-Handler: com.untrusted.script.UntrustedScriptHandler batik-1.9.orig/samples/tests/resources/java/resources/com/test/0000755000175000017500000000000013063003306024240 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/test/script/0000755000175000017500000000000013153020772025552 5ustar mans0954mans0954batik-1.9.orig/samples/tests/resources/java/resources/com/test/script/java-binding.mf0000644000175000017500000000012613063003310030413 0ustar mans0954mans0954Manifest-Version: 1.0 SVG-Handler-Class: com.test.script.EventListenerInitializerImpl batik-1.9.orig/samples/tests/spec/0000755000175000017500000000000013063003316016471 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/fonts/0000755000175000017500000000000013153020772017627 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/fonts/batikFont.svg0000644000175000017500000003377613063003312022300 0ustar mans0954mans0954 SVGFont - Batik Font test Batik SVG Font Batik BBB aaa tititi kkk ktiaB atikB batik-1.9.orig/samples/tests/spec/fonts/fontDecorations.svg0000644000175000017500000013234213063003312023505 0ustar mans0954mans0954 SVGFont - tspan and decoration test SVGFont - tspan and Decoration Test abcde fghij UnderLine OverLine LineThrough batik-1.9.orig/samples/tests/spec/fonts/fontGlyphsBoth.svg0000644000175000017500000006355013063003312023322 0ustar mans0954mans0954 SVGFont - both glyph types test SVG fonts - both glyph types without kerning with kerning font svg font svg abcdefgᨊ uvwxyz batik-1.9.orig/samples/tests/spec/fonts/fontAltGlyph.svg0000644000175000017500000003256713063003312022767 0ustar mans0954mans0954 SVGFont - altGlyph test altGlyph Test a bc de fg ab c d efg ab c d efg abcdefg abcdefg abcdefg abcdefg abcdefg altGlyph references local glyph altGlyph references local altGlyphDef altGlyph references external glyph altGlyph references external altGlyphDef local altGlyphDef with multiple glyphRefs (internal and external) external altGlyphDef with multiple glyphRefs (internal and external) local altGlyphDef with altGlyphItems (some containing invalid glyphRef URIs) external altGlyphDef with altGlyphItems batik-1.9.orig/samples/tests/spec/fonts/fontFamilyCaseSensitivity.svg0000644000175000017500000001732613063003310025525 0ustar mans0954mans0954 font-family case-sensitivity font-family case-sensitivity System Font with proper case sensitivity Times New Roman System Font with improper case sensitivity times new roman for Times New Roman SVG Font with proper case sensitivity Larabiefont SVG Font with improper case sensitivity larabieFont for Larabiefont batik-1.9.orig/samples/tests/spec/fonts/fontFace.svg0000644000175000017500000001152713063003311022071 0ustar mans0954mans0954 <font-face> and @font-face test <font-face> and @font-face test SVG Batik Batik CSS Batik Batik SVG Batik Batik CSS Batik Batik SVG Batik Batik CSS Batik Batik SVG Batik Batik CSS Batik Batik SVG Batik Batik CSS Batik Batik batik-1.9.orig/samples/tests/spec/fonts/fontGlyphChoice.svg0000644000175000017500000012566413063003311023441 0ustar mans0954mans0954 SVGFont - glyph selection test Glyph Selection Test Horizontal Text Vertical Text English Français batik-1.9.orig/samples/tests/spec/fonts/fontKerning.svg0000644000175000017500000004631713063003312022636 0ustar mans0954mans0954 SVGFont - kerning test SVG fonts - kerning test Horizontal Kerning abcdefg abcdefg u1="U+0061-0063" u2="U+0064-0066" k="500" uvwxyz uvwxyz u1="u" g2="v" k="-200" u1="v" g2="w" k="-400" u1="w" g2="x" k="200" u1="x" g2="y" k="400" u1="y" g2="z" k="-1000" abcxyz abcxyz u1="U+006?" u2="U+007?" k="-1000" Vertical Kerning abcdefg abcdefg abcdefg abcdefg uvwxyz uvwxyz abcxyz abcxyz batik-1.9.orig/samples/tests/spec/fonts/fontGlyphsChildSVG.svg0000644000175000017500000006115013063003312024023 0ustar mans0954mans0954 SVGFont - children SVG test SVG fonts - glyphs SVG children without kerning with kerning font svg mask font svg mask abcdefgᨊ abcdefgᨊ uvwxyz uvwxyz batik-1.9.orig/samples/tests/spec/fonts/fontStyling.svg0000644000175000017500000003744713063003310022674 0ustar mans0954mans0954 SVGFont - font styling test Font Styling Test abcd efgh ijij klmn opqr The text style should match the style of the box beside it. batik-1.9.orig/samples/tests/spec/fonts/fontGlyphsD.svg0000644000175000017500000006004613063003310022604 0ustar mans0954mans0954 SVGFont - d attribute test SVG fonts - glyphs "d" without kerning with kerning font svg mask font svg mask abcdefgᨊ abcdefgᨊ uvwxyz uvwxyz batik-1.9.orig/samples/tests/spec/fonts/fontAltGlyph2.svg0000644000175000017500000001501513063003312023036 0ustar mans0954mans0954 altGlyph, altGlyphItem altGlyph, altGlyphItem Test altGlyph referencing a unique glyph... ...which is valid : " No Match " ...which has an invalid id : " No Match " ...which is not an actual glyph : " No Match " altGlyph referencing a glyphDef containing... ...5 valid glyphRefs : " No Match " ...4 valid and an invalid glyphRefs : " No Match " ...2 altGlyphItems (both valid) : " No Match " ...2 altGlyphItems (2nd is valid) : " No Match " ...2 altGlyphItems (both invalid ) : " No Match " ...5 glyphRefs with dx/dy/rotate : " No Match " batik-1.9.orig/samples/tests/spec/fonts/fontAltGlyph3.svg0000644000175000017500000003256113063003312023044 0ustar mans0954mans0954 SVGFont - altGlyph test altGlyph Test a bc de fg ab c d efg ab c d efg abcdefg abefg abfg abcefg acdefg altGlyph references local glyph altGlyph references local altGlyphDef altGlyph references external glyph altGlyph references external altGlyphDef local altGlyphDef with multiple glyphRefs (internal and external) external altGlyphDef with multiple glyphRefs (internal and external) local altGlyphDef with altGlyphItems (some containing invalid glyphRef URIs) external altGlyphDef with altGlyphItems batik-1.9.orig/samples/tests/spec/fonts/fontExternalFont.svg0000644000175000017500000000506413063003312023644 0ustar mans0954mans0954 SVGFont - external font test External SVG Font Test Batik Batik batik-1.9.orig/samples/tests/spec/fonts/fontArabic.svg0000644000175000017500000035167613063003310022427 0ustar mans0954mans0954 SVGFont - arabic shaping test Arabic shaping test Arabic using SVG font: لماذا لا يتكلمون اللّغة العربية فحسب؟ arabic: ءأؤإئابةت ثجحخدذرزس شصضطظعـفق كلمنهوىِᙶ Arabic using system font: لماذا لا يتكلمون اللّغة العربية فحسب؟ arabic: ءأؤإئابةت ثجحخدذرزس شصضطظعـفق كلمنهوىِᙶ Reference image of arabic text: batik-1.9.orig/samples/tests/spec/fonts/fontBounds.svg0000644000175000017500000000711713063003311022465 0ustar mans0954mans0954 SVGFont - Text/Font Bounds computation. SVGFont - Text/Font Bounds computation. FOP FOP The bottoms of the letters should appear in black on top of the blue rect batik-1.9.orig/samples/tests/spec/fonts/fontChoice.svg0000644000175000017500000003254613063003311022431 0ustar mans0954mans0954 SVGFont - font selection test Font Selection Test Georgia Bold Georgia SansSerif Bold Italic SansSerif font-family="SVGGeorgia, SansSerif" font-family="SVGGeorgia, SansSerif" font-weight="bold" font-family="SansSerif, SVGGeorgia" font-family="SVGGeorgia, SansSerif" font-weight="bold" font-style="italic" batik-1.9.orig/samples/tests/spec/fonts/fontOnPath.svg0000644000175000017500000001707013063003312022424 0ustar mans0954mans0954 SVGFont - text path test SVG Font with textPath Test Font on a Path startOffset="0%" text-anchor="start" Font on a Path startOffset="0%" text-anchor="middle" Font on a Path startOffset="50%" text-anchor="end" Font on a Path startOffset="50%" text-anchor="start" Font on a Path startOffset="50%" text-anchor="middle" Font on a Path startOffset="100%" text-anchor="end" Font on a Path startOffset="35" text-anchor="start" Font on a Path startOffset="35" text-anchor="middle" Font on a Path startOffset="35" text-anchor="end" batik-1.9.orig/samples/tests/spec/rendering/0000755000175000017500000000000013153020772020453 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/rendering/opacity.svg0000644000175000017500000001201613063003314022635 0ustar mans0954mans0954 Opacity: stroke-opacity, fill-opacity, opacity Opacity : stroke-opacity, fill-opacity and opacity opacity:1 stroke-opacity:1 fill-opacity:1 opacity:1 stroke-opacity:1 fill-opacity:0.5 opacity:1 stroke-opacity:0.5 fill-opacity:1 opacity:1 stroke-opacity:0.5 fill-opacity:0.5 opacity:0.5 stroke-opacity:1 fill-opacity:1 opacity:0.5 stroke-opacity:1 fill-opacity:0.5 opacity:0.5 stroke-opacity:0.5 fill-opacity:1 opacity:0.5 stroke-opacity:0.5 fill-opacity:0.5 batik-1.9.orig/samples/tests/spec/rendering/opacity2.svg0000644000175000017500000001211013063003314022712 0ustar mans0954mans0954 Opacity: opacity on group Opacity2 : opacity on group opacity:1 stroke-opacity:1 fill-opacity:1 opacity:0.5 stroke-opacity:1 fill-opacity:1 opacity:1 stroke-opacity:0.5 fill-opacity:1 opacity:0.5 stroke-opacity:0.5 fill-opacity:1 opacity:1 stroke-opacity:1 fill-opacity:0.5 opacity:0.5 stroke-opacity:1 fill-opacity:0.5 batik-1.9.orig/samples/tests/spec/rendering/paintOpacity.svg0000644000175000017500000002546413063003312023642 0ustar mans0954mans0954 Paint Server Opacity Test Paint Server Opacity Test rgb radial grad linear grad pattern fill stroke opaque fill-opac. combo opaque fill-opac. combo batik-1.9.orig/samples/tests/spec/shapes/0000755000175000017500000000000013153020772017761 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/shapes/emptyShape.svg0000644000175000017500000000417713063003321022621 0ustar mans0954mans0954 Empty 'd', 'points' on <path>, <polyline> and <polygon> Empty 'd', 'points' on <path>, <polyline> and <polygon> batik-1.9.orig/samples/tests/spec/shapes/zero.svg0000644000175000017500000001012413063003320021445 0ustar mans0954mans0954 Test zero length on various shapes Test zero length on various shapes Value of zero disables rendering of the elements <rect> <circle> <ellipse> width="0" height="0" width & height="0" r="0" rx="0" ry="0" rx & ry="0" batik-1.9.orig/samples/tests/spec/filters/0000755000175000017500000000000013153020772020146 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/filters/feTileTarget.svg0000644000175000017500000002057613063003307023253 0ustar mans0954mans0954 feTile Visual Reference feTile Test Visual Reference tile_1 Reference tile_1 Skewed Reference Reference tile_2 Reference tile_2 Reference Scaled Rotated tile_3 Reference tile_3 Reference Skewed Y batik-1.9.orig/samples/tests/spec/filters/enableBackground.svg0000644000175000017500000001673013063003310024111 0ustar mans0954mans0954 enable-background Test Enable-Background Test Left Copied to right Right is transparent Blobs opaquely merged w/ oval Copy of middle of first row (by setting enable-background bounds) batik-1.9.orig/samples/tests/spec/filters/feConvolveMatrix.svg0000644000175000017500000003114413063003312024154 0ustar mans0954mans0954 feMerge Test feConvolveMatrix Text 1.1 Replicate Top & Right 1.2 Replicate Top, targetX 1.3 Replicate Right, targetY, norm 3.1 Rep Bottom & Left 3.2 Rep Bottom & Right 3.3 Rep Top & Left 3.2 None PreserveAlpha B&L 3.2 None Top & Right 3.3 None Bottom & Left batik-1.9.orig/samples/tests/spec/filters/feDisplacementMap.svg0000644000175000017500000002116213063003310024237 0ustar mans0954mans0954 Filter Effect: feDisplacementMap Filter Effect: feDisplacementMap Reference x only y only x and y x and y (different) batik-1.9.orig/samples/tests/spec/filters/feMerge.svg0000644000175000017500000002170413063003312022234 0ustar mans0954mans0954 feMerge Test feMerge Test lt green/blue/lt blue/green lt green/lt blue/blue/green lt green/lt blue/green/blue lt blue/green/lt green/blue lt blue/lt green/green/blue green/blue/lt blue/lt green batik-1.9.orig/samples/tests/spec/filters/feTile.svg0000644000175000017500000001530513063003312022072 0ustar mans0954mans0954 feTile Test feTile Test tile_1 4 tiles, quarter size tile_2 (centered) 9 tiles, 1 full, 8 partial tile_3 (top left offset) 9 tiles, 1 full, 8 partial tile_1 skewed X tile_2 (centered, rotate & scale) tile_3 (top left offset) skewed Y How it should look like... batik-1.9.orig/samples/tests/spec/filters/feGaussianDefault.svg0000644000175000017500000000370413063003310024252 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/filters/feComposite.svg0000644000175000017500000002274613063003310023144 0ustar mans0954mans0954 feComposite Test feComposite Test 1.1 Check FeImage 1.2 Orange over blue 1.3 Orange in blue 2.1 Orange out blue 2.2 Orange atop blue 2.3 Orange xor blue 3.1 Orange arithmetic blue k1=0 k2=0.5 k3=0.5 k4=0 3.2 Orange arithmetic blue k1=0 k2=0.75 k3=0.25 k4=0 3.3 Orange arithmetic blue k1=1 k2=0.5 k3=0.5 k4=0.2 batik-1.9.orig/samples/tests/spec/filters/feTurbulence.svg0000644000175000017500000001170513063003312023305 0ustar mans0954mans0954 Filter Effect: feTurbulence Filter Effect: feTurbulence type=turbulence baseFrequency=0.05 numOctaves=2 type=turbulence baseFrequency=0.1 numOctaves=2 type=turbulence baseFrequency=0.05 numOctaves=8 type=fractalNoise baseFrequency=0.1 numOctaves=4 type=fractalNoise baseFrequency=0.4 numOctaves=4 type=fractalNoise baseFrequency=0.1 numOctaves=1 batik-1.9.orig/samples/tests/spec/filters/feImage2.svg0000644000175000017500000001610513063003312022300 0ustar mans0954mans0954 feImage Test feImage Test <symbol> <svg> <g> feImage <symbol> feImage <svg> feImage <g> feImage ObjBBox <symbol> feImage ObjBBox <svg> feImage ObjBBox <g> batik-1.9.orig/samples/tests/spec/filters/feComponentTransfer2.svg0000644000175000017500000002432113063003310024722 0ustar mans0954mans0954 Filter Effect: feComponentTransfer (2) Filter Effect: feComponentTransfer (2) Reference Image type=table Identity tables (0 1) type=table Invert RGB (1 0) type=table darkBlue-cyan type=table darkRed-orange type=table darkGreen-green type=discrete yellow-red type=discrete White-Yellow-Orange-Red type=gamma exponent (2.4) offset (0) amplitude (1) batik-1.9.orig/samples/tests/spec/filters/svgEnableBackground.svg0000644000175000017500000002052413063003310024565 0ustar mans0954mans0954 enable-background Test on< svg> Enable-Background Test on< svg> Left Copied to right Right is transparent Blobs opaquely merged w/ oval Copy of middle of first row (by setting enable-background bounds) batik-1.9.orig/samples/tests/spec/filters/feMorphology.svg0000644000175000017500000001215413063003310023331 0ustar mans0954mans0954 Filter Effect: feMorphology Filter Effect: feMorphology type=erode radius=1 type=erode radius=2 type=dilate radius=1 type=dilate radius=3 batik-1.9.orig/samples/tests/spec/filters/filterRegions.svg0000644000175000017500000006210713063003310023476 0ustar mans0954mans0954 FilterRegions test Filter Regions filterRegion_0 filterRegion_1 filterRegion_2 filterRegion_3 filterRegion_4 filterRegion_5 filterRegion_6 filterRegion_2_0 filterRegion_2_1 filterRegion_2_2 filterRegion_2_3 filterRegion_2_4 filterRegion_2_5 filterRegion_3_1 filterRegion_3_0 filterRegion_3_2 filterRegion_3_3 batik-1.9.orig/samples/tests/spec/filters/feColorMatrix.svg0000644000175000017500000001513213063003311023435 0ustar mans0954mans0954 Filter Effect: feColorMatrix Filter Effect: feColorMatrix Reference Image type=luminanceToAlpha type=hueRotate type=saturate type=matrix (alpha) type=matrix (red) type=matrix (green) type=matrix (blue) batik-1.9.orig/samples/tests/spec/filters/feComponentTransfer.svg0000644000175000017500000002266513063003312024653 0ustar mans0954mans0954 Filter Effect: feComponentTransfer Filter Effect: feComponentTransfer Reference Image type=linear Red channel. Alpha 1. type=linear Red channel. Alpha 1. type=linear Blue channel. Alpha 1. type=linear Alpha Channel. type=linear 50% gray type=linear Brighten type=linear Darken type=linear Offset batik-1.9.orig/samples/tests/spec/filters/feImage.svg0000644000175000017500000001121513063003312022213 0ustar mans0954mans0954 feImage Test feImage Test 1.1 Reference local element 1.2 Reference external SVG file 1.3 Reference external SVG element batik-1.9.orig/samples/tests/spec/painting/0000755000175000017500000000000013153020772020307 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/painting/image-rendering.svg0000644000175000017500000000563513063003311024064 0ustar mans0954mans0954 Test the 'text-rendering' property Test the 'image-rendering' property auto optimizeSpeed optimizeQuality batik-1.9.orig/samples/tests/spec/painting/markersPreserveAspectRatio.svg0000644000175000017500000006220513063003311026342 0ustar mans0954mans0954 Marker Test Markers, preserveAspectRatio yMin yMid yMax xMin xMid xMax meet slice none none batik-1.9.orig/samples/tests/spec/painting/markersExt.svg0000644000175000017500000002640413063003311023151 0ustar mans0954mans0954 Marker Test Markers on paths with just moves and elliptical arcs Simple test of multiple moves Another test of multiple moves Test of rotated arcs Test of arcs 2 Test of arcs 3 Test of arcs 4 Test of arcs 5 batik-1.9.orig/samples/tests/spec/painting/markersOrientB.svg0000644000175000017500000001770713063003312023762 0ustar mans0954mans0954 Marker Test Markers, Orient 2/2 Middle w/quadTo Middle w/ cubicTo Middle w/ close batik-1.9.orig/samples/tests/spec/painting/text-rendering.svg0000644000175000017500000000674013063003312023765 0ustar mans0954mans0954 Test the 'text-rendering' property Test the 'text-rendering' property Batik Batik Batik Batik Batik Batik Batik Batik auto optimizeSpeed optimizeLegibility geometricPrecision batik-1.9.orig/samples/tests/spec/painting/display.svg0000644000175000017500000001724013063003311022467 0ustar mans0954mans0954 Test 'display' property Test 'display' property display:inherit display:inline display:none <rect> <g> <clipPath> <mask> batik-1.9.orig/samples/tests/spec/painting/markersOrientA.svg0000644000175000017500000002635013063003312023753 0ustar mans0954mans0954 Marker Test Markers, Orient 1/2 moveTo lineTo quadTo cubicTo close start/end Middle w/ moveTo Middle w/ lineTo batik-1.9.orig/samples/tests/spec/painting/markersShapes.svg0000644000175000017500000001665013063003311023636 0ustar mans0954mans0954 Marker Test Markers, Shape Test <path> <line> <polyline> <polygon> batik-1.9.orig/samples/tests/spec/painting/markersMisc.svg0000644000175000017500000002704513063003312023307 0ustar mans0954mans0954 Marker Test Markers, Ref Point, Overflow markerUnits & viewBox Various values for refX/refY start, middle and end overflow="hidden" overflow="visible" Various values for the overflow property Various values for the viewBox property markerUnits="strokeWidth" markerUnits="userSpaceOnUse" Various values for the markerUnits property batik-1.9.orig/samples/tests/spec/painting/stroke-rendering.svg0000644000175000017500000000632313063003311024304 0ustar mans0954mans0954 Test the 'shape-rendering' property Test the 'stroke-dashoffset' property stroke-width='0' stroke-dasharray="10,10" stroke-dashoffset="-15" stroke-dashoffset="-25" stroke-dashoffset="25" batik-1.9.orig/samples/tests/spec/painting/visibility.svg0000644000175000017500000001633513063003311023215 0ustar mans0954mans0954 Test 'visibility' property inheritance Test 'visibility' property inheritance inherit | inherit | inherit <g> inherit inherit | inherit | inherit <g> hidden inherit | hidden | visible <g> inherit inherit | hidden | visible <g> visible inherit | hidden | visible <g> collapse inherit | hidden | visible <g> hidden batik-1.9.orig/samples/tests/spec/painting/bboxOnText.svg0000644000175000017500000000472313063003312023121 0ustar mans0954mans0954 ObjectBounding box on TextNode ObjectBoundingBox batik-1.9.orig/samples/tests/spec/painting/shape-rendering.svg0000644000175000017500000000561513063003312024101 0ustar mans0954mans0954 Test the 'shape-rendering' property Test the 'shape-rendering' property auto optimizeSpeed crispEdges geometricPrecision batik-1.9.orig/samples/tests/spec/painting/text-rendering2.svg0000644000175000017500000001034013063003311024035 0ustar mans0954mans0954 Test the 'text-rendering' property Test the 'text-rendering' property (Using SVG font) BATIK BATIK BATIK BATIK auto optimizeSpeed optimizeLegibility geometricPrecision batik-1.9.orig/samples/tests/spec/linking/0000755000175000017500000000000013153020772020131 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/linking/pointerEvents.svg0000644000175000017500000002775513063003312023526 0ustar mans0954mans0954 Pointer Events Test 'pointer-events' Test Click in any of the links in the table. You should see a smilley. Return to test visiblePainted visibleFill visibleStroke visible painted fill stroke all none batik-1.9.orig/samples/tests/spec/linking/pointerEvents2.svg0000644000175000017500000002565613063003312023606 0ustar mans0954mans0954 Pointer Events Test 'pointer-events' Test Click in any of the links in the table. You should see a smilley. Return to test visiblePainted visibleFill visibleStroke visible painted fill stroke all none Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik Batik batik-1.9.orig/samples/tests/spec/linking/linkingTransform.svg0000644000175000017500000000601013063003312024165 0ustar mans0954mans0954 Linking and transform test Linking and transform test batik-1.9.orig/samples/tests/spec/linking/anchor.svg0000644000175000017500000007634213063003312022127 0ustar mans0954mans0954 Anchor (<a/>) Test Anchor (<a>) TestClick in any of the links in the table. You should see a smilley. Return to test Return to test Link preventDefault inside a preventDefault outside a mouseover prvtDflt click prvtDflt <rect> <circle> <ellipse> <line> <polyline> <polygon> <path> <image> <image> <text> Ho, la, la! Ho, la, la! Ho, la, la! Ho, la, la! Ho, la, la! <use> <g> Element with two 'a' elems batik-1.9.orig/samples/tests/spec/linking/anchorInsideText.svg0000644000175000017500000001331213063003312024114 0ustar mans0954mans0954 test anchor inside text Click in any of the links in the table. You should see a smilley. Return to test Return to test Return to test Return to test This is simple text under the text element and here is a simple tspan and some more with nested tspan and more... This is text with transform and here is a simple tspan and some more with nested tspan and more... This is simple text on a path with nested tspan and dy attributes all with different links. Only the crimson tspan has an anchor batik-1.9.orig/samples/tests/spec/linking/linkingViewBox.svg0000644000175000017500000000703613063003314023610 0ustar mans0954mans0954 Linking and viewBox test Linking and viewBox test Click here to start... Go to 'orange' Go to 'gold' Go to 'grey' Back to 'crimson' batik-1.9.orig/samples/tests/spec/coordinates/0000755000175000017500000000000013153020772021010 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/coordinates/percentagesAndUnits.svg0000644000175000017500000001464313063003312025476 0ustar mans0954mans0954 Test percentages and units Test percentages and units px % mm TopLevel px % mm Viewport in px px % mm Viewport in % px % mm Viewport in mm batik-1.9.orig/samples/tests/spec/coordinates/em.svg0000644000175000017500000000772013063003312022127 0ustar mans0954mans0954 Test 'em' units Test 'em' units width: 300 width: 30em / font-size: 10 width: 60em / font-size: 5 width: 30em / font-size: 10px width: 60em / font-size: 5px width: 30em / font-size: 5em / parent font-size: 2 width: 30em / font-size: 5em / parent font-size: 2px width: 30em / font-size: 7.5pt (96dpi) width: 30em / font-size: 2em / parent font-size: 3.75pt (96dpi) batik-1.9.orig/samples/tests/spec/paints/0000755000175000017500000000000013153020772017774 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/paints/linearGradientLine.svg0000644000175000017500000001017213063003316024251 0ustar mans0954mans0954 Linear gradient on lines Linear gradient on lines hGradient vGradient hvGradient horizontal <line> vertical <Line> batik-1.9.orig/samples/tests/spec/paints/patternRegions.svg0000644000175000017500000003017513063003314023520 0ustar mans0954mans0954 Pattern Tests patternUnits / patternContentUnits pattern viewBox #pattern1 patternUnits=default contentUnits=default no viewbox #pattern2 patternUnits=objectBoundingBox contentUnits=default #pattern3 patternUnits=userSpaceOnUse contentUnits=default overflow=visible #pattern4 patternUnits=default contentUnits=objectBoundingBox overflow=visible #pattern5 patternUnits=objectBoundingBox contentUnits=objectBoundingBox #pattern6 patternUnits=userSpaceOnUse contentUnits=objectBoundingBox #pattern7 patternUnits=userSpaceOnUse contentUnits=objectBoundingBox viewBox preserveAspectRatio=none #pattern8 same as pattern#7 with preserveAspectRatio=xMinYmin meet #pattern9 preserveAspectRatio=xMinYmin slice overflow=visible batik-1.9.orig/samples/tests/spec/paints/patternRegionB.svg0000644000175000017500000003056113063003316023440 0ustar mans0954mans0954 Pattern Region Test, B patternRegion, x, y, width, height, viewBox Pattern (4 times actual size) Exact Fit in patternRegion pattern content offset to the right pattern content offset to the bottom pattern content offset to the bottom/right Exact Fit in patternRegion pattern content X stretch pattern content Y stretch pattern content X/Y stretch batik-1.9.orig/samples/tests/spec/paints/radialGradient.svg0000644000175000017500000002224613063003312023424 0ustar mans0954mans0954 <radialGradient> Test 1 (Simple) <radialGradient> Test 1 (Simple) Q A S Defaults Forced Defaults userSpaceOnUse (cx,cy) = (0%, 100%) (cx,cy) = (75%, 25%) (fx,fy)=(60%,40%) (fx,fy)=(0%,50%) (fx,fy)=(0%,0%) r=.125, spread=default r=.125, spread=reflect r=.125, spread=repeat translate(.5,.5) (cx,cy)=(0%,0%) translate(.5,.5) scale(1.5,.25) (fx,fy)=(0,0) scale(.5, .5) (fx,fy)=(cx, cy)=(0%, 100%) batik-1.9.orig/samples/tests/spec/paints/gradientLimit.svg0000644000175000017500000001574413063003316023317 0ustar mans0954mans0954 Limit test on Gradients Gradient Limit Test Close Offsets on linearGradient The last two offsets of this linearGradient are very close (0.000001) to one-another Two close offsets <linearGradient> Close Offsets on linearGradient The last two offsets of this linearGradient are very close (0.00000001) to one-another, with a difference below the single precision floating point Two very close offsets <linearGradient> Close Offsets on radialGradient The last two offsets of this radialGradient are very close (0.000001) to one-another Two close offsets <radialGradient> Close Offsets on radialGradient The last two offsets of this radialGradient are very close (0.00000001) to one-another Two very close offsets <radialGradient> Close control points on linearGradient The y coordinates on the gradient are close (0.00000001) to one-another Close control points <linearGradient> Small radius on radialGradient The radialGradient has a very small (0.00000001) radius Small Radius <radialGradient> batik-1.9.orig/samples/tests/spec/paints/patternRegionA.svg0000644000175000017500000002553513063003314023442 0ustar mans0954mans0954 Pattern Region Test, A patternRegion, x, y, width, height Pattern (4 times actual size) Exact Fit in patternRegion patternRegion offset to the left patternRegion offset to the top patternRegion offset to the top/left patternRegion wider than content patternRegion higher than content patternRegion higher than content batik-1.9.orig/samples/tests/spec/paints/patternPreserveAspectRatioA.svg0000644000175000017500000005317513063003314026152 0ustar mans0954mans0954 Pattern Region Test, B patterns, preserveAspectRatio yMin yMid yMax xMin xMid xMax meet slice none none batik-1.9.orig/samples/tests/spec/paints/radialGradientOrientation.svg0000644000175000017500000001476113063003312025643 0ustar mans0954mans0954 Radial Gradient Orientation Radial Gradient Orientation cx = cy / fx < fy cx = cy / fx > fy cx = cy / fx = fy cx < cy / fx < fy cx < cy / fx > fy cx < cy / fx = fy cx > cy / fx < fy cx > cy / fx > fy cx > cy / fx = fy r = 0 batik-1.9.orig/samples/tests/spec/paints/radialGradient3.svg0000644000175000017500000002255213063003314023511 0ustar mans0954mans0954 <radialGradient> Test 3 (Complex lookup) <radialGradient> Test 3 (Complex lookup) Q A S Defaults Forced Defaults userSpaceOnUse (cx,cy) = (0%, 100%) (cx,cy) = (75%, 25%) (fx,fy)=(60%,40%) (fx,fy)=(0%,50%) (fx,fy)=(0%,0%) r=.125, spread=default r=.125, spread=reflect r=.125, spread=repeat translate(.5,.5) (cx,cy)=(0%,0%) translate(.5,.5) scale(1.5,.25) (fx,fy)=(0,0) scale(.5, .5) (fx,fy)=(cx, cy)=(0%, 100%) batik-1.9.orig/samples/tests/spec/paints/externalPaints.svg0000644000175000017500000001111713063003314023510 0ustar mans0954mans0954 Test external paint servers External Paint Servers This file is using the defs.svg file to get the external resources Linear Gradient Radial Gradient Pattern Simple Reference Inheritance Ext. Inheritance batik-1.9.orig/samples/tests/spec/paints/gradientPoint.svg0000644000175000017500000001311313063003316023316 0ustar mans0954mans0954 Gradients on Points Gradients on Points hLinGrad vLinGrad hvLinGrad radGrad No Scale Scale Up Scale Down batik-1.9.orig/samples/tests/spec/paints/linearGradientRepeat.svg0000644000175000017500000001450613063003314024605 0ustar mans0954mans0954 <linearGradient> Repeat Test <linearGradient> Repeat Test Q A S Right Up Right Up Up Left Left Down Left Down Down Right batik-1.9.orig/samples/tests/spec/paints/linearGradientOrientation.svg0000644000175000017500000001474013063003314025660 0ustar mans0954mans0954 Linear Gradient Orientation Linear Gradient Orientation x1 < x2 / y1 = y2 x1 > x2 / y1 = y2 x1 = x2 / y1 < y2 x1 = x2 / y1 > y2 x1 < x2 / y1 < y2 x1 < x2 / y1 > y2 x1 > x2 / y1 < y2 x1 > x2 / y1 > y2 x1 = x2 = y1 = y2 batik-1.9.orig/samples/tests/spec/paints/radialGradientLine.svg0000644000175000017500000000612513063003312024232 0ustar mans0954mans0954 Radial gradient on lines Radial gradient on lines Gradient horizontal <line> vertical <Line> batik-1.9.orig/samples/tests/spec/paints/radialGradient2.svg0000644000175000017500000002254013063003314023505 0ustar mans0954mans0954 <radialGradient> Test 2 (Discontinuity) <radialGradient> Test 2 (Discontinuity) Q A S Defaults Forced Defaults userSpaceOnUse (cx,cy) = (0%, 100%) (cx,cy) = (75%, 25%) (fx,fy)=(60%,40%) (fx,fy)=(0%,50%) (fx,fy)=(0%,0%) r=.125, spread=default r=.125, spread=reflect r=.125, spread=repeat translate(.5,.5) (cx,cy)=(0%,0%) translate(.5,.5) scale(1.5,.25) (fx,fy)=(0,0) scale(.5, .5) (fx,fy)=(cx, cy)=(0%, 100%) batik-1.9.orig/samples/tests/spec/masking/0000755000175000017500000000000013153020772020127 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/masking/clipTransform.svg0000644000175000017500000000663213063003311023470 0ustar mans0954mans0954 Clip Transform Test Clip Transform Test transform on <clipPath> transform on <clipPath>'s children batik-1.9.orig/samples/tests/spec/masking/clip.svg0000644000175000017500000002451313063003311021572 0ustar mans0954mans0954 Clip Test Clip Test clip_1_1 clip_1_2 clip_1_2 clip_2_1 clip_2_2 clip_2_3 clip_3_1 clip_3_2 clip_3_2 batik-1.9.orig/samples/tests/spec/masking/clipQuality.svg0000644000175000017500000002525513063003312023150 0ustar mans0954mans0954 Clip Test (geometricPrecision) Clip Test (geometricPrecision) clip_1_1 clip_1_2 clip_1_2 clip_2_1 clip_2_2 clip_2_3 clip_3_1 clip_3_2 clip_3_2 batik-1.9.orig/samples/tests/spec/masking/maskRegions.svg0000644000175000017500000001421713063003312023126 0ustar mans0954mans0954 Mask Mask Regions Masked Mask 1 Mask 2 Mask 3 Mask 4 batik-1.9.orig/samples/tests/spec/scripting/0000755000175000017500000000000013153020772020500 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/scripting/security.svg0000644000175000017500000001710513063003315023066 0ustar mans0954mans0954 Check Security Settings on Load ECMA Script Security Check Test Result Security Check Type Run Test not run batik-1.9.orig/samples/tests/spec/scripting/memoryLeak1.svg0000644000175000017500000000664113063003315023410 0ustar mans0954mans0954 Simple Text Simple Text Simple Text Some Complex Text Some Complex Text Some Complex Text batik-1.9.orig/samples/tests/spec/scripting/resourceDocDynamic12.svg0000644000175000017500000000306313063003315025142 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/text_children3.svg0000644000175000017500000001411013063003315024127 0ustar mans0954mans0954 brown <text> children 'onload' <text> children in 'onload' the quick fox the quick fox the quick fox the quick brown fox the quick fox the quick brownfox the quick brown fox the quick fox the quick brown fox the quick fox the quick fox the quick fox insert nodes ( <tspan>,<tref>,<textPath> ) remove nodes ( <tspan>,<tref>,<textPath> ) batik-1.9.orig/samples/tests/spec/scripting/polygon_points2.svg0000644000175000017500000001767513063003316024401 0ustar mans0954mans0954 <polygon> attributes 'onload' <polygon> getPoints() in 'onload' points provider polygon with insertItemBefore inserted point replaceItem replaced point initialize/appendItem intialized point appended point new Polygon polygon with batik-1.9.orig/samples/tests/spec/scripting/remove.svg0000644000175000017500000000645113063003321022513 0ustar mans0954mans0954 removeChild test 'onload' removeChild test 'onload' batik-1.9.orig/samples/tests/spec/scripting/paintType.svg0000644000175000017500000001332113063003315023170 0ustar mans0954mans0954 Test of paintType DOM interface Test of paintType DOM interface batik-1.9.orig/samples/tests/spec/scripting/text_children1.svg0000644000175000017500000001146413063003315024136 0ustar mans0954mans0954 <text> children 'onload' <text> children in 'onload' the quick brown fox the quick brown fox the quick brown fox the quick brown fox the quick brown fox the quick brown fox insert nodes ( TEXT_NODE and CDATA_SECTION_NODE ) remove nodes ( TEXT_NODE and CDATA_SECTION_NODE ) batik-1.9.orig/samples/tests/spec/scripting/svgFontMove.svg0000644000175000017500000000502613063003320023467 0ustar mans0954mans0954 Testing script updates of SVG Font text. Testing script updates of SVG Font text. SVG Font Text batik-1.9.orig/samples/tests/spec/scripting/tspan_children2.svg0000644000175000017500000001030313063003320024263 0ustar mans0954mans0954 <tspan> children updates 'onload' <tspan> children in 'onload' append at delete any words insert words replace a sentence append at the end delete words insert between words replace a string TEXT_NODE.append TEXT_NODE.delete TEXT_NODE.insert TEXT_NODE.replace batik-1.9.orig/samples/tests/spec/scripting/security3Include.svg0000644000175000017500000000351113063003314024450 0ustar mans0954mans0954 I was included with success batik-1.9.orig/samples/tests/spec/scripting/svg2.svg0000644000175000017500000000513413063003314022076 0ustar mans0954mans0954 svg viewport modification 'onclick' svg viewport modification 'onclick' Done batik-1.9.orig/samples/tests/spec/scripting/currentScaleTranslate.svg0000644000175000017500000001100513063003320025514 0ustar mans0954mans0954 svg current scale/translate modification test test test test test test test batik-1.9.orig/samples/tests/spec/scripting/text_children2.svg0000644000175000017500000001010313063003315024124 0ustar mans0954mans0954 <text> children updates 'onload' <text> children in 'onload' append at delete any words insert words replace a sentence append at the end delete words insert between words replace a string TEXT_NODE.append TEXT_NODE.delete TEXT_NODE.insert TEXT_NODE.replace batik-1.9.orig/samples/tests/spec/scripting/primaryDoc.svg0000644000175000017500000000524413063003315023331 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/text_ylist2.svg0000644000175000017500000001474013063003320023507 0ustar mans0954mans0954 <text> y attribute 'onload' SVGLengthList <text> getY() in 'onload' getNumberOfItems text with insertItemBefore inserted point replaceItem replaced point removeItem intialized point appended point batik-1.9.orig/samples/tests/spec/scripting/trefProperties.svg0000644000175000017500000000721113063003314024230 0ustar mans0954mans0954 <tref> CSS properties on 'onload' <tref> CSS properties on 'onload' font-family:Arial font-size:32 fill:crimson stroke:orange; font-size:18 text-anchor:start text-anchor:middle text-anchor:end font-weight:bold font-style:italic letter-spacing:10 batik-1.9.orig/samples/tests/spec/scripting/addDescOnClick.svg0000644000175000017500000001477013063003314024015 0ustar mans0954mans0954 Add Desc element "onClick" Add Desc element "onClick" Pre Existing Title Pre Existing Desc Pre Existing Title Pre-existing Desc Pre Existing Title A constant Desc Pre-existing Desc A constant title Pre Existing TitleText 2 Title 1Pre-existing Desc Pre Existing TitleText 2 Title 1Pre-existing Desc batik-1.9.orig/samples/tests/spec/scripting/imagesvg.svg0000644000175000017500000001553113063003321023017 0ustar mans0954mans0954 update on <image> <image> tests (preserveAspectRatio) xMin* meet xMid* meet xMax* meet *YMin meet *YMid meet *YMax meet xMin* slice xMid* slice xMax* slice *YMin slice *YMid slice *YMax slice batik-1.9.orig/samples/tests/spec/scripting/removeOnclick.svg0000644000175000017500000000646313063003315024024 0ustar mans0954mans0954 removeChild test 'onload' removeChild test 'onclick' batik-1.9.orig/samples/tests/spec/scripting/add.svg0000644000175000017500000000624113063003315021746 0ustar mans0954mans0954 appendChild test 'onload' appendChild test 'onload' constructed using 'onload' reference batik-1.9.orig/samples/tests/spec/scripting/modalEventTest.svg0000644000175000017500000001042713063003320024151 0ustar mans0954mans0954 Modal Event Test Modal Event Test Test 1: Press mousedown on circle, move out, release Test 2: Press mousedown out of circle, move in, release Test 3: Press mousedown out of circle, move through, release Hit the clear button between tests mousedown mouseup Clear batik-1.9.orig/samples/tests/spec/scripting/xyModifOnLoad.svg0000644000175000017500000000605413063003315023734 0ustar mans0954mans0954 <rect> x modification in 'onload' <rect> x modification in 'onload' <rect> position before onload <rect> position after onload The modified rectangle is orange and should show on the right batik-1.9.orig/samples/tests/spec/scripting/setProperty.svg0000644000175000017500000000552313063003316023561 0ustar mans0954mans0954 Testing CSS DOM with setProperty. Setting CSS properties through CSS DOM Setting CSS properties through CSS DOM batik-1.9.orig/samples/tests/spec/scripting/intersectionList.svg0000644000175000017500000004160413063003320024556 0ustar mans0954mans0954 Test of getIntersectionList interface Test of getIntersectionList interface This is a test of text intersection batik-1.9.orig/samples/tests/spec/scripting/tspan.svg0000644000175000017500000001106513063003315022343 0ustar mans0954mans0954 <tspan> attributes 'onload' <tspan> attributes in 'onload' EXAMPLE1 EXAMPLE2 EXAMPLE3 EXAMPLE4 EXAMPLE5 EXAMPLE6 EXAMPLE1 EXAMPLE2 EXAMPLE3 EXAMPLE4 EXAMPLE5 EXAMPLE6 x, y dx, dy rotate x, y ( list ) dx, dy ( list ) rotate ( list ) batik-1.9.orig/samples/tests/spec/scripting/fill.svg0000644000175000017500000000442513063003315022146 0ustar mans0954mans0954 fill property on 'onload' 'fill property on 'onload' batik-1.9.orig/samples/tests/spec/scripting/visibilityOnClick.svg0000644000175000017500000001374113063003314024652 0ustar mans0954mans0954 'visibility' property on 'onclick 'visibility' property on 'onclick' Click on the Click Target (crimson circle) to toggle visibility on elements. batik-1.9.orig/samples/tests/spec/scripting/nestedsvg.svg0000644000175000017500000000400013063003315023207 0ustar mans0954mans0954 nested svg element batik-1.9.orig/samples/tests/spec/scripting/display.svg0000644000175000017500000001074413063003320022662 0ustar mans0954mans0954 'display' property on 'onload' 'display' property on 'onload' batik-1.9.orig/samples/tests/spec/scripting/tspanProperties.svg0000644000175000017500000000626013063003316024422 0ustar mans0954mans0954 <tspan> CSS properties on 'onload' <tspan> CSS properties on 'onload' font-family:Arial font-size:32 fill:crimson stroke:orange; font-size:18 text-anchor:start text-anchor:middle text-anchor:end font-weight:bold font-style:italic letter-spacing:10 batik-1.9.orig/samples/tests/spec/scripting/markerUpdateRef.svg0000644000175000017500000000730613063003315024302 0ustar mans0954mans0954 Marker with geometry updates Marker with geometry updates strokeWidth userSpaceOnUse <marker> batik-1.9.orig/samples/tests/spec/scripting/path_pathSegList1.svg0000644000175000017500000003032413063003314024540 0ustar mans0954mans0954 <path> getPathSegList 'onload' <path> getPathSegList() in 'onload' getNumberOfItems path with clear path with getItem Item 1: insertItemBefore inserted seg replaceItem replaced seg removeItem Item removed : initialize/appendItem intialized seg appended seg setAttribute before after setAttribute2 segment 1 before segment 1 after batik-1.9.orig/samples/tests/spec/scripting/text_content.svg0000644000175000017500000003541013063003320023730 0ustar mans0954mans0954 Text content interface test. Text content interface test Simple Text Using Tspan Tspan Dx/Dy Tspan X/Y Text on a Path Text on a Path Text on a Path glyphRefs: "No Match" phRefs: "No Match 5 valid glyphRefs: "No Match" 2 altGlyphItems, both invalid: "No Match" 2 altGlyphItems, 2nd valid: "No Match" 5 glyphRefs, dx/dy/rotate: "No Match" ligature ABCDE ligature ABCDE ligature ABC ligature ABCDE batik-1.9.orig/samples/tests/spec/scripting/polyline_points2.svg0000644000175000017500000001773413063003314024537 0ustar mans0954mans0954 <polyline> attributes 'onload' <polyline> getPoints() in 'onload' points provider polyline with insertItemBefore inserted point replaceItem replaced point initialize/appendItem intialized point appended point new Polyline polyline with batik-1.9.orig/samples/tests/spec/scripting/resourceDocStatic12.svg0000644000175000017500000000274013063003316025007 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/suspendRedraw.svg0000644000175000017500000001642713063003314024052 0ustar mans0954mans0954 <rect> fill modification with redraw suspended. <rect> fill modification with redraw suspended. suspendRedraw(2000) unsuspendRedraw(id) @2s unsuspendRedrawAll() @2s suspendRedraw 1000, 2000 suspendRedraw 3000, 4000 unsuspendAll @2s suspendRedraw 2000, 4000 unsuspend 1st @1s unsuspend 2nd @2s suspendRedraw 4000, 2000 unsuspend 1st @2s unsuspend 2nd @1s suspendRedraw 1000, 2000 unsuspend 1st @ .5s suspendRedraw 3000, 2000 unsuspend 1st @ 1.5s suspendRedraw 4000, 1000 unsuspend 1st @ 2s suspendRedraw 2000, 1000 unsuspend 2nd @ .5s suspendRedraw 2000, 3000 unsuspend 2nd @ 1.5s suspendRedraw 1000, 4000 unsuspend 2nd @ 2s Click on the Rectangles one at a time. The rectangles should change color ~2sec after you click --> batik-1.9.orig/samples/tests/spec/scripting/viewBoxOnLoad.svg0000644000175000017500000000466413063003321023742 0ustar mans0954mans0954 'viewBox' modification in 'onload' viewBox modification in 'onload' No red should show batik-1.9.orig/samples/tests/spec/scripting/xyModifOnClick.svg0000644000175000017500000000676313063003320024105 0ustar mans0954mans0954 <rect> x modification in 'onclick' <rect> x modification in 'onclick' Position A Position B Click on the Position A or Position B target (crimson circle) to move the rectangle to a new position batik-1.9.orig/samples/tests/spec/scripting/gradientsUpdateRef.svg0000644000175000017500000001076013063003314024776 0ustar mans0954mans0954 Gradients with geometry updates Gradients with geometry updates objectBoundingBox userSpaceOnUse <linearGradient> <radialGradient> batik-1.9.orig/samples/tests/spec/scripting/textcontent/0000755000175000017500000000000013153020772023057 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/scripting/textcontent/numberOfChars.svg0000644000175000017500000002704113063003321026331 0ustar mans0954mans0954 number of chars no text selected no text selected no text selected textOnPath textStyles verticalText textLayout textEffect3 fontAltGlyph fontAltGlyph2 fontAltGlyph3 BatikFont fontDecorations fontOnPath fontGlyphsBoth batik-1.9.orig/samples/tests/spec/scripting/textcontent/missing-glpyh.svg0000644000175000017500000003403413063003316026371 0ustar mans0954mans0954 Missing Glyph Missing Glyphs aᨊbᨊcᨊdᨊeᨊfᨊgᨊ aᨊbᨊcᨊdᨊeᨊfᨊgᨊ ᨊabcdefg batik-1.9.orig/samples/tests/spec/scripting/gradientsUpdate.svg0000644000175000017500000001234413063003315024342 0ustar mans0954mans0954 Gradients with geometry updates Gradients with geometry updates (click on all shapes and see gradientsUpdateRef.svg) objectBoundingBox userSpaceOnUse <linearGradient> <radialGradient> Done batik-1.9.orig/samples/tests/spec/scripting/normalizedPathTest.svg0000644000175000017500000000555613063003316025050 0ustar mans0954mans0954 Normalized Path Test Normalized Path Test batik-1.9.orig/samples/tests/spec/scripting/textProperties.svg0000644000175000017500000000557613063003320024265 0ustar mans0954mans0954 text CSS properties on 'onload' text CSS properties on 'onload' font-family:Arial font-size:32 fill:crimson stroke:orange; font-size:18 text-anchor:start text-anchor:middle text-anchor:end font-weight:bold font-style:italic letter-spacing:10 batik-1.9.orig/samples/tests/spec/scripting/text_dylist1.svg0000644000175000017500000002655513063003314023664 0ustar mans0954mans0954 <text> dy attribute 'onload' SVGLengthList <text> getDy() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with clear SVGLengthList SVGLengthList text with getItem SVGLengthList SVGLengthList first point insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList removed point initialize/appendItem SVGLengthList SVGLengthList intialized point appended point setAttribute SVGLengthList SVGLengthList before after setAttribute2 SVGLengthList SVGLengthList point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/line.svg0000644000175000017500000000610313063003315022142 0ustar mans0954mans0954 <line> attributes 'onload' <line> attributes in 'onload' x1, y1, x2, y2 x1, y1, x2, y2 (units and %) batik-1.9.orig/samples/tests/spec/scripting/svg.svg0000644000175000017500000000541413063003320022012 0ustar mans0954mans0954 svg viewport modification 'onclick' svg viewport modification 'onclick' Done batik-1.9.orig/samples/tests/spec/scripting/textAllProperties.svg0000644000175000017500000002460513063003316024715 0ustar mans0954mans0954 <tspan> attributes 'onload' <group> attributes in 'onload' <text> attributes in 'onload' <tspan> attributes in 'onload' <tref> attributes in 'onload' <textPath> attributes in 'onload' fox the quick brown <tref> tests <tspan> tests <textPath> tests <text> tests <group> tests batik-1.9.orig/samples/tests/spec/scripting/ellipse.svg0000644000175000017500000000553613063003320022655 0ustar mans0954mans0954 <ellipse> attributes 'onload' <ellipse> attributes in 'onload' rx, ry, cx, cy rx, ry, cx, cy rx, ry, cx, cy (units and %) batik-1.9.orig/samples/tests/spec/scripting/polyline_points1.svg0000644000175000017500000002460113063003314024525 0ustar mans0954mans0954 <polyline> attributes 'onload' <polyline> getPoints() in 'onload' getNumberOfItems polyline with clear getItem first point insertItemBefore inserted point replaceItem replaced point removeItem removed point initialize/appendItem intialized point appended point setAttribute before after setAttribute2 point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/rectResizeOnClick.svg0000644000175000017500000000666013063003314024604 0ustar mans0954mans0954 <rect> width & hieght modification in 'onclick' <rect> width & height modification in 'onclick' Position A Click Target Click on the Click Target (crimson circle) to resize the rectangle to fill the viewport. Hiding everything but this text. batik-1.9.orig/samples/tests/spec/scripting/tspan_children1.svg0000644000175000017500000001166013063003315024275 0ustar mans0954mans0954 <tspan> children 'onload' <tspan> children in 'onload' the quick brown fox the quick brown fox the quick brown fox the quick brown fox the quick brown fox the quick brown fox insert nodes ( TEXT_NODE and CDATA_SECTION_NODE ) remove nodes ( TEXT_NODE and CDATA_SECTION_NODE ) batik-1.9.orig/samples/tests/spec/scripting/xAnimOnClick.svg0000644000175000017500000001066313063003315023540 0ustar mans0954mans0954 <rect> x Animation in 'onclick' <rect> x Animation in 'onclick' Position A Position B Click on Play button (green triangle) to start animation Click on Pause button (yellow rects) to stop animation batik-1.9.orig/samples/tests/spec/scripting/text_xlist2.svg0000644000175000017500000001410613063003315023506 0ustar mans0954mans0954 <text> x attribute 'onload' <text> getX() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList intialized point appended point batik-1.9.orig/samples/tests/spec/scripting/eventAttrAdd.svg0000644000175000017500000000734213063003314023605 0ustar mans0954mans0954 Addtion/Modification/Removal of event attributes. Addtion/Modification/Removal of event attributes. Click Rect to start test Event Attr Add Event Attr Modify Event Attr Remove batik-1.9.orig/samples/tests/spec/scripting/transform.svg0000644000175000017500000001027713063003315023235 0ustar mans0954mans0954 transform attribute in 'onload' transform attributes in 'onload' Batik Batik batik-1.9.orig/samples/tests/spec/scripting/removeLast.svg0000644000175000017500000000407013063003315023335 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/use.svg0000644000175000017500000002134413063003315022013 0ustar mans0954mans0954 Update on <use> x/y/transform update on <use> Hi Attribute <use> and ref x y transform xlink:href mutation Run Test Done batik-1.9.orig/samples/tests/spec/scripting/polygon.svg0000644000175000017500000000430713063003320022702 0ustar mans0954mans0954 <polygon> attributes 'onload' <polygon> attributes in 'onload' points batik-1.9.orig/samples/tests/spec/scripting/circle.svg0000644000175000017500000000501413063003315022454 0ustar mans0954mans0954 <circle> attributes 'onload' <circle> attributes in 'onload' cx, cy, r cx, cy, r (units and %) batik-1.9.orig/samples/tests/spec/scripting/pathLength.svg0000644000175000017500000001042313063003315023311 0ustar mans0954mans0954 Test getPathLength and getPointAtLength interfaces Test getPathLength and getPointAtLength interfaces batik-1.9.orig/samples/tests/spec/scripting/textSelection.svg0000644000175000017500000000766413063003315024062 0ustar mans0954mans0954 Multi-line Text Selection with ups and downs Zoom Done batik-1.9.orig/samples/tests/spec/scripting/text_ylist1.svg0000644000175000017500000002671313063003315023515 0ustar mans0954mans0954 <text> y attribute 'onload' SVGLengthList <text> getY() in 'onload' getNumberOfItems text with clear text with getItem first point insertItemBefore inserted point replaceItem replaced point removeItem removed point initialize/appendItem intialized point appended point setAttribute before after setAttribute2 point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/enclosureList2.svg0000644000175000017500000004526313063003315024142 0ustar mans0954mans0954 Test of getEnclosureList interface Test of getEnclosureList interface Painted simple complex Fill simple complex Stroke simple complex All simple complex None simple complex Visible simple complex VisiblePainted simple complex VisibleFill simple complex VisibleStroke simple complex batik-1.9.orig/samples/tests/spec/scripting/text_dxlist2.svg0000644000175000017500000001415313063003316023655 0ustar mans0954mans0954 <text> dx attribute 'onload' <text> getDx() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList intialized point appended point batik-1.9.orig/samples/tests/spec/scripting/text_dxlist1.svg0000644000175000017500000002477413063003316023666 0ustar mans0954mans0954 <text> dx attribute 'onload' <text> getDx() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with clear SVGLengthList SVGLengthList text with getItem SVGLengthList SVGLengthList first point insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList removed point initialize/appendItem SVGLengthList SVGLengthList intialized point appended point setAttribute SVGLengthList SVGLengthList before after setAttribute2 SVGLengthList SVGLengthList point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/rootSizeChange.svg0000644000175000017500000000714013063003315024141 0ustar mans0954mans0954 Testing Update engine when root changes size/location. To ensure proper test results you may need to turn off double buffering and pause the animation and force a repaint, if you see lots of junk then the repaint engine is not working properly. batik-1.9.orig/samples/tests/spec/scripting/alert.svg0000644000175000017500000001065013063003320022320 0ustar mans0954mans0954 Alert on mouse events Alert on mouse events mousedown mouseup mouseover mouseout mousemove onclick batik-1.9.orig/samples/tests/spec/scripting/filterPatternUpdateRef.svg0000644000175000017500000001162613063003314025643 0ustar mans0954mans0954 Filter and pattern with geometry updates Filter and pattern with geometry updates objectBoundingBox userSpaceOnUse <filter> <pattern> batik-1.9.orig/samples/tests/spec/scripting/security3.svg0000644000175000017500000002462413063003315023155 0ustar mans0954mans0954 ECMA Script Secure Access to the Window Object setInterval clearInterval setTimeout clearTimeout parseXML getURL alert confirm prompt eval Done batik-1.9.orig/samples/tests/spec/scripting/image.svg0000644000175000017500000001045513063003316022303 0ustar mans0954mans0954 update on <image> <image> dynamic tests SVG image x,y,width,height update SVG Image : aspectRatio none PNG Image x,y,width,height update PNG Image : aspectRatio none batik-1.9.orig/samples/tests/spec/scripting/textpathProperties.svg0000644000175000017500000001320313063003314025127 0ustar mans0954mans0954 <textPath> CSS properties on 'onload' <textPath> CSS properties on 'onload' font-family:Arial font-size:32 fill:crimson stroke:orange; font-size:18 text-anchor:start text-anchor:middle text-anchor:end font-weight:bold font-style:italic letter-spacing:10 batik-1.9.orig/samples/tests/spec/scripting/transform_create.svg0000644000175000017500000002004013063003316024546 0ustar mans0954mans0954 SVGTransformable.getTransform() 'onload' SVGTransformable.getTransform() in 'onload' translate transform rotate transform skewX transform skewY transform scale transform matrix transform batik-1.9.orig/samples/tests/spec/scripting/visibility.svg0000644000175000017500000001113313063003315023401 0ustar mans0954mans0954 'visibility' property on 'onload' 'visibility' property on 'onload' batik-1.9.orig/samples/tests/spec/scripting/polyline.svg0000644000175000017500000000433313063003315023051 0ustar mans0954mans0954 <polyline> attributes 'onload' <polyline> attributes in 'onload' points batik-1.9.orig/samples/tests/spec/scripting/tspan_children3.svg0000644000175000017500000001164013063003315024275 0ustar mans0954mans0954 brown <tspan> children 'onload' <tspan> children in 'onload' the quick fox the quick fox the quick brown fox the quick fox the quick brown fox the quick fox the quick fox the quick fox insert nodes ( <tspan>,<tref> ) remove nodes ( <tspan>,<tref> ) batik-1.9.orig/samples/tests/spec/scripting/textProperties2.svg0000644000175000017500000002212513063003320024334 0ustar mans0954mans0954 Change! Text Properties Text display and visibility. Visibility on text & tspans Display on text & tspans ---, ---, --- ---, hid, vis ---, hid, hid hid, vis, hid ---, ---, --- ---, ---, --- hid, hid, --- ---, ---, hid ---, ---, vis vis, ---, vis ---, ---, hid hid, ---, --- ---, ---, --- ---, inl, non ---, non, inl ---, non, non non, inl, non ---, non, --- ---, ---, inl ---, inl, --- non, inl, inl inl, ---, --- Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text batik-1.9.orig/samples/tests/spec/scripting/text_dylist2.svg0000644000175000017500000001475313063003315023663 0ustar mans0954mans0954 <text> dy attribute 'onload' SVGLengthList <text> getDy() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList intialized point appended point batik-1.9.orig/samples/tests/spec/scripting/rect.svg0000644000175000017500000000653413063003314022157 0ustar mans0954mans0954 <rect> attributes 'onload' <rect> attributes in 'onload' x, y, width, height x, y, width, height, rx x, y, width, height, rx, ry x, y, width, height, rx, ry (units and %) batik-1.9.orig/samples/tests/spec/scripting/text_xlist1.svg0000644000175000017500000002506413063003320023506 0ustar mans0954mans0954 <text> x attribute 'onload' <text> getX() in 'onload' getNumberOfItems SVGLengthList SVGLengthList text with clear SVGLengthList SVGLengthList text with getItem SVGLengthList SVGLengthList first point insertItemBefore SVGLengthList SVGLengthList inserted point replaceItem SVGLengthList SVGLengthList replaced point removeItem SVGLengthList SVGLengthList removed point initialize/appendItem SVGLengthList SVGLengthList intialized point appended point setAttribute SVGLengthList SVGLengthList before after setAttribute2 SVGLengthList SVGLengthList point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/security2.svg0000644000175000017500000001766113063003315023157 0ustar mans0954mans0954 Check Security Settings on Load Java Jar-file Security Check Test Result Security Check Type Run Test not run batik-1.9.orig/samples/tests/spec/scripting/path_pathSegList_create.svg0000644000175000017500000002251313063003320026000 0ustar mans0954mans0954 <path> attributes 'onload' <path> getPathSegList() in 'onload' MoveTo/LineTo/close MoveTo/HV/close MoveTo/Cubic MoveTo/Quadratic Cubic/CubicSmooth Quadratic/QuadraticSmooth Moveto/Arcto batik-1.9.orig/samples/tests/spec/scripting/enclosureList.svg0000644000175000017500000004314513063003320024051 0ustar mans0954mans0954 Test of getEnclosureList interface Test of getEnclosureList interface This is a test of text encolsure!!! This is a test of text encolsure!!! This is a test of text encolsure!!!! batik-1.9.orig/samples/tests/spec/scripting/transform_create1.svg0000644000175000017500000001770513063003316024645 0ustar mans0954mans0954 SVGTransformable.transform 'onload' SVGTransformable.transform in 'onload' translate transform rotate transform skewX transform skewY transform scale transform matrix transform batik-1.9.orig/samples/tests/spec/scripting/polygon_points1.svg0000644000175000017500000002470213063003315024364 0ustar mans0954mans0954 <polygon> points attribute 'onload' <polygon> getPoints() in 'onload' getNumberOfItems polygon with clear getItem first point insertItemBefore inserted point replaceItem replaced point removeItem removed point initialize/appendItem intialized point appended point setAttribute before after setAttribute2 point 0 before point 0 after batik-1.9.orig/samples/tests/spec/scripting/transform_getTransform1.svg0000644000175000017500000003103613063003320026041 0ustar mans0954mans0954 SVGTransformable.getTransform() 'onload' SVGTransformable.getTransform() in 'onload' getNumberOfItems rect with clear rect with getItem transform 0 insertItemBefore inserted transform replaceItem replaced transform removeItem removed point initialize/appendItem intialized transform appended transform setAttribute before after setAttribute2 transform 0 before transform 0 after batik-1.9.orig/samples/tests/spec/scripting/maskClipUpdate.svg0000644000175000017500000001170413063003314024123 0ustar mans0954mans0954 Clip and mask with geometry updates Clip and mask with geometry updates (click on all shapes and see maskClipUpdateRef.svg) objectBoundingBox userSpaceOnUse <clipPath> <mask> Done batik-1.9.orig/samples/tests/spec/scripting/zeroSize.svg0000644000175000017500000002432213063003315023030 0ustar mans0954mans0954 Resizing zero w/h items 'onload' Resizing zero w/h items 'onload' batik-1.9.orig/samples/tests/spec/scripting/forceRedraw.svg0000644000175000017500000000772113063003315023465 0ustar mans0954mans0954 <rect> moving display updated with forceRedraw() <rect> fill modification with redraw suspended. suspendRedraw 2000 immediate forceRepaint() suspendRedraw 2000 forceRepaint() @1s suspendRedraw 2000 fill='blue' forceRepaint() fill='crimson' Loop on x with forceRepaint batik-1.9.orig/samples/tests/spec/scripting/resourceDocDynamic11.svg0000644000175000017500000000306313063003315025141 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/imageraster.svg0000644000175000017500000001562513063003320023523 0ustar mans0954mans0954 update on <image> <image> tests (preserveAspectRatio) xMin* meet xMid* meet xMax* meet *YMin meet *YMid meet *YMax meet xMin* slice xMid* slice xMax* slice *YMin slice *YMid slice *YMax slice batik-1.9.orig/samples/tests/spec/scripting/markerUpdate.svg0000644000175000017500000001702713063003315023646 0ustar mans0954mans0954 Marker with geometry updates Marker with geometry and property updates. (click on shapes or run button) strokeWidth userspaceuserSpaceOnUse start mid end marker <marker> Run batik-1.9.orig/samples/tests/spec/scripting/domSVGColor.svg0000644000175000017500000001566413063003315023365 0ustar mans0954mans0954 Test DOM SVGColor Interface Test DOM SVGColor Interface Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: Before: After: batik-1.9.orig/samples/tests/spec/scripting/path.svg0000644000175000017500000000425713063003320022153 0ustar mans0954mans0954 <path> attributes 'onload' <path> attributes in 'onload' d batik-1.9.orig/samples/tests/spec/scripting/maskClipUpdateRef.svg0000644000175000017500000001031713063003320024554 0ustar mans0954mans0954 Clip and mask with geometry updates Clip and mask with geometry updates objectBoundingBox userSpaceOnUse <clipPath> <mask> batik-1.9.orig/samples/tests/spec/scripting/imageUpdate.svg0000644000175000017500000001233413063003315023443 0ustar mans0954mans0954 update on <image> <image> dynamic tests SVG image ref,x,y,width,height update SVG Image changed 1 2 Click 1 and 2, the image should change and its size and position Done batik-1.9.orig/samples/tests/spec/scripting/intersectionList2.svg0000644000175000017500000004530213063003316024644 0ustar mans0954mans0954 Test of getIntersectionList interface Test of getIntersectionList interface Painted simple complex Fill simple complex Stroke simple complex All simple complex None simple complex Visible simple complex VisiblePainted simple complex VisibleFill simple complex VisibleStroke simple complex batik-1.9.orig/samples/tests/spec/scripting/getElementById.svg0000644000175000017500000001735313063003315024065 0ustar mans0954mans0954 Test of 'getElementById' method Test of 'getElementById' method Test 1: Test 2: Test 3: Test 4: Test 5: Test 6: Test 7: Test 8: Test 9: Test 10: Test 11: Test 12: Test 13: Test 14: Test 15: Test 16: Test 17: Test 18: Test 19: Test 20: Test 21: Test 22: Test 23: batik-1.9.orig/samples/tests/spec/scripting/filterPatternUpdate.svg0000644000175000017500000001322413063003314025202 0ustar mans0954mans0954 Filter and pattern with geometry updates Filter and pattern with geometry updates (click on all shapes and see filterPatternUpdateRef.svg) objectBoundingBox userSpaceOnUse <filter> <pattern> Done batik-1.9.orig/samples/tests/spec/scripting/styling.svg0000644000175000017500000001214213063003316022705 0ustar mans0954mans0954 Dynamic test of CSS selectors Dynamic test of CSS selectors Click me Do I change? Click Me! Click me Child Text Click me Click me Click me Click me Click Me batik-1.9.orig/samples/tests/spec/scripting/transform_getTransform2.svg0000644000175000017500000001552213063003315026050 0ustar mans0954mans0954 SVGTransformable.getTransform() 'onload' SVGTransformable.getTransform() in 'onload' transform_provider rect with insertItemBefore inserted transform replaceItem replaced transform initialize/appendItem intialized transform appended transform batik-1.9.orig/samples/tests/spec/scripting/path_pathSegList2.svg0000644000175000017500000002000313063003320024527 0ustar mans0954mans0954 <path> getPathSegList 'onload' <path> getPathSegList() in 'onload' segment provider path with insertItemBefore inserted seg replaceItem replaced seg initialize/appendItem intialized seg appended seg new Path path with batik-1.9.orig/samples/tests/spec/scripting/imageRefUpdate.svg0000644000175000017500000001017513063003316024102 0ustar mans0954mans0954 update on <image> <image> dynamic tests SVG image Reference SVG Image changed PNG Image Reference PNG Image changed batik-1.9.orig/samples/tests/spec/scripting/imageRendering.svg0000644000175000017500000000466113063003316024143 0ustar mans0954mans0954 'image-rendering' property test 'image-rendering' property test batik-1.9.orig/samples/tests/spec/scripting/relativeURI.svg0000644000175000017500000002031413063003321023403 0ustar mans0954mans0954 Test of CSS with relative URIs Test of CSS with relative URIs Style Computed fill cursor clip-path color-profile filter marker mask batik-1.9.orig/samples/tests/spec/scripting/resourceDocStatic11.svg0000644000175000017500000000273613063003321025007 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/scripting/bbox.svg0000644000175000017500000004242213063003315022151 0ustar mans0954mans0954 Test getBBox interface Test getBBox interface Normal visiblilty="hidden" display="none" Update none fill stroke fill+stroke none fill stroke fill+stroke none fill stroke fill+stroke none fill+stroke getBBox getBBox getBBox getBBox getBBox getBBox getBBox getBBox getBBox getBBox getBBox getBBox sm sm batik-1.9.orig/samples/tests/spec/scripting/bug12933.svg0000644000175000017500000001072113063003320022367 0ustar mans0954mans0954 UpdateTracker bug#12933 UpdateTracker bug#12933 1 2 Click 1 and 2, the bounding box of <rect> should appear in red Done batik-1.9.orig/samples/tests/spec/scripting/transform2.svg0000644000175000017500000000622113063003315023311 0ustar mans0954mans0954 transform attribute in 'onload' (2) transform attributes in 'onload' (2) batik-1.9.orig/samples/tests/spec/scripting/text.svg0000644000175000017500000001026013063003320022172 0ustar mans0954mans0954 <text> attributes 'onload' <text> attributes in 'onload' EXAMPLE1 EXAMPLE2 EXAMPLE3 EXAMPLE4 EXAMPLE5 EXAMPLE6 EXAMPLE1 EXAMPLE2 EXAMPLE3 EXAMPLE4 EXAMPLE5 EXAMPLE6 x, y dx, dy rotate x, y ( list ) dx, dy ( list ) rotate ( list ) batik-1.9.orig/samples/tests/spec/scripting/boundsTransformChange.svg0000644000175000017500000000530213063003320025503 0ustar mans0954mans0954 Testing Update engine when bounds and transform change. This tests changing the bounds of an object then changing a a parent's transform to ensure the dirty regions are properly computed. Squash the Bug batik-1.9.orig/samples/tests/spec/scripting/javaBinding.svg0000644000175000017500000000633413063003320023431 0ustar mans0954mans0954 Done batik-1.9.orig/samples/tests/spec/structure/0000755000175000017500000000000013153020772020536 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/structure/externalUseCascading.svg0000644000175000017500000000545013063003314025350 0ustar mans0954mans0954 External <use> cascading External <use> cascading This file is using the defs.svg file to get the external resources batik-1.9.orig/samples/tests/spec/structure/svgImageViewBoxClip.svg0000644000175000017500000007141613063003314025137 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on svg <image>clip set to rect(5,4,3,2) meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/xmlBaseStyling.svg0000644000175000017500000001162213063003314024217 0ustar mans0954mans0954 Test xml:base and styling Test xml:base and styling This file is using the defs.svg file to get the external resources xml:base on <style> the base URI is: ../../resources/svg/ xml:base on <g> enclosing the <use> the base URI is: ../../resources/svg/ xml:base on <g> enclosing the <use> the base URI is: ../../resources/svg/defs.svg xml:base on <g> enclosing a <g> the base URI is: ../../resources/svg/ xml:base on enclosed <g> enclosing the <use> the base URI is: defs.svg xml:base on <g> enclosing the <use> the base URI is: ../../resources/svg/ xml:base on the <use> the base URI is: defs.svg batik-1.9.orig/samples/tests/spec/structure/switch.svg0000644000175000017500000000513213063003314022552 0ustar mans0954mans0954 Switch element with transform Switch element with transform batik-1.9.orig/samples/tests/spec/structure/requiredFeatures.svg0000644000175000017500000002023313063003314024567 0ustar mans0954mans0954 Test the 'requiredFeatures' attribute Test the 'requiredFeatures' attribute default org.w3c.svg.static invalid Graphic Obj. <svg> <g> <use> text text text batik-1.9.orig/samples/tests/spec/structure/svgImageViewBoxOverflow.svg0000644000175000017500000006011213063003314026042 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on svg <image>, overflow="visible" meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/rasterImageViewBoxClip.svg0000644000175000017500000007142513063003314025640 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on raster <image> clip set to rect(5,4,3,2) meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/symbolViewBoxClip.svg0000644000175000017500000007746313063003316024714 0ustar mans0954mans0954 <symbol> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on <symbol> viewBox & preserveAspectRatio on <symbol> This test validates the processing of viewBox and preserveAspectRatio on <symbol> elements in conjunction with the overflow property. In this test, there should be a clipping beyond the viewBox boundaries and the smilley's ears and feet should show partially. clip set to rect(5,4,3,2) meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/dataProtocol.svg0000644000175000017500000011270313063003314023707 0ustar mans0954mans0954 Data Protocol dataProtocol test Initial JPEG, encoded as PNG, data protocol Initial PNG, encoded with data protocol batik-1.9.orig/samples/tests/spec/structure/useStylingURI.svg0000644000175000017500000001610113063003314023775 0ustar mans0954mans0954 Test use and styling using URIs <use> and styling using URIs This file is using the defs.svg file to get the external resources - linearGradient defined in this file (local) - radialGradient defined in defs.svg (external) - gold/crimson: gradient on <rect>, white/black: gradient on <use> yellow/green: inherited from <g> Local <use> External <use> internal style on external style on inherited style <rect> <use> <rect> <use> internal external batik-1.9.orig/samples/tests/spec/structure/requiredFeaturesCombo.svg0000644000175000017500000001127213063003314025552 0ustar mans0954mans0954 Test the 'requiredFeatures' attribute combo Test the 'requiredFeatures' attribute combo org.w3c.svg org.w3c.svg.static invalid org.w3c.svg org.w3c.svg.static invalid batik-1.9.orig/samples/tests/spec/structure/xmlBase.svg0000644000175000017500000000536513063003316022656 0ustar mans0954mans0954 XML Base Test Test of xml:base, use and SVG fonts Batik batik-1.9.orig/samples/tests/spec/structure/useMultiple.svg0000644000175000017500000001032213063003316023560 0ustar mans0954mans0954 Multiple <use> Multiple <use> This file is using the defs.svg file to get the external resources <use> External <use> <use> External <use> batik-1.9.orig/samples/tests/spec/structure/rasterImageViewBoxOverflow.svg0000644000175000017500000005746413063003314026563 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on raster <image> with overflow="visible" meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/systemLanguageDialect.svg0000644000175000017500000000462113063003316025533 0ustar mans0954mans0954 Test the 'systemLanguage' attribute with dialect english (en) english UK (en-UK) batik-1.9.orig/samples/tests/spec/structure/tiff.svg0000644000175000017500000000613613063003314022206 0ustar mans0954mans0954 Tiff Reading Test Tiff Reading Test RGB TIFF Uncompressed Tiled RGB TIFF Uncompressed RGB TIFF PackBits Tiled RGB TIFF PackBits batik-1.9.orig/samples/tests/spec/structure/symbolViewBox.svg0000644000175000017500000006431113063003314024066 0ustar mans0954mans0954 <symbol> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on <symbol> meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/useTargets.svg0000644000175000017500000001270413063003314023402 0ustar mans0954mans0954 <use> targets <use> targets This file is using the defs.svg file to get the external resources <use> External <use> Symbol SVG Other batik-1.9.orig/samples/tests/spec/structure/symbolViewBoxOverflow.svg0000644000175000017500000006726513063003316025627 0ustar mans0954mans0954 <symbol> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio viewBox & preserveAspectRatio on <symbol> This test validates the processing of viewBox and preserveAspectRatio on <symbol> elements in conjunction with the overflow property. In this test, there should be no clipping around the viewBox boundaries and the smilley's ears and feet should show. on <symbol>, overflow="visible" meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/image.svg0000644000175000017500000000535213063003314022337 0ustar mans0954mans0954 Image element references an SVG file Image element references an SVG file batik-1.9.orig/samples/tests/spec/structure/toolTips.svg0000644000175000017500000005742513063003314023102 0ustar mans0954mans0954 Marker Test <title>and <desc> tool tips on Graphical Elements No info <title> <desc> both <rect> <rect> with title only <rect> with <desc> only Title: <rect> with title and <desc> Description: <rect> with title and <desc> <circle> <circle> with <title> only <circle> with <desc> only Title: <circle> with <title> and <desc> Description: <circle> with <desc> and <desc> <ellipse> <ellipse> with <title> only <ellipse> with <desc> only Title: <ellipse> with <title> and <desc> Description: <ellipse> with <desc> and <desc> <line> <line> with <title> only <line> with <desc> only Title: <line> with <title> and <desc> Description: <line> with <desc> and <desc> <polyline> <polyline> with <title> only <polyline> with <desc> only Title: <polyline> with <title> and <desc> Description: <polyline> with <desc> and <desc> <polygon> <polygon> with <title> only <polygon> with <desc> only Title: <polygon> with <title> and <desc> Description: <polygon> with <desc> and <desc> <path> <path> with <title> only <path> with <desc> only Title: <path> with <title> and <desc> Description: <path> with <desc> and <desc> <image> <image> with <title> only <image> with <desc> only Title: <image> with <title> and <desc> Description: <image> with <desc> and <desc> <text> Ho, la, la! Ho, la, la! <text> with <title> only Ho, la, la! <text> with <desc> only Ho, la, la! Title: <text> with <title> and <desc> Description: <text> with <desc> and <desc> <use> <use> with <title> only <use> with <desc> only Title: <use> with <title> and <desc> Description: <use> with <desc> and <desc> Orange w/ Tip Orange wo/ Tip Red w/Tip Red wo/Tip Red <rect> with tip Orange <rect> with tip Red <rect> with tip Orange <rect> with tip batik-1.9.orig/samples/tests/spec/structure/useMultipleURI.svg0000644000175000017500000001155713063003316024153 0ustar mans0954mans0954 Multiple <use> with CSS property values: URIs Multiple <use> with CSS property values: URIs This file is using the defs.svg file to get the external resources <use> External <use> <use> External <use> batik-1.9.orig/samples/tests/spec/structure/systemLanguage.svg0000644000175000017500000002070213063003314024241 0ustar mans0954mans0954 Test the 'systemLanguage' attribute default english (en) french (fr) Graphic Obj. <svg> <g> <use> <tspan> text text text simple <tspan> simple <tspan> simple <tspan> batik-1.9.orig/samples/tests/spec/structure/svgImageViewBox.svg0000644000175000017500000005652413063003316024334 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on svg <image> meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/rasterImageViewBox.svg0000644000175000017500000005653213063003314025032 0ustar mans0954mans0954 <image> and viewBox & preserveAspectRatio viewBox & preserveAspectRatio on raster <image> meet slice unspecified yMin yMid yMax yMin yMid yMax yMin yMid yMax xMin xMid xMax none batik-1.9.orig/samples/tests/spec/structure/useTargets2.svg0000644000175000017500000002072213063003314023463 0ustar mans0954mans0954 <use> Targets2 <use> Targets 2 <use> references a <symbol> <use> references a <svg> <use> references with percentages x, y, w, h,transform w, h, transform equivalent svg x, y, w, h,transform w, h, transform equivalent svg referencing svgx, y, w, h% referencing svgw, h% referencing symbolw, h% referencing symbolw, h% batik-1.9.orig/samples/tests/spec/structure/useStyling.svg0000644000175000017500000000572113063003314023423 0ustar mans0954mans0954 Test use and styling using <style> <use> and styling using <style> This file is using the defs.svg file to get the external resources batik-1.9.orig/samples/tests/spec/structure/useStylesheet.svg0000644000175000017500000000560713063003314024126 0ustar mans0954mans0954 Test use and styling using <style> <use> and styling using <style> This file is using the defs.svg file to get the external resources batik-1.9.orig/samples/tests/spec/styling/0000755000175000017500000000000013153020772020167 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/styling/important.svg0000644000175000017500000000616213063003312022721 0ustar mans0954mans0954 Test of CSS !important properties. Test of CSS !important properties. fill: green !important; fill: red fill: red !important; fill: green !important fill="blue" style="fill:green" fill: green !important; fill: red .t3 { fill: yellow; }g > rect { fill: green !important; } .t4 { fill: green !important; }g > g > rect { fill: red !important; } batik-1.9.orig/samples/tests/spec/styling/fontShorthand.svg0000644000175000017500000001054013063003311023517 0ustar mans0954mans0954 Test the CSS 'font' shorthand property Test the CSS 'font' shorthand property default font: 20px Serif font: 20 SanSerif font: 20 times font: bold 20 times font: italic 20 times font: bold italic 20 times font: italic bold 20 times font: 200 20 times font: 700 small-caps 20 times font: small-caps 700 20 times font: small-caps 700 italic 20 times font: 700 small-caps italic 20 times font: small-caps italic 700 20 times font: 200 "bolder" font: 200 bolder font: 200px bolder font: bolder 200 bolder font: italic 20 times group font-weight="bold" font: bold 20 times group font-style="italic" File: menu File: small-caption batik-1.9.orig/samples/tests/spec/styling/defaultFontFamily.svg0000644000175000017500000000224413063003312024316 0ustar mans0954mans0954 Default font-family batik-1.9.orig/samples/tests/spec/styling/cssMedia.svg0000644000175000017500000001345013063003312022432 0ustar mans0954mans0954 CSS Media CSS Media Demonstrate how a slide can be different depending on the CSS media. Choose your media using the 'Edit=>Preference' menu item. You can switch between 'screen', 'print' or 'projection' What is SVG? * Stands for Scalable Vector Graphics * An XML grammar for defining vector-based 2D graphics * W3C Recommendation - 4 Sept. 2001 The specification defines the features and syntax for Scalable Vector Graphics (SVG), a language for describing two-dimensional vector and mixed vector/raster graphics in XML. SVG is a language for describing two-dimensional graphics in XML [XML10]. SVG allows for three types of graphic objects: vector graphic shapes, images and text. This document has been reviewed by W3C Members and other interested parties and has been endorsed by the Director as a W3C Recommendation. It is a stable document and may be used as reference material or cited as a normative reference from another document. batik-1.9.orig/samples/tests/spec/styling/alternateStylesheet.svg0000644000175000017500000001373213063003312024736 0ustar mans0954mans0954 Alternate stylesheets Alternate Stylesheets 2 Choose your alternate stylesheet using the 'View->Use Stylesheet' submenu items. Batik batik-1.9.orig/samples/tests/spec/styling/cssMediaList.svg0000644000175000017500000001100113063003312023254 0ustar mans0954mans0954 CSS Media CSS Media 2 Show which CSS media is taken into account Choose your media using the 'Edit=>Preference' menu item. all aural braille embossed handheld print projection screen tty tv batik-1.9.orig/samples/tests/spec/styling/emptyStyle.svg0000644000175000017500000000213213063003312023054 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/styling/smiley.svg0000644000175000017500000000714113063003312022204 0ustar mans0954mans0954 Alternate stylesheets Alternate Stylesheets Choose your alternate stylesheet using the 'View->Use Stylesheet' submenu items. :-) :-( :-o :-| :-* batik-1.9.orig/samples/tests/spec/styling/styleElement.svg0000644000175000017500000000572713063003312023364 0ustar mans0954mans0954 Test of XML comments in <style> elements Test of XML comments in <style> elements class="blue" class="green" class="purple" class="yellow" batik-1.9.orig/samples/tests/spec/interactivity/0000755000175000017500000000000013153020772021374 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/interactivity/cursor4.svg0000644000175000017500000002152213063003314023511 0ustar mans0954mans0954 Custom Cursor Image Test (cntd) Try and hit the small black dot after selecting your cursor Hit Count : 0 Cursor Selection Current Target Area Cursor Broken Imagedefaults to crosshair Tiff Image PNG Image JPEG Image Unsupported Image (BMP)defaults to crosshair SVG Imagedefaults to crosshair SVG ImageNo viewBox/width/height SVG ImageViewBox, no width/height y SVG ImageViewBox, different aspect ratio batik-1.9.orig/samples/tests/spec/interactivity/cursor.svg0000644000175000017500000002073213063003312023425 0ustar mans0954mans0954 Cursor Property auto crosshair default pointer move text wait help <a> cursor=auto <a> cursor=wait <text> cursor=auto <text> cursor=wait <a>.. <text />.. <a> cursor=auto <a> <text /> <a> cursor=crosshair <text><a/><text> cursor=auto <text><a/><text> cursor=wait e-resize w-resize ne-resize nw-resize n-resize se-resize sw-resize s-resize Bad url, crosshair Good url, wait Bad url, good url, crosshair <use cursor=auto (wait)> <use cursor=crosshair> <image cursor=auto (wait)> <image cursor=crosshair> Done batik-1.9.orig/samples/tests/spec/interactivity/cursorImage.svg0000644000175000017500000000201313063003315024363 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/interactivity/cursor2.svg0000644000175000017500000001513313063003315023511 0ustar mans0954mans0954 Custom Cursor Hot Spot Test Try and hit the small black dot after selecting your cursor Hit Count : 0 Cursor Selection Current Target Area Cursor batik-1.9.orig/samples/tests/spec/interactivity/pointerEvents.svg0000644000175000017500000022754213063003312024765 0ustar mans0954mans0954 Test 'pointer-events' property Test 'pointer-events' property Done Painted Fill Stroke All None Visible VisiblePainted VisibleFill VisibleStroke batik-1.9.orig/samples/tests/spec/interactivity/cursor3.svg0000644000175000017500000001206213063003312023505 0ustar mans0954mans0954 Custom Cursor Image Test Try and hit the small black dot after selecting your cursor Hit Count : 0 Cursor Selection Current Target Area Cursor batik-1.9.orig/samples/tests/spec/interactivity/focus.svg0000644000175000017500000001134613063003314023232 0ustar mans0954mans0954 DOMFocusIn, DOMFocusOut, and DOMActivate test Done batik-1.9.orig/samples/tests/spec/interactivity/cursorImage2.svg0000644000175000017500000000200713063003314024447 0ustar mans0954mans0954 batik-1.9.orig/samples/tests/spec/interactivity/keyEvents.svg0000644000175000017500000001136213063003312024064 0ustar mans0954mans0954 KeyEvents test(type an upper case 'A' on each color) Done batik-1.9.orig/samples/tests/spec/interactivity/keyEvents2.svg0000644000175000017500000003560713063003312024156 0ustar mans0954mans0954 KeyEvents test: DOM_VK_* values Type text over the canvas to see the code of the last key pressed Last key pressed: batik-1.9.orig/samples/tests/spec/text/0000755000175000017500000000000013153020772017462 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/text/textEffect3.svg0000644000175000017500000001400213063003320022352 0ustar mans0954mans0954 Mix text transformation Gradient and filter on text and tspan (Using System font and SVG font) BATIK BATIK BATIK BATIK BATIK BATIK (System font) (SVG font) batik-1.9.orig/samples/tests/spec/text/textDecoration.svg0000644000175000017500000001104113063003320023162 0ustar mans0954mans0954 Text decoration test Text decoration test Underline Overline Line-through Underline Overline Line-through Underline Overline Line-through Underline and overline Underline, overline and line-through Decorations with tspan Transparent text with tspan Tspan with own decoration Tspan with no decoration Nested tspan decorations batik-1.9.orig/samples/tests/spec/text/verticalText.svg0000644000175000017500000001146013063003320022651 0ustar mans0954mans0954 Vertical Text Test Vertical Text Test Writing top to bottom画像 Glyph Orientation:auto画像 Glyph Orientation:0画像 Glyph Orientation:90画像 Glyph Orientation:180画像 Glyph Orientation:270画像 Embedded <tspan> element Embedded orientated element Vertical text on a Path画像 batik-1.9.orig/samples/tests/spec/text/textBiDi2.svg0000644000175000017500000000546713063003322022005 0ustar mans0954mans0954 BiDi Text / International Text 2 אבג ABC ABC אבג ABC אבג ABC אבגד ABCD אבגד batik-1.9.orig/samples/tests/spec/text/textLayout.svg0000644000175000017500000001453413063003320022362 0ustar mans0954mans0954 Text Layout Properties sample Text Layout Properties Explicit Glyph Positioning sample tspan x="40,60,80,105,125,140" sample Serif, default spacing sample x="175" dx="0,10,10,10,10,10" Letter Spacing Adjustment and Explicit Length Specification sample textLength="120" sample textLength="70" sample kerning="10" sample textLength="120", lengthAdjust="spacingAndGlyphs" sample textLength="70" lengthAdjust="spacingAndGlyphs" sample textLength="120",kerning="10" sample letter-spacing="0.3em" sample letter-spacing="-3" sample letter-spacing="10" Word Spacing Adjustment Wide separation between words textLength="350" word-spacing="3em" Narrow separation between words textLength="350" word-spacing="-5" Narrow separation between words textLength="350" lengthAdjust="spacingAndGlyphs" word-spacing="-5" batik-1.9.orig/samples/tests/spec/text/textOnPathSpaces.svg0000644000175000017500000001573713063003320023443 0ustar mans0954mans0954 Text on a path with spaces test Text on a path with adjusted spacing sample default spacing sample tspan x="10,30,50,75,95,110" y="110" sample tspan dx="0,10,10,10,10,10" sample textLength="140" sample textLength="70" sample kerning="10" sample textLength="140" lengthAdjust= "spacingAndGlyphs" sample textLength="50" lengthAdjust= "spacingAndGlyphs" sample textLength="140", kerning="10" lengthAdjust= "spacingAndGlyphs" sample letter-spacing="-3" sample sample textLength="140" word-spacing="2em" sample sample textLength="140" word-spacing="-5" lengthAdjust= "spacingAndGlyphs" batik-1.9.orig/samples/tests/spec/text/textPosition.svg0000644000175000017500000001101313063003320022676 0ustar mans0954mans0954 Text Position Text Position Batik <text x="100" y="80"> Batik <text x="240" y="80" letter-spacing="20"> Batik <text x="50 70 90 110 130" y="140"> Batik <text dx="240 20 20 20 20" y="140"> Batik <tspan x="50" y="200"> Batik <tspan x="240" y="200" letter-spacing="20"> Batik <tspan x="50 70 90 110 130" y="260"> Batik <tspan dx="240 20 20 20 20" y="260"> Batik <tspan x="50 60 70 80 90" dx="0 10 20 30 40" y="320"> Batik <tspan x="240" dx="0 10 10 10 10" y="320" style="letter-spacing:10"> Batik Empty Trailing tspan Batik Empty Preceeding tspan batik-1.9.orig/samples/tests/spec/text/textBiDi.svg0000644000175000017500000001165213063003322021714 0ustar mans0954mans0954 BiDi Text / International Text Some text goes (right to left), other text goes (left to right). Some (embedded bidi) text. Text selection allows visually discontiguous selections across bi-directional text. latin: ABCDEFG abcdefghijklmnopqrstuvwxyz latin-extended: æçèéêëìíîïðñòóô cyrillic: БВГДЕЖЗИЙКЛМНОПРСТУФХЦЧ greek: ΑΒΓΔ αβγδεζηθικλμνξοπρςστυφχψω hebrew: אבגדהוזחטיךכלםמןנסעףפץצקרשת אבגדהוזחטיךכלםמןנסעףפץצקרשת arabic: ءأؤإئابةتثجحخدذرزسشصضطظعـفقكلمنهوىِٶ ءأؤإئابةتثجحخدذرزسشصضطظعـفقكلمنهوىِٶ batik-1.9.orig/samples/tests/spec/text/verticalTextOnPath.svg0000644000175000017500000002245213063003322023770 0ustar mans0954mans0954 Vertical text on a path test Vertical text on a path test Text on a Path startOffset="0%" text-anchor="start" glyph-orientation="auto" Text on a Path startOffset="0%" text-anchor="middle" glyph-orientation="0deg" Text on a Path startOffset="50%" text-anchor="end" glyph-orientation="180deg" Text on a Path startOffset="50%" text-anchor="start" glyph-orientation="270deg" Text on a Path startOffset="50%" text-anchor="middle" glyph-orientation="0deg" Text on a Path startOffset="100%" text-anchor="end" glyph-orientation="90deg" Text on a Path startOffset="35" text-anchor="start" glyph-orientation="180deg" Text on a Path startOffset="35" text-anchor="middle" Text on a Path startOffset="35" text-anchor="end" glyph-orientation="90deg" super and subscripts baseline-shift="super" and baseline-shift="sub" glyph-orientation="auto" positive and negative baseline-shift="+/-20%" glyph-orientation="auto" before path on pathafter path text before/after textPath glyph-orientation="auto" batik-1.9.orig/samples/tests/spec/text/textAnchor2.svg0000644000175000017500000001355113063003320022377 0ustar mans0954mans0954 text-anchor on a single <tspan> x attribute define new text chunks y attribute does not define new text chunk x & y attributes define new text chunks Batik Batik Batik Batik Batik Batik Batik Batik Batik batik-1.9.orig/samples/tests/spec/text/textOnPath2.svg0000644000175000017500000000707313063003320022360 0ustar mans0954mans0954 Text on Path with trailing <tspan> Text on Path with trailing <tspan> Text with embedded textPath and multiple trailing tspan textPath has startOffset="10%" textPath with startOffset and text-anchor This is simpletext on a pathwith nested tspan xxx all with different links. This is simpletext on a pathwith nested tspan xxx all with different links. This is simpletext on a pathwith nested tspan xxx all with different links. batik-1.9.orig/samples/tests/spec/text/textGlyphOrientationHorizontal.svg0000644000175000017500000001040113063003322026445 0ustar mans0954mans0954 Text Orientation Horizontal Text Orientation Horizontal Batik is Good Batik is Good Batik is Good Batik is Good Batik is Good Batik is Good Batik is Good Batik is Good batik-1.9.orig/samples/tests/spec/text/textProperties.svg0000644000175000017500000001647613063003320023250 0ustar mans0954mans0954 Text Properties sample Text Alignment, Geometry, References, and Spans text-anchor="start" text-anchor="middle" text-anchor="end" sample font-size="1cm" sample font-size="200%" sample font-size="28" referenced text via <tref> sample use of <tspan> predefined text via <use> Text Rendering Properties transform="rotate(180)" opacity="0.5" fill="DarkRed" filter="url(#gaussianBlur)" fill="yellow"; stroke="MidnightBlue" sample text as clip-path a stroke-linejoin="miter" stroke-linecap="square" a stroke-linejoin="round" stroke-linecap="round" batik-1.9.orig/samples/tests/spec/text/textOnPath3.svg0000644000175000017500000000627213063003320022361 0ustar mans0954mans0954 Text on Path with for text with an 'x' Text on Path with for text with an 'x' Text with one textPath child and x="10" Text on a path for text w/ 'x'. Text with one textPath child and x="100" Text on a path for text w/ 'x'. Text with one textPath child and x="-100" y="10" Text on a path for text w/ 'x'. batik-1.9.orig/samples/tests/spec/text/textLength.svg0000644000175000017500000001413613063003320022324 0ustar mans0954mans0954 textLength with Anchor xml-batik No textLength B textLength="50" lengthAdjust="spacingAndGlyphs" B textLength="50" lengthAdjust="spacing" Batik textLength="50" lengthAdjust="spacingAndGlyphs" Batik textLength="50" lengthAdjust="spacing" Apache Batik textLength="50" lengthAdjust="spacingAndGlyphs" (shrinking) Apache Batik textLength="50" lengthAdjust="spacingAndGlyphs" (no anchor) Apache Batik!! textLength="50" lengthAdjust="spacingAndGlyphs" (tspan) B a t i k lengthAdjust="spacingAndGlyphs" textLength="25" font-size="100" batik-1.9.orig/samples/tests/spec/text/longTextOnPath.svg0000644000175000017500000000644113063003320023114 0ustar mans0954mans0954 Long text on a path test for selection Long text on a path test for selection This is an example of a very long string that is split across multiple lines via the textPath tag. The purpose of this test is to ensure that text-selection can keep up even when relatively large numbers of characters are part of the selection. Since I haven't reached the end yet, let me keep going with more really quite useless text just to see if we hit a limit where it really starts to slow things down. However if it hasn't slowed down by now I'm guessing that it won't slow down at all. But you never know for sure until you try it, so I am, and here is the result. Selection does bog down a little near the end but it's redraw related. batik-1.9.orig/samples/tests/spec/text/smallFonts.svg0000644000175000017500000001362313063003322022322 0ustar mans0954mans0954 Small font size test (viewBox="0 0 9 10") Text can change size, typeface, color, or style within a single text element. Styling features include weight, posture, and typeface. Graphics attributes such as opacity can be applied. "text decoration" can include underline, overline, and strikethrough. Super and sub scripts are available. Various outline styles, fill colors and thicknesses can be used, and the outline stroke can be rounded or mitered. Text elements also can be filtered, transformed and placed on a path. Shadow Shadow Small text on a Path batik-1.9.orig/samples/tests/spec/text/textEffect2.svg0000644000175000017500000001103113063003320022350 0ustar mans0954mans0954 Mix text transformation clip-path using text (Using System font and SVG font) BATIK BATIK (System font) (SVG font) batik-1.9.orig/samples/tests/spec/text/textDecoration2.svg0000644000175000017500000001246413063003320023256 0ustar mans0954mans0954 Text Decoration with dx,dy Tests Text Decoration with dx, dy tests This is a textthat covers multiplelines This is a textthat covers multiplelines Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts Text that shifts batik-1.9.orig/samples/tests/spec/text/textProperties2.svg0000644000175000017500000001316713063003320023324 0ustar mans0954mans0954 Text Properties Text display and visibility. Visibility on text & tspans Display on text & tspans vis, vis, vis vis, hid, vis vis, hid, hid hid, vis, hid inline, inline, inline inline, inline, none inline, none, inline inline, none, none none, inline, none Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text Text tspan 1 tspan 2 more span 1 finish text batik-1.9.orig/samples/tests/spec/text/textOnPath.svg0000644000175000017500000001743413063003320022300 0ustar mans0954mans0954 Text on a path test Text on a path test Text on a Path startOffset="0%" text-anchor="start" Text on a Path startOffset="0%" text-anchor="middle" Text on a Path startOffset="50%" text-anchor="end" Text on a Path startOffset="50%" text-anchor="start" Text on a Path startOffset="50%" text-anchor="middle" Text on a Path startOffset="100%" text-anchor="end" Text on a Path startOffset="35" text-anchor="start" Text on a Path startOffset="35" text-anchor="middle" Text on a Path startOffset="35" text-anchor="end" super and subscripts baseline-shift="super" and baseline-shift="sub" positive and negative baseline-shift="+/-20%" before path on path after path text before/after textPath batik-1.9.orig/samples/tests/spec/text/textStyles.svg0000644000175000017500000002037313063003320022366 0ustar mans0954mans0954 Text Font Faces and Styles sample Text Font Faces and Styles Standard Font Faces SansSerif, normal weight SansSerif, bold SansSerif, oblique Serif, normal weight Serif, bold Serif, oblique Monospaced, normal weight Monospaced, bold Monospaced, oblique (default) default, bold, oblique stroke-width=1, fill=none Named Font Families (Not all typefaces are available on all systems.) Times Verdana Helvetica Arial (underlined) Impact AvantGarde (line-through) batik-1.9.orig/samples/tests/spec/text/textAnchor3.svg0000644000175000017500000001437313063003320022403 0ustar mans0954mans0954 text-anchor on a single <tspan> x attributed tspan with extra text x attribute for some chars x & y attributes with inheritance Batik rules! Batik rules! Batik rules! Batik Batik Batik Batik rules! Batik rules! Batik rules! batik-1.9.orig/samples/tests/spec/text/textFeatures.svg0000644000175000017500000001253113063003322022660 0ustar mans0954mans0954 Text Element Features Text can change size, typeface, color, or style within a single text element. Styling features include weight, posture, and typeface. Graphics attributes such as opacity can be applied. "text decoration" can include underline, overline, and strikethrough. super-and- sub-scripts are available. Baseline can also be shifted up and down by percentage. Various outline styles, fill colors and thicknesses can be used, and the outline stroke can be rounded or mitered. Text elements also can be filtered and transformed. Shadow Shadow batik-1.9.orig/samples/tests/spec/text/textPosition2.svg0000644000175000017500000001344613063003320022774 0ustar mans0954mans0954 Text Position 2 Text Position 2 Batik <text x="100" y="80"> Batik <text x="240" y="80" letter-spacing="20"> Batik <text x="50 70 90 110 130" y="140"> Batik <text dx="240 20 20 20 20" y="140"> Batik <tspan x="50" y="200"> Batik <tspan x="240" y="200" letter-spacing="20"> Batik <tspan x="50 70 90 110 130" y="260"> Batik <tspan dx="240 20 20 20 20" y="260"> Batik <tspan x="50 60 70 80 90" dx="0 10 20 30 40" y="320"> Batik <tspan x="240" dx="0 10 10 10 10" y="320" style="letter-spacing:10"> batik-1.9.orig/samples/tests/spec/text/xmlSpace.svg0000644000175000017500000001705313063003320021753 0ustar mans0954mans0954 Test of xml:space handling X X no xml:space attr X X xml:space="default" X X Empty tspan at end xml:space="default" X X tspan end 2spc xml:space="default" X X tspan end xml:space="default" X X tspan start xml:space="default" X X tspan near start xml:space="default" X X tspan middle front xml:space="default" X X tspan middle end xml:space="default" X X unknown element start X X unknown element middle X X unknown element end X X xml:space="preserve" X X Empty tspan at end xml:space="preserve" X X tspan end 2spc xml:space="preserve" X X tspan end xml:space="preserve" X X tspan start xml:space="preserve" X X tspan near start xml:space="preserve" X X tspan middle front xml:space="preserve" X X tspan middle end xml:space="preserve" X X unknown element start X X unknown element middle X X unknown element end batik-1.9.orig/samples/tests/spec/text/textLayout2.svg0000644000175000017500000001163113063003320022437 0ustar mans0954mans0954 Text Layout Properties sample Text Layout Properties (2) Baseline Properties super and subscripts baseline-shift="super"/baseline-shift="sub" positive and negative baseline-shift baseline-shift="+/-20%" Multi-line Text Selection (Try selecting the following text regions) Text selections can span multiple lines via <tspan> elements. Text-circle. Text-in-a-square Text with rotated glyphs More rotated glyphs batik-1.9.orig/samples/tests/spec/text/textAnchor.svg0000644000175000017500000001742313063003320022317 0ustar mans0954mans0954 text-anchor on <tspan> I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk I am the same text chunk another text chunk batik-1.9.orig/samples/tests/spec/text/textPCDATA.svg0000644000175000017500000000517713063003322022046 0ustar mans0954mans0954 Character Data on <text> CDATA only <text> with a CDATA section text, CDATA, text Text first, then CDATA section in <text>, text again text, CDATA, tspan, CDATA, text text, CDATA section in <text>, tspan w/CDATA section in <tspan>, text again batik-1.9.orig/samples/tests/spec/text/textEffect.svg0000644000175000017500000001252713063003320022301 0ustar mans0954mans0954 Mix text transformation Gradient and filter on text (Using System font and SVG font) BATIK BATIK BATIK BATIK BATIK BATIK (System font) (SVG font) batik-1.9.orig/samples/tests/spec/color/0000755000175000017500000000000013153020772017614 5ustar mans0954mans0954batik-1.9.orig/samples/tests/spec/color/colors.svg0000644000175000017500000002634113063003314021635 0ustar mans0954mans0954 SVG Color Identifiers SVG Color Identifiers AliceBlue AntiqueWhite Aqua Aquamarine Azure Beige Bisque Black BlancheDalmond Blue BlueViolet Brown BurlyWood CadetBlue Chartreuse Chocolate Coral CornFlowerBlue CornSilk Crimson Cyan DarkBlue DarkCyan DarkGoldenRod DarkGray DarkGreen DarkGrey DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkSlateGrey DarkTurquoise DarkViolet DeepPink DeepSkyBlue DimGray DimGrey DodgerBlue FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold GoldenRod Gray Green Grey GreenYellow HoneyDew HotPink IndianRed Indigo Ivory Khaki Lavender LavenderBlush LawnGreen LemonChiffon LightBlue LightCoral LightCyan LightGoldenRodYellow LightGray LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSlateGrey LightSteelBlue LightYellow Lime LimeGreen Linen Magenta Maroon MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed MidnightBlue MintCream MistyRose Moccasin NavajoWhite Navy OldLace Olive OliveDrab Orange OrangeRed Orchid PaleGoldenRod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip PeachPuff Peru Pink Plum PowderBlue Purple Red RosyBrown RoyalBlue SaddleBrown Salmon SandyBrown SeaGreen SeaShell Sienna Silver SkyBlue SlateBlue SlateGray SlateGrey Snow SpringGreen SteelBlue Tan Teal Thistle Tomato Turquoise Violet Wheat White WhiteSmoke Yellow YellowGreen batik-1.9.orig/samples/tests/spec/color/colorProfile.svg0000644000175000017500000005142013063003314022767 0ustar mans0954mans0954 <color-profile> test <color-profile> test raster image icc color values rendering-intent auto perceptual saturation rel. col. abs. col. Input colors for both raster and icc colors batik-1.9.orig/samples/tests/spec/color/systemColors.svg0000644000175000017500000001755213063003312023044 0ustar mans0954mans0954 System Colors System Colors Inactive Caption Active Caption Menu Selected Item 1 Item 2 Item 3 batik-1.9.orig/samples/chessboard.svg0000644000175000017500000001240413063003304017231 0ustar mans0954mans0954 Chessboard batik-1.9.orig/samples/moonPhases.svg0000644000175000017500000027240413063003306017242 0ustar mans0954mans0954 Nouvelle lune Premier croissant Premier quartier Lune gibbeuse Pleine lune Lune gibbeuse Dernier quartier Dernier croissant Nouvelle lune Soleil Lune Terre New moon Waxing crescent Waxing quarter Near full Full moon Near full Waning quarter Waning crescent New moon Sun Moon Earth Les phases de la lune The phases of the moon batik-1.9.orig/samples/3D.svg0000644000175000017500000004621613063003323015373 0ustar mans0954mans0954 Batik 3D batik-1.9.orig/samples/chessFont.svg0000644000175000017500000004764313063003306017067 0ustar mans0954mans0954 Chess Font Chess Font 8 7 6 5 4 3 2 1 a b c d e f g h batik-1.9.orig/samples/batikYin.svg0000644000175000017500000006430513063003304016675 0ustar mans0954mans0954 Batik, Yin-Yang batik-1.9.orig/samples/strokeFont.svg0000644000175000017500000021273513063003305017264 0ustar mans0954mans0954 SVG 'Stroke' Font SVG 'Stroke' Font !"#$%&'()*+,-./0123456789:;<>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz|{}~ !"#$%&'()*+,-./0123456789:;<>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz|{}~ The quick brown fox jumped over the lazy dog. The quick brown fox jumpedover the lazy dog. batik-1.9.orig/samples/logoShadowOffset.svg0000644000175000017500000012432313063003306020377 0ustar mans0954mans0954 batik-1.9.orig/samples/batik3D.svg0000644000175000017500000031643613063003307016414 0ustar mans0954mans0954 batik-1.9.orig/samples/batikFX.svg0000644000175000017500000004164613063003304016456 0ustar mans0954mans0954 Batik, Futuristic Mood batik-1.9.orig/samples/batikLogo.svg0000644000175000017500000004042313063003307017034 0ustar mans0954mans0954 Batik Logo batik-1.9.orig/samples/textRotateShadows.svg0000644000175000017500000001133213063003307020612 0ustar mans0954mans0954 Text Rotation and Shadows batik Text Transformation batik-1.9.orig/samples/mapWaadt.svg0000644000175000017500000100141513063003306016655 0ustar mans0954mans0954 Morges Lavigny Lac Lman Lausanne Vevey Moudon Pompaples Mex Orbe Vallorbe Yverdon La Broye L'Orbe Le Talent Le Venoge Beschftigung Kanton Waadt Employment canton of Vaud 1985/95 Geschlechtsspez. Verteilung in Voll- und Teilzeit im 2. u. 3. Wirtschaftssektor Gender-specific distribution of full- vs part-time in the industry and services Verhltnis Teilzeit/Vollzeit Ratio part-time/full-time < 22.3 % < 39.1 % < Anteil der Frauen an den Share of women in the Teilzeitbeschftigten part-time employees < 81.8 % < 66.7 % < Gemeinden unter 10 Beschftigten Municipalities under 10 employed oder ohne Teilzeitbeschftigung or without part-time employment Massstab 1:200.000 Echelle 1:200.000 Scale 1:200.000 0 10 20 30 40 50 km 20.000 20,000 10.000 10,000 5.000 5,000 2.000 2,000 1.000 1,000 500 100 Grsster Teilkreis: Lausanne Biggest circle: Lausanne 71.606 Vollzeitbeschftigte 71,606 full-time employed 1 mm = 22 Beschftigte 1 mm = 22 employed Frauen Frauen Mnner Mnner Vollzeitbeschftigte Teilzeitbeschftigte Women Women Men Men Full-time employed Part-time employed 1985 1995 Source: company counts 1985/1995, Federal Office of Statistics Editors: Heiko Munde, Andreas Neumann, Simone Schoch Tutors: Ernst Hutzler, Daniel Staub Map created for the Exercises in Thematic Cartography, summer semester 1997, Institute Cartography, ETH Zurich Software: Themap (E. Hutzler, ETH), Microstation, Corel Draw Gemeindetypen entsprechend Beschftigungsverhltnis Beschftigte absolut Source: company counts 1985/1995, Federal Office of Statistics Editors: Heiko Munde, Andreas Neumann, Simone Schoch Tutors: Ernst Hutzler, Daniel Staub Map created for the Exercises in Thematic Cartography, summer semester 1997, Institute Cartography, ETH Zurich Software: Themap (E. Hutzler, ETH), Microstation, Corel Draw Municipalities according to employment ratio Employed absolute batik-1.9.orig/samples/henryV.svg0000644000175000017500000001414413063003304016372 0ustar mans0954mans0954 Henry V Henry V Henry V O for a Muse of fire, that would ascend The brightest heaven of invention, A kingdom for a stage, princes to act And monarchs to behold the swelling scene! Then should the warlike Harry, like himself, Assume the port of Mars; and at his heels, Leash'd in like hounds, should famine, sword and fire Crouch for employment. But pardon, and gentles all, The flat unraised spirits that have dared On this unworthy scaffold to bring forth So great an object: can this cockpit hold The vasty fields of France? or may we cram Within this wooden O the very casques That did affright the air at Agincourt? O, pardon! since a crooked figure may Attest in little place a million; And let us, ciphers to this great accompt, On your imaginary forces work. Suppose within the girdle of these walls Are now confined two mighty monarchies, Whose high upreared and abutting fronts The perilous narrow ocean parts asunder: Piece out our imperfections with your thoughts; Into a thousand parts divide on man, And make imaginary puissance; Think when we talk of horses, that you see them Printing their proud hoofs i' the receiving earth; For 'tis your thoughts that now must deck our kings, Carry them here and there; jumping o'er times, Turning the accomplishment of many years Into an hour-glass: for the which supply, Admit me Chorus to this history; Who prologue-like your humble patience pray, Gently to hear, kindly to judge, our play. batik-1.9.orig/samples/GVT.svg0000644000175000017500000001653313063003304015563 0ustar mans0954mans0954 batik-1.9.orig/samples/gradients.svg0000644000175000017500000001342213063003304017075 0ustar mans0954mans0954 batik-1.9.orig/samples/mapSpain.svg0000644000175000017500000077615013063003306016705 0ustar mans0954mans0954 10 10 8 8 6 6 4 4 2 2 0 0 2 2 4 4 westl. v. Greenwich west of Greenwich westl. v. Greenwich west of Greenwich stl. v. Greenwich east of Greenwich stl. v. Greenwich east of Greenwich 36 36 38 38 40 40 42 42 Modifizierte Kegelprojektion nach Lambert Modified conic projection after Lambert Berhrungsbreitenkreise: 38 und 42 nrdl. Breite, (Kanarische Inseln: 28 nrdl. Breite) Touching latitudes: 38 and 42 north latitude (Canary Islands: 28 north latitude) Zentralmeridian: 4 westl. Lnge, (Kanarische Inseln: 16 westl. Lnge) Central meridian: 4 west longitude, (Canary Islands: 16 west longitude) Atlantischer Ozean Atlantic Ocean Mittel- Mediter- lndisches Meer ranean Sea Balearen Balearics Mallorca Menorca Marokko Morocco Portugal Frankreich France Barcelona Valencia Madrid Bilbao La Corua Sevilla Seville Lissabon Lisbon Algier Algiers Marseille Montpellier Perpignan Porto Ebro Tajo Tejo Duero Guadalquivir Guadiana Ibiza 18 16 14 westl. v. Greenwich west of Greenwich 18 16 14 28 28 Kanarische Inseln Canary Islands Teneriffa Gran Canaria Spanien - Bevlkerung 1970 - 1990 Erstellt v. Andreas Neumann im Rahmen d. Kartenentwurfspraktikums, Sommersemester 1998, geleitet v. Prof. Ingrid Kretschmer, Institut fr Geographie der Universitt Wien. Verwendete Software: Arc/Info und Module, CorelDRAW und div. Perl-Scripts. Bevlkerungsdichte Bevlkerungsvernderung Bevlkerung absolut Einwohner/km auf Provinzebene Prozentuelle Vernderung der Provinzen gegenber Stand 1970 Prozentuelle Vernderung der Hauptstdte gegenber Stand 1970 Auf Provinzebene und in den Hauptstdten (inneres Quadrat) Spain - Population 1970 - 1990 Created by Andreas Neumann for the map design course, summer semester 1998, led by Prof. Ingrid Kretschmer, Geography Institute of Vienna University. Used software: Arc/Info and Modules, CorelDRAW and various Perl scripts. Population density Population change Population absolute Inhab. per km at province level Percentual change of the province vs situation 1970 Percentual change of the capitals vs situation 1970 At provincial level and in the capitals (inner square) < 25 < 85 % < 115 % 25 45 < 85 % 100 % < 115 % 130 % < 45 75 < 100 % 115 % < 130 % 145 % < 75 150 < 115 % 130 % < 145 % 160 % < 150 < 130 % < 160 % < 5.000 1.000 500 200 100 50 Angaben in tausend Indications in thousands 0 100 200 300 km 50 Massstab 1 : 6.000.000 Scale 1 : 6.000.000 Quelle: Spanisches Statistisches Zentralamt Source: Spanish Central Office for Statistics Min.: Soria - 9,46, Max.: Madrid - 628,91 Minimum: Soria - 84,61 %, Maximum: Las Palmas - 141,24 % Minimum: Vizcaya - 93,50 %, Maximum: Guadalajara - 199,18 % Minimum (Provinz): Soria - 97.268 Minimum (Province): Soria - 97.268 Maximum (Provinz): Madrid - 5.028.120 Maximum (Province): Madrid - 5.028.120 Minimum (Hauptstadt): Teruel - 28.488 Minimum (capital): Teruel - 28.488 Maximum (Hauptstadt): Madrid - 3.120.732 Maximum (capital): Madrid - 3.120.732 Stand 1990 Situation 1990 Stand 1990 Sit. 1990 batik-1.9.orig/samples/sizeOfSun.svg0000644000175000017500000002606313063003306017051 0ustar mans0954mans0954 Size of the Sun Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto Size of the Sun You could line up all of the planets along the Sun's 1,392,000 kilometer equator three times and still have room left for 1 Saturn, 4 Earths, and a Mercury. One time... Two times... 3 times... batik-1.9.orig/samples/solitaire/0000755000175000017500000000000013153020772016375 5ustar mans0954mans0954batik-1.9.orig/samples/solitaire/towers.svg0000644000175000017500000006117313063003307020444 0ustar mans0954mans0954 z/Z - Undo move r/R - Redo move ? - Get Help batik-1.9.orig/samples/solitaire/script/0000755000175000017500000000000013153020772017701 5ustar mans0954mans0954batik-1.9.orig/samples/solitaire/script/util.js0000644000175000017500000000436113063003304021210 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function screenCTM(elem) { if (elem.getScreenCTM) return elem.getScreenCTM(); // This is to handle ASV 3.0, this depends on // a number of bugs in the ASV implementation. if (elem.currentScale) { var scale = root.currentScale; var trans = root.currentTranslate; var ret = root.createSVGMatrix(); ret.scale(scale); ret.translate(trans.x, trans.y); return ret; } var pMat = screenCTM(elem.parentNode); var eMat = elem.getCTM(); if (eMat == null) return pMat; eMat = eMat.multiply(pMat); return eMat; } function transformToElement(from, to) { if (!from.getTransformToElement) return from.getTransformToElement(to); var m1 = screenCTM(from); var m2 = screenCTM(to); return m1.multiply(m2.inverse()); } // Transform screen x/y to elem's coordinate system. // returns an SVGPoint object. function localPt(elem, x, y) { var mat = screenCTM(elem); var imat = mat.inverse(); var cPt = document.getRootElement().createSVGPoint(); cPt.x = x; cPt.y = y; cPt = cPt.matrixTransform(imat); return cPt; } function ForwardMouseDown(obj) { this.obj = obj; this.handleEvent = function(evt) { obj.mousedown(evt); } } function ForwardMouseMove(obj) { this.obj = obj; this.handleEvent = function(evt) { obj.mousemove(evt); } } function ForwardMouseUp(obj) { this.obj = obj; this.handleEvent = function(evt) { obj.mouseup(evt); } } batik-1.9.orig/samples/solitaire/script/pile.js0000644000175000017500000002470313063003304021166 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var svgns = "http://www.w3.org/2000/svg"; var xlinkns = "http://www.w3.org/1999/xlink"; function Pile(board, x, y, w, h, dx, dy, pdx, pdy) { this.board = board; this.doc = board.doc; this.index = board.thePiles.length; board.thePiles.push(this); this.g = this.doc.createElementNS(svgns, "g"); this.g.setAttribute("id", "pile-"+this.index); this.g.addEventListener("mousedown", new PileMouseDownHandler(this), false); this.g.addEventListener("click", new PileClickHandler(this), false); this.base = this.doc.createElementNS(svgns, "rect"); this.base.setAttribute("x", ""+x); this.base.setAttribute("y", ""+y); this.base.setAttribute("width", ""+w); this.base.setAttribute("height", ""+h); this.base.setAttribute("style", "visibility:hidden; pointer-events:fill"); this.g.appendChild(this.base); board.boardGroup.appendChild(this.g); this.x = x; this.y = y; this.width = w; this.height = h; this.dx = dx; this.dy = dy; this.pdx = pdx; this.pdy = pdy; this.cards = new Array(); var me = this; } Pile.prototype.addCard = function(card) { if (card.pile) { card.pile.removeCard(card); } var len = this.cards.length; if ((this.pdx != 0) || (this.pdy !=0)) { for (var i=0; i=0; i--) { var c = this.cards[i]; if (c == card) { this.cards.splice(i, 1); len = this.cards.length; for (var j=i; j 9) { this.clickX = evt.clientX; this.clickY = evt.clientY; this.clickCnt = 1; if (this.pile.click) this.pile.click(this.pile, evt); return; } this.clickX = evt.clientX; this.clickY = evt.clientY; this.clickCnt++; if (this.clickCnt > 2) { this.clickCnt = 1; if (this.pile.click) this.pile.click(this.pile, evt); return; } if (this.pile.doubleClick) { this.pile.doubleClick(this.pile, evt); } }; function PileMouseDownHandler(pile) { this.pile = pile; } PileMouseDownHandler.prototype.handleEvent = function(evt) { if (!this.pile.dragCheck) return; var tgt = evt.target; var e = tgt; var p = e.parentNode; while (p && (p != this.pile.g)) { e = p; p = e.parentNode; } if (!p) return; var c, i; var num = this.pile.cards.length; for (i=num-1; i>=0; i--) { c = this.pile.cards[i]; if (e == c.elem) break; c = null; } if (!c) return; var g = this.pile.dragCheck(this.pile, c, i); if (!g) return; var cards = this.pile.cards.splice(i, num-i); new CardMoveManager(g, this.pile, cards, evt.clientX, evt.clientY); } /** * Finds the pile associated with elem, if any. * returns null if elem is not associated with a pile. * otherwise it returns the associated Pile object. */ function findPile(board, elem) { var root = document.getRootElement(); var tgt = elem var destPile = null; while (tgt != root) { var id; try { id = tgt.getAttribute("id"); } catch (x) { break; } if (id && id.substring(0, 5) == "pile-") { var idx = parseFloat(id.substring(5)); destPile = board.thePiles[idx]; break; } tgt = tgt.parentNode; } return destPile; } function CardMoveManager(group, pile, cards, x, y) { this.pile = pile; this.board = pile.board; this.cards = cards; this.group = group; this.parent = group.parentNode; this.root = this.group.getOwnerDocument().getRootElement(); this.startPt = localPt(this.parent, x, y); this.fmm = new ForwardMouseMove(this); this.fmu = new ForwardMouseUp(this); this.root.addEventListener("mousemove", this.fmm, false); this.root.addEventListener("mouseup", this.fmu, false); this.moved = false; }; CardMoveManager.prototype.mousemove = function(evt) { var pt = localPt(this.parent, evt.clientX, evt.clientY); var dx = pt.x-this.startPt.x; var dy = pt.y-this.startPt.y; if (!this.moved && ((dx*dx+dy*dy) < 4)) return; if (!this.moved) { this.moved = true; // Now move cards for (var i=0; i= len) r = Math.floor(Math.random()*(len-x)); var c = this.cards[r]; this.cards.splice(r, 1); this.cards[len-1] = c; } } } Deck.prototype.dealCard = function(faceup) { var c = this.cards.shift(); c.flipCard(faceup); return c; } batik-1.9.orig/samples/solitaire/script/board.js0000644000175000017500000001071313063003304021320 0ustar mans0954mans0954/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var svgns = "http://www.w3.org/2000/svg"; var xlinkns = "http://www.w3.org/1999/xlink"; function Board(boardGroup, moveGroup, winG, helpG) { this.doc = boardGroup.getOwnerDocument(); this.root = this.doc.getRootElement(); this.helpG = (helpG)?helpG:this.doc.getElementById("help"); this.winG = (winG)?winG:this.doc.getElementById("win"); this.boardGroup = boardGroup; this.moveGroup = moveGroup; this.thePiles = new Array(); this.moves = new Array(); this.moveIndex = 0; this.numMoves = 0; this.isWon = false; this.root.addEventListener("keypress", this, false); if (helpG) { var board = this; this.helpG.addEventListener("click", function() { board.hideHelp(); }, false); } } Board.prototype.won = function() { if (!this.winG) return; var style = this.winG.style; if (style.getPropertyValue("display") == "inline") { this.unwon(); return; } style.setProperty("display", "inline", ""); this.isWon = true; }; Board.prototype.unwon = function() { if (!this.winG) return; if (this.winG.style.getPropertyValue("display") != "none") { this.winG.style.setProperty("display", "none", ""); } }; Board.prototype.setNotifyMoveDone = function(moveDone) { this.moveDone = moveDone; }; Board.prototype.notifyMoveDone = function() { if (this.moveDone) { this.moveDone(); } }; Board.prototype.saveMove = function(moveinfo) { this.moves[this.moveIndex++] = moveinfo; this.numMoves = this.moveIndex; this.isWon = false; }; Board.prototype.setMoveInfo = function(moveinfo) { if (this.moveIndex == 0) return null; this.moves[this.moveIndex-1] = moveinfo; }; Board.prototype.getMoveInfo = function() { if (this.moveIndex == 0) return null; return this.moves[this.moveIndex-1]; }; Board.prototype.undoMove = function() { if (this.moveIndex == 0) return; if (this.isWon) this.unwon(); this.moveIndex--; var mi = this.moves[this.moveIndex]; mi.undo(); }; Board.prototype.redoMove = function() { if (this.moveIndex == this.numMoves) return; var mi = this.moves[this.moveIndex++]; mi.redo(); if (this.isWon && (this.moveIndex == this.numMoves)) this.won(); }; Board.prototype.handleEvent = function(evt) { var keycode = evt.keyCode ? evt.keyCode : evt.charCode ? evt.charCode : evt.which ? evt.which : void 0; var key = String.fromCharCode(keycode); if ((key == "z") || (key == "Z")) { this.undoMove(); } else if ((key == "r") || (key == "R")) { this.redoMove(); } else if (key == "?") { this.showHelp(); } }; Board.prototype.showHelp = function() { if (!this.helpG) return; var style = this.helpG.style; if (style.getPropertyValue("display") == "inline") { this.hideHelp(); return; } style.setProperty("display", "inline", ""); style.setProperty("pointer-events", "fill", ""); var board = this; } Board.prototype.hideHelp = function() { if (!this.helpG) return; this.helpG.style.setProperty("pointer-events", "none", ""); this.helpG.style.setProperty("display", "none", ""); } function MultiMoveInfo(mi1, mi2) { this.mi1 = mi1; this.mi2 = mi2; this.undo = function() { this.mi2.undo(); this.mi1.undo(); }; this.redo = function() { this.mi1.redo(); this.mi2.redo(); }; } function SimpleMoveInfo(fromCards, fromPile, toCards, toPile) { this.fromCards = fromCards; this.fromPile = fromPile; this.toCards = toCards; this.toPile = toPile; this.undo = function() { var len = fromCards.length; for (var i=0; i= this.dx)) { newX = this.destX; } else { register = true; } } else { if (((deltaX*1.01) >= this.dx) && ((deltaX*0.99) <= this.dx)) { newX = this.destX; } else { register = true; } } var deltaY = (this.destY-this.y); var newY = this.y + this.dy; if (deltaY < 0) { if (((deltaY*1.01) <= this.dy) && ((deltaY*0.99) >= this.dy)) { newY = this.destY; } else { register = true; } } else { if (((deltaY*1.01) >= this.dy) && ((deltaY*0.99) <= this.dy)) { newY = this.destY; } else { register = true; } } this.setPos(newX, newY); if (!register) { var nc = this.pile.nextCard(this); while (nc) { var ncelem = nc?nc.elem:null; if (ncelem.parentNode == this.pile.g) { this.pile.g.insertBefore(this.elem, ncelem); break; } nc = this.pile.nextCard(nc); } if (!nc) this.pile.g.appendChild(this.elem); } this.moving = register; return register; } function moveCards() { var register = false; var num = MOVING.length; for (var i=0; i batik-1.9.orig/samples/solitaire/cards/0000755000175000017500000000000013153020772017471 5ustar mans0954mans0954batik-1.9.orig/samples/solitaire/cards/default.svg0000644000175000017500000013226713063003304021641 0ustar mans0954mans0954 A A 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 J J Q Q K K A A 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 J J Q Q K K A A 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 J J Q Q K K A A 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 J J Q Q K K batik-1.9.orig/samples/sunRise.svg0000644000175000017500000020333213063003304016546 0ustar mans0954mans0954 Sun Rise BATIK BATIK BATIK Scalable Vector Graphics batik-1.9.orig/samples/batik70.svg0000644000175000017500000002715513063003304016366 0ustar mans0954mans0954 Batik, 70's Mood batik-1.9.orig/samples/mathMetal.svg0000644000175000017500000007351313063003306017042 0ustar mans0954mans0954 Math Metal f ( g ) = - + | g n | d g MATH batik-1.9.orig/samples/batikBatik.svg0000644000175000017500000004125513063003323017170 0ustar mans0954mans0954 batik-1.9.orig/samples/extensions/0000755000175000017500000000000013153020772016601 5ustar mans0954mans0954batik-1.9.orig/samples/extensions/histogramNormalization.jpg0000644000175000017500000012445013063003310024042 0ustar mans0954mans0954JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!G~IP=5=4{SSф7#c댔G,QK ʸ#*^旭 \"2|;8 us)럭j2 J, =+N@g8w$aR#㿧S`W.rAjuLJ˖ͮ]I["HثʲSLr2ߍJ3SN5/^s#Y+TlVRѸx;^<)*Ak7=\y\euv]8u^Oxmv~ I D35,G_qwJJiٟ;v7|*0t=jr-R{RެQސ11HO4i8HsHc>sҀ!ojTX^sڱ{b7XZ7aSo? FjU e`pjt9qVdw5P5RFOr=wis 9=EOMudhMIdT+03R;e9T!5,rlGZiZb,~O&g=)$Q`T(d =8o­ ?#N{fKv Wkp3W5pW%#6 )+H,aу))gJZܘ7F>f _"RsN 6xҗ4Q;YP+\{Tۉ+ o7V2JROaӇ9#$uS^%+v4Qr4֌O&FV eUL, i!CxTIewq]$"mI_Qꧭz|Z՝ ĥ)T. heO u1k&{gP{7mN[B6޽Rf̄#!ֶ7杊ni~w2t&yi !Hii M87!#4 {Քb~a~b7[D2Ҧx㚛ք6M wQR dg\)bj"?rwhکFRb 'O"i FELfGqژ棗%&*;CYJjXOjDL6oԏjd[J*2: Na wA"UͲWNxGZõS$inzމhV8OzntaBPg/#WFG;;rMek4d0kV8~\}j=y'#ڛ)26N;S㕗T1{^"ZE;~j kӏqQEG]s_6`ێ(+Ȳ"+|{r9\\I  c˘dqD@E!qVvj!O,*#MoȳPGQUe}oHe#𦚐X^7܀2~Y}?\$c|GgҢI1<ZF3}b^ds$Oҵ؊X ,%7'f+G2+:ԑ*8!"y`>^20xTdS\ Jy|9AFuJZ7BqaH"[pSG=:7@Fk5֓5Mvsb`bRb82яJ3KHb;sJy<J_'z@!L=OZ5HݼWnLUvfpǭDШ>lZ01V͑,@ME qRdJ 8SbxAyV#X*q/x u?CZ-Ni?.94zaM4Maw7N/B&2}jg \T3SI5$}Evѿ|Qe *d~5UU{ P6VFʲ{Xk&5WM]9ea jE26zԔ1}\2c櫅=qED:L]J7\c>Ҫ$WJR3 i3XӖRL;b±{Zz;D85>i 5mL+|Բ$o1;k>f),1Eitd8bB$fHv:uB(1OӆCޡ_,H>Ƶ6PS.4U$0?vQj9緵uj[e¿( wQMYfӺ3$BU҉p,3ר>Ft!q8YqԤU gzbV2Z޷Az84t"LQ) w)4R瞔%'JO'"EM`VP~ s2JnW?ӁO^jS\2Zd&3t&݁$4{V, Te_njÓW f9楡W~j(<zUv)a;x'&L z {U-8y}5, op5GICRRD.TjK˘?#h RB#8 Cn8+7KR4zvwq]G*ORycǥMd{LMW2 o a\u([6vw`X8 Oc9 X[ҭ2Z6rF~z6x hh߈Uvh$P(nؤQceAVTKDJdl}jLU&dG/fuϥK6I+U-5JN:$*'0RuW1uk8bngwⰉ=—L҃LQZJ) \⒔Ĥ=)M4GzOEk'UO>h:,\L,_wEϭE6T"գ66`/֪y~O[w*{Yʑ*Vveצ=*;DpܭG`v q1&7\I7PEvXH 2fӍT v[& B;dsM+bX^yʆG,U6āQң;Tm%;SЭ[(X]@)N&Ume_ɣ$QMoFA.>>H {AavdAvi=AYvf?j>Dkc܅蠮\iqs"ƩGz/5KSO&?OSn+c*~yߕVٮ29\Di֘ߝ;rPۭFM Ne#ޮmҦɃTQzץZ1TМ%ӕUnPzثVǖ̍Yb#,=Ė2ں-Y?UP:ș85 Ygb);iE ` jdtJ*^!|!zҴ-D[sϽgPsڐ\Aqrp )rGaҥe[qɣ{2b9Ԑʥ20Pw[*Bci[悄N&lg Ee4f$IԂ>ZLz8%koW# -~Zr"աcUIT!R>DU(D`dUGaOpRsN@hhŤ"HbfZwSHhi3N4ڐփIPƈYD>aVEbn"#ޒ.q3dgO`qڑj /ʿZޭd\*[-eY|QCu{wU=*ffb0*doqnyL@${-C]d+b3;1VM=f{ɕNῄWqD~@}jŏX^ :EcP'u9V*I >K@kvinWd{?yӌOQiINI+#휒A+ZF#$O& =mWM`_$~l|Vtynx2l3-9# q YvO@=jä>0GaңPn;໲ h{8{&^3u+; dո^XtpuNC3M9NiNX[+U± >:c;n۔GcZ)w"Q^^,ǐv;LQZ:҃I(H=8ii) 3HF(Ͻ iN?4;GZF?))Oaǝ֬=bnOz9Sb9 *XfZ1rj m#i|U?¯`le- m]NRJ³슂 I3UY4V<ƍ`kE\X !0+B&PKdqPy֢͑ U: hb'yjtMUdV%Lte(6[$O<<(԰{f0CcZ#9lfңa.)*L#<ԭL"ڣ~T .=U઱}VPqX3tZ9$U>Jĝ Ypx>IEͫ`  )5fl Vd9 4Rd Jօ!9UvO54raGKCLCQ{Uqڲw81NXfw?Z.6j[Sbxta\aApjEŘ*1SM{aq$ǥ\[|sY\(\$0qLXHJЁG/=+tNF+lsI(':ZbH t=)s1cHi m%)> )$8?ܤHYKJzV7B@}m3N9<:" qKF(Sޒ.~aZd1ܪ}j8֩֫cmMefBsڴ.!lV~;5w5(柴1>A<2N9o蝙 023֨*{U kHҳ5Cq>b9 `ޫBr0}jŽpN@^'ފNris]h`)i)z!i{SsZCFx#! g44LKIHh;?i@)=VsPB>cX&,짞?<@ɣLy9A?Flm;gj**[KrA*gxqll8Ⱙ=qV#.GYNMO;XIYvzygrjjx*c#b)O<S:V$lj"9FiӀH=覄C\{Ո8~E@-Z2w [ظ8j* UO|.CC+*͹`g<\j&r3ڙj4޵lU[W_*/Qy*U9AYbAVH2Z:EWnߕ բYLU+R ES1T! Y*;;`p=Ni:V"JA4sPi9ptZNgQH~ ړ?/Ji1{H(cGrH>U`Nv6ST(|}iV}RGI#}jh-R%/D>~~DϭQZc n$.=T:>fS eUlkM&Ugu!fM->KRߧ |--ȿ湋)T9k%}C}kyen= 3}}M& G(Oq>c&O YJ~{a9d~UgҊl8g1_V 'L*UgiԊvCB(t;{wp#ğZAD05fϜZVmQTJK)zSRaM>?).)x57зY=*x1E2{c pRC\V"FcޘO<Ԯ:F=CrS.`~3G@V\AYSZ M[JKsW",)۟Bf^[8sT Ҷu4jY9hU"GK `U48|ƔQE4- å (IZZ)4=9404{HM!i2sAE u(2بn:֬(GZbt"dVoʅҜ SXϥ,`P TD1/[tHGT|H=3TcǶfqS5t82\UdeQpU#We1gnW"ÑSWH rd߇( EGVj<7qψ=,󏫷WzOzTVU_؏`K r*5=j+8횞*\ަ|Cܵh:PcVqAv%h/HVsȪD⫶jH>USֵ9ȨzۭG?.:҂{E[J֝t>Eozt6кBuztSCTгn`b:d)Y1u#1T}b*,c)@{JyQP&Ppf+r*x$ֱj,Z+TlBu4$n88+fqYsZHn+:U3|5FbE>$"/R4Rk@Mx:ԀA94i)SM?!)}@:pSQ->:*FG5:eF}(oJA:}J|GQ$?EY,}8fAWxlF;asOz%9LI\[s&h6M?nE[]*'-,5jM֝3=MghL/~Xd$ >K9tFVOƺ𸍎|4Tf52|H>+ m}^#ޙ!e\qʟξV[yGS؃+fy-бھXTiV60^SHq;⤉'Lr>ډnطp*d.P|ߥB=*hcxuJ#X}1Vdw֪7j?lbEF<f <Ҋm;☙ GcP*>=J4ŸՊ/ҫrs⮑ߊ*ʧVÞ늱*푇"aYwq49D}+;G.5'{KҢ cS8}S\WXݏJ0yɑTlrU0Jc_CïˑH"x3]l7GN >aV ,ȎMd1浢 &ƶ[rj-H^T u7z8ni)ړ 44ҞiJCM;4i LhP1\S$??N53بnON*P*(~O`nY R펃jtS0&Ixo P})b\Jȫ"ȳqڹ!~;k({";dv06v ?m| R4ۓ ɼ}37={rnvw \rWv6N;_|F:ԟ̊z; |O-`M@0O_kwom/E8noГU/vZSLa~ ..? #Z=;b/ҡ>4\Q&yULz&2U>v=5J[=cS"(Fi} (Jݫl3 cTL<SmV# flMU؈##jcKE;'5]\\MP* LiLS+) z߆)|ˀk/[b7MBVg\,у"Qդ CED1JzR]Qc[.P Wv5 iv V, 70+Օ-ۏ?J͹R0(yTLOQZE**V#N9(AF qR )!qMyϵ(9 /4M=i C4ӽM=htP>5 {Or_s5 5(blYQS!\⤃>rՒK0+??/[Dб +i;ȤAKHl]Y i\ QJOok]="c@w?#UaȬ9pgKnp1^#ĺn|\״rv׃N_1}_hb9#/ ')m[qS_C|'H);ڣRM GbGUye"v楊N8SzSCІKryLhi kE>T*dZFx2B{8IHZB)4ȠqT*#MLօS'YăҴ!*IYXиZpit0^AҺ[}<]::]]9%Lt[HNw-s`HzsZ%c+q`Ӣ2jYF*<`>l__[[`HH\u5OO[,_tV$t.=͚no0I<԰"@s?*Ģh<8NTzֱ2OS 2?P ❊MHa4ނi JFKHzP))O'=PߩN;gܱr)5ltsۊn* x)d,'  ԰ތՒ3p~܀ڌ 8^TW5p1}BgFUԔCxU$gXU_sZkMȤ#B[YF9O<5g?C^vs\x2ѯnQp,<= *PcS^sSO5m0Fk_c 7+F0J=5v2iҗ4b#?4iw(q#˞85_] >".QO~Uwq[4fqX.s[HW7Lʭ!7}r/,* #կ3QHǕ9?X؋\c{T8Wq=jբaaʣ՚AY'_Zc:[#KosV R[Dw |Y6ci'{v ~cϾ 59#]oom4.aRߐ?ָFQ^杬vM}[>ya"q+>^Mzkυ~!Lo#[МoM~*s:Kz~dj<榽9(} ZqGb?>=@9RģxO֢喎*hs5_:%!NG5HObrAT \1 ug޵0 ksޛӛڛhy5R: V:ZRqrs޺ knֹ59kpu<-s{ic4F5MКP>(4΁PUb=:=Zf MH=k1$䚼e20$5A9-XTLz 3T7.ִRgJ[ *p:MGA$U8*Ƒv8D~c܌D=Rt<`S=*1܏=DKlgd1ڟ}+Oe_'$:±neDq&1պ?ҵ nm5bf2*+ʑV2o80áiz enn7bٛ809iAj5u8 CO$L{FKnS)`{`d^ЗOHw֘Y^E54nM2sҍӸa{Ruj3@Fڡ^;o@繥28`@"c#ԕ]AK4bhOQÂ8#EBѩw%eccWqk_jɽc "nWpOct ]V5p(~qV !#rGJ+cwF.GSZvqY )pqYN%R&p$+FҨ+ m|gOcY^ܡX˧jr[L R8#mc3]什?:|H!`%Ff29ҵ/b=9̌✶3EgP2&sc eD5уST+X`RE OZlmfk{]وu4F=>8dR˯MX-d&ҟGԼag#c;]XeEY*5"+<ܮF*f\v]gU$銼sT֦e@ZPC uQjR~*B("(+CRQQRͳzD(oNҚ۠8LD4J!koeӼkr'o8-.Om=ʳ-DZYҹ8j&6Ʃ\>ރ5MI\" qU< ͻ-1rC1R* D9U>jߘ,..$+~_'%gёgs*̞D~bp*[n6 3=;Sqn.jhE*?h[w[:Tj6x4L)"1R/P}*H84,uikcWETC$Rbr*>Qnv[ݯӚs&DJ]fU Z]$BG8*H8qG]|9i- Yfe1rG\IYIǡɜi~aSj6Oi'X2GbpHUӖ,ҎSs"Jt<8sOE^;_YV%$X[Of|}*/19Zؕ|d})ٽ[;4JY:UQQ'Ծ!Cw9MUx sͻiM੠Ωa{s2F'W v?t[澚[YimQ kt[+)Uʟ^â|S ydPd%u- M4xf9F*AzU5+[syM){f\IlX}'ps]p2Jfk9~z՟FɪÆ~XUu 86-rU?\ Kҫ+6*? YW:2(jU]61š 76yFekOH.GU Qy ̡݇Ģ+s9ӄ iZYQ s>g{z֡ ^8 Ą;s?fve1CVIW b*iܷ x50$UsSRh#v;TMŇ<=HTaȑ2%K?*)P涤VyLS>VbM "Osj̖ 1'SU2KBHYqq]C{F{!q VU}j5%^PzUQWcާ?3ثDmGBJm7_NtIŕd=˰9'0* #!19Zҵ 9QUeVƉPVޝf:<2M-3AOh+.688mE' )V3sftitkGu"FS#θ4~|4JHO*zY]s y5{ 0SXHՔQoFpHe,<zo66Zk MXoJpZ6`pU xBijJHLmןNmnis.q+˔;N\Ƞ|sIVe6FMij }G\qZ@<:URQaҴu I ̂RĀH6>BǒA`lcqmrV[Ak9d{TOqbm2(sZ?vk'O"[~54rOC$O4(⧅\7'1ad,D]%rx8I̩g3'N 1hV5BMBIxwړl,'Y][K?C\v>_irmh#WO!M 7ۇh/ֵKMc5EjQn.[OarhqVFymklXTPC/afa08DΉ|A')I)܀2N9SյMVy$8R3XIAiNnH,Wf2y#^37?6qZn{}ymo,ZFO- U\QN ]{w5i1j?Zqi\aUxfIT=+9S-C*8>==+6l(rLA1P ?zBd Ǡ5Kn1Me"G_sڇ'GWdVu:w zyڽԶ 93Ϩ}#9l7Vܧv)N* ?A[7uVRfX擒1v~tKXT4 Im5v$g*ު"[H<#Uk9򫌉>nX4˸'׌Ccl4>݆PO&a fZ֯o|OC09Ckּeh>pJf눞P2@8= yv{sm6> QҟA'"՝æjXU56f']& *CP(Kg]x鶗0\i4F<ʸ1>\LapqU~Qzs֦;sŶ8f &bI?bA pT}+z1TcȫVTV;)GҬFʨfךسT5p(@qdd{f(^YV^q ONqTE[Z`B>g돠`r*A9"iwEq4 8ދ`}F{\'㿹iVIu̍`'p+g-64J٭a~OS~~iUMgyJFJ}`U{'󦥡-2ny $JVqj&3HF\c󣘥՚e/F45^"8HTZD2er'=驜;˓:RD!\ĶִiWxW|7; V\oDRZa*c1Œ)Aϯj2Nh4uNh⨒Μ?,嘚]bBYD Or&Ue+ߠY-ҋNj7ǭKzlS6zBFG)*D;295]~iA#WU|)> 7D6JIdȨrd$B_k(7ZVU }hSs^Lfn焒ǭvbޔqopDnA٩_04ySVŅSHm#rҲ !YU6?Z\wuե=5]zsWbl2ہ j|֘*Bx$ A/cT5YqoYjW?{$rP ,sݖo>)eVsWC?1qlkH֏ȜVRWCGFK]wz(w[?#$oj+*—Wl2?Hd #YO_euˈ\Ү.N8g95FXV|\gܔEZΩhrdjH=! 8@qx%@ Rٔcs@\;q d;aɩHÇ:gvGahz~ۋ+=JXĿef\G8 J㥊H&)Q# #"'\c]mگ@?c(QDŏ裯`]qcAja 5ЅJ"vջsT=j ˪pEX<5P1p#+ӣEǠY8f8 ͦhI%w|2A)(}Lґ0XKAMujC\@@@;F"!-~gJM=J:ɨP٠XC+ 5𯂣oRe ~WIqs2;IUozE=#)_S] smt ՠdspDqԏ~5eqeu 9`pkپO3g|jEcԣ`Y2;-6 YVANq+dQ*}H~P)X|I)&CI)un$8Q 'FܓD ,Σ5|..đ]o)A\kO+Qޣp/(6(8'I}*[ B^ZnKS#6Upa?W]\x=NCۻ2 ړz:?0E  Gj렶@Z cGZy/"yi{#תjW3v0,-J'+j`k2C[:Sz*:{ G`POK.nQڦ6Ϩ\<3V\X̶82W0Mr ƒڷtAj"T>}?i|22 Yb\uB*c+T"<<]ūvV?3?\BNxlsrN{VԮDa:ϸ?hV}؀kiL7Њ-}EQ hYsà[6z+۰Jͻv0$U|g>uF1.iZK0\7fnOl2iu-,Nc}RƅI_IXbrOJ E'#=}R20e=3X6\f%J4&AN:jkx+Qgxh{!?yc=kHK8Q#$UқQnRVb?0'5[faEJؼxLx5209hg6+a5Vk)K5- y7[6;FF+./2>TkOgyHI k,ߨZPy%MI= WˌaMsB:mPN@ >1: Nn կ8ӹcnJj`3{ȄHt'7jElSWwoéuHu\z83 o/"36)%#f^9}ZW476F~޵ׅ֩Si<:ݦ0mkł܍Ǩ5RFO = 6HRs֒9w#ޠ#$^g qZv3Y[`k~H91PFV%w5IGi k)g2ڌ،~R.s+b+> Y+%tXHJ8VR:k<Dq2e[Emi0jmL"bS]Εݣ:IN7-l2Ṵ tDdQ2wz唝w/o >6 Krz3y3F!G^a)fj֤`ᇥYz<5Z$O*qXn"ƾlc4M v uR8}j/vH!󩵉LuQ\X3O?ʭxPMKSQ%us(Wf;߈hHn4АX"e&̃!FX{Z[jp}c>Cr5< hvH==>rѸǾkm-CO`j٫($udS.1֒F)ر>£mQ_>8ߍ{ةqj̵8yPLӧ G֧!q[=VKNs@'4MSX-Kr3֫FNwJ>R)HVQnȁ;R!)oVjR7 )%I0=z; 6H< JIaZD# 'cW63^GTj7_gP\Սv m>3J\=GiQ'}̎>?JL~"|T⠄ڧ=*ѫ: xV54C-7U@2qqUd@F|dfWZQ_ΰ>j{MvɽBkt8-+kG>Esۖfz3k5u[18{S(Q"cks"G'(rO=Pmv֠:LT`}P̈́#+6"s~kTƪQT+ILƧqN:!}j{ M֯yæ*>O:ʀO~jYF}N7cB# O;zfFΧ)Ϫ I,Ac(ϢXP)pAЩߚձ ͣ# 9e[=)/[It<>p:9)s&G.W>drҭF 0p3RQk@Ͽ5u>|ѓUTsDx~ m#8TgU*.:{HHTXu[ЮdŜqN OrL䑀=:C@*082(&2VczU{JګؘUEZl=Tjm\ؼ̏}iYH֠vGZ*s4&b0F*uG5ynU#hu2+soW}KCE>8nTQϟ%3O#Mnaԭ~2coPj4*k*;s͑rTVH"(zRɧEc7]46zpzKpyzV~9ekIA HEJ&G}Zk1ź;h*Ԭ;1c?vI+0k>Gk`m#^W?5~1ўO pj/ӵJO5dbƫe~M"iz{c\>*RyJȶiil >!߆\R>y֖I gxͨ@OՉ? k$BZT?ڗ}qN36 o%p~/ZwkZ<>Q^eK#{mEY??\|?k}7#ґI4Ȓ7DOH\~YǓ|F?nn";-)%f 5bAgt*nt=fI`k Q ~*݇;WacMǷzN8kxK`6۠qM_=p}1BwcJNeʸS~A*?VecVjHz(da~_QoXGdb^ UA4m@#ֶ: VwccZHVo/p4h:(4~@iMo TW#SQ3 V%nPVfE䮋ޔrGUb|U|qIX ^ew/kuo`V[[3NY][k ('0NX0oY`u!I?֪;AV U9OTRs/s T-Hi(4t!KuoqU"?'V·?T#XKsdːOҬt:Uˊ@a`:ǎžڱlQ*rj6h6NzR*M\Hʶ{Qj@x4)je8GuB7azVW\h2e9/q]zצVi]tB3w;q5X^ AE$>[v:UNmqY8{Ѕ6ƫ9lh-R 7 6OJn(&^M$KpUZi1nغnkB@MN߀|<֣r{3X* l x7T\*ǂfӾmF+Mfr:e`:gI\C\j.oG6;O^unK.mʧpTַ|Wz7PZY]]\ve+)c8j[} :ӇDy@eTR`lT1 8)c88cҰY TmHvd8{VCsңnv`ELsҕɔODhTExslc)u?7n+%_޿}Li}F0O)^R sVD Zw/W1ںֱ8>;}*7.4mbLAuڦ,\vBގ9+kK9r!",O T@PI$N$$ևEgs$4Β^JdS#D^rIw˦H#2n(mHI&Gʿ\Ԇ)EA޻BaHvN\ԫa@g ;܎#Zwm3G5f!RSk(69kR/&oe7nߕ&CJhA-'HnAdCµS__ƶH99*Z{dޮ.(6SV`q6H;5f~5Et,˙7Td2:Wg?? Iₑ7j"v5kp+sFŦ-+ w$2X?Z2f-!kc#;oEE/tޤ=IYntb|=v TPʥ.G?oJC]H.+ 5"wqlJ܎-|JrIYYvnll&+q,gB?a[J,Ni9 t.^,BXվht_4nmn=21\|*¹Ie$N :2dڃh魤Ki!9X$L7 HNwHspkuofp.'޿qs7CYL#M&\F#j үjuў뉪X1)iqY5mZmU݈xo'Hl*}XW0%rdcJ޹ ,|dwGOAL}VW9I# 63֢qED4GUSi tMۊs>VrqC%Ur zL[b8m?v ? 1- ׾^s"lr>lUcòiiq[#"n&sLZڜ? {GbM9A,`6rJHL7waӁZ0w-=*U좹Wo榝E 5rpL} -4ҢSHڷlꏱg`Nba @7WF[TGi#q\3y2 ~^?M{+"ݱң-S'΃y8n"8 Fc:gkg$9W=@朞5 ̈́Ջc]OSqMm`Է$1YVAC,>X]V2G?y{k,V&UUY_{})!Y{KUnwUy"cTMʑ]Qg<̉m>N /'ښNS-mdN8#ҭYożru :ݏZ8bd]Emwڠ#V$rxxﭭg 'H79&rM 5,@UQOn*Έjk "rb&AӶziڣOhi$6#lL=N8nq ֺ[ޝ^ H.EPP~yqmQep{. '~^5rM>CS偂>a{յaE0̡rvAWbf5 M;<[u dPvakٖ9xب`J< 'YH,e28'/[AA׍W10npGdf$x*Y+{HIH!7 YZD!0'ҷPdsjMJU dx›\ krɤ1Ǹnu]Gsh5)Ṏ#r2 q ̼U2 u{AV>LJ,j djJi-|Gd RVڹ3=(㩟i7%ӵw$S^A+Z]5 g>5櫐fR95{5@K7W=;NI59qw% -/LȃVǥXwGϊ10, j÷ W6:^^oČ1WI6Mid.fo1Xرl9UYzqWb' W -9R|G#RV,*no x=M'U\cjȕ4G1¦fҥL95KCCUH{ J.h +5Z3đȟ\g#TEL*9!؃PG3o O׊V~!U95cbgʪbb v;zf$Ew3qllDp-`g-W\'xjrdjEq3Q.)ʤkgӢmOjT$ewoci[KYOnyS؎'ץrQ6`IPᑃ©M]X"d/pQ??qz_N? H^`*)bVW®:{I)$'uE\nȣvϵ63ԷycJD-IYy<H /VW D3WLԮtFPpA5DnbĹ˳14?B* G zqT5k4qF188xjaaIoֻ3K&.-)<1\=gT] lUP^Xۡ&{] mOcySv$uڵIVN?W2z hWt *r1T(~G?p4 `H)WI4)U S ><ՕCФ:; D g4>:#=c<՝xVg"a10~=}zS7v1UNKyФ9ÃHM F(zjc$H*' JNUO{S3N 뚊7ܩ5=6؊]*uAY]QRB^vڶv1+R{T S+gғEzBjGrFn EsC5FN)ؖ>i[r+wQcV-hzv2o7Q `+kŨ^[Y]Kq8cúwCq?|gV/2wdM&O h=skJ(̸4dMӭs+']].뚞շ[v-MhpONh3{b-X`}Fyf#Mѐ@9v0I'ɷ@=ȋw:UǙȉ$,k3wzZIťom9'I]nOԁ3éQ5 7ټ]8$fM"_+s 1Jkֺ(B3dW?yl +C3ԎAMSNկ^YI ~n@pĜqZ6Zb'͇# ?@qֆ CspH-h#(H?^O;T pvp8'A{ͭMuvy՘!=]I3I!'5/髾fzO<7gz6-oa!йvY3$=!|V́]]|5[2'XĪ|$apkk*GV| i2rV5<;p(T<0T;Mjb3!rTfQz9kkQDotgR&V=qڱ Kk zi*Z+A9R>SPĨiڌ[S[+P&O\G@)hfu^d}TmAh^Jgo2G`quURK-d̒0s֫YKS~|zWxCғAҦC^ZAG9=+6cWLոLAHx+U/b4{֨|dM]ɶ9'DlV`m:o#<>bP8%BkW,:n8VoM-.!$Gk+X{iE3*3˩2#H584jM ُ+'YT·梴T~ݣz%8= U9'$U9AW J 2AT)A4$hMlpÕA# 8JQk麓$q;Ewlhu&;+eN:7ZecRTqceǺzU޾G̘JrGo{Y%F+"T*ǎu ?Q#$ tR|zQZw\c}[෶KxJq&<~YŨ-0 1]gE 7ҥhhEluC*]S} 'IP%HyjFi% w%2w::WC&q6y_&.OO]ϓ@FQI ,A\gQ}KJǡxvoOcXa'`%8ѯGْUsݜW-!NjRi?9E89AB{ x,S=j%Nz⨶#b-bs]o upȪ}?5/tTw9x7d9QN(sq6iЙbߞCdU9y"܀iWpjhj.p=~^O&τ.y$H cj#qIOޱNܒymp}Q^5֭]6g# ZU8w= ylK<yqim,9h6`5z Cfh."hNGskҾ!xq4};Y-@ :^w"]1?*2&PA\֞tzZiUSUݑx ]D 3 TLo2prq׮~9pX*3Q.)N:4.>~tOT*?tx;~S.lN*uQQ;b=RΉJUz?DIC~OGz,wQy1߭RS90wv~o1R2A*Gkdq\iimty W$~Cj ugSDSm줺Y\qZ"!˫FU' +7ʵ/'ʀq"E~KnךQ6c$T,*;`"YTGlsSM]jApKv9XsIM q'ټEK*@I'ʸ* _C6Cpq]޸m.~-G5AǡQ"ORǯW;ZXo8/T tܽE'~=p>K=6/HX]J:Hv܍V^y,$,GnU} ߴj^RXz[HE?*W4$q°LVrvN14JAsZHlC^:tS:Ϧ@j~: ߶w%a,Lbsd^gĝGGկFi)|÷dc Bμxc+l!Me'gWbG:K($[+CB&#T+#Du: |/lI8DιcMFdh|~Ehg{ܩ%ʘުfHzA8 ZSK!ۧLR@d0zj{[?>v..:tZܛjTWj)k˭6Ÿ@,.W0`jz :4w23#޳Ih|n{VC'Ӟ pOZNL["j~||Z|Wc2q#nN\^_e""{X̱7;'MhTڍ̽*P clviҏBEtOo{u4s#@U|ubK]ۮORX!I xWn$*$HL<VFz׊ ,DQ9o]M7K[Ct [ByU\nV. u=L:fQH7 𮓡uZLR0>|CΚHȲvP !߭b]xL L1\2xǯz6NGWk{KQ+MnR[y hOcLטGFg+CĐI j/-V+ۏ )uXvV]i 5hd-c֔2LibPGq H RUۑc-"n{k`+#]̚+nhIAǕJ }#zMu,VY*_$qDIݜIm UFXhm/WE# "6:UcbnSFPyϥ NO5I'lsɭ; iR_y?,?JNjPk/\ /|mܺAuLz7M>ixXX<젌p?5ur# h$~B=qN/>º{X̮NgAZZPm!rF;(h+qߦh181a;p…/%}ez~ti!\z"9H?Q &'N;W3"ٓ#u3Gjs Po]՝Φ0ǃ4&# r.,{b3:}3YRj1g޵D>~ΏkDgʖ~8ST5@'[|zVU{ w%/&v7X\e,Dkg*k(WQaK*2{aG敪ǤJ9X#pNO?PRzVXnDבCIğIa /קG=c0T\I5ZR0׽5 ːQY%|e>DxG\+UX%ʆd[8?+|R2IP`jwj\62[9_{W"(rOȬՍI>a['f^ 'u_) [ɂFNЧҪHR،m [$zdx}QAw5uE* =~ %΂iL[˞RTt')ռs) '[-ixI~s;sפM]ClN2DJ+vh-M ML9Q6JV Z)Yec]޻{HY܆iAE^4Ťy=kH+-DDKS|`$.zU'^\д7E(?{+a{ KM;Dd3]ͲVbsGx,lwnxcXu[QslHm}rW-.75_BmGld#@0+>g⫣#*ig=wqZ,ŕ4H]X2J00NyZm6H"h牌LZqK~B5BCiE?j[-RrV=þ!V\[s_8 W\6G\4+OMK ^our k*ƽY5kZߪʱe*>`~˫:w~@EϠ>sLe%%vfVzMSHp{1MCz@s0C-6N}5n]r{.+O2^X dzP߲'nxʊbrz#1*헌u:R6;U2}x9c:kwZbwO4՜Ó]`I.>7 * Sxۂ(ZlKԏĺȓrjwzzY]JyY.nij񎂚CeGMdPݘM2F/Lݐ(|;*g&[4|XHVx֍mc{#%O8*6n0yڡm !乶:3KuPa)/Cl[[Թ ֏dDD>5ƭpIb;>[Q;c=זa˜A5ҥlw M;iZMd8Qփ3ڬzJVL馒ZƧ곛K`HEEY3*}<~Kӑ Fkϴ}`H*dhYxbl}{36,Ӧig<q؎Er2˒VG")bO\S kLi/9VY8=Ջl\v0=STў.( 3pMI1P;,m3}M<3)#=h$Nn9q:VPҁؑ 2b91 $^|ȳ Ѐ-$G"a9PzDaϽ.>jEiAURۉ'4m9484 ?3j W]w|#: %ӚC՝J4Hyƕ̤wNf~c)<`sM;`')m4 #lT(9TM96kxkcc9>uᐎ:g㨬ۈ3;"U?1^c$䅏=dFbLڠa}n3WOg.v+FFi=v.2Ir~c Nk+8bC`s{V~^I^ɸo2=6l1UTW< Gu=6šzȭXeyo1 =OEM V /"2x"o$qd.+|![D3Zj]&lM)h\0Z&wxblc2x$ʹvʍ1o(z|?xnAkŴW3('r+ &n͎Igu- `zѦwV7ixWFqJ@rqֻ#$LjΌ`a^4̍ԬmIH[LI 䊳\|"2MW#%bĖOgR=jH搀pۑ$1LS;ѨX<~a*Pr1ڠQN=@0ϘsӊV-H>#'{sԋ@HR;c/\-2K!#C0$dI%`#92` b*i cO9W,D@R+J8RL!4qI8c֠p(Dr"U~ۖ@z}FArFv'րFLAWXl?ʨUp;q@?`[$[MEAt̸ ؚupbpKvP?ƣ'̓0*3pa k\>ªZ5 ,ą 4`*L5 f=`iߠsLg5Cе,#UwQX4M v-@¤.0zT1!?wJLW<.iq-9QMxT #MB2y=x wv4/B>pI3a48GbŭkNM:X!6²uZןm;M>WQҭE;G]j;u0A+ψ/?Ab\W7L~B瑣5#̞g9bI$9Zt y$`w+ɀ#VnH)]sQxe~NqQe";9r>lx'5Ӱ|,~[<px'ӕ;IJ9{hvwèO˦jc?:W"? J~b3#5inj?GtkOMɷVf-:[:N[d\N%E_FnLJ\| r83ic+KcE pm_cB;Ir+o5s~#KZIm%xȇ33DkS(ҍ]?.uXņr8+Z[O _d$Kn0?ڸ; `K<04zy*_N@\~RhGc\<Nkҵi̞D;Q%nQ~0M8tCCUFzٞN?,am۱Ȍc91OXaZ9=ii*pԞcFM4iUX(ǜO3<FQE!Ҝ'c9SH ĬJ. lj4͸a $FUqQ4ޜR4avN@(-nl sl.hk0?ҫ0s瞴rWԌI3De$4SDc4¤i8 bD9܄P#2s4iҴrn,#ڣڀy? 㨤qRa{6;f2F'?JvIc4N6/|*82gx❅rM\u })圎))a KH1֞gwZXNq֞б3(ց\oʀ5 \__0 ~ÎO9a 9"K嶈 #gqzVjLyUx@ہ+ yk5)d}n2=C̗Cln|`V+xZmlIӜʄ(墶[s5RHyS@ 8*Q8ۍb<={kgKbACvϿmfJŽxg ֳRis_C064?aS gOè5 :1w;Y?܍W=`qm!? *mmGl7,.?1i7go*~ D4T/4Z/\|B~KEc)SN\ x[X`KF7-q*3TRy#Hco|SVF#ZVII湲wcI)b梄g?ZQ|h ?K7[NyVuQcGM?2ϭ!HN1A}k e!$'cy  zWAijE641$r+ڥ狃ٜ$KRd#q ~yH?2]+xeF3x_Z6zPV<0C\SQ@E&(V8jv9Aso 0,1vipš?S9,OީQx4F@uh8B4Gj/)Zm1C,Qygc,VQM8H.לA(ᛑe+)̾`VRqx54V27n\P~[IaD}Îךx[SOZ]]ȜȑOW7͠m܎;T)C$R4r##pAAfIcp>H&$4'S|a;F"vƬV|ףh wu; 6w3@g MfWGGO'ŸoNoOH&5J#~#G_һϞ :4yIӊGj0ڦY^(<[zcGе9tWc r# E ]0~D^$h1rD㒢-ܞ_`:Qq؆2]15l`iҸDkc xU@TO)N 4@Ҝ㡥>޴XW,ߥQA1@OO*ORLC)!=1KH88iحLZB)@K 0;zYv[7:qoc.J'+jF2v=Pӵ .Yq' ֖rl$uF,ȹp=CNu_ '<> d_hz}. #ƚ@%i#ΤfV o½ dWMbkv'#ްfSWo٬`_69a;]9 Regular Polygon Extension Tag Regular Polygon Extension Tag batik-1.9.orig/samples/extensions/gears.svg0000644000175000017500000000625713063003306020427 0ustar mans0954mans0954 Animated Stars Animation on a Custom Element Batik Rules! batik-1.9.orig/samples/extensions/flowTextAlign.svg0000644000175000017500000001614513063003306022112 0ustar mans0954mans0954 Test of Text vertical-align. Test of Text vertical-align Try top Try middle Try bottom Try top two lines Middle two lines Bottom two lines Try top two lines Middle two lines Bottom two lines Try top two lines Middle two lines Bottom two lines batik-1.9.orig/samples/extensions/colorSwitch.svg0000644000175000017500000001326613063003310021617 0ustar mans0954mans0954 Star Extension Tag Color Switch Paint Server batik-1.9.orig/samples/extensions/extension.css0000644000175000017500000000171413063003306021324 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ .title { font-family: Arial, Helvetica; font-size: 16; text-anchor: middle; } .legend { font-family: Arial, Helvetica; font-size: 10; text-anchor: middle; } batik-1.9.orig/samples/extensions/flowText.svg0000644000175000017500000001056013063003306021132 0ustar mans0954mans0954 Test of Text wrapping stuff. Test of Text wrapping stuff This is an ex­ample of a very long string that is split ‍across multi­ple lines via text wrap­ping. Now check if text wrapping handles a number of tricky situations: averylongrunonwordthatspansmultiplelineswithembeddedspanelements & super or sub scripts. Now we are just about to go to the next flow rect (note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here). I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets taller batik-1.9.orig/samples/extensions/xsl/0000755000175000017500000000000013153020772017407 5ustar mans0954mans0954batik-1.9.orig/samples/extensions/xsl/data.xsl0000644000175000017500000000621313063003306021044 0ustar mans0954mans0954 batik-1.9.orig/samples/extensions/xsl/nodata.xsl0000644000175000017500000000604613063003306021405 0ustar mans0954mans0954 batik-1.9.orig/samples/extensions/xsl/data.xml0000644000175000017500000000340413063003307021036 0ustar mans0954mans0954 batik-1.9.orig/samples/extensions/solidColor2.svg0000644000175000017500000001121213063003306021504 0ustar mans0954mans0954 Solid Color Test (Xlink> Solid Color Paint Server (Xlink) batik-1.9.orig/samples/extensions/histogramNormalization.svg0000644000175000017500000000773713063003306024076 0ustar mans0954mans0954 Histogram Normalization Extension Tag Histogram Normalization Extension Tag Before With Extension Extension not present batik-1.9.orig/samples/extensions/star.svg0000644000175000017500000000735013063003306020272 0ustar mans0954mans0954 Star Extension Tag Star Extension Tag batik-1.9.orig/samples/extensions/solidColor.svg0000644000175000017500000001116013063003310021417 0ustar mans0954mans0954 Solid Color Test Solid Color Paint Server batik-1.9.orig/batik-test-util/0000755000175000017500000000000013153020772015760 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/0000755000175000017500000000000013063003461016543 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/0000755000175000017500000000000013063003461017467 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/java/0000755000175000017500000000000013063003461020410 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/java/org/0000755000175000017500000000000013063003461021177 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/java/org/apache/0000755000175000017500000000000013063003461022420 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/java/org/apache/batik/0000755000175000017500000000000013063003461023512 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/main/java/org/apache/batik/util/0000755000175000017500000000000013063003461024467 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/0000755000175000017500000000000013063003461017522 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/java/0000755000175000017500000000000013063003461020443 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/java/org/0000755000175000017500000000000013063003461021232 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/java/org/apache/0000755000175000017500000000000013063003461022453 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/java/org/apache/batik/0000755000175000017500000000000013063003461023545 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/src/test/java/org/apache/batik/util/0000755000175000017500000000000013063003461024522 5ustar mans0954mans0954batik-1.9.orig/batik-test-util/pom.xml0000644000175000017500000000412313063004314017267 0ustar mans0954mans0954 4.0.0 batik-test-util ${project.groupId}:${project.artifactId} Batik Test Harness Utilities org.apache.xmlgraphics batik 1.9 ${project.groupId} batik-test ${project.version} junit junit ${junit.version} test src/main/resources ${basedir}/.. LICENSE NOTICE META-INF batik-1.9.orig/build.bat0000644000175000017500000000447213063003306014526 0ustar mans0954mans0954@echo off :: ---------------------------------------------------------------------------- :: :: Licensed to the Apache Software Foundation (ASF) under one or more :: contributor license agreements. See the NOTICE file distributed with :: this work for additional information regarding copyright ownership. :: The ASF licenses this file to You under the Apache License, Version 2.0 :: (the "License"); you may not use this file except in compliance with :: the License. You may obtain a copy of the License at :: :: http://www.apache.org/licenses/LICENSE-2.0 :: :: Unless required by applicable law or agreed to in writing, software :: distributed under the License is distributed on an "AS IS" BASIS, :: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. :: See the License for the specific language governing permissions and :: limitations under the License. :: :: build.bat - Win32 Build Script for Apache Batik :: :: $Id: build.bat 1775198 2016-12-20 03:21:58Z gadams $ :: ---------------------------------------------------------------------------- :: ----- Verify and Set Required Environment Variables ------------------------ if not "%JAVA_HOME%" == "" goto gotJavaHome echo You must set JAVA_HOME to point at your Java Development Kit installation goto cleanup :gotJavaHome if not "%ANT_HOME%" == "" goto gotAntHome :: ----- Set Up The Runtime Classpath ----------------------------------------- set CP="%JAVA_HOME%\lib\tools.jar";.\lib\build\ant-1.9.7.jar;.\lib\build\ant-launcher-1.9.7.jar;.\lib\build\crimson-1.1.3.jar :: If Forrest is present, add the ForrestBot dependency jars to the classpath. if "%FORREST_HOME%" == "" goto forrestNotPresent for %%f in ("%FORREST_HOME%\tools\forrestbot\lib\*.jar") do set CP=%CP%;"%%f" :forrestNotPresent :: ----- Execute The Requested Build ------------------------------------------ echo "%JAVA_HOME%\bin\java.exe" %ANT_OPTS% -classpath %CP% org.apache.tools.ant.Main -emacs -Dant.home=. %1 -Dargs="%2 %3 %4 %5 %6 %7 %8 %9" "%JAVA_HOME%\bin\java.exe" %ANT_OPTS% -classpath %CP% org.apache.tools.ant.Main -emacs -Dant.home=. %1 -Dargs="%2 %3 %4 %5 %6 %7 %8 %9" :: ----- Cleanup the environment ---------------------------------------------- goto cleanup :gotAntHome call ant -Dargs="%2 %3 %4 %5 %6 %7 %8 %9" %1 goto cleanup :cleanup set CP= batik-1.9.orig/batik-codec/0000755000175000017500000000000013153020772015103 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/0000755000175000017500000000000013063003441015664 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/0000755000175000017500000000000013063003442016611 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/0000755000175000017500000000000013063003442020623 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/0000755000175000017500000000000013063003442021412 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/0000755000175000017500000000000013063003442022633 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/0000755000175000017500000000000013063003442023725 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/ext/0000755000175000017500000000000013063003442024525 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/ext/awt/0000755000175000017500000000000013063003442025320 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/ext/awt/image/0000755000175000017500000000000013063003442026402 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/ext/awt/image/codec/0000755000175000017500000000000013153020772027464 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/org/apache/batik/ext/awt/image/codec/properties0000644000175000017500000000000013063003442031564 0ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/META-INF/0000755000175000017500000000000013063003442021763 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/resources/META-INF/services/0000755000175000017500000000000013153020772023613 5ustar mans0954mans0954././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/resources/META-INF/services/org.apache.batik.ext.awt.image.spi.ImageWriterbatik-1.9.orig/batik-codec/src/main/resources/META-INF/services/org.apache.batik.ext.awt.image.spi.I0000644000175000017500000000306413063003443032270 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This file registers PNG and JPEG writer classes. # # $Id: org.apache.batik.ext.awt.image.spi.ImageWriter 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- # NOTE: the "codec" package is deprecated, there entries are kept here for compatibility with older JVM versions # (uses "sun.image", which is only supported in Sun Java implementations and was retired in JDK 7) #org.apache.batik.ext.awt.image.codec.png.PNGImageWriter org.apache.batik.ext.awt.image.codec.imageio.ImageIOPNGImageWriter org.apache.batik.ext.awt.image.codec.imageio.ImageIOTIFFImageWriter org.apache.batik.ext.awt.image.codec.imageio.ImageIOJPEGImageWriter ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/resources/META-INF/services/org.apache.batik.ext.awt.image.spi.RegistryEntrybatik-1.9.orig/batik-codec/src/main/resources/META-INF/services/org.apache.batik.ext.awt.image.spi.R0000644000175000017500000000307013063003443032276 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This file registers PNG and JPEG codecs. # # $Id: org.apache.batik.ext.awt.image.spi.RegistryEntry 1739282 2016-04-15 11:16:16Z ssteiner $ # ----------------------------------------------------------------------------- # NOTE: the "codec" package is deprecated, there entries are kept here for compatibility with older JVM versions # (uses "sun.image", which is only supported in Sun Java implementations and was retired in JDK 7) #org.apache.batik.ext.awt.image.codec.png.PNGRegistryEntry org.apache.batik.ext.awt.image.codec.imageio.ImageIOJPEGRegistryEntry org.apache.batik.ext.awt.image.codec.imageio.ImageIOPNGRegistryEntry org.apache.batik.ext.awt.image.codec.imageio.ImageIOTIFFRegistryEntry batik-1.9.orig/batik-codec/src/main/java/0000755000175000017500000000000013063003441017531 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/0000755000175000017500000000000013063003441020320 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/0000755000175000017500000000000013063003441021541 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/0000755000175000017500000000000013063003441022633 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/0000755000175000017500000000000013063003441023433 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/0000755000175000017500000000000013063003441024226 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/0000755000175000017500000000000013063003441025310 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/0000755000175000017500000000000013153020772026373 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/0000755000175000017500000000000013153020772030005 5ustar mans0954mans0954././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOJPEGImageWriter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOJPEGIma0000644000175000017500000001310613063003443032274 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import java.awt.image.RenderedImage; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import org.apache.batik.ext.awt.image.spi.ImageWriterParams; /** * ImageWriter that encodes JPEG images using Image I/O. * * @version $Id: ImageIOJPEGImageWriter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOJPEGImageWriter extends ImageIOImageWriter { private static final String JPEG_NATIVE_FORMAT = "javax_imageio_jpeg_image_1.0"; /** * Main constructor. */ public ImageIOJPEGImageWriter() { super("image/jpeg"); } /** {@inheritDoc} */ @Override protected IIOMetadata updateMetadata(IIOMetadata meta, ImageWriterParams params) { //ImageIODebugUtil.dumpMetadata(meta); if (JPEG_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())) { meta = addAdobeTransform(meta); IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(JPEG_NATIVE_FORMAT); IIOMetadataNode jv = getChildNode(root, "JPEGvariety"); if (jv == null) { jv = new IIOMetadataNode("JPEGvariety"); root.appendChild(jv); } IIOMetadataNode child; if (params.getResolution() != null) { child = getChildNode(jv, "app0JFIF"); if (child == null) { child = new IIOMetadataNode("app0JFIF"); jv.appendChild(child); } //JPEG gets special treatment because there seems to be a bug in //the JPEG codec in ImageIO converting the pixel size incorrectly //(or not at all) when using standard metadata format. child.setAttribute("majorVersion", null); child.setAttribute("minorVersion", null); child.setAttribute("resUnits", "1"); //dots per inch child.setAttribute("Xdensity", params.getResolution().toString()); child.setAttribute("Ydensity", params.getResolution().toString()); child.setAttribute("thumbWidth", null); child.setAttribute("thumbHeight", null); } try { meta.setFromTree(JPEG_NATIVE_FORMAT, root); } catch (IIOInvalidTreeException e) { throw new RuntimeException("Cannot update image metadata: " + e.getMessage(), e); } //ImageIODebugUtil.dumpMetadata(meta); } return meta; } private static IIOMetadata addAdobeTransform(IIOMetadata meta) { // add the adobe transformation (transform 1 -> to YCbCr) IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(JPEG_NATIVE_FORMAT); IIOMetadataNode markerSequence = getChildNode(root, "markerSequence"); if (markerSequence == null) { throw new RuntimeException("Invalid metadata!"); } IIOMetadataNode adobeTransform = getChildNode(markerSequence, "app14Adobe"); if (adobeTransform == null) { adobeTransform = new IIOMetadataNode("app14Adobe"); adobeTransform.setAttribute("transform" , "1"); // convert RGB to YCbCr adobeTransform.setAttribute("version", "101"); adobeTransform.setAttribute("flags0", "0"); adobeTransform.setAttribute("flags1", "0"); markerSequence.appendChild(adobeTransform); } else { adobeTransform.setAttribute("transform" , "1"); } try { meta.setFromTree(JPEG_NATIVE_FORMAT, root); } catch (IIOInvalidTreeException e) { throw new RuntimeException("Cannot update image metadata: " + e.getMessage(), e); } return meta; } /** {@inheritDoc} */ @Override protected ImageWriteParam getDefaultWriteParam( ImageWriter iiowriter, RenderedImage image, ImageWriterParams params) { JPEGImageWriteParam param = new JPEGImageWriteParam(iiowriter.getLocale()); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(params.getJPEGQuality()); if (params.getCompressionMethod() != null && !"JPEG".equals(params.getCompressionMethod())) { throw new IllegalArgumentException( "No compression method other than JPEG is supported for JPEG output!"); } if (params.getJPEGForceBaseline()) { param.setProgressiveMode(JPEGImageWriteParam.MODE_DISABLED); } return param; } } ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/AbstractImageIORegistryEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/AbstractImageI0000644000175000017500000001615613063003442032553 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import org.apache.batik.ext.awt.image.GraphicsUtil; import org.apache.batik.ext.awt.image.renderable.DeferRable; import org.apache.batik.ext.awt.image.renderable.Filter; import org.apache.batik.ext.awt.image.renderable.RedRable; import org.apache.batik.ext.awt.image.rendered.Any2sRGBRed; import org.apache.batik.ext.awt.image.rendered.CachableRed; import org.apache.batik.ext.awt.image.rendered.FormatRed; import org.apache.batik.ext.awt.image.spi.ImageTagRegistry; import org.apache.batik.ext.awt.image.spi.MagicNumberRegistryEntry; import org.apache.batik.util.ParsedURL; /** * This is the base class for all ImageIO-based RegistryEntry implementations. They * have a slightly lower priority than the RegistryEntry implementations using the * internal codecs, so these take precedence if they are available. * * @version $Id: AbstractImageIORegistryEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class AbstractImageIORegistryEntry extends MagicNumberRegistryEntry { /** * Constructor * @param name Format Name * @param exts Standard set of extensions * @param magicNumbers array of magic numbers any of which can match. */ public AbstractImageIORegistryEntry(String name, String [] exts, String [] mimeTypes, MagicNumber [] magicNumbers) { super(name, PRIORITY + 100, exts, mimeTypes, magicNumbers); } /** * Constructor, simplifies construction of entry when only * one extension and one magic number is required. * @param name Format Name * @param ext Standard extension * @param offset Offset of magic number * @param magicNumber byte array to match. */ public AbstractImageIORegistryEntry(String name, String ext, String mimeType, int offset, byte[] magicNumber) { super(name, PRIORITY + 100, ext, mimeType, offset, magicNumber); } /** * Decode the Stream into a RenderableImage * * @param inIS The input stream that contains the image. * @param origURL The original URL, if any, for documentation * purposes only. This may be null. * @param needRawData If true the image returned should not have * any default color correction the file may * specify applied. */ public Filter handleStream(InputStream inIS, ParsedURL origURL, boolean needRawData) { final DeferRable dr = new DeferRable(); final InputStream is = inIS; final String errCode; final Object [] errParam; if (origURL != null) { errCode = ERR_URL_FORMAT_UNREADABLE; errParam = new Object[] {getFormatName(), origURL}; } else { errCode = ERR_STREAM_FORMAT_UNREADABLE; errParam = new Object[] {getFormatName()}; } Thread t = new Thread() { @Override public void run() { Filter filt; try{ Iterator iter = ImageIO.getImageReadersByMIMEType( getMimeTypes().get(0).toString()); if (!iter.hasNext()) { throw new UnsupportedOperationException( "No image reader for " + getFormatName() + " available!"); } ImageReader reader = iter.next(); ImageInputStream imageIn = ImageIO.createImageInputStream(is); reader.setInput(imageIn, true); int imageIndex = 0; dr.setBounds(new Rectangle2D.Double (0, 0, reader.getWidth(imageIndex), reader.getHeight(imageIndex))); CachableRed cr; //Naive approach possibly wasting lots of memory //and ignoring the gamma correction done by PNGRed :-( //Matches the code used by the former JPEGRegistryEntry, though. BufferedImage bi = reader.read(imageIndex); cr = GraphicsUtil.wrap(bi); cr = new Any2sRGBRed(cr); cr = new FormatRed(cr, GraphicsUtil.sRGB_Unpre); WritableRaster wr = (WritableRaster)cr.getData(); ColorModel cm = cr.getColorModel(); BufferedImage image = new BufferedImage (cm, wr, cm.isAlphaPremultiplied(), null); cr = GraphicsUtil.wrap(image); filt = new RedRable(cr); } catch (IOException ioe) { // Something bad happened here... filt = ImageTagRegistry.getBrokenLinkImage (AbstractImageIORegistryEntry.this, errCode, errParam); } catch (ThreadDeath td) { filt = ImageTagRegistry.getBrokenLinkImage (AbstractImageIORegistryEntry.this, errCode, errParam); dr.setSource(filt); throw td; } catch (Throwable t) { filt = ImageTagRegistry.getBrokenLinkImage (AbstractImageIORegistryEntry.this, errCode, errParam); } dr.setSource(filt); } }; t.start(); return dr; } } ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOPNGImageWriter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOPNGImag0000644000175000017500000000224413063003442032342 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; /** * ImageWriter that encodes PNG images using Image I/O. * * @version $Id: ImageIOPNGImageWriter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOPNGImageWriter extends ImageIOImageWriter { /** * Main constructor. */ public ImageIOPNGImageWriter() { super("image/png"); } } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOImageWriter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOImageWr0000644000175000017500000001732213063003442032456 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriteParam; import javax.imageio.event.IIOWriteWarningListener; import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.ImageOutputStream; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.apache.batik.ext.awt.image.spi.ImageWriter; import org.apache.batik.ext.awt.image.spi.ImageWriterParams; /** * ImageWriter implementation that uses Image I/O to write images. * * @version $Id: ImageIOImageWriter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOImageWriter implements ImageWriter, IIOWriteWarningListener { private String targetMIME; /** * Main constructor. * @param mime the MIME type of the image format */ public ImageIOImageWriter(String mime) { this.targetMIME = mime; } /** * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream) */ public void writeImage(RenderedImage image, OutputStream out) throws IOException { writeImage(image, out, null); } /** * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream, ImageWriterParams) */ public void writeImage(RenderedImage image, OutputStream out, ImageWriterParams params) throws IOException { Iterator iter; iter = ImageIO.getImageWritersByMIMEType(getMIMEType()); javax.imageio.ImageWriter iiowriter = null; try { iiowriter = (javax.imageio.ImageWriter)iter.next(); if (iiowriter != null) { iiowriter.addIIOWriteWarningListener(this); ImageOutputStream imgout = null; try { imgout = ImageIO.createImageOutputStream(out); ImageWriteParam iwParam = getDefaultWriteParam(iiowriter, image, params); ImageTypeSpecifier type; if (iwParam.getDestinationType() != null) { type = iwParam.getDestinationType(); } else { type = ImageTypeSpecifier.createFromRenderedImage(image); } //Handle metadata IIOMetadata meta = iiowriter.getDefaultImageMetadata( type, iwParam); //meta might be null for some JAI codecs as they don't support metadata if (params != null && meta != null) { meta = updateMetadata(meta, params); } //Write image iiowriter.setOutput(imgout); IIOImage iioimg = new IIOImage(image, null, meta); iiowriter.write(null, iioimg, iwParam); } finally { if (imgout != null) { imgout.close(); } } } else { throw new UnsupportedOperationException("No ImageIO codec for writing " + getMIMEType() + " is available!"); } } finally { if (iiowriter != null) { iiowriter.dispose(); } } } /** * Returns the default write parameters for encoding the image. * @param iiowriter The IIO ImageWriter that will be used * @param image the image to be encoded * @param params the parameters for this writer instance * @return the IIO ImageWriteParam instance */ protected ImageWriteParam getDefaultWriteParam( javax.imageio.ImageWriter iiowriter, RenderedImage image, ImageWriterParams params) { ImageWriteParam param = iiowriter.getDefaultWriteParam(); if ((params != null) && (params.getCompressionMethod() != null)) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionType(params.getCompressionMethod()); } return param; } /** * Updates the metadata information based on the parameters to this writer. * @param meta the metadata * @param params the parameters * @return the updated metadata */ protected IIOMetadata updateMetadata(IIOMetadata meta, ImageWriterParams params) { final String stdmeta = "javax_imageio_1.0"; if (meta.isStandardMetadataFormatSupported()) { IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(stdmeta); IIOMetadataNode dim = getChildNode(root, "Dimension"); IIOMetadataNode child; if (params.getResolution() != null) { child = getChildNode(dim, "HorizontalPixelSize"); if (child == null) { child = new IIOMetadataNode("HorizontalPixelSize"); dim.appendChild(child); } child.setAttribute("value", Double.toString(params.getResolution().doubleValue() / 25.4)); child = getChildNode(dim, "VerticalPixelSize"); if (child == null) { child = new IIOMetadataNode("VerticalPixelSize"); dim.appendChild(child); } child.setAttribute("value", Double.toString(params.getResolution().doubleValue() / 25.4)); } try { meta.mergeTree(stdmeta, root); } catch (IIOInvalidTreeException e) { throw new RuntimeException("Cannot update image metadata: " + e.getMessage()); } } return meta; } /** * Returns a specific metadata child node * @param n the base node * @param name the name of the child * @return the requested child node */ protected static IIOMetadataNode getChildNode(Node n, String name) { NodeList nodes = n.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { Node child = nodes.item(i); if (name.equals(child.getNodeName())) { return (IIOMetadataNode)child; } } return null; } /** * @see ImageWriter#getMIMEType() */ public String getMIMEType() { return this.targetMIME; } /** * @see javax.imageio.event.IIOWriteWarningListener#warningOccurred(javax.imageio.ImageWriter, int, java.lang.String) */ public void warningOccurred(javax.imageio.ImageWriter source, int imageIndex, String warning) { System.err.println("Problem while writing image using ImageI/O: " + warning); } } ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOTIFFImageWriter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOTIFFIma0000644000175000017500000000224513063003443032301 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; /** * ImageWriter that encodes TIFF images using Image I/O. * * @version $Id: ImageIOTIFFImageWriter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOTIFFImageWriter extends ImageIOImageWriter { /** * Main constructor. */ public ImageIOTIFFImageWriter() { super("image/tiff"); } } ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOJPEGRegistryEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOJPEGReg0000644000175000017500000000301113063003443032275 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; /** * RegistryEntry implementation for loading JPEG images through Image I/O. * * @version $Id: ImageIOJPEGRegistryEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOJPEGRegistryEntry extends AbstractImageIORegistryEntry { static final byte [] sigJPEG = {(byte)0xFF, (byte)0xd8, (byte)0xFF}; static final String [] exts = {"jpeg", "jpg" }; static final String [] mimeTypes = {"image/jpeg", "image/jpg" }; static final MagicNumber [] magicNumbers = { new MagicNumber(0, sigJPEG) }; public ImageIOJPEGRegistryEntry() { super("JPEG", exts, mimeTypes, magicNumbers); } } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIODebugUtil.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIODebugUt0000644000175000017500000000366213063003442032464 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import javax.imageio.metadata.IIOMetadata; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Node; /** * Helper class for debugging stuff in Image I/O. * * @version $Id: ImageIODebugUtil.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIODebugUtil { public static void dumpMetadata(IIOMetadata meta) { String format = meta.getNativeMetadataFormatName(); Node node = meta.getAsTree(format); dumpNode(node); } public static void dumpNode(Node node) { try { TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); Source src = new DOMSource(node); Result res = new StreamResult(System.out); t.transform(src, res); System.out.println(); } catch (Exception e) { e.printStackTrace(); } } } ././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/TIFFTranscoderImageIOWriteAdapter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/TIFFTranscoder0000644000175000017500000001032113063003444032477 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.PixelInterleavedSampleModel; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.awt.image.SinglePixelPackedSampleModel; import java.io.IOException; import java.io.OutputStream; import org.apache.batik.ext.awt.image.GraphicsUtil; import org.apache.batik.ext.awt.image.rendered.FormatRed; import org.apache.batik.ext.awt.image.spi.ImageWriter; import org.apache.batik.ext.awt.image.spi.ImageWriterParams; import org.apache.batik.ext.awt.image.spi.ImageWriterRegistry; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.TIFFTranscoder; /** * This class is a helper to TIFFTranscoder that writes TIFF images * through the Image I/O API. * * @version $Id: TIFFTranscoderImageIOWriteAdapter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class TIFFTranscoderImageIOWriteAdapter implements TIFFTranscoder.WriteAdapter { /** * @throws TranscoderException * @see org.apache.batik.transcoder.image.TIFFTranscoder.WriteAdapter#writeImage(TIFFTranscoder, java.awt.image.BufferedImage, org.apache.batik.transcoder.TranscoderOutput) */ public void writeImage(TIFFTranscoder transcoder, BufferedImage img, TranscoderOutput output) throws TranscoderException { TranscodingHints hints = transcoder.getTranscodingHints(); ImageWriter writer = ImageWriterRegistry.getInstance() .getWriterFor("image/tiff"); ImageWriterParams params = new ImageWriterParams(); float PixSzMM = transcoder.getUserAgent().getPixelUnitToMillimeter(); int PixSzInch = (int)(25.4 / PixSzMM + 0.5); params.setResolution(PixSzInch); if (hints.containsKey(TIFFTranscoder.KEY_COMPRESSION_METHOD)) { String method = (String)hints.get(TIFFTranscoder.KEY_COMPRESSION_METHOD); //Values set here as defined in TIFFImageWriteParam of JAI Image I/O Tools if ("packbits".equals(method)) { params.setCompressionMethod("PackBits"); } else if ("deflate".equals(method)) { params.setCompressionMethod("Deflate"); } else if ("lzw".equals(method)) { params.setCompressionMethod("LZW"); } else if ("jpeg".equals(method)) { params.setCompressionMethod("JPEG"); } else { //nop } } try { OutputStream ostream = output.getOutputStream(); int w = img.getWidth(); int h = img.getHeight(); SinglePixelPackedSampleModel sppsm; sppsm = (SinglePixelPackedSampleModel)img.getSampleModel(); int bands = sppsm.getNumBands(); int [] off = new int[bands]; for (int i = 0; i < bands; i++) off[i] = i; SampleModel sm = new PixelInterleavedSampleModel (DataBuffer.TYPE_BYTE, w, h, bands, w * bands, off); RenderedImage rimg = new FormatRed(GraphicsUtil.wrap(img), sm); writer.writeImage(rimg, ostream, params); ostream.flush(); } catch (IOException ex) { throw new TranscoderException(ex); } } } ././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/PNGTranscoderImageIOWriteAdapter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/PNGTranscoderI0000644000175000017500000001006713063003443032512 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import org.apache.batik.ext.awt.image.rendered.IndexImage; import org.apache.batik.ext.awt.image.spi.ImageWriter; import org.apache.batik.ext.awt.image.spi.ImageWriterParams; import org.apache.batik.ext.awt.image.spi.ImageWriterRegistry; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.PNGTranscoder; /** * This class is a helper to PNGTranscoder that writes PNG images * through the Image I/O API. * * @version $Id: PNGTranscoderImageIOWriteAdapter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGTranscoderImageIOWriteAdapter implements PNGTranscoder.WriteAdapter { /** * @throws TranscoderException * @see org.apache.batik.transcoder.image.PNGTranscoder.WriteAdapter#writeImage(org.apache.batik.transcoder.image.PNGTranscoder, java.awt.image.BufferedImage, org.apache.batik.transcoder.TranscoderOutput) */ public void writeImage(PNGTranscoder transcoder, BufferedImage img, TranscoderOutput output) throws TranscoderException { TranscodingHints hints = transcoder.getTranscodingHints(); int n = -1; if (hints.containsKey(PNGTranscoder.KEY_INDEXED)) { n=((Integer)hints.get(PNGTranscoder.KEY_INDEXED)).intValue(); if (n==1||n==2||n==4||n==8) //PNGEncodeParam.Palette can handle these numbers only. img = IndexImage.getIndexedImage(img, 1< 0) { params.setGamma(gamma); } params.setChromaticity(PNGTranscoder.DEFAULT_CHROMA); } else { // We generally want an sRGB chunk and our encoding intent // is perceptual params.setSRGBIntent(PNGEncodeParam.INTENT_PERCEPTUAL); }*/ float PixSzMM = transcoder.getUserAgent().getPixelUnitToMillimeter(); int PixSzInch = (int)(25.4 / PixSzMM + 0.5); params.setResolution(PixSzInch); try { OutputStream ostream = output.getOutputStream(); writer.writeImage(img, ostream, params); ostream.flush(); } catch (IOException ex) { throw new TranscoderException(ex); } } } ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOPNGRegistryEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOPNGRegi0000644000175000017500000000241313063003442032351 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; /** * RegistryEntry implementation for loading PNG images through Image I/O. * * @version $Id: ImageIOPNGRegistryEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOPNGRegistryEntry extends AbstractImageIORegistryEntry { static final byte [] signature = {(byte)0x89, 80, 78, 71, 13, 10, 26, 10}; public ImageIOPNGRegistryEntry() { super("PNG", "png", "image/png", 0, signature); } } ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOTIFFRegistryEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/imageio/ImageIOTIFFReg0000644000175000017500000000330213063003442032302 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.imageio; import org.apache.batik.ext.awt.image.spi.MagicNumberRegistryEntry; /** * RegistryEntry implementation for loading TIFF images through Image I/O. * * @version $Id: ImageIOTIFFRegistryEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ImageIOTIFFRegistryEntry extends AbstractImageIORegistryEntry { static final byte [] sig1 = {(byte)0x49, (byte)0x49, 42, 0}; static final byte [] sig2 = {(byte)0x4D, (byte)0x4D, 0, 42}; static MagicNumberRegistryEntry.MagicNumber [] magicNumbers = { new MagicNumberRegistryEntry.MagicNumber(0, sig1), new MagicNumberRegistryEntry.MagicNumber(0, sig2) }; static final String [] exts = {"tiff", "tif" }; static final String [] mimeTypes = {"image/tiff", "image/tif" }; public ImageIOTIFFRegistryEntry() { super("TIFF", exts, mimeTypes, magicNumbers); } } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/0000755000175000017500000000000013153020772027350 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageEncoder.java0000644000175000017500000000515413063003442032535 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; /** * An interface describing objects that transform a BufferedImage or * Raster into an OutputStream. * *

This interface is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: ImageEncoder.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ImageEncoder { /** * Returns the current parameters as an instance of the * ImageEncodeParam interface. Concrete implementations of this * interface will return corresponding concrete implementations of * the ImageEncodeParam interface. For example, a JPEGImageEncoder * will return an instance of JPEGEncodeParam. */ ImageEncodeParam getParam(); /** * Sets the current parameters to an instance of the * ImageEncodeParam interface. Concrete implementations * of ImageEncoder may throw a RuntimeException if the * params argument is not an instance of the appropriate * subclass or subinterface. For example, a JPEGImageEncoder * will expect param to be an instance of JPEGEncodeParam. */ void setParam(ImageEncodeParam param); /** Returns the OutputStream associated with this ImageEncoder. */ OutputStream getOutputStream(); /** * Encodes a Raster with a given ColorModel and writes the output * to the OutputStream associated with this ImageEncoder. */ void encode(Raster ras, ColorModel cm) throws IOException; /** * Encodes a RenderedImage and writes the output to the * OutputStream associated with this ImageEncoder. */ void encode(RenderedImage im) throws IOException; } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/FileCacheSeekableStream.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/FileCacheSeekable0000644000175000017500000002271613063003442032535 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; /** * A subclass of SeekableStream that may be used to wrap * a regular InputStream. Seeking backwards is supported * by means of a file cache. In circumstances that do not allow the * creation of a temporary file (for example, due to security * consideration or the absence of local disk), the * MemoryCacheSeekableStream class may be used instead. * *

The mark() and reset() methods are * supported. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: FileCacheSeekableStream.java 1733416 2016-03-03 07:07:13Z gadams $ */ public final class FileCacheSeekableStream extends SeekableStream { /** The source stream. */ private InputStream stream; /** The cache File. */ private File cacheFile; /** The cache as a RandomAcessFile. */ private RandomAccessFile cache; /** The length of the read buffer. */ private int bufLen = 1024; /** The read buffer. */ private byte[] buf = new byte[bufLen]; /** Number of bytes in the cache. */ private long length = 0; /** Next byte to be read. */ private long pointer = 0; /** True if we've encountered the end of the source stream. */ private boolean foundEOF = false; /** * Constructs a MemoryCacheSeekableStream that takes * its source data from a regular InputStream. * Seeking backwards is supported by means of an file cache. * *

An IOException will be thrown if the * attempt to create the cache file fails for any reason. */ public FileCacheSeekableStream(InputStream stream) throws IOException { this.stream = stream; this.cacheFile = File.createTempFile("jai-FCSS-", ".tmp"); cacheFile.deleteOnExit(); this.cache = new RandomAccessFile(cacheFile, "rw"); } /** * Ensures that at least pos bytes are cached, * or the end of the source is reached. The return value * is equal to the smaller of pos and the * length of the source file. */ private long readUntil(long pos) throws IOException { // We've already got enough data cached if (pos < length) { return pos; } // pos >= length but length isn't getting any bigger, so return it if (foundEOF) { return length; } long len = pos - length; cache.seek(length); while (len > 0) { // Copy a buffer's worth of data from the source to the cache // bufLen will always fit into an int so this is safe int nbytes = stream.read(buf, 0, (int)Math.min(len, bufLen)); if (nbytes == -1) { foundEOF = true; return length; } cache.setLength(cache.length() + nbytes); cache.write(buf, 0, nbytes); len -= nbytes; length += nbytes; } return pos; } /** * Returns true since all * FileCacheSeekableStream instances support seeking * backwards. */ public boolean canSeekBackwards() { return true; } /** * Returns the current offset in this file. * * @return the offset from the beginning of the file, in bytes, * at which the next read occurs. */ public long getFilePointer() { return pointer; } /** * Sets the file-pointer offset, measured from the beginning of this * file, at which the next read occurs. * * @param pos the offset position, measured in bytes from the * beginning of the file, at which to set the file * pointer. * @exception IOException if pos is less than * 0 or if an I/O error occurs. */ public void seek(long pos) throws IOException { if (pos < 0) { throw new IOException(PropertyUtil.getString("FileCacheSeekableStream0")); } pointer = pos; } /** * Reads the next byte of data from the input stream. The value byte is * returned as an int in the range 0 to * 255. If no byte is available because the end of the stream * has been reached, the value -1 is returned. This method * blocks until input data is available, the end of the stream is detected, * or an exception is thrown. * * @return the next byte of data, or -1 if the end of the * stream is reached. * @exception IOException if an I/O error occurs. */ public int read() throws IOException { long next = pointer + 1; long pos = readUntil(next); if (pos >= next) { cache.seek(pointer++); return cache.read(); } else { return -1; } } /** * Reads up to len bytes of data from the input stream into * an array of bytes. An attempt is made to read as many as * len bytes, but a smaller number may be read, possibly * zero. The number of bytes actually read is returned as an integer. * *

This method blocks until input data is available, end of file is * detected, or an exception is thrown. * *

If b is null, a * NullPointerException is thrown. * *

If off is negative, or len is negative, or * off+len is greater than the length of the array * b, then an IndexOutOfBoundsException is * thrown. * *

If len is zero, then no bytes are read and * 0 is returned; otherwise, there is an attempt to read at * least one byte. If no byte is available because the stream is at end of * file, the value -1 is returned; otherwise, at least one * byte is read and stored into b. * *

The first byte read is stored into element b[off], the * next one into b[off+1], and so on. The number of bytes read * is, at most, equal to len. Let k be the number of * bytes actually read; these bytes will be stored in elements * b[off] through b[off+k-1], * leaving elements b[off+k] through * b[off+len-1] unaffected. * *

In every case, elements b[0] through * b[off] and elements b[off+len] through * b[b.length-1] are unaffected. * *

If the first byte cannot be read for any reason other than end of * file, then an IOException is thrown. In particular, an * IOException is thrown if the input stream has been closed. * * @param b the buffer into which the data is read. * @param off the start offset in array b * at which the data is written. * @param len the maximum number of bytes to read. * @return the total number of bytes read into the buffer, or * -1 if there is no more data because the end of * the stream has been reached. * @exception IOException if an I/O error occurs. */ public int read(byte[] b, int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } if ((off < 0) || (len < 0) || (off + len > b.length)) { throw new IndexOutOfBoundsException(); } if (len == 0) { return 0; } long pos = readUntil(pointer + len); // len will always fit into an int so this is safe len = (int)Math.min(len, pos - pointer); if (len > 0) { cache.seek(pointer); cache.readFully(b, off, len); pointer += len; return len; } else { return -1; } } /** * Closes this stream and releases any system resources * associated with the stream. * * @throws IOException if an I/O error occurs. */ public void close() throws IOException { super.close(); cache.close(); cacheFile.delete(); } } ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/MemoryCacheSeekableStream.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/MemoryCacheSeekab0000644000175000017500000002236613063003442032606 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.ArrayList; /** * A subclass of SeekableStream that may be used to wrap * a regular InputStream. Seeking backwards is supported * by means of an in-memory cache. For greater efficiency, * FileCacheSeekableStream should be used in * circumstances that allow the creation of a temporary file. * *

The mark() and reset() methods are * supported. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: MemoryCacheSeekableStream.java 1733416 2016-03-03 07:07:13Z gadams $ */ public final class MemoryCacheSeekableStream extends SeekableStream { /** The source input stream. */ private InputStream src; /** Position of first unread byte. */ private long pointer = 0; /** Log_2 of the sector size. */ private static final int SECTOR_SHIFT = 9; /** The sector size. */ private static final int SECTOR_SIZE = 1 << SECTOR_SHIFT; /** A mask to determine the offset within a sector. */ private static final int SECTOR_MASK = SECTOR_SIZE - 1; /** A Vector of source sectors. */ private List data = new ArrayList(); /** Number of sectors stored. */ int sectors = 0; /** Number of bytes read. */ int length = 0; /** True if we've previously reached the end of the source stream */ boolean foundEOS = false; /** * Constructs a MemoryCacheSeekableStream that takes * its source data from a regular InputStream. * Seeking backwards is supported by means of an in-memory cache. */ public MemoryCacheSeekableStream(InputStream src) { this.src = src; } /** * Ensures that at least pos bytes are cached, * or the end of the source is reached. The return value * is equal to the smaller of pos and the * length of the source stream. */ private long readUntil(long pos) throws IOException { // We've already got enough data cached if (pos < length) { return pos; } // pos >= length but length isn't getting any bigger, so return it if (foundEOS) { return length; } int sector = (int)(pos >> SECTOR_SHIFT); // First unread sector int startSector = length >> SECTOR_SHIFT; // Read sectors until the desired sector for (int i = startSector; i <= sector; i++) { byte[] buf = new byte[SECTOR_SIZE]; data.add(buf); // Read up to SECTOR_SIZE bytes int len = SECTOR_SIZE; int off = 0; while (len > 0) { int nbytes = src.read(buf, off, len); // Found the end-of-stream if (nbytes == -1) { foundEOS = true; return length; } off += nbytes; len -= nbytes; // Record new data length length += nbytes; } } return length; } /** * Returns true since all * MemoryCacheSeekableStream instances support seeking * backwards. */ public boolean canSeekBackwards() { return true; } /** * Returns the current offset in this file. * * @return the offset from the beginning of the file, in bytes, * at which the next read occurs. */ public long getFilePointer() { return pointer; } /** * Sets the file-pointer offset, measured from the beginning of this * file, at which the next read occurs. * * @param pos the offset position, measured in bytes from the * beginning of the file, at which to set the file * pointer. * @exception IOException if pos is less than * 0 or if an I/O error occurs. */ public void seek(long pos) throws IOException { if (pos < 0) { throw new IOException(PropertyUtil.getString("MemoryCacheSeekableStream0")); } pointer = pos; } /** * Reads the next byte of data from the input stream. The value byte is * returned as an int in the range 0 to * 255. If no byte is available because the end of the stream * has been reached, the value -1 is returned. This method * blocks until input data is available, the end of the stream is detected, * or an exception is thrown. * * @return the next byte of data, or -1 if the end of the * stream is reached. */ public int read() throws IOException { long next = pointer + 1; long pos = readUntil(next); if (pos >= next) { byte[] buf = (byte[])data.get((int)(pointer >> SECTOR_SHIFT)); return buf[(int)(pointer++ & SECTOR_MASK)] & 0xff; } else { return -1; } } /** * Reads up to len bytes of data from the input stream into * an array of bytes. An attempt is made to read as many as * len bytes, but a smaller number may be read, possibly * zero. The number of bytes actually read is returned as an integer. * *

This method blocks until input data is available, end of file is * detected, or an exception is thrown. * *

If b is null, a * NullPointerException is thrown. * *

If off is negative, or len is negative, or * off+len is greater than the length of the array * b, then an IndexOutOfBoundsException is * thrown. * *

If len is zero, then no bytes are read and * 0 is returned; otherwise, there is an attempt to read at * least one byte. If no byte is available because the stream is at end of * file, the value -1 is returned; otherwise, at least one * byte is read and stored into b. * *

The first byte read is stored into element b[off], the * next one into b[off+1], and so on. The number of bytes read * is, at most, equal to len. Let k be the number of * bytes actually read; these bytes will be stored in elements * b[off] through b[off+k-1], * leaving elements b[off+k] through * b[off+len-1] unaffected. * *

In every case, elements b[0] through * b[off] and elements b[off+len] through * b[b.length-1] are unaffected. * *

If the first byte cannot be read for any reason other than end of * file, then an IOException is thrown. In particular, an * IOException is thrown if the input stream has been closed. * * @param b the buffer into which the data is read. * @param off the start offset in array b * at which the data is written. * @param len the maximum number of bytes to read. * @return the total number of bytes read into the buffer, or * -1 if there is no more data because the end of * the stream has been reached. */ public int read(byte[] b, int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } if ((off < 0) || (len < 0) || (off + len > b.length)) { throw new IndexOutOfBoundsException(); } if (len == 0) { return 0; } long pos = readUntil(pointer + len); // End-of-stream if (pos <= pointer) { return -1; } byte[] buf = (byte[])data.get((int)(pointer >> SECTOR_SHIFT)); int nbytes = Math.min(len, SECTOR_SIZE - (int)(pointer & SECTOR_MASK)); System.arraycopy(buf, (int)(pointer & SECTOR_MASK), b, off, nbytes); pointer += nbytes; return nbytes; } } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ForwardSeekableStream.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ForwardSeekableSt0000644000175000017500000000762613063003443032651 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.IOException; import java.io.InputStream; /** * A subclass of SeekableStream that may be used * to wrap a regular InputStream efficiently. * Seeking backwards is not supported. * * @version $Id: ForwardSeekableStream.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class ForwardSeekableStream extends SeekableStream { /** The source InputStream. */ private InputStream src; /** The current position. */ long pointer = 0L; /** * Constructs a InputStreamForwardSeekableStream from a * regular InputStream. */ public ForwardSeekableStream(InputStream src) { this.src = src; } /** Forwards the request to the real InputStream. */ public final int read() throws IOException { int result = src.read(); if (result != -1) { ++pointer; } return result; } /** Forwards the request to the real InputStream. */ public final int read(byte[] b, int off, int len) throws IOException { int result = src.read(b, off, len); if (result != -1) { pointer += result; } return result; } /** Forwards the request to the real InputStream. */ public final long skip(long n) throws IOException { long skipped = src.skip(n); pointer += skipped; return skipped; } /** Forwards the request to the real InputStream. */ public final int available() throws IOException { return src.available(); } /** Forwards the request to the real InputStream. */ public final void close() throws IOException { src.close(); } /** * Forwards the request to the real InputStream. * We use {@link SeekableStream#markPos} */ public final synchronized void mark(int readLimit) { markPos = pointer; src.mark(readLimit); } /** * Forwards the request to the real InputStream. * We use {@link SeekableStream#markPos} */ public final synchronized void reset() throws IOException { if (markPos != -1) { pointer = markPos; } src.reset(); } /** Forwards the request to the real InputStream. */ public boolean markSupported() { return src.markSupported(); } /** Returns false since seking backwards is not supported. */ public final boolean canSeekBackwards() { return false; } /** Returns the current position in the stream (bytes read). */ public final long getFilePointer() { return pointer; } /** * Seeks forward to the given position in the stream. * If pos is smaller than the current position * as returned by getFilePointer(), nothing * happens. */ public final void seek(long pos) throws IOException { while (pos - pointer > 0) { pointer += src.skip(pos - pointer); } } } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/PropertyUtil.java0000644000175000017500000000276413063003442032701 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.util.MissingResourceException; import org.apache.batik.i18n.LocalizableSupport; /** * * @version $Id: PropertyUtil.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PropertyUtil { protected static final String RESOURCES = "org.apache.batik.bridge.resources.properties"; protected static LocalizableSupport localizableSupport = new LocalizableSupport (RESOURCES, PropertyUtil.class.getClassLoader()); public static String getString(String key) { try{ return localizableSupport.formatMessage(key, null); }catch(MissingResourceException e){ return key; } } } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageDecoderImpl.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageDecoderImpl.0000644000175000017500000001322613063003442032502 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.InputStream; /** * A partial implementation of the ImageDecoder interface * useful for subclassing. * * @version $Id: ImageDecoderImpl.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class ImageDecoderImpl implements ImageDecoder { /** * The SeekableStream associcted with this * ImageEncoder. */ protected SeekableStream input; /** * The ImageDecodeParam object associated with this * ImageEncoder. */ protected ImageDecodeParam param; /** * Constructs an ImageDecoderImpl with a given * SeekableStream and ImageDecodeParam * instance. */ public ImageDecoderImpl(SeekableStream input, ImageDecodeParam param) { this.input = input; this.param = param; } /** * Constructs an ImageDecoderImpl with a given * InputStream and ImageDecodeParam * instance. The input parameter will be used to * construct a ForwardSeekableStream; if the ability * to seek backwards is required, the caller should construct * an instance of SeekableStream and * make use of the other contructor. */ public ImageDecoderImpl(InputStream input, ImageDecodeParam param) { this.input = new ForwardSeekableStream(input); this.param = param; } /** * Returns the current parameters as an instance of the * ImageDecodeParam interface. Concrete * implementations of this interface will return corresponding * concrete implementations of the ImageDecodeParam * interface. For example, a JPEGImageDecoder will * return an instance of JPEGDecodeParam. */ public ImageDecodeParam getParam() { return param; } /** * Sets the current parameters to an instance of the * ImageDecodeParam interface. Concrete * implementations of ImageDecoder may throw a * RuntimeException if the param * argument is not an instance of the appropriate subclass or * subinterface. For example, a JPEGImageDecoder * will expect param to be an instance of * JPEGDecodeParam. */ public void setParam(ImageDecodeParam param) { this.param = param; } /** * Returns the SeekableStream associated with * this ImageDecoder. */ public SeekableStream getInputStream() { return input; } /** * Returns the number of pages present in the current stream. * By default, the return value is 1. Subclasses that deal with * multi-page formats should override this method. */ public int getNumPages() throws IOException { return 1; } /** * Returns a Raster that contains the decoded * contents of the SeekableStream associated * with this ImageDecoder. Only * the first page of a multi-page image is decoded. */ public Raster decodeAsRaster() throws IOException { return decodeAsRaster(0); } /** * Returns a Raster that contains the decoded * contents of the SeekableStream associated * with this ImageDecoder. * The given page of a multi-page image is decoded. If * the page does not exist, an IOException will be thrown. * Page numbering begins at zero. * * @param page The page to be decoded. */ public Raster decodeAsRaster(int page) throws IOException { RenderedImage im = decodeAsRenderedImage(page); return im.getData(); } /** * Returns a RenderedImage that contains the decoded * contents of the SeekableStream associated * with this ImageDecoder. Only * the first page of a multi-page image is decoded. */ public RenderedImage decodeAsRenderedImage() throws IOException { return decodeAsRenderedImage(0); } /** * Returns a RenderedImage that contains the decoded * contents of the SeekableStream associated * with this ImageDecoder. * The given page of a multi-page image is decoded. If * the page does not exist, an IOException will be thrown. * Page numbering begins at zero. * * @param page The page to be decoded. */ public abstract RenderedImage decodeAsRenderedImage(int page) throws IOException; } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageDecoder.java0000644000175000017500000000673113063003442032525 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.IOException; /** * An interface describing objects that transform an InputStream into a * BufferedImage or Raster. * * @version $Id: ImageDecoder.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ImageDecoder { /** * Returns the current parameters as an instance of the * ImageDecodeParam interface. Concrete implementations of this * interface will return corresponding concrete implementations of * the ImageDecodeParam interface. For example, a JPEGImageDecoder * will return an instance of JPEGDecodeParam. */ ImageDecodeParam getParam(); /** * Sets the current parameters to an instance of the * ImageDecodeParam interface. Concrete implementations * of ImageDecoder may throw a RuntimeException if the * param argument is not an instance of the appropriate * subclass or subinterface. For example, a JPEGImageDecoder * will expect param to be an instance of JPEGDecodeParam. */ void setParam(ImageDecodeParam param); /** Returns the SeekableStream associated with this ImageDecoder. */ SeekableStream getInputStream(); /** Returns the number of pages present in the current stream. */ int getNumPages() throws IOException; /** * Returns a Raster that contains the decoded contents of the * SeekableStream associated with this ImageDecoder. Only * the first page of a multi-page image is decoded. */ Raster decodeAsRaster() throws IOException; /** * Returns a Raster that contains the decoded contents of the * SeekableStream associated with this ImageDecoder. * The given page of a multi-page image is decoded. If * the page does not exist, an IOException will be thrown. * Page numbering begins at zero. * * @param page The page to be decoded. */ Raster decodeAsRaster(int page) throws IOException; /** * Returns a RenderedImage that contains the decoded contents of the * SeekableStream associated with this ImageDecoder. Only * the first page of a multi-page image is decoded. */ RenderedImage decodeAsRenderedImage() throws IOException; /** * Returns a RenderedImage that contains the decoded contents of the * SeekableStream associated with this ImageDecoder. * The given page of a multi-page image is decoded. If * the page does not exist, an IOException will be thrown. * Page numbering begins at zero. * * @param page The page to be decoded. */ RenderedImage decodeAsRenderedImage(int page) throws IOException; } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SingleTileRenderedImage.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SingleTileRendere0000644000175000017500000000421713063003442032636 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.image.ColorModel; import java.awt.image.Raster; /** * A simple class that provides RenderedImage functionality * given a Raster and a ColorModel. * * @version $Id: SingleTileRenderedImage.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SingleTileRenderedImage extends SimpleRenderedImage { Raster ras; /** * Constructs a SingleTileRenderedImage based on a Raster * and a ColorModel. * * @param ras A Raster that will define tile (0, 0) of the image. * @param colorModel A ColorModel that will serve as the image's * ColorModel. */ public SingleTileRenderedImage(Raster ras, ColorModel colorModel) { this.ras = ras; this.tileGridXOffset = this.minX = ras.getMinX(); this.tileGridYOffset = this.minY = ras.getMinY(); this.tileWidth = this.width = ras.getWidth(); this.tileHeight = this.height = ras.getHeight(); this.sampleModel = ras.getSampleModel(); this.colorModel = colorModel; } /** * Returns the image's Raster as tile (0, 0). */ public Raster getTile(int tileX, int tileY) { if (tileX != 0 || tileY != 0) { throw new IllegalArgumentException(PropertyUtil.getString("SingleTileRenderedImage0")); } return ras; } } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SeekableOutputStream.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SeekableOutputStr0000644000175000017500000000503413063003442032715 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.IOException; import java.io.OutputStream; import java.io.RandomAccessFile; /** * An OutputStream which can seek to an arbitrary offset. * * @version $Id: SeekableOutputStream.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class SeekableOutputStream extends OutputStream { private RandomAccessFile file; /** * Constructs a SeekableOutputStream from a * RandomAccessFile. Unless otherwise indicated, * all method invocations are fowarded to the underlying * RandomAccessFile. * * @param file The RandomAccessFile to which calls * will be forwarded. * @exception IllegalArgumentException if file is * null. */ public SeekableOutputStream(RandomAccessFile file) { if(file == null) { throw new IllegalArgumentException("SeekableOutputStream0"); } this.file = file; } public void write(int b) throws IOException { file.write(b); } public void write(byte[] b) throws IOException { file.write(b); } public void write(byte[] b, int off, int len) throws IOException { file.write(b, off, len); } /** * Invokes getFD().sync() on the underlying * RandomAccessFile. */ public void flush() throws IOException { file.getFD().sync(); } public void close() throws IOException { file.close(); } public long getFilePointer() throws IOException { return file.getFilePointer(); } public void seek(long pos) throws IOException { file.seek(pos); } } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageEncoderImpl.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageEncoderImpl.0000644000175000017500000000652713063003443032523 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; /** * A partial implementation of the ImageEncoder interface useful for * subclassing. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: ImageEncoderImpl.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class ImageEncoderImpl implements ImageEncoder { /** The OutputStream associcted with this ImageEncoder. */ protected OutputStream output; /** The ImageEncodeParam object associcted with this ImageEncoder. */ protected ImageEncodeParam param; /** * Constructs an ImageEncoderImpl with a given OutputStream * and ImageEncoderParam instance. */ public ImageEncoderImpl(OutputStream output, ImageEncodeParam param) { this.output = output; this.param = param; } /** * Returns the current parameters as an instance of the * ImageEncodeParam interface. Concrete implementations of this * interface will return corresponding concrete implementations of * the ImageEncodeParam interface. For example, a JPEGImageEncoder * will return an instance of JPEGEncodeParam. */ public ImageEncodeParam getParam() { return param; } /** * Sets the current parameters to an instance of the * ImageEncodeParam interface. Concrete implementations * of ImageEncoder may throw a RuntimeException if the * params argument is not an instance of the appropriate * subclass or subinterface. For example, a JPEGImageEncoder * will expect param to be an instance of JPEGEncodeParam. */ public void setParam(ImageEncodeParam param) { this.param = param; } /** Returns the OutputStream associated with this ImageEncoder. */ public OutputStream getOutputStream() { return output; } /** * Encodes a Raster with a given ColorModel and writes the output * to the OutputStream associated with this ImageEncoder. */ public void encode(Raster ras, ColorModel cm) throws IOException { RenderedImage im = new SingleTileRenderedImage(ras, cm); encode(im); } /** * Encodes a RenderedImage and writes the output to the * OutputStream associated with this ImageEncoder. */ public abstract void encode(RenderedImage im) throws IOException; } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageDecodeParam.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageDecodeParam.0000644000175000017500000000236013063003442032454 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.Serializable; /** * An empty (marker) interface to be implemented by all image decoder * parameter classes. * *

This interface is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: ImageDecodeParam.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ImageDecodeParam extends Cloneable, Serializable { } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageEncodeParam.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/ImageEncodeParam.0000644000175000017500000000240613063003442032467 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.Serializable; /** * An empty (marker) interface to be implemented by all image encoder * parameter classes. * *

This interface is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: ImageEncodeParam.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface ImageEncodeParam extends ImageDecodeParam, Cloneable, Serializable { } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SimpleRenderedImage.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SimpleRenderedIma0000644000175000017500000004472113063003442032627 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.ColorModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.util.Vector; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; /** * A simple class implemented the RenderedImage * interface. Only the getTile() method needs to be * implemented by subclasses. The instance variables must also be * filled in properly. * *

Normally in JAI PlanarImage is used for this * purpose, but in the interest of modularity the * use of PlanarImage has been avoided. * * @version $Id: SimpleRenderedImage.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class SimpleRenderedImage implements RenderedImage { /** The X coordinate of the image's upper-left pixel. */ protected int minX; /** The Y coordinate of the image's upper-left pixel. */ protected int minY; /** The image's width in pixels. */ protected int width; /** The image's height in pixels. */ protected int height; /** The width of a tile. */ protected int tileWidth; /** The height of a tile. */ protected int tileHeight; /** The X coordinate of the upper-left pixel of tile (0, 0). */ protected int tileGridXOffset = 0; /** The Y coordinate of the upper-left pixel of tile (0, 0). */ protected int tileGridYOffset = 0; /** The image's SampleModel. */ protected SampleModel sampleModel = null; /** The image's ColorModel. */ protected ColorModel colorModel = null; /** The image's sources, stored in a Vector. */ protected List sources = new ArrayList(); /** A Hashtable containing the image properties. */ protected Map properties = new HashMap(); public SimpleRenderedImage() {} /** Returns the X coordinate of the leftmost column of the image. */ public int getMinX() { return minX; } /** * Returns the X coordinate of the column immediatetely to the * right of the rightmost column of the image. getMaxX() is * implemented in terms of getMinX() and getWidth() and so does * not need to be implemented by subclasses. */ public final int getMaxX() { return getMinX() + getWidth(); } /** Returns the X coordinate of the uppermost row of the image. */ public int getMinY() { return minY; } /** * Returns the Y coordinate of the row immediately below the * bottom row of the image. getMaxY() is implemented in terms of * getMinY() and getHeight() and so does not need to be * implemented by subclasses. */ public final int getMaxY() { return getMinY() + getHeight(); } /** Returns the width of the image. */ public int getWidth() { return width; } /** Returns the height of the image. */ public int getHeight() { return height; } /** Returns a Rectangle indicating the image bounds. */ public Rectangle getBounds() { return new Rectangle(getMinX(), getMinY(), getWidth(), getHeight()); } /** Returns the width of a tile. */ public int getTileWidth() { return tileWidth; } /** Returns the height of a tile. */ public int getTileHeight() { return tileHeight; } /** * Returns the X coordinate of the upper-left pixel of tile (0, 0). */ public int getTileGridXOffset() { return tileGridXOffset; } /** * Returns the Y coordinate of the upper-left pixel of tile (0, 0). */ public int getTileGridYOffset() { return tileGridYOffset; } /** * Returns the horizontal index of the leftmost column of tiles. * getMinTileX() is implemented in terms of getMinX() * and so does not need to be implemented by subclasses. */ public int getMinTileX() { return XToTileX(getMinX()); } /** * Returns the horizontal index of the rightmost column of tiles. * getMaxTileX() is implemented in terms of getMaxX() * and so does not need to be implemented by subclasses. */ public int getMaxTileX() { return XToTileX(getMaxX() - 1); } /** * Returns the number of tiles along the tile grid in the * horizontal direction. getNumXTiles() is implemented in terms * of getMinTileX() and getMaxTileX() and so does not need to be * implemented by subclasses. */ public int getNumXTiles() { return getMaxTileX() - getMinTileX() + 1; } /** * Returns the vertical index of the uppermost row of tiles. getMinTileY() * is implemented in terms of getMinY() and so does not need to be * implemented by subclasses. */ public int getMinTileY() { return YToTileY(getMinY()); } /** * Returns the vertical index of the bottom row of tiles. getMaxTileY() * is implemented in terms of getMaxY() and so does not need to * be implemented by subclasses. */ public int getMaxTileY() { return YToTileY(getMaxY() - 1); } /** * Returns the number of tiles along the tile grid in the vertical * direction. getNumYTiles() is implemented in terms * of getMinTileY() and getMaxTileY() and so does not need to be * implemented by subclasses. */ public int getNumYTiles() { return getMaxTileY() - getMinTileY() + 1; } /** Returns the SampleModel of the image. */ public SampleModel getSampleModel() { return sampleModel; } /** Returns the ColorModel of the image. */ public ColorModel getColorModel() { return colorModel; } /** * Gets a property from the property set of this image. If the * property name is not recognized, null will be returned. * * @param name the name of the property to get, as a * String. * @return a reference to the property * Object, or the value null */ public Object getProperty(String name) { name = name.toLowerCase(); return properties.get(name); } /** * Returns a list of the properties recognized by this image. If * no properties are available, an empty String[] will be returned. * * @return an array of Strings representing valid * property names. */ public String[] getPropertyNames() { String[] names = new String[properties.size()]; // int index = 0; // // Enumeration e = properties.keys(); // while (e.hasMoreElements()) { // String name = (String)e.nextElement(); // names[index++] = name; // } properties.keySet().toArray( names ); return names; } /** * Returns an array of Strings recognized as names by * this property source that begin with the supplied prefix. If * no property names match, null will be returned. * The comparison is done in a case-independent manner. * *

The default implementation calls * getPropertyNames() and searches the list of names * for matches. * * @return an array of Strings giving the valid * property names (can be null). */ public String[] getPropertyNames(String prefix) { String[] propertyNames = getPropertyNames(); if (propertyNames == null) { return null; } prefix = prefix.toLowerCase(); List names = new ArrayList(); for (int i = 0; i < propertyNames.length; i++) { if (propertyNames[i].startsWith(prefix)) { names.add(propertyNames[i]); } } if (names.size() == 0) { return null; } // Copy the strings from the Vector over to a String array. String[] prefixNames = new String[names.size()]; // int count = 0; // for (Iterator it = names.iterator(); it.hasNext(); ) { // todo xx.toArray() // prefixNames[count++] = (String)it.next(); // } names.toArray( prefixNames ); return prefixNames; } // Utility methods. /** * Converts a pixel's X coordinate into a horizontal tile index * relative to a given tile grid layout specified by its X offset * and tile width. */ public static int XToTileX(int x, int tileGridXOffset, int tileWidth) { x -= tileGridXOffset; if (x < 0) { x += 1 - tileWidth; // Force round to -infinity } return x/tileWidth; } /** * Converts a pixel's Y coordinate into a vertical tile index * relative to a given tile grid layout specified by its Y offset * and tile height. */ public static int YToTileY(int y, int tileGridYOffset, int tileHeight) { y -= tileGridYOffset; if (y < 0) { y += 1 - tileHeight; // Force round to -infinity } return y/tileHeight; } /** * Converts a pixel's X coordinate into a horizontal tile index. * This is a convenience method. No attempt is made to detect * out-of-range coordinates. * * @param x the X coordinate of a pixel. * @return the X index of the tile containing the pixel. */ public int XToTileX(int x) { return XToTileX(x, getTileGridXOffset(), getTileWidth()); } /** * Converts a pixel's Y coordinate into a vertical tile index. * This is a convenience method. No attempt is made to detect * out-of-range coordinates. * * @param y the Y coordinate of a pixel. * @return the Y index of the tile containing the pixel. */ public int YToTileY(int y) { return YToTileY(y, getTileGridYOffset(), getTileHeight()); } /** * Converts a horizontal tile index into the X coordinate of its * upper left pixel relative to a given tile grid layout specified * by its X offset and tile width. */ public static int tileXToX(int tx, int tileGridXOffset, int tileWidth) { return tx*tileWidth + tileGridXOffset; } /** * Converts a vertical tile index into the Y coordinate of * its upper left pixel relative to a given tile grid layout * specified by its Y offset and tile height. */ public static int tileYToY(int ty, int tileGridYOffset, int tileHeight) { return ty*tileHeight + tileGridYOffset; } /** * Converts a horizontal tile index into the X coordinate of its * upper left pixel. This is a convenience method. No attempt is made * to detect out-of-range indices. * * @param tx the horizontal index of a tile. * @return the X coordinate of the tile's upper left pixel. */ public int tileXToX(int tx) { return tx*tileWidth + tileGridXOffset; } /** * Converts a vertical tile index into the Y coordinate of its * upper left pixel. This is a convenience method. No attempt is made * to detect out-of-range indices. * * @param ty the vertical index of a tile. * @return the Y coordinate of the tile's upper left pixel. */ public int tileYToY(int ty) { return ty*tileHeight + tileGridYOffset; } public Vector getSources() { return null; } /** * Returns the entire image in a single Raster. For images with * multiple tiles this will require making a copy. * *

The returned Raster is semantically a copy. This means * that updates to the source image will not be reflected in the * returned Raster. For non-writable (immutable) source images, * the returned value may be a reference to the image's internal * data. The returned Raster should be considered non-writable; * any attempt to alter its pixel data (such as by casting it to * WritableRaster or obtaining and modifying its DataBuffer) may * result in undefined behavior. The copyData method should be * used if the returned Raster is to be modified. * * @return a Raster containing a copy of this image's data. */ public Raster getData() { Rectangle rect = new Rectangle(getMinX(), getMinY(), getWidth(), getHeight()); return getData(rect); } /** * Returns an arbitrary rectangular region of the RenderedImage * in a Raster. The rectangle of interest will be clipped against * the image bounds. * *

The returned Raster is semantically a copy. This means * that updates to the source image will not be reflected in the * returned Raster. For non-writable (immutable) source images, * the returned value may be a reference to the image's internal * data. The returned Raster should be considered non-writable; * any attempt to alter its pixel data (such as by casting it to * WritableRaster or obtaining and modifying its DataBuffer) may * result in undefined behavior. The copyData method should be * used if the returned Raster is to be modified. * * @param bounds the region of the RenderedImage to be returned. */ public Raster getData(Rectangle bounds) { int startX = XToTileX(bounds.x); int startY = YToTileY(bounds.y); int endX = XToTileX(bounds.x + bounds.width - 1); int endY = YToTileY(bounds.y + bounds.height - 1); Raster tile; if ((startX == endX) && (startY == endY)) { tile = getTile(startX, startY); return tile.createChild(bounds.x, bounds.y, bounds.width, bounds.height, bounds.x, bounds.y, null); } else { // Create a WritableRaster of the desired size SampleModel sm = sampleModel.createCompatibleSampleModel(bounds.width, bounds.height); // Translate it WritableRaster dest = Raster.createWritableRaster(sm, bounds.getLocation()); for (int j = startY; j <= endY; j++) { for (int i = startX; i <= endX; i++) { tile = getTile(i, j); Rectangle intersectRect = bounds.intersection(tile.getBounds()); Raster liveRaster = tile.createChild(intersectRect.x, intersectRect.y, intersectRect.width, intersectRect.height, intersectRect.x, intersectRect.y, null); dest.setDataElements(0, 0, liveRaster); } } return dest; } } /** * Copies an arbitrary rectangular region of the RenderedImage * into a caller-supplied WritableRaster. The region to be * computed is determined by clipping the bounds of the supplied * WritableRaster against the bounds of the image. The supplied * WritableRaster must have a SampleModel that is compatible with * that of the image. * *

If the raster argument is null, the entire image will * be copied into a newly-created WritableRaster with a SampleModel * that is compatible with that of the image. * * @param dest a WritableRaster to hold the returned portion of * the image. * @return a reference to the supplied WritableRaster, or to a * new WritableRaster if the supplied one was null. */ public WritableRaster copyData(WritableRaster dest) { Rectangle bounds; Raster tile; if (dest == null) { bounds = getBounds(); Point p = new Point(minX, minY); /* A SampleModel to hold the entire image. */ SampleModel sm = sampleModel.createCompatibleSampleModel( width, height); dest = Raster.createWritableRaster(sm, p); } else { bounds = dest.getBounds(); } int startX = XToTileX(bounds.x); int startY = YToTileY(bounds.y); int endX = XToTileX(bounds.x + bounds.width - 1); int endY = YToTileY(bounds.y + bounds.height - 1); for (int j = startY; j <= endY; j++) { for (int i = startX; i <= endX; i++) { tile = getTile(i, j); Rectangle intersectRect = bounds.intersection(tile.getBounds()); Raster liveRaster = tile.createChild(intersectRect.x, intersectRect.y, intersectRect.width, intersectRect.height, intersectRect.x, intersectRect.y, null); /* * WritableRaster.setDataElements takes into account of * inRaster's minX and minY and add these to x and y. Since * liveRaster has the origin at the correct location, the * following call should not again give these coordinates in * places of x and y. */ dest.setDataElements(0, 0, liveRaster); } } return dest; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SeekableStream.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/util/SeekableStream.ja0000644000175000017500000011406513063003443032556 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.util; import java.io.DataInput; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.UTFDataFormatException; /** * An abstract subclass of java.io.InputStream that allows seeking * within the input, similar to the RandomAccessFile class. * Additionally, the DataInput interface is supported and extended * to include support for little-endian representations of fundamental data * types. * *

In addition to the familiar methods from InputStream, the * methods getFilePointer(), seek(), are defined as in * the RandomAccessFile class. The canSeekBackwards() * method will return true if it is permissible to seek to a * position earlier in the stream than the current value of * getFilePointer(). Some subclasses of * SeekableStream guarantee the ability to seek backwards while * others may not offer this feature in the interest of providing greater * efficiency for those users who do not require it. * *

The DataInput interface is supported as well. This included * the skipBytes() and readFully() methods and a * variety of read methods for various data types. * *

A number of concrete subclasses of SeekableStream are * supplied in the com.sun.media.jai.codec package. * *

Three classes are provided for the purpose of adapting a standard * InputStream to the SeekableStream interface. * ForwardSeekableStream does not allows seeking backwards, but is * inexpensive to use. FileCacheSeekableStream maintains a copy of * all of the data read from the input in a temporary file; this file will be * discarded automatically when the FileSeekableStream is * finalized, or when the JVM exits normally. * FileCacheSeekableStream is intended to be reasonably efficient * apart from the unavoidable use of disk space. In circumstances where the * creation of a temporary file is not possible, * MemoryCacheSeekableStream may be used. * MemoryCacheSeekableStream creates a potentially large in-memory * buffer to store the stream data and so should be avoided when possible. * *

The FileSeekableStream class wraps a File or * RandomAccessFile. It forwards requests to the real underlying * file. It performs a limited amount of caching in order to avoid excessive * I/O costs. * *

The SegmentedSeekableStream class performs a different sort * of function. It creates a SeekableStream from another * SeekableStream by selecting a series of portions or "segments". * Each segment starts at a specified location within the source * SeekableStream and extends for a specified number of bytes. The * StreamSegmentMapper interface and StreamSegment * class may be used to compute the segment positions dynamically. * *

A convenience methods, wrapInputStream is provided to * construct a suitable SeekableStream instance whose data is * supplied by a given InputStream. The caller, by means of the * canSeekBackwards parameter, determines whether support for * seeking backwards is required. * * @version $Id: SeekableStream.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class SeekableStream extends InputStream implements DataInput { /** * Returns a SeekableStream that will read from a * given InputStream, optionally including support * for seeking backwards. This is a convenience method that * avoids the need to instantiate specific subclasses of * SeekableStream depending on the current security * model. * * @param is An InputStream. * @param canSeekBackwards true if the ability to seek * backwards in the output is required. * @return An instance of SeekableStream. */ public static SeekableStream wrapInputStream(InputStream is, boolean canSeekBackwards) { SeekableStream stream = null; if (canSeekBackwards) { try { stream = new FileCacheSeekableStream(is); } catch (Exception e) { stream = new MemoryCacheSeekableStream(is); } } else { stream = new ForwardSeekableStream(is); } return stream; } // Methods from InputStream /** * Reads the next byte of data from the input stream. The value byte is * returned as an int in the range 0 to * 255. If no byte is available because the end of the stream * has been reached, the value -1 is returned. This method * blocks until input data is available, the end of the stream is detected, * or an exception is thrown. * *

A subclass must provide an implementation of this method. * * @return the next byte of data, or -1 if the end of the * stream is reached. * @exception IOException if an I/O error occurs. */ public abstract int read() throws IOException; /** * Reads up to len bytes of data from the input stream into * an array of bytes. An attempt is made to read as many as * len bytes, but a smaller number may be read, possibly * zero. The number of bytes actually read is returned as an integer. * *

This method blocks until input data is available, end of stream is * detected, or an exception is thrown. * *

If b is null, a * NullPointerException is thrown. * *

If off is negative, or len is negative, or * off+len is greater than the length of the array * b, then an IndexOutOfBoundsException is * thrown. * *

If len is zero, then no bytes are read and * 0 is returned; otherwise, there is an attempt to read at * least one byte. If no byte is available because the stream is at end of * stream, the value -1 is returned; otherwise, at least one * byte is read and stored into b. * *

The first byte read is stored into element b[off], the * next one into b[off+1], and so on. The number of bytes read * is, at most, equal to len. Let k be the number of * bytes actually read; these bytes will be stored in elements * b[off] through b[off+k-1], * leaving elements b[off+k] through * b[off+len-1] unaffected. * *

In every case, elements b[0] through * b[off] and elements b[off+len] through * b[b.length-1] are unaffected. * *

If the first byte cannot be read for any reason other than end of * stream, then an IOException is thrown. In particular, an * IOException is thrown if the input stream has been closed. * *

A subclass must provide an implementation of this method. * * @param b the buffer into which the data is read. * @param off the start offset in array b * at which the data is written. * @param len the maximum number of bytes to read. * @return the total number of bytes read into the buffer, or * -1 if there is no more data because the end of * the stream has been reached. * @exception IOException if an I/O error occurs. */ public abstract int read(byte[] b, int off, int len) throws IOException; // Implemented in InputStream: // // public int read(byte[] b) throws IOException { // public long skip(long n) throws IOException // public int available) throws IOException // public void close() throws IOException; /** Marked position, shared by {@link ForwardSeekableStream} */ protected long markPos = -1L; /** * Marks the current file position for later return using * the reset() method. */ public synchronized void mark(int readLimit) { try { markPos = getFilePointer(); } catch (IOException e) { markPos = -1L; } } /** * Returns the file position to its position at the time of * the immediately previous call to the mark() * method. */ public synchronized void reset() throws IOException { if (markPos != -1) { seek(markPos); } } /** * Returns true if marking is supported. * Marking is automatically supported for SeekableStream * subclasses that support seeking backeards. Subclasses that do * not support seeking backwards but do support marking must override * this method. */ public boolean markSupported() { return canSeekBackwards(); } /** * Returns true if this object supports calls to * seek(pos) with an offset pos smaller * than the current offset, as returned by getFilePointer. */ public boolean canSeekBackwards() { return false; } /** * Returns the current offset in this stream. * * @return the offset from the beginning of the stream, in bytes, * at which the next read occurs. * @exception IOException if an I/O error occurs. */ public abstract long getFilePointer() throws IOException; /** * Sets the offset, measured from the beginning of this * stream, at which the next read occurs. * *

If canSeekBackwards() returns false, * then setting pos to an offset smaller than * the current value of getFilePointer() will have * no effect. * * @param pos the offset position, measured in bytes from the * beginning of the stream, at which to set the stream * pointer. * @exception IOException if pos is less than * 0 or if an I/O error occurs. */ public abstract void seek(long pos) throws IOException; // Methods from RandomAccessFile /** * Reads b.length bytes from this stream into the byte * array, starting at the current stream pointer. This method reads * repeatedly from the stream until the requested number of bytes are * read. This method blocks until the requested number of bytes are * read, the end of the stream is detected, or an exception is thrown. * * @param b the buffer into which the data is read. * @exception EOFException if this stream reaches the end before reading * all the bytes. * @exception IOException if an I/O error occurs. */ public final void readFully(byte[] b) throws IOException { readFully(b, 0, b.length); } /** * Reads exactly len bytes from this stream into the byte * array, starting at the current stream pointer. This method reads * repeatedly from the stream until the requested number of bytes are * read. This method blocks until the requested number of bytes are * read, the end of the stream is detected, or an exception is thrown. * * @param b the buffer into which the data is read. * @param off the start offset of the data. * @param len the number of bytes to read. * @exception EOFException if this stream reaches the end before reading * all the bytes. * @exception IOException if an I/O error occurs. */ public final void readFully(byte[] b, int off, int len) throws IOException { int n = 0; do { int count = this.read(b, off + n, len - n); if (count < 0) throw new EOFException(); n += count; } while (n < len); } // Methods from DataInput, plus little-endian versions /** * Attempts to skip over n bytes of input discarding the * skipped bytes. *

* * This method may skip over some smaller number of bytes, possibly zero. * This may result from any of a number of conditions; reaching end of * stream before n bytes have been skipped is only one * possibility. This method never throws an EOFException. * The actual number of bytes skipped is returned. If n * is negative, no bytes are skipped. * * @param n the number of bytes to be skipped. * @return the actual number of bytes skipped. * @exception IOException if an I/O error occurs. */ public int skipBytes(int n) throws IOException { if (n <= 0) { return 0; } return (int)skip(n); } /** * Reads a boolean from this stream. This method reads a * single byte from the stream, starting at the current stream pointer. * A value of 0 represents * false. Any other value represents true. * This method blocks until the byte is read, the end of the stream * is detected, or an exception is thrown. * * @return the boolean value read. * @exception EOFException if this stream has reached the end. * @exception IOException if an I/O error occurs. */ public final boolean readBoolean() throws IOException { int ch = this.read(); if (ch < 0) throw new EOFException(); return (ch != 0); } /** * Reads a signed eight-bit value from this stream. This method reads a * byte from the stream, starting from the current stream pointer. * If the byte read is b, where * 0 <= b <= 255, * then the result is: *

     *     (byte)(b)
     * 
*

* This method blocks until the byte is read, the end of the stream * is detected, or an exception is thrown. * * @return the next byte of this stream as a signed eight-bit * byte. * @exception EOFException if this stream has reached the end. * @exception IOException if an I/O error occurs. */ public final byte readByte() throws IOException { int ch = this.read(); if (ch < 0) throw new EOFException(); return (byte)(ch); } /** * Reads an unsigned eight-bit number from this stream. This method reads * a byte from this stream, starting at the current stream pointer, * and returns that byte. *

* This method blocks until the byte is read, the end of the stream * is detected, or an exception is thrown. * * @return the next byte of this stream, interpreted as an unsigned * eight-bit number. * @exception EOFException if this stream has reached the end. * @exception IOException if an I/O error occurs. */ public final int readUnsignedByte() throws IOException { int ch = this.read(); if (ch < 0) throw new EOFException(); return ch; } /** * Reads a signed 16-bit number from this stream. * The method reads two * bytes from this stream, starting at the current stream pointer. * If the two bytes read, in order, are * b1 and b2, where each of the two values is * between 0 and 255, inclusive, then the * result is equal to: *

     *     (short)((b1 << 8) | b2)
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream, interpreted as a signed * 16-bit number. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final short readShort() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (short)((ch1 << 8) + (ch2 << 0)); } /** * Reads a signed 16-bit number from this stream in little-endian order. * The method reads two * bytes from this stream, starting at the current stream pointer. * If the two bytes read, in order, are * b1 and b2, where each of the two values is * between 0 and 255, inclusive, then the * result is equal to: *

     *     (short)((b2 << 8) | b1)
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream, interpreted as a signed * 16-bit number. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final short readShortLE() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (short)((ch2 << 8) + (ch1 << 0)); } /** * Reads an unsigned 16-bit number from this stream. This method reads * two bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1 and b2, where * 0 <= b1, b2 <= 255, * then the result is equal to: *

     *     (b1 << 8) | b2
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream, interpreted as an * unsigned 16-bit integer. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final int readUnsignedShort() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (ch1 << 8) + (ch2 << 0); } /** * Reads an unsigned 16-bit number from this stream in little-endian order. * This method reads * two bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1 and b2, where * 0 <= b1, b2 <= 255, * then the result is equal to: *

     *     (b2 << 8) | b1
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream, interpreted as an * unsigned 16-bit integer. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final int readUnsignedShortLE() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (ch2 << 8) + (ch1 << 0); } /** * Reads a Unicode character from this stream. This method reads two * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1 and b2, where * 0 <= b1, b2 <= 255, * then the result is equal to: *

     *     (char)((b1 << 8) | b2)
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream as a Unicode character. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final char readChar() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (char)((ch1 << 8) + (ch2 << 0)); } /** * Reads a Unicode character from this stream in little-endian order. * This method reads two * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1 and b2, where * 0 <= b1, b2 <= 255, * then the result is equal to: *

     *     (char)((b2 << 8) | b1)
     * 
*

* This method blocks until the two bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next two bytes of this stream as a Unicode character. * @exception EOFException if this stream reaches the end before reading * two bytes. * @exception IOException if an I/O error occurs. */ public final char readCharLE() throws IOException { int ch1 = this.read(); int ch2 = this.read(); if ((ch1 | ch2) < 0) throw new EOFException(); return (char)((ch2 << 8) + (ch1 << 0)); } /** * Reads a signed 32-bit integer from this stream. This method reads 4 * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are b1, * b2, b3, and b4, where * 0 <= b1, b2, b3, b4 <= 255, * then the result is equal to: *

     *     (b1 << 24) | (b2 << 16) + (b3 << 8) + b4
     * 
*

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as an * int. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final int readInt() throws IOException { int ch1 = this.read(); int ch2 = this.read(); int ch3 = this.read(); int ch4 = this.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); } /** * Reads a signed 32-bit integer from this stream in little-endian order. * This method reads 4 * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are b1, * b2, b3, and b4, where * 0 <= b1, b2, b3, b4 <= 255, * then the result is equal to: *

     *     (b4 << 24) | (b3 << 16) + (b2 << 8) + b1
     * 
*

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as an * int. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final int readIntLE() throws IOException { int ch1 = this.read(); int ch2 = this.read(); int ch3 = this.read(); int ch4 = this.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0)); } /** * Reads an unsigned 32-bit integer from this stream. This method reads 4 * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are b1, * b2, b3, and b4, where * 0 <= b1, b2, b3, b4 <= 255, * then the result is equal to: *

     *     (b1 << 24) | (b2 << 16) + (b3 << 8) + b4
     * 
*

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as a * long. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final long readUnsignedInt() throws IOException { long ch1 = this.read(); long ch2 = this.read(); long ch3 = this.read(); long ch4 = this.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); } private byte[] ruileBuf = new byte[4]; /** * Reads an unsigned 32-bit integer from this stream in little-endian * order. This method reads 4 * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are b1, * b2, b3, and b4, where * 0 <= b1, b2, b3, b4 <= 255, * then the result is equal to: *

     *     (b4 << 24) | (b3 << 16) + (b2 << 8) + b1
     * 
*

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as a * long. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final long readUnsignedIntLE() throws IOException { this.readFully(ruileBuf); long ch1 = (ruileBuf[0] & 0xff); long ch2 = (ruileBuf[1] & 0xff); long ch3 = (ruileBuf[2] & 0xff); long ch4 = (ruileBuf[3] & 0xff); return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0)); } /** * Reads a signed 64-bit integer from this stream. This method reads eight * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1, b2, b3, * b4, b5, b6, * b7, and b8, where: *

     *     0 <= b1, b2, b3, b4, b5, b6, b7, b8 <=255,
     * 
*

* then the result is equal to: *

     *     ((long)b1 << 56) + ((long)b2 << 48)
     *     + ((long)b3 << 40) + ((long)b4 << 32)
     *     + ((long)b5 << 24) + ((long)b6 << 16)
     *     + ((long)b7 << 8) + b8
     * 
*

* This method blocks until the eight bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next eight bytes of this stream, interpreted as a * long. * @exception EOFException if this stream reaches the end before reading * eight bytes. * @exception IOException if an I/O error occurs. */ public final long readLong() throws IOException { return ((long)(readInt()) << 32) + (readInt() & 0xFFFFFFFFL); } /** * Reads a signed 64-bit integer from this stream in little-endian * order. This method reads eight * bytes from the stream, starting at the current stream pointer. * If the bytes read, in order, are * b1, b2, b3, * b4, b5, b6, * b7, and b8, where: *

     *     0 <= b1, b2, b3, b4, b5, b6, b7, b8 <=255,
     * 
*

* then the result is equal to: *

     *     ((long)b1 << 56) + ((long)b2 << 48)
     *     + ((long)b3 << 40) + ((long)b4 << 32)
     *     + ((long)b5 << 24) + ((long)b6 << 16)
     *     + ((long)b7 << 8) + b8
     * 
*

* This method blocks until the eight bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next eight bytes of this stream, interpreted as a * long. * @exception EOFException if this stream reaches the end before reading * eight bytes. * @exception IOException if an I/O error occurs. */ public final long readLongLE() throws IOException { int i1 = readIntLE(); int i2 = readIntLE(); return ((long)i2 << 32) + (i1 & 0xFFFFFFFFL); } /** * Reads a float from this stream. This method reads an * int value, starting at the current stream pointer, * as if by the readInt method * and then converts that int to a float * using the intBitsToFloat method in class * Float. *

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as a * float. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final float readFloat() throws IOException { return Float.intBitsToFloat(readInt()); } /** * Reads a float from this stream in little-endian order. * This method reads an * int value, starting at the current stream pointer, * as if by the readInt method * and then converts that int to a float * using the intBitsToFloat method in class * Float. *

* This method blocks until the four bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next four bytes of this stream, interpreted as a * float. * @exception EOFException if this stream reaches the end before reading * four bytes. * @exception IOException if an I/O error occurs. */ public final float readFloatLE() throws IOException { return Float.intBitsToFloat(readIntLE()); } /** * Reads a double from this stream. This method reads a * long value, starting at the current stream pointer, * as if by the readLong method * and then converts that long to a double * using the longBitsToDouble method in * class Double. *

* This method blocks until the eight bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next eight bytes of this stream, interpreted as a * double. * @exception EOFException if this stream reaches the end before reading * eight bytes. * @exception IOException if an I/O error occurs. */ public final double readDouble() throws IOException { return Double.longBitsToDouble(readLong()); } /** * Reads a double from this stream in little-endian order. * This method reads a * long value, starting at the current stream pointer, * as if by the readLong method * and then converts that long to a double * using the longBitsToDouble method in * class Double. *

* This method blocks until the eight bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return the next eight bytes of this stream, interpreted as a * double. * @exception EOFException if this stream reaches the end before reading * eight bytes. * @exception IOException if an I/O error occurs. */ public final double readDoubleLE() throws IOException { return Double.longBitsToDouble(readLongLE()); } /** * Reads the next line of text from this stream. This method successively * reads bytes from the stream, starting at the current stream pointer, * until it reaches a line terminator or the end * of the stream. Each byte is converted into a character by taking the * byte's value for the lower eight bits of the character and setting the * high eight bits of the character to zero. This method does not, * therefore, support the full Unicode character set. * *

A line of text is terminated by a carriage-return character * ('\r'), a newline character ('\n'), a * carriage-return character immediately followed by a newline character, * or the end of the stream. Line-terminating characters are discarded and * are not included as part of the string returned. * *

This method blocks until a newline character is read, a carriage * return and the byte following it are read (to see if it is a newline), * the end of the stream is reached, or an exception is thrown. * * @return the next line of text from this stream, or null if end * of stream is encountered before even one byte is read. * @exception IOException if an I/O error occurs. */ public final String readLine() throws IOException { StringBuffer input = new StringBuffer(); int c = -1; boolean eol = false; while (!eol) { switch (c = read()) { case -1: case '\n': eol = true; break; case '\r': eol = true; long cur = getFilePointer(); if ((read()) != '\n') { seek(cur); } break; default: input.append((char)c); break; } } if ((c == -1) && (input.length() == 0)) { return null; } return input.toString(); } /** * Reads in a string from this stream. The string has been encoded * using a modified UTF-8 format. *

* The first two bytes are read, starting from the current stream * pointer, as if by * readUnsignedShort. This value gives the number of * following bytes that are in the encoded string, not * the length of the resulting string. The following bytes are then * interpreted as bytes encoding characters in the UTF-8 format * and are converted into characters. *

* This method blocks until all the bytes are read, the end of the * stream is detected, or an exception is thrown. * * @return a Unicode string. * @exception EOFException if this stream reaches the end before * reading all the bytes. * @exception IOException if an I/O error occurs. * @exception UTFDataFormatException if the bytes do not represent * valid UTF-8 encoding of a Unicode string. */ public final String readUTF() throws IOException { return DataInputStream.readUTF(this); } /** * Releases any system resources associated with this stream * by calling the close() method. */ protected void finalize() throws Throwable { super.finalize(); close(); } } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/0000755000175000017500000000000013153020772027157 5ustar mans0954mans0954././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageDecoder.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageDecoder.ja0000644000175000017500000017367713063003443032371 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import java.awt.Color; import java.awt.Point; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferUShort; import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import org.apache.batik.ext.awt.image.codec.util.ImageDecoderImpl; import org.apache.batik.ext.awt.image.codec.util.PropertyUtil; import org.apache.batik.ext.awt.image.codec.util.SimpleRenderedImage; /** * @version $Id: PNGImageDecoder.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGImageDecoder extends ImageDecoderImpl { public PNGImageDecoder(InputStream input, PNGDecodeParam param) { super(input, param); } public RenderedImage decodeAsRenderedImage(int page) throws IOException { if (page != 0) { throw new IOException(PropertyUtil.getString("PNGImageDecoder19")); } return new PNGImage(input, (PNGDecodeParam)param); } } class PNGChunk { int length; int type; byte[] data; int crc; final String typeString; PNGChunk(int length, int type, byte[] data, int crc) { this.length = length; this.type = type; this.data = data; this.crc = crc; typeString = "" + (char)((type >>> 24) & 0xff) + (char)((type >>> 16) & 0xff) + (char)((type >>> 8) & 0xff) + (char)((type ) & 0xff); } public int getLength() { return length; } public int getType() { return type; } public String getTypeString() { return typeString; } public byte[] getData() { return data; } public byte getByte(int offset) { return data[offset]; } public int getInt1(int offset) { return data[offset] & 0xff; } public int getInt2(int offset) { return ((data[offset] & 0xff) << 8) | (data[offset + 1] & 0xff); } public int getInt4(int offset) { return ((data[offset] & 0xff) << 24) | ((data[offset + 1] & 0xff) << 16) | ((data[offset + 2] & 0xff) << 8) | (data[offset + 3] & 0xff); } public String getString4(int offset) { return "" + (char)data[offset] + (char)data[offset + 1] + (char)data[offset + 2] + (char)data[offset + 3]; } public boolean isType(String typeName) { return typeString.equals(typeName); } } /** * TO DO: * * zTXt chunks * */ class PNGImage extends SimpleRenderedImage { public static final int PNG_COLOR_GRAY = 0; public static final int PNG_COLOR_RGB = 2; public static final int PNG_COLOR_PALETTE = 3; public static final int PNG_COLOR_GRAY_ALPHA = 4; public static final int PNG_COLOR_RGB_ALPHA = 6; private static final String[] colorTypeNames = { "Grayscale", "Error", "Truecolor", "Index", "Grayscale with alpha", "Error", "Truecolor with alpha" }; public static final int PNG_FILTER_NONE = 0; public static final int PNG_FILTER_SUB = 1; public static final int PNG_FILTER_UP = 2; public static final int PNG_FILTER_AVERAGE = 3; public static final int PNG_FILTER_PAETH = 4; private int[][] bandOffsets = { null, { 0 }, // G { 0, 1 }, // GA in GA order { 0, 1, 2 }, // RGB in RGB order { 0, 1, 2, 3 } // RGBA in RGBA order }; private int bitDepth; private int colorType; private int compressionMethod; private int filterMethod; private int interlaceMethod; private int paletteEntries; private byte[] redPalette; private byte[] greenPalette; private byte[] bluePalette; private byte[] alphaPalette; private int bkgdRed; private int bkgdGreen; private int bkgdBlue; private int grayTransparentAlpha; private int redTransparentAlpha; private int greenTransparentAlpha; private int blueTransparentAlpha; private int maxOpacity; private int[] significantBits = null; // Parameter information // If true, the user wants destination alpha where applicable. private boolean suppressAlpha = false; // If true, perform palette lookup internally private boolean expandPalette = false; // If true, output < 8 bit gray images in 8 bit components format private boolean output8BitGray = false; // Create an alpha channel in the destination color model. private boolean outputHasAlphaPalette = false; // Perform gamma correction on the image private boolean performGammaCorrection = false; // Expand GA to GGGA for compatbility with Java2D private boolean expandGrayAlpha = false; // Produce an instance of PNGEncodeParam private boolean generateEncodeParam = false; // PNGDecodeParam controlling decode process private PNGDecodeParam decodeParam = null; // PNGEncodeParam to store file details in private PNGEncodeParam encodeParam = null; private boolean emitProperties = true; private float fileGamma = 45455/100000.0F; private float userExponent = 1.0F; private float displayExponent = 2.2F; private float[] chromaticity = null; private int sRGBRenderingIntent = -1; // Post-processing step implied by above parameters private int postProcess = POST_NONE; // Possible post-processing steps // Do nothing private static final int POST_NONE = 0; // Gamma correct only private static final int POST_GAMMA = 1; // Push gray values through grayLut to expand to 8 bits private static final int POST_GRAY_LUT = 2; // Push gray values through grayLut to expand to 8 bits, add alpha private static final int POST_GRAY_LUT_ADD_TRANS = 3; // Push palette value through R,G,B lookup tables private static final int POST_PALETTE_TO_RGB = 4; // Push palette value through R,G,B,A lookup tables private static final int POST_PALETTE_TO_RGBA = 5; // Add transparency to a given gray value (w/ optional gamma) private static final int POST_ADD_GRAY_TRANS = 6; // Add transparency to a given RGB value (w/ optional gamma) private static final int POST_ADD_RGB_TRANS = 7; // Remove the alpha channel from a gray image (w/ optional gamma) private static final int POST_REMOVE_GRAY_TRANS = 8; // Remove the alpha channel from an RGB image (w/optional gamma) private static final int POST_REMOVE_RGB_TRANS = 9; // Mask to add expansion of GA -> GGGA private static final int POST_EXP_MASK = 16; // Expand gray to G/G/G private static final int POST_GRAY_ALPHA_EXP = POST_NONE | POST_EXP_MASK; // Expand gray to G/G/G through a gamma lut private static final int POST_GAMMA_EXP = POST_GAMMA | POST_EXP_MASK; // Push gray values through grayLut to expand to 8 bits, expand, add alpha private static final int POST_GRAY_LUT_ADD_TRANS_EXP = POST_GRAY_LUT_ADD_TRANS | POST_EXP_MASK; // Add transparency to a given gray value, expand private static final int POST_ADD_GRAY_TRANS_EXP = POST_ADD_GRAY_TRANS | POST_EXP_MASK; private List streamVec = new ArrayList(); private DataInputStream dataStream; private int bytesPerPixel; // number of bytes per input pixel private int inputBands; private int outputBands; // Number of private chunks private int chunkIndex = 0; private List textKeys = new ArrayList(); private List textStrings = new ArrayList(); private List ztextKeys = new ArrayList(); private List ztextStrings = new ArrayList(); private WritableRaster theTile; private int[] gammaLut = null; private void initGammaLut(int bits) { double exp = (double)userExponent/(fileGamma*displayExponent); int numSamples = 1 << bits; int maxOutSample = (bits == 16) ? 65535 : 255; gammaLut = new int[numSamples]; for (int i = 0; i < numSamples; i++) { double gbright = (double)i/(numSamples - 1); double gamma = Math.pow(gbright, exp); int igamma = (int)(gamma*maxOutSample + 0.5); if (igamma > maxOutSample) { igamma = maxOutSample; } gammaLut[i] = igamma; } } private final byte[][] expandBits = { null, { (byte)0x00, (byte)0xff }, { (byte)0x00, (byte)0x55, (byte)0xaa, (byte)0xff }, null, { (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff } }; private int[] grayLut = null; private void initGrayLut(int bits) { int len = 1 << bits; grayLut = new int[len]; if (performGammaCorrection) { System.arraycopy( gammaLut, 0, grayLut, 0, len ); } else { for (int i = 0; i < len; i++) { grayLut[i] = expandBits[bits][i]; } } } public PNGImage(InputStream stream, PNGDecodeParam decodeParam) throws IOException { if (!stream.markSupported()) { stream = new BufferedInputStream(stream); } DataInputStream distream = new DataInputStream(stream); if (decodeParam == null) { decodeParam = new PNGDecodeParam(); } this.decodeParam = decodeParam; // Get parameter values this.suppressAlpha = decodeParam.getSuppressAlpha(); this.expandPalette = decodeParam.getExpandPalette(); this.output8BitGray = decodeParam.getOutput8BitGray(); this.expandGrayAlpha = decodeParam.getExpandGrayAlpha(); if (decodeParam.getPerformGammaCorrection()) { this.userExponent = decodeParam.getUserExponent(); this.displayExponent = decodeParam.getDisplayExponent(); performGammaCorrection = true; output8BitGray = true; } this.generateEncodeParam = decodeParam.getGenerateEncodeParam(); if (emitProperties) { properties.put("file_type", "PNG v. 1.0"); } try { long magic = distream.readLong(); if (magic != 0x89504e470d0a1a0aL) { String msg = PropertyUtil.getString("PNGImageDecoder0"); throw new RuntimeException(msg); } } catch (Exception e) { e.printStackTrace(); String msg = PropertyUtil.getString("PNGImageDecoder1"); throw new RuntimeException(msg); } do { try { PNGChunk chunk; String chunkType = getChunkType(distream); if (chunkType.equals("IHDR")) { chunk = readChunk(distream); parse_IHDR_chunk(chunk); } else if (chunkType.equals("PLTE")) { chunk = readChunk(distream); parse_PLTE_chunk(chunk); } else if (chunkType.equals("IDAT")) { chunk = readChunk(distream); streamVec.add(new ByteArrayInputStream(chunk.getData())); } else if (chunkType.equals("IEND")) { chunk = readChunk(distream); parse_IEND_chunk(chunk); break; // fall through to the bottom } else if (chunkType.equals("bKGD")) { chunk = readChunk(distream); parse_bKGD_chunk(chunk); } else if (chunkType.equals("cHRM")) { chunk = readChunk(distream); parse_cHRM_chunk(chunk); } else if (chunkType.equals("gAMA")) { chunk = readChunk(distream); parse_gAMA_chunk(chunk); } else if (chunkType.equals("hIST")) { chunk = readChunk(distream); parse_hIST_chunk(chunk); } else if (chunkType.equals("iCCP")) { chunk = readChunk(distream); parse_iCCP_chunk(chunk); } else if (chunkType.equals("pHYs")) { chunk = readChunk(distream); parse_pHYs_chunk(chunk); } else if (chunkType.equals("sBIT")) { chunk = readChunk(distream); parse_sBIT_chunk(chunk); } else if (chunkType.equals("sRGB")) { chunk = readChunk(distream); parse_sRGB_chunk(chunk); } else if (chunkType.equals("tEXt")) { chunk = readChunk(distream); parse_tEXt_chunk(chunk); } else if (chunkType.equals("tIME")) { chunk = readChunk(distream); parse_tIME_chunk(chunk); } else if (chunkType.equals("tRNS")) { chunk = readChunk(distream); parse_tRNS_chunk(chunk); } else if (chunkType.equals("zTXt")) { chunk = readChunk(distream); parse_zTXt_chunk(chunk); } else { chunk = readChunk(distream); // Output the chunk data in raw form String type = chunk.getTypeString(); byte[] data = chunk.getData(); if (encodeParam != null) { encodeParam.addPrivateChunk(type, data); } if (emitProperties) { String key = "chunk_" + chunkIndex++ + ':' + type; properties.put(key.toLowerCase(), data); } } } catch (Exception e) { e.printStackTrace(); String msg = PropertyUtil.getString("PNGImageDecoder2"); throw new RuntimeException(msg); } } while (true); // Final post-processing if (significantBits == null) { significantBits = new int[inputBands]; for (int i = 0; i < inputBands; i++) { significantBits[i] = bitDepth; } if (emitProperties) { properties.put("significant_bits", significantBits); } } } private static String getChunkType(DataInputStream distream) { try { distream.mark(8); /* int length = */ distream.readInt(); int type = distream.readInt(); distream.reset(); String typeString = ""; // todo simplify this typeString += (char)(type >> 24); typeString += (char)((type >> 16) & 0xff); typeString += (char)((type >> 8) & 0xff); typeString += (char)(type & 0xff); return typeString; } catch (Exception e) { e.printStackTrace(); return null; } } private static PNGChunk readChunk(DataInputStream distream) { try { int length = distream.readInt(); int type = distream.readInt(); byte[] data = new byte[length]; distream.readFully(data); int crc = distream.readInt(); return new PNGChunk(length, type, data, crc); } catch (Exception e) { e.printStackTrace(); return null; } } private void parse_IHDR_chunk(PNGChunk chunk) { tileWidth = width = chunk.getInt4(0); tileHeight = height = chunk.getInt4(4); bitDepth = chunk.getInt1(8); if ((bitDepth != 1) && (bitDepth != 2) && (bitDepth != 4) && (bitDepth != 8) && (bitDepth != 16)) { // Error -- bad bit depth String msg = PropertyUtil.getString("PNGImageDecoder3"); throw new RuntimeException(msg); } maxOpacity = (1 << bitDepth) - 1; colorType = chunk.getInt1(9); if ((colorType != PNG_COLOR_GRAY) && (colorType != PNG_COLOR_RGB) && (colorType != PNG_COLOR_PALETTE) && (colorType != PNG_COLOR_GRAY_ALPHA) && (colorType != PNG_COLOR_RGB_ALPHA)) { System.out.println(PropertyUtil.getString("PNGImageDecoder4")); } if ((colorType == PNG_COLOR_RGB) && (bitDepth < 8)) { // Error -- RGB images must have 8 or 16 bits String msg = PropertyUtil.getString("PNGImageDecoder5"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_PALETTE) && (bitDepth == 16)) { // Error -- palette images must have < 16 bits String msg = PropertyUtil.getString("PNGImageDecoder6"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_GRAY_ALPHA) && (bitDepth < 8)) { // Error -- gray/alpha images must have >= 8 bits String msg = PropertyUtil.getString("PNGImageDecoder7"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_RGB_ALPHA) && (bitDepth < 8)) { // Error -- RGB/alpha images must have >= 8 bits String msg = PropertyUtil.getString("PNGImageDecoder8"); throw new RuntimeException(msg); } if (emitProperties) { properties.put("color_type", colorTypeNames[colorType]); } if (generateEncodeParam) { if (colorType == PNG_COLOR_PALETTE) { encodeParam = new PNGEncodeParam.Palette(); } else if (colorType == PNG_COLOR_GRAY || colorType == PNG_COLOR_GRAY_ALPHA) { encodeParam = new PNGEncodeParam.Gray(); } else { encodeParam = new PNGEncodeParam.RGB(); } decodeParam.setEncodeParam(encodeParam); } if (encodeParam != null) { encodeParam.setBitDepth(bitDepth); } if (emitProperties) { properties.put("bit_depth", new Integer(bitDepth)); } if (performGammaCorrection) { // Assume file gamma is 1/2.2 unless we get a gAMA chunk float gamma = (1.0F/2.2F)*(displayExponent/userExponent); if (encodeParam != null) { encodeParam.setGamma(gamma); } if (emitProperties) { properties.put("gamma", new Float(gamma)); } } compressionMethod = chunk.getInt1(10); if (compressionMethod != 0) { // Error -- only know about compression method 0 String msg = PropertyUtil.getString("PNGImageDecoder9"); throw new RuntimeException(msg); } filterMethod = chunk.getInt1(11); if (filterMethod != 0) { // Error -- only know about filter method 0 String msg = PropertyUtil.getString("PNGImageDecoder10"); throw new RuntimeException(msg); } interlaceMethod = chunk.getInt1(12); if (interlaceMethod == 0) { if (encodeParam != null) { encodeParam.setInterlacing(false); } if (emitProperties) { properties.put("interlace_method", "None"); } } else if (interlaceMethod == 1) { if (encodeParam != null) { encodeParam.setInterlacing(true); } if (emitProperties) { properties.put("interlace_method", "Adam7"); } } else { // Error -- only know about Adam7 interlacing String msg = PropertyUtil.getString("PNGImageDecoder11"); throw new RuntimeException(msg); } bytesPerPixel = (bitDepth == 16) ? 2 : 1; switch (colorType) { case PNG_COLOR_GRAY: inputBands = 1; outputBands = 1; if (output8BitGray && (bitDepth < 8)) { postProcess = POST_GRAY_LUT; } else if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; case PNG_COLOR_RGB: inputBands = 3; bytesPerPixel *= 3; outputBands = 3; if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; case PNG_COLOR_PALETTE: inputBands = 1; bytesPerPixel = 1; outputBands = expandPalette ? 3 : 1; if (expandPalette) { postProcess = POST_PALETTE_TO_RGB; } else { postProcess = POST_NONE; } break; case PNG_COLOR_GRAY_ALPHA: inputBands = 2; bytesPerPixel *= 2; if (suppressAlpha) { outputBands = 1; postProcess = POST_REMOVE_GRAY_TRANS; } else { if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } if (expandGrayAlpha) { postProcess |= POST_EXP_MASK; outputBands = 4; } else { outputBands = 2; } } break; case PNG_COLOR_RGB_ALPHA: inputBands = 4; bytesPerPixel *= 4; outputBands = (!suppressAlpha) ? 4 : 3; if (suppressAlpha) { postProcess = POST_REMOVE_RGB_TRANS; } else if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; } } private void parse_IEND_chunk(PNGChunk chunk) throws Exception { // Store text strings int textLen = textKeys.size(); String[] textArray = new String[2*textLen]; for (int i = 0; i < textLen; i++) { String key = (String)textKeys.get(i); String val = (String)textStrings.get(i); textArray[2*i] = key; textArray[2*i + 1] = val; if (emitProperties) { String uniqueKey = "text_" + i + ':' + key; properties.put(uniqueKey.toLowerCase(), val); } } if (encodeParam != null) { encodeParam.setText(textArray); } // Store compressed text strings int ztextLen = ztextKeys.size(); String[] ztextArray = new String[2*ztextLen]; for (int i = 0; i < ztextLen; i++) { String key = (String)ztextKeys.get(i); String val = (String)ztextStrings.get(i); ztextArray[2*i] = key; ztextArray[2*i + 1] = val; if (emitProperties) { String uniqueKey = "ztext_" + i + ':' + key; properties.put(uniqueKey.toLowerCase(), val); } } if (encodeParam != null) { encodeParam.setCompressedText(ztextArray); } // Parse prior IDAT chunks InputStream seqStream = new SequenceInputStream( Collections.enumeration( streamVec ) ); InputStream infStream = new InflaterInputStream(seqStream, new Inflater()); dataStream = new DataInputStream(infStream); // Create an empty WritableRaster int depth = bitDepth; if ((colorType == PNG_COLOR_GRAY) && (bitDepth < 8) && output8BitGray) { depth = 8; } if ((colorType == PNG_COLOR_PALETTE) && expandPalette) { depth = 8; } int bytesPerRow = (outputBands*width*depth + 7)/8; int scanlineStride = (depth == 16) ? (bytesPerRow/2) : bytesPerRow; theTile = createRaster(width, height, outputBands, scanlineStride, depth); if (performGammaCorrection && (gammaLut == null)) { initGammaLut(bitDepth); } if ((postProcess == POST_GRAY_LUT) || (postProcess == POST_GRAY_LUT_ADD_TRANS) || (postProcess == POST_GRAY_LUT_ADD_TRANS_EXP)) { initGrayLut(bitDepth); } decodeImage(interlaceMethod == 1); sampleModel = theTile.getSampleModel(); if ((colorType == PNG_COLOR_PALETTE) && !expandPalette) { if (outputHasAlphaPalette) { colorModel = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette, bluePalette, alphaPalette); } else { colorModel = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette, bluePalette); } } else if ((colorType == PNG_COLOR_GRAY) && (bitDepth < 8) && !output8BitGray) { byte[] palette = expandBits[bitDepth]; colorModel = new IndexColorModel(bitDepth, palette.length, palette, palette, palette); } else { colorModel = createComponentColorModel(sampleModel); } } private static final int[] GrayBits8 = { 8 }; private static final ComponentColorModel colorModelGray8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits8, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); private static final int[] GrayAlphaBits8 = { 8, 8 }; private static final ComponentColorModel colorModelGrayAlpha8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits8, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); private static final int[] GrayBits16 = { 16 }; private static final ComponentColorModel colorModelGray16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits16, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); private static final int[] GrayAlphaBits16 = { 16, 16 }; private static final ComponentColorModel colorModelGrayAlpha16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits16, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT); private static final int[] GrayBits32 = { 32 }; private static final ComponentColorModel colorModelGray32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits32, false, false, Transparency.OPAQUE, DataBuffer.TYPE_INT); private static final int[] GrayAlphaBits32 = { 32, 32 }; private static final ComponentColorModel colorModelGrayAlpha32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits32, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_INT); private static final int[] RGBBits8 = { 8, 8, 8 }; private static final ComponentColorModel colorModelRGB8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits8, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); private static final int[] RGBABits8 = { 8, 8, 8, 8 }; private static final ComponentColorModel colorModelRGBA8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits8, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); private static final int[] RGBBits16 = { 16, 16, 16 }; private static final ComponentColorModel colorModelRGB16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits16, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); private static final int[] RGBABits16 = { 16, 16, 16, 16 }; private static final ComponentColorModel colorModelRGBA16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits16, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT); private static final int[] RGBBits32 = { 32, 32, 32 }; private static final ComponentColorModel colorModelRGB32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits32, false, false, Transparency.OPAQUE, DataBuffer.TYPE_INT); private static final int[] RGBABits32 = { 32, 32, 32, 32 }; private static final ComponentColorModel colorModelRGBA32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits32, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_INT); /** * A convenience method to create an instance of * ComponentColorModel suitable for use with the * given SampleModel. The SampleModel * should have a data type of DataBuffer.TYPE_BYTE, * TYPE_USHORT, or TYPE_INT and between * 1 and 4 bands. Depending on the number of bands of the * SampleModel, either a gray, gray+alpha, rgb, or * rgb+alpha ColorModel is returned. */ public static ColorModel createComponentColorModel(SampleModel sm) { int type = sm.getDataType(); int bands = sm.getNumBands(); ComponentColorModel cm = null; if (type == DataBuffer.TYPE_BYTE) { switch (bands) { case 1: cm = colorModelGray8; break; case 2: cm = colorModelGrayAlpha8; break; case 3: cm = colorModelRGB8; break; case 4: cm = colorModelRGBA8; break; } } else if (type == DataBuffer.TYPE_USHORT) { switch (bands) { case 1: cm = colorModelGray16; break; case 2: cm = colorModelGrayAlpha16; break; case 3: cm = colorModelRGB16; break; case 4: cm = colorModelRGBA16; break; } } else if (type == DataBuffer.TYPE_INT) { switch (bands) { case 1: cm = colorModelGray32; break; case 2: cm = colorModelGrayAlpha32; break; case 3: cm = colorModelRGB32; break; case 4: cm = colorModelRGBA32; break; } } return cm; } private void parse_PLTE_chunk(PNGChunk chunk) { paletteEntries = chunk.getLength()/3; redPalette = new byte[paletteEntries]; greenPalette = new byte[paletteEntries]; bluePalette = new byte[paletteEntries]; int pltIndex = 0; // gAMA chunk must precede PLTE chunk if (performGammaCorrection) { if (gammaLut == null) { initGammaLut(bitDepth == 16 ? 16 : 8); } for (int i = 0; i < paletteEntries; i++) { byte r = chunk.getByte(pltIndex++); byte g = chunk.getByte(pltIndex++); byte b = chunk.getByte(pltIndex++); redPalette[i] = (byte)gammaLut[r & 0xff]; greenPalette[i] = (byte)gammaLut[g & 0xff]; bluePalette[i] = (byte)gammaLut[b & 0xff]; } } else { for (int i = 0; i < paletteEntries; i++) { redPalette[i] = chunk.getByte(pltIndex++); greenPalette[i] = chunk.getByte(pltIndex++); bluePalette[i] = chunk.getByte(pltIndex++); } } } private void parse_bKGD_chunk(PNGChunk chunk) { switch (colorType) { case PNG_COLOR_PALETTE: int bkgdIndex = chunk.getByte(0) & 0xff; bkgdRed = redPalette[bkgdIndex] & 0xff; bkgdGreen = greenPalette[bkgdIndex] & 0xff; bkgdBlue = bluePalette[bkgdIndex] & 0xff; if (encodeParam != null) { ((PNGEncodeParam.Palette)encodeParam). setBackgroundPaletteIndex(bkgdIndex); } break; case PNG_COLOR_GRAY: case PNG_COLOR_GRAY_ALPHA: int bkgdGray = chunk.getInt2(0); bkgdRed = bkgdGreen = bkgdBlue = bkgdGray; if (encodeParam != null) { ((PNGEncodeParam.Gray)encodeParam). setBackgroundGray(bkgdGray); } break; case PNG_COLOR_RGB: case PNG_COLOR_RGB_ALPHA: bkgdRed = chunk.getInt2(0); bkgdGreen = chunk.getInt2(2); bkgdBlue = chunk.getInt2(4); int[] bkgdRGB = new int[3]; bkgdRGB[0] = bkgdRed; bkgdRGB[1] = bkgdGreen; bkgdRGB[2] = bkgdBlue; if (encodeParam != null) { ((PNGEncodeParam.RGB)encodeParam). setBackgroundRGB(bkgdRGB); } break; } int r = 0, g = 0, b = 0; if (bitDepth < 8) { r = expandBits[bitDepth][bkgdRed]; g = expandBits[bitDepth][bkgdGreen]; b = expandBits[bitDepth][bkgdBlue]; } else if (bitDepth == 8) { r = bkgdRed; g = bkgdGreen; b = bkgdBlue; } else if (bitDepth == 16) { r = bkgdRed >> 8; g = bkgdGreen >> 8; b = bkgdBlue >> 8; } if (emitProperties) { properties.put("background_color", new Color(r, g, b)); } } private void parse_cHRM_chunk(PNGChunk chunk) { // If an sRGB chunk exists, ignore cHRM chunks if (sRGBRenderingIntent != -1) { return; } chromaticity = new float[8]; chromaticity[0] = chunk.getInt4(0)/100000.0F; chromaticity[1] = chunk.getInt4(4)/100000.0F; chromaticity[2] = chunk.getInt4(8)/100000.0F; chromaticity[3] = chunk.getInt4(12)/100000.0F; chromaticity[4] = chunk.getInt4(16)/100000.0F; chromaticity[5] = chunk.getInt4(20)/100000.0F; chromaticity[6] = chunk.getInt4(24)/100000.0F; chromaticity[7] = chunk.getInt4(28)/100000.0F; if (encodeParam != null) { encodeParam.setChromaticity(chromaticity); } if (emitProperties) { properties.put("white_point_x", new Float(chromaticity[0])); properties.put("white_point_y", new Float(chromaticity[1])); properties.put("red_x", new Float(chromaticity[2])); properties.put("red_y", new Float(chromaticity[3])); properties.put("green_x", new Float(chromaticity[4])); properties.put("green_y", new Float(chromaticity[5])); properties.put("blue_x", new Float(chromaticity[6])); properties.put("blue_y", new Float(chromaticity[7])); } } private void parse_gAMA_chunk(PNGChunk chunk) { // If an sRGB chunk exists, ignore gAMA chunks if (sRGBRenderingIntent != -1) { return; } fileGamma = chunk.getInt4(0)/100000.0F; float exp = performGammaCorrection ? displayExponent/userExponent : 1.0F; if (encodeParam != null) { encodeParam.setGamma(fileGamma*exp); } if (emitProperties) { properties.put("gamma", new Float(fileGamma*exp)); } } private void parse_hIST_chunk(PNGChunk chunk) { if (redPalette == null) { String msg = PropertyUtil.getString("PNGImageDecoder18"); throw new RuntimeException(msg); } int length = redPalette.length; int[] hist = new int[length]; for (int i = 0; i < length; i++) { hist[i] = chunk.getInt2(2*i); } if (encodeParam != null) { encodeParam.setPaletteHistogram(hist); } } private void parse_iCCP_chunk(PNGChunk chunk) { String name = ""; // todo simplify this byte b; int textIndex = 0; while ((b = chunk.getByte(textIndex++)) != 0) { name += (char)b; } } private void parse_pHYs_chunk(PNGChunk chunk) { int xPixelsPerUnit = chunk.getInt4(0); int yPixelsPerUnit = chunk.getInt4(4); int unitSpecifier = chunk.getInt1(8); if (encodeParam != null) { encodeParam.setPhysicalDimension(xPixelsPerUnit, yPixelsPerUnit, unitSpecifier); } if (emitProperties) { properties.put("x_pixels_per_unit", new Integer(xPixelsPerUnit)); properties.put("y_pixels_per_unit", new Integer(yPixelsPerUnit)); properties.put("pixel_aspect_ratio", new Float((float)xPixelsPerUnit/yPixelsPerUnit)); if (unitSpecifier == 1) { properties.put("pixel_units", "Meters"); } else if (unitSpecifier != 0) { // Error -- unit specifier must be 0 or 1 String msg = PropertyUtil.getString("PNGImageDecoder12"); throw new RuntimeException(msg); } } } private void parse_sBIT_chunk(PNGChunk chunk) { if (colorType == PNG_COLOR_PALETTE) { significantBits = new int[3]; } else { significantBits = new int[inputBands]; } for (int i = 0; i < significantBits.length; i++) { int bits = chunk.getByte(i); int depth = (colorType == PNG_COLOR_PALETTE) ? 8 : bitDepth; if (bits <= 0 || bits > depth) { // Error -- significant bits must be between 0 and // image bit depth. String msg = PropertyUtil.getString("PNGImageDecoder13"); throw new RuntimeException(msg); } significantBits[i] = bits; } if (encodeParam != null) { encodeParam.setSignificantBits(significantBits); } if (emitProperties) { properties.put("significant_bits", significantBits); } } private void parse_sRGB_chunk(PNGChunk chunk) { sRGBRenderingIntent = chunk.getByte(0); // The presence of an sRGB chunk implies particular // settings for gamma and chroma. fileGamma = 45455/100000.0F; chromaticity = new float[8]; chromaticity[0] = 31270/10000.0F; chromaticity[1] = 32900/10000.0F; chromaticity[2] = 64000/10000.0F; chromaticity[3] = 33000/10000.0F; chromaticity[4] = 30000/10000.0F; chromaticity[5] = 60000/10000.0F; chromaticity[6] = 15000/10000.0F; chromaticity[7] = 6000/10000.0F; if (performGammaCorrection) { // File gamma is 1/2.2 float gamma = fileGamma*(displayExponent/userExponent); if (encodeParam != null) { encodeParam.setGamma(gamma); encodeParam.setChromaticity(chromaticity); } if (emitProperties) { properties.put("gamma", new Float(gamma)); properties.put("white_point_x", new Float(chromaticity[0])); properties.put("white_point_y", new Float(chromaticity[1])); properties.put("red_x", new Float(chromaticity[2])); properties.put("red_y", new Float(chromaticity[3])); properties.put("green_x", new Float(chromaticity[4])); properties.put("green_y", new Float(chromaticity[5])); properties.put("blue_x", new Float(chromaticity[6])); properties.put("blue_y", new Float(chromaticity[7])); } } } private void parse_tEXt_chunk(PNGChunk chunk) { byte b; StringBuffer key = new StringBuffer(); int textIndex = 0; while ((b = chunk.getByte(textIndex++)) != 0) { key.append( (char)b ); } StringBuffer value= new StringBuffer(); for (int i = textIndex; i < chunk.getLength(); i++) { value.append( (char)chunk.getByte(i) ); } textKeys.add(key.toString() ); textStrings.add(value.toString() ); } private void parse_tIME_chunk(PNGChunk chunk) { int year = chunk.getInt2(0); int month = chunk.getInt1(2) - 1; int day = chunk.getInt1(3); int hour = chunk.getInt1(4); int minute = chunk.getInt1(5); int second = chunk.getInt1(6); TimeZone gmt = TimeZone.getTimeZone("GMT"); GregorianCalendar cal = new GregorianCalendar(gmt); cal.set(year, month, day, hour, minute, second); Date date = cal.getTime(); if (encodeParam != null) { encodeParam.setModificationTime(date); } if (emitProperties) { properties.put("timestamp", date); } } private void parse_tRNS_chunk(PNGChunk chunk) { if (colorType == PNG_COLOR_PALETTE) { int entries = chunk.getLength(); if (entries > paletteEntries) { // Error -- mustn't have more alpha than RGB palette entries String msg = PropertyUtil.getString("PNGImageDecoder14"); throw new RuntimeException(msg); } // Load beginning of palette from the chunk alphaPalette = new byte[paletteEntries]; for (int i = 0; i < entries; i++) { alphaPalette[i] = chunk.getByte(i); } // Fill rest of palette with 255 for (int i = entries; i < paletteEntries; i++) { alphaPalette[i] = (byte)255; } if (!suppressAlpha) { if (expandPalette) { postProcess = POST_PALETTE_TO_RGBA; outputBands = 4; } else { outputHasAlphaPalette = true; } } } else if (colorType == PNG_COLOR_GRAY) { grayTransparentAlpha = chunk.getInt2(0); if (!suppressAlpha) { if (bitDepth < 8) { output8BitGray = true; maxOpacity = 255; postProcess = POST_GRAY_LUT_ADD_TRANS; } else { postProcess = POST_ADD_GRAY_TRANS; } if (expandGrayAlpha) { outputBands = 4; postProcess |= POST_EXP_MASK; } else { outputBands = 2; } if (encodeParam != null) { ((PNGEncodeParam.Gray)encodeParam). setTransparentGray(grayTransparentAlpha); } } } else if (colorType == PNG_COLOR_RGB) { redTransparentAlpha = chunk.getInt2(0); greenTransparentAlpha = chunk.getInt2(2); blueTransparentAlpha = chunk.getInt2(4); if (!suppressAlpha) { outputBands = 4; postProcess = POST_ADD_RGB_TRANS; if (encodeParam != null) { int[] rgbTrans = new int[3]; rgbTrans[0] = redTransparentAlpha; rgbTrans[1] = greenTransparentAlpha; rgbTrans[2] = blueTransparentAlpha; ((PNGEncodeParam.RGB)encodeParam). setTransparentRGB(rgbTrans); } } } else if (colorType == PNG_COLOR_GRAY_ALPHA || colorType == PNG_COLOR_RGB_ALPHA) { // Error -- GA or RGBA image can't have a tRNS chunk. String msg = PropertyUtil.getString("PNGImageDecoder15"); throw new RuntimeException(msg); } } private void parse_zTXt_chunk(PNGChunk chunk) { int textIndex = 0; StringBuffer key = new StringBuffer(); byte b; while ((b = chunk.getByte(textIndex++)) != 0) { key.append( (char)b ); } /* int method = */ chunk.getByte(textIndex++); StringBuffer value = new StringBuffer(); try { int length = chunk.getLength() - textIndex; byte[] data = chunk.getData(); InputStream cis = new ByteArrayInputStream(data, textIndex, length); InputStream iis = new InflaterInputStream(cis); int c; while ((c = iis.read()) != -1) { value.append( (char)c ); } ztextKeys.add(key.toString() ); ztextStrings.add(value.toString() ); } catch (Exception e) { e.printStackTrace(); } } private WritableRaster createRaster(int width, int height, int bands, int scanlineStride, int bitDepth) { DataBuffer dataBuffer; WritableRaster ras = null; Point origin = new Point(0, 0); if ((bitDepth < 8) && (bands == 1)) { dataBuffer = new DataBufferByte(height*scanlineStride); ras = Raster.createPackedRaster(dataBuffer, width, height, bitDepth, origin); } else if (bitDepth <= 8) { dataBuffer = new DataBufferByte(height*scanlineStride); ras = Raster.createInterleavedRaster(dataBuffer, width, height, scanlineStride, bands, bandOffsets[bands], origin); } else { dataBuffer = new DataBufferUShort(height*scanlineStride); ras = Raster.createInterleavedRaster(dataBuffer, width, height, scanlineStride, bands, bandOffsets[bands], origin); } return ras; } // Data filtering methods private static void decodeSubFilter(byte[] curr, int count, int bpp) { for (int i = bpp; i < count; i++) { int val; val = curr[i] & 0xff; val += curr[i - bpp] & 0xff; curr[i] = (byte)val; } } private static void decodeUpFilter(byte[] curr, byte[] prev, int count) { for (int i = 0; i < count; i++) { int raw = curr[i] & 0xff; int prior = prev[i] & 0xff; curr[i] = (byte)(raw + prior); } } private static void decodeAverageFilter(byte[] curr, byte[] prev, int count, int bpp) { int raw, priorPixel, priorRow; for (int i = 0; i < bpp; i++) { raw = curr[i] & 0xff; priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + priorRow/2); } for (int i = bpp; i < count; i++) { raw = curr[i] & 0xff; priorPixel = curr[i - bpp] & 0xff; priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + (priorPixel + priorRow)/2); } } private static void decodePaethFilter(byte[] curr, byte[] prev, int count, int bpp) { int raw, priorPixel, priorRow, priorRowPixel; for (int i = 0; i < bpp; i++) { raw = curr[i] & 0xff; priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + priorRow); } for (int i = bpp; i < count; i++) { raw = curr[i] & 0xff; priorPixel = curr[i - bpp] & 0xff; priorRow = prev[i] & 0xff; priorRowPixel = prev[i - bpp] & 0xff; curr[i] = (byte)(raw + PNGEncodeParam.paethPredictor(priorPixel, priorRow, priorRowPixel)); } } private void processPixels(int process, Raster src, WritableRaster dst, int xOffset, int step, int y, int width) { int srcX, dstX; // Create an array suitable for holding one pixel int[] ps = src.getPixel(0, 0, (int[])null); int[] pd = dst.getPixel(0, 0, (int[])null); dstX = xOffset; switch (process) { case POST_NONE: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); dst.setPixel(dstX, y, ps); dstX += step; } break; case POST_GAMMA: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); for (int i = 0; i < inputBands; i++) { int x = ps[i]; ps[i] = gammaLut[x]; } dst.setPixel(dstX, y, ps); dstX += step; } break; case POST_GRAY_LUT: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); pd[0] = grayLut[ps[0]]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_LUT_ADD_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = grayLut[val]; if (val == grayTransparentAlpha) { pd[1] = 0; } else { pd[1] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_PALETTE_TO_RGB: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = redPalette[val]; pd[1] = greenPalette[val]; pd[2] = bluePalette[val]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_PALETTE_TO_RGBA: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = redPalette[val]; pd[1] = greenPalette[val]; pd[2] = bluePalette[val]; pd[3] = alphaPalette[val]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_GRAY_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; if (performGammaCorrection) { val = gammaLut[val]; } pd[0] = val; if (val == grayTransparentAlpha) { pd[1] = 0; } else { pd[1] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_RGB_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int r = ps[0]; int g = ps[1]; int b = ps[2]; if (performGammaCorrection) { pd[0] = gammaLut[r]; pd[1] = gammaLut[g]; pd[2] = gammaLut[b]; } else { pd[0] = r; pd[1] = g; pd[2] = b; } if ((r == redTransparentAlpha) && (g == greenTransparentAlpha) && (b == blueTransparentAlpha)) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_REMOVE_GRAY_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int g = ps[0]; if (performGammaCorrection) { pd[0] = gammaLut[g]; } else { pd[0] = g; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_REMOVE_RGB_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int r = ps[0]; int g = ps[1]; int b = ps[2]; if (performGammaCorrection) { pd[0] = gammaLut[r]; pd[1] = gammaLut[g]; pd[2] = gammaLut[b]; } else { pd[0] = r; pd[1] = g; pd[2] = b; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GAMMA_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int alpha = ps[1]; int gamma = gammaLut[val]; pd[0] = gamma; pd[1] = gamma; pd[2] = gamma; pd[3] = alpha; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_ALPHA_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int alpha = ps[1]; pd[0] = val; pd[1] = val; pd[2] = val; pd[3] = alpha; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_GRAY_TRANS_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; if (performGammaCorrection) { val = gammaLut[val]; } pd[0] = val; pd[1] = val; pd[2] = val; if (val == grayTransparentAlpha) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_LUT_ADD_TRANS_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int val2 = grayLut[val]; pd[0] = val2; pd[1] = val2; pd[2] = val2; if (val == grayTransparentAlpha) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; } } /** * Reads in an image of a given size and returns it as a * WritableRaster. */ private void decodePass(WritableRaster imRas, int xOffset, int yOffset, int xStep, int yStep, int passWidth, int passHeight) { if ((passWidth == 0) || (passHeight == 0)) { return; } int bytesPerRow = (inputBands*passWidth*bitDepth + 7)/8; int eltsPerRow = (bitDepth == 16) ? bytesPerRow/2 : bytesPerRow; byte[] curr = new byte[bytesPerRow]; byte[] prior = new byte[bytesPerRow]; // Create a 1-row tall Raster to hold the data WritableRaster passRow = createRaster(passWidth, 1, inputBands, eltsPerRow, bitDepth); DataBuffer dataBuffer = passRow.getDataBuffer(); int type = dataBuffer.getDataType(); byte[] byteData = null; short[] shortData = null; if (type == DataBuffer.TYPE_BYTE) { byteData = ((DataBufferByte)dataBuffer).getData(); } else { shortData = ((DataBufferUShort)dataBuffer).getData(); } // Decode the (sub)image row-by-row int srcY, dstY; for (srcY = 0, dstY = yOffset; srcY < passHeight; srcY++, dstY += yStep) { // Read the filter type byte and a row of data int filter = 0; try { filter = dataStream.read(); dataStream.readFully(curr, 0, bytesPerRow); } catch (Exception e) { e.printStackTrace(); } switch (filter) { case PNG_FILTER_NONE: break; case PNG_FILTER_SUB: decodeSubFilter(curr, bytesPerRow, bytesPerPixel); break; case PNG_FILTER_UP: decodeUpFilter(curr, prior, bytesPerRow); break; case PNG_FILTER_AVERAGE: decodeAverageFilter(curr, prior, bytesPerRow, bytesPerPixel); break; case PNG_FILTER_PAETH: decodePaethFilter(curr, prior, bytesPerRow, bytesPerPixel); break; default: // Error -- uknown filter type String msg = PropertyUtil.getString("PNGImageDecoder16"); throw new RuntimeException(msg); } // Copy data into passRow byte by byte if (bitDepth < 16) { System.arraycopy(curr, 0, byteData, 0, bytesPerRow); } else { int idx = 0; for (int j = 0; j < eltsPerRow; j++) { shortData[j] = (short)((curr[idx] << 8) | (curr[idx + 1] & 0xff)); idx += 2; } } processPixels(postProcess, passRow, imRas, xOffset, xStep, dstY, passWidth); // Swap curr and prior byte[] tmp = prior; prior = curr; curr = tmp; } } private void decodeImage(boolean useInterlacing) { if (!useInterlacing) { decodePass(theTile, 0, 0, 1, 1, width, height); } else { decodePass(theTile, 0, 0, 8, 8, (width + 7)/8, (height + 7)/8); decodePass(theTile, 4, 0, 8, 8, (width + 3)/8, (height + 7)/8); decodePass(theTile, 0, 4, 4, 8, (width + 3)/4, (height + 3)/8); decodePass(theTile, 2, 0, 4, 4, (width + 1)/4, (height + 3)/4); decodePass(theTile, 0, 2, 2, 4, (width + 1)/2, (height + 1)/4); decodePass(theTile, 1, 0, 2, 2, width/2, (height + 1)/2); decodePass(theTile, 0, 1, 1, 2, width, height/2); } } // RenderedImage stuff public Raster getTile(int tileX, int tileY) { if (tileX != 0 || tileY != 0) { // Error -- bad tile requested String msg = PropertyUtil.getString("PNGImageDecoder17"); throw new IllegalArgumentException(msg); } return theTile; } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGEncodeParam.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGEncodeParam.jav0000644000175000017500000013606213063003442032407 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import org.apache.batik.ext.awt.image.codec.util.ImageEncodeParam; import org.apache.batik.ext.awt.image.codec.util.PropertyUtil; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.util.Date; import java.util.List; import java.util.ArrayList; /** * An instance of ImageEncodeParam for encoding images in * the PNG format. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: PNGEncodeParam.java 1733416 2016-03-03 07:07:13Z gadams $ */ public abstract class PNGEncodeParam implements ImageEncodeParam { /** Constant for use with the sRGB chunk. */ public static final int INTENT_PERCEPTUAL = 0; /** Constant for use with the sRGB chunk. */ public static final int INTENT_RELATIVE = 1; /** Constant for use with the sRGB chunk. */ public static final int INTENT_SATURATION = 2; /** Constant for use with the sRGB chunk. */ public static final int INTENT_ABSOLUTE = 3; /** Constant for use in filtering. */ public static final int PNG_FILTER_NONE = 0; /** Constant for use in filtering. */ public static final int PNG_FILTER_SUB = 1; /** Constant for use in filtering. */ public static final int PNG_FILTER_UP = 2; /** Constant for use in filtering. */ public static final int PNG_FILTER_AVERAGE = 3; /** Constant for use in filtering. */ public static final int PNG_FILTER_PAETH = 4; /** * Returns an instance of PNGEncodeParam.Palette, * PNGEncodeParam.Gray, or * PNGEncodeParam.RGB appropriate for encoding * the given image. * *

If the image has an IndexColorModel, an * instance of PNGEncodeParam.Palette is returned. * Otherwise, if the image has 1 or 2 bands an instance of * PNGEncodeParam.Gray is returned. In all other * cases an instance of PNGEncodeParam.RGB is * returned. * *

Note that this method does not provide any guarantee that * the given image will be successfully encoded by the PNG * encoder, as it only performs a very superficial analysis of * the image structure. */ public static PNGEncodeParam getDefaultEncodeParam(RenderedImage im) { ColorModel colorModel = im.getColorModel(); if (colorModel instanceof IndexColorModel) { return new PNGEncodeParam.Palette(); } SampleModel sampleModel = im.getSampleModel(); int numBands = sampleModel.getNumBands(); if (numBands == 1 || numBands == 2) { return new PNGEncodeParam.Gray(); } else { return new PNGEncodeParam.RGB(); } } public static class Palette extends PNGEncodeParam { /** Constructs an instance of PNGEncodeParam.Palette. */ public Palette() {} // bKGD chunk private boolean backgroundSet = false; /** * Suppresses the 'bKGD' chunk from being output. */ public void unsetBackground() { backgroundSet = false; } /** * Returns true if a 'bKGD' chunk will be output. */ public boolean isBackgroundSet() { return backgroundSet; } /** * Sets the desired bit depth for a palette image. The bit * depth must be one of 1, 2, 4, or 8, or else an * IllegalArgumentException will be thrown. */ public void setBitDepth(int bitDepth) { if (bitDepth != 1 && bitDepth != 2 && bitDepth != 4 && bitDepth != 8) { throw new IllegalArgumentException(PropertyUtil.getString("PNGEncodeParam2")); } this.bitDepth = bitDepth; bitDepthSet = true; } // PLTE chunk private int[] palette = null; private boolean paletteSet = false; /** * Sets the RGB palette of the image to be encoded. * The rgb parameter contains alternating * R, G, B values for each color index used in the image. * The number of elements must be a multiple of 3 between * 3 and 3*256. * *

The 'PLTE' chunk will encode this information. * * @param rgb An array of ints. */ public void setPalette(int[] rgb) { if (rgb.length < 1*3 || rgb.length > 256*3) { throw new IllegalArgumentException(PropertyUtil.getString("PNGEncodeParam0")); } if ((rgb.length % 3) != 0) { throw new IllegalArgumentException(PropertyUtil.getString("PNGEncodeParam1")); } palette = (int[])(rgb.clone()); paletteSet = true; } /** * Returns the current RGB palette. * *

If the palette has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the palette is not set. * * @return An array of ints. */ public int[] getPalette() { if (!paletteSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam3")); } return (int[])(palette.clone()); } /** * Suppresses the 'PLTE' chunk from being output. */ public void unsetPalette() { palette = null; paletteSet = false; } /** * Returns true if a 'PLTE' chunk will be output. */ public boolean isPaletteSet() { return paletteSet; } // bKGD chunk private int backgroundPaletteIndex; /** * Sets the palette index of the suggested background color. * *

The 'bKGD' chunk will encode this information. */ public void setBackgroundPaletteIndex(int index) { backgroundPaletteIndex = index; backgroundSet = true; } /** * Returns the palette index of the suggested background color. * *

If the background palette index has not previously been * set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the palette index is not set. */ public int getBackgroundPaletteIndex() { if (!backgroundSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam4")); } return backgroundPaletteIndex; } // tRNS chunk private int[] transparency; /** * Sets the alpha values associated with each palette entry. * The alpha parameter should have as many entries * as there are RGB triples in the palette. * *

The 'tRNS' chunk will encode this information. */ public void setPaletteTransparency(byte[] alpha) { transparency = new int[alpha.length]; for (int i = 0; i < alpha.length; i++) { transparency[i] = alpha[i] & 0xff; } transparencySet = true; } /** * Returns the alpha values associated with each palette entry. * *

If the palette transparency has not previously been * set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the palette transparency is * not set. */ public byte[] getPaletteTransparency() { if (!transparencySet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam5")); } byte[] alpha = new byte[transparency.length]; for (int i = 0; i < alpha.length; i++) { alpha[i] = (byte)transparency[i]; } return alpha; } } public static class Gray extends PNGEncodeParam { /** Constructs an instance of PNGEncodeParam.Gray. */ public Gray() {} // bKGD chunk private boolean backgroundSet = false; /** * Suppresses the 'bKGD' chunk from being output. */ public void unsetBackground() { backgroundSet = false; } /** * Returns true if a 'bKGD' chunk will be output. */ public boolean isBackgroundSet() { return backgroundSet; } /** * Sets the desired bit depth for a grayscale image. The bit * depth must be one of 1, 2, 4, 8, or 16. * *

When encoding a source image of a greater bit depth, * pixel values will be clamped to the smaller range after * shifting by the value given by getBitShift(). * When encoding a source image of a smaller bit depth, pixel * values will be shifted and left-filled with zeroes. */ public void setBitDepth(int bitDepth) { if (bitDepth != 1 && bitDepth != 2 && bitDepth != 4 && bitDepth != 8 && bitDepth != 16) { throw new IllegalArgumentException(); } this.bitDepth = bitDepth; bitDepthSet = true; } // bKGD chunk private int backgroundPaletteGray; /** * Sets the suggested gray level of the background. * *

The 'bKGD' chunk will encode this information. */ public void setBackgroundGray(int gray) { backgroundPaletteGray = gray; backgroundSet = true; } /** * Returns the suggested gray level of the background. * *

If the background gray level has not previously been * set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the background gray level * is not set. */ public int getBackgroundGray() { if (!backgroundSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam6")); } return backgroundPaletteGray; } // tRNS chunk private int[] transparency; /** * Sets the gray value to be used to denote transparency. * *

Setting this attribute will cause the alpha channel * of the input image to be ignored. * *

The 'tRNS' chunk will encode this information. */ public void setTransparentGray(int transparentGray) { transparency = new int[1]; transparency[0] = transparentGray; transparencySet = true; } /** * Returns the gray value to be used to denote transparency. * *

If the transparent gray value has not previously been * set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the transparent gray value * is not set. */ public int getTransparentGray() { if (!transparencySet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam7")); } int gray = transparency[0]; return gray; } private int bitShift; private boolean bitShiftSet = false; /** * Sets the desired bit shift for a grayscale image. * Pixels in the source image will be shifted right by * the given amount prior to being clamped to the maximum * value given by the encoded image's bit depth. */ public void setBitShift(int bitShift) { if (bitShift < 0) { throw new RuntimeException(); } this.bitShift = bitShift; bitShiftSet = true; } /** * Returns the desired bit shift for a grayscale image. * *

If the bit shift has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the bit shift is not set. */ public int getBitShift() { if (!bitShiftSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam8")); } return bitShift; } /** * Suppresses the setting of the bit shift of a grayscale image. * Pixels in the source image will not be shifted prior to encoding. */ public void unsetBitShift() { bitShiftSet = false; } /** * Returns true if the bit shift has been set. */ public boolean isBitShiftSet() { return bitShiftSet; } /** * Returns true if the bit depth has been set. */ public boolean isBitDepthSet() { return bitDepthSet; } } public static class RGB extends PNGEncodeParam { /** Constructs an instance of PNGEncodeParam.RGB. */ public RGB() {} // bKGD chunk private boolean backgroundSet = false; /** * Suppresses the 'bKGD' chunk from being output. */ public void unsetBackground() { backgroundSet = false; } /** * Returns true if a 'bKGD' chunk will be output. */ public boolean isBackgroundSet() { return backgroundSet; } /** * Sets the desired bit depth for an RGB image. The bit * depth must be 8 or 16. */ public void setBitDepth(int bitDepth) { if (bitDepth != 8 && bitDepth != 16) { throw new RuntimeException(); } this.bitDepth = bitDepth; bitDepthSet = true; } // bKGD chunk private int[] backgroundRGB; /** * Sets the RGB value of the suggested background color. * The rgb parameter should have 3 entries. * *

The 'bKGD' chunk will encode this information. */ public void setBackgroundRGB(int[] rgb) { if (rgb.length != 3) { throw new RuntimeException(); } backgroundRGB = rgb; backgroundSet = true; } /** * Returns the RGB value of the suggested background color. * *

If the background color has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the background color is not set. */ public int[] getBackgroundRGB() { if (!backgroundSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam9")); } return backgroundRGB; } // tRNS chunk private int[] transparency; /** * Sets the RGB value to be used to denote transparency. * *

Setting this attribute will cause the alpha channel * of the input image to be ignored. * *

The 'tRNS' chunk will encode this information. */ public void setTransparentRGB(int[] transparentRGB) { transparency = (int[])(transparentRGB.clone()); transparencySet = true; } /** * Returns the RGB value to be used to denote transparency. * *

If the transparent color has not previously been set, * or has been unset, an IllegalStateException * will be thrown. * * @throws IllegalStateException if the transparent color is not set. */ public int[] getTransparentRGB() { if (!transparencySet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam10")); } return (int[])(transparency.clone()); } } protected int bitDepth; protected boolean bitDepthSet = false; /** * Sets the desired bit depth of an image. */ public abstract void setBitDepth(int bitDepth); /** * Returns the desired bit depth for a grayscale image. * *

If the bit depth has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the bit depth is not set. */ public int getBitDepth() { if (!bitDepthSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam11")); } return bitDepth; } /** * Suppresses the setting of the bit depth of a grayscale image. * The depth of the encoded image will be inferred from the source * image bit depth, rounded up to the next power of 2 between 1 * and 16. */ public void unsetBitDepth() { bitDepthSet = false; } private boolean useInterlacing = false; /** * Turns Adam7 interlacing on or off. */ public void setInterlacing(boolean useInterlacing) { this.useInterlacing = useInterlacing; } /** * Returns true if Adam7 interlacing will be used. */ public boolean getInterlacing() { return useInterlacing; } // bKGD chunk - delegate to subclasses // In JAI 1.0, 'backgroundSet' was private. The JDK 1.2 compiler // was lenient and incorrectly allowed this variable to be // accessed from the subclasses. The JDK 1.3 compiler correctly // flags this as a use of a non-static variable in a static // context. Changing 'backgroundSet' to protected would have // solved the problem, but would have introduced a visible API // change. Thus we are forced to adopt the solution of placing a // separate private variable in each subclass and providing // separate implementations of 'unsetBackground' and // 'isBackgroundSet' in each concrete subclass. /** * Suppresses the 'bKGD' chunk from being output. * For API compatibility with JAI 1.0, the superclass * defines this method to throw a RuntimeException; * accordingly, subclasses must provide their own implementations. */ public void unsetBackground() { throw new RuntimeException(PropertyUtil.getString("PNGEncodeParam23")); } /** * Returns true if a 'bKGD' chunk will be output. * For API compatibility with JAI 1.0, the superclass * defines this method to throw a RuntimeException; * accordingly, subclasses must provide their own implementations. */ public boolean isBackgroundSet() { throw new RuntimeException(PropertyUtil.getString("PNGEncodeParam24")); } // cHRM chunk private float[] chromaticity = null; private boolean chromaticitySet = false; /** * Sets the white point and primary chromaticities in CIE (x, y) * space. * *

The chromaticity parameter should be a * float array of length 8 containing the white point * X and Y, red X and Y, green X and Y, and blue X and Y values in * order. * *

The 'cHRM' chunk will encode this information. */ public void setChromaticity(float[] chromaticity) { if (chromaticity.length != 8) { throw new IllegalArgumentException(); } this.chromaticity = (float[])(chromaticity.clone()); chromaticitySet = true; } /** * A convenience method that calls the array version. */ public void setChromaticity(float whitePointX, float whitePointY, float redX, float redY, float greenX, float greenY, float blueX, float blueY) { float[] chroma = new float[8]; chroma[0] = whitePointX; chroma[1] = whitePointY; chroma[2] = redX; chroma[3] = redY; chroma[4] = greenX; chroma[5] = greenY; chroma[6] = blueX; chroma[7] = blueY; setChromaticity(chroma); } /** * Returns the white point and primary chromaticities in * CIE (x, y) space. * *

See the documentation for the setChromaticity * method for the format of the returned data. * *

If the chromaticity has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the chromaticity is not set. */ public float[] getChromaticity() { if (!chromaticitySet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam12")); } return (float[])(chromaticity.clone()); } /** * Suppresses the 'cHRM' chunk from being output. */ public void unsetChromaticity() { chromaticity = null; chromaticitySet = false; } /** * Returns true if a 'cHRM' chunk will be output. */ public boolean isChromaticitySet() { return chromaticitySet; } // gAMA chunk private float gamma; private boolean gammaSet = false; /** * Sets the file gamma value for the image. * *

The 'gAMA' chunk will encode this information. */ public void setGamma(float gamma) { this.gamma = gamma; gammaSet = true; } /** * Returns the file gamma value for the image. * *

If the file gamma has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the gamma is not set. */ public float getGamma() { if (!gammaSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam13")); } return gamma; } /** * Suppresses the 'gAMA' chunk from being output. */ public void unsetGamma() { gammaSet = false; } /** * Returns true if a 'gAMA' chunk will be output. */ public boolean isGammaSet() { return gammaSet; } // hIST chunk private int[] paletteHistogram = null; private boolean paletteHistogramSet = false; /** * Sets the palette histogram to be stored with this image. * The histogram consists of an array of integers, one per * palette entry. * *

The 'hIST' chunk will encode this information. */ public void setPaletteHistogram(int[] paletteHistogram) { this.paletteHistogram = (int[])(paletteHistogram.clone()); paletteHistogramSet = true; } /** * Returns the palette histogram to be stored with this image. * *

If the histogram has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the histogram is not set. */ public int[] getPaletteHistogram() { if (!paletteHistogramSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam14")); } return paletteHistogram; } /** * Suppresses the 'hIST' chunk from being output. */ public void unsetPaletteHistogram() { paletteHistogram = null; paletteHistogramSet = false; } /** * Returns true if a 'hIST' chunk will be output. */ public boolean isPaletteHistogramSet() { return paletteHistogramSet; } // iCCP chunk private byte[] ICCProfileData = null; private boolean ICCProfileDataSet = false; /** * Sets the ICC profile data to be stored with this image. * The profile is represented in raw binary form. * *

The 'iCCP' chunk will encode this information. */ public void setICCProfileData(byte[] ICCProfileData) { this.ICCProfileData = (byte[])(ICCProfileData.clone()); ICCProfileDataSet = true; } /** * Returns the ICC profile data to be stored with this image. * *

If the ICC profile has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the ICC profile is not set. */ public byte[] getICCProfileData() { if (!ICCProfileDataSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam15")); } return (byte[])(ICCProfileData.clone()); } /** * Suppresses the 'iCCP' chunk from being output. */ public void unsetICCProfileData() { ICCProfileData = null; ICCProfileDataSet = false; } /** * Returns true if a 'iCCP' chunk will be output. */ public boolean isICCProfileDataSet() { return ICCProfileDataSet; } // pHYS chunk private int[] physicalDimension = null; private boolean physicalDimensionSet = false; /** * Sets the physical dimension information to be stored with this * image. The physicalDimension parameter should be a 3-entry * array containing the number of pixels per unit in the X * direction, the number of pixels per unit in the Y direction, * and the unit specifier (0 = unknown, 1 = meters). * *

The 'pHYS' chunk will encode this information. */ public void setPhysicalDimension(int[] physicalDimension) { this.physicalDimension = (int[])(physicalDimension.clone()); physicalDimensionSet = true; } /** * A convenience method that calls the array version. */ public void setPhysicalDimension(int xPixelsPerUnit, int yPixelsPerUnit, int unitSpecifier) { int[] pd = new int[3]; pd[0] = xPixelsPerUnit; pd[1] = yPixelsPerUnit; pd[2] = unitSpecifier; setPhysicalDimension(pd); } /** * Returns the physical dimension information to be stored * with this image. * *

If the physical dimension information has not previously * been set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the physical dimension information * is not set. */ public int[] getPhysicalDimension() { if (!physicalDimensionSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam16")); } return (int[])(physicalDimension.clone()); } /** * Suppresses the 'pHYS' chunk from being output. */ public void unsetPhysicalDimension() { physicalDimension = null; physicalDimensionSet = false; } /** * Returns true if a 'pHYS' chunk will be output. */ public boolean isPhysicalDimensionSet() { return physicalDimensionSet; } // sPLT chunk private PNGSuggestedPaletteEntry[] suggestedPalette = null; private boolean suggestedPaletteSet = false; /** * Sets the suggested palette information to be stored with this * image. The information is passed to this method as an array of * PNGSuggestedPaletteEntry objects. * *

The 'sPLT' chunk will encode this information. */ public void setSuggestedPalette(PNGSuggestedPaletteEntry[] palette) { suggestedPalette = (PNGSuggestedPaletteEntry[])(palette.clone()); suggestedPaletteSet = true; } /** * Returns the suggested palette information to be stored with this * image. * *

If the suggested palette information has not previously * been set, or has been unset, an * IllegalStateException will be thrown. * * @throws IllegalStateException if the suggested palette * information is not set. */ public PNGSuggestedPaletteEntry[] getSuggestedPalette() { if (!suggestedPaletteSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam17")); } return (PNGSuggestedPaletteEntry[])(suggestedPalette.clone()); } /** * Suppresses the 'sPLT' chunk from being output. */ public void unsetSuggestedPalette() { suggestedPalette = null; suggestedPaletteSet = false; } /** * Returns true if a 'sPLT' chunk will be output. */ public boolean isSuggestedPaletteSet() { return suggestedPaletteSet; } // sBIT chunk private int[] significantBits = null; private boolean significantBitsSet = false; /** * Sets the number of significant bits for each band of the image. * *

The number of entries in the significantBits * array must be equal to the number of output bands in the image: * 1 for a gray image, 2 for gray+alpha, 3 for index or truecolor, * and 4 for truecolor+alpha. * *

The 'sBIT' chunk will encode this information. */ public void setSignificantBits(int[] significantBits) { this.significantBits = (int[])(significantBits.clone()); significantBitsSet = true; } /** * Returns the number of significant bits for each band of the image. * *

If the significant bits values have not previously been * set, or have been unset, an IllegalStateException * will be thrown. * * @throws IllegalStateException if the significant bits values are * not set. */ public int[] getSignificantBits() { if (!significantBitsSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam18")); } return (int[])significantBits.clone(); } /** * Suppresses the 'sBIT' chunk from being output. */ public void unsetSignificantBits() { significantBits = null; significantBitsSet = false; } /** * Returns true if an 'sBIT' chunk will be output. */ public boolean isSignificantBitsSet() { return significantBitsSet; } // sRGB chunk private int SRGBIntent; private boolean SRGBIntentSet = false; /** * Sets the sRGB rendering intent to be stored with this image. * The legal values are 0 = Perceptual, 1 = Relative Colorimetric, * 2 = Saturation, and 3 = Absolute Colorimetric. Refer to the * PNG specification for information on these values. * *

The 'sRGB' chunk will encode this information. */ public void setSRGBIntent(int SRGBIntent) { this.SRGBIntent = SRGBIntent; SRGBIntentSet = true; } /** * Returns the sRGB rendering intent to be stored with this image. * *

If the sRGB intent has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the sRGB intent is not set. */ public int getSRGBIntent() { if (!SRGBIntentSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam19")); } return SRGBIntent; } /** * Suppresses the 'sRGB' chunk from being output. */ public void unsetSRGBIntent() { SRGBIntentSet = false; } /** * Returns true if an 'sRGB' chunk will be output. */ public boolean isSRGBIntentSet() { return SRGBIntentSet; } // tEXt chunk private String[] text = null; private boolean textSet = false; /** * Sets the textual data to be stored in uncompressed form with this * image. The data is passed to this method as an array of * Strings. * *

The 'tEXt' chunk will encode this information. */ public void setText(String[] text) { this.text = text; textSet = true; } /** * Returns the text strings to be stored in uncompressed form with this * image as an array of Strings. * *

If the text strings have not previously been set, or have been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the text strings are not set. */ public String[] getText() { if (!textSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam20")); } return text; } /** * Suppresses the 'tEXt' chunk from being output. */ public void unsetText() { text = null; textSet = false; } /** * Returns true if a 'tEXt' chunk will be output. */ public boolean isTextSet() { return textSet; } // tIME chunk private Date modificationTime; private boolean modificationTimeSet = false; /** * Sets the modification time, as a Date, to be * stored with this image. The internal storage format will use * UTC regardless of how the modificationTime * parameter was created. * *

The 'tIME' chunk will encode this information. */ public void setModificationTime(Date modificationTime) { this.modificationTime = modificationTime; modificationTimeSet = true; } /** * Returns the modification time to be stored with this image. * *

If the bit depth has not previously been set, or has been * unset, an IllegalStateException will be thrown. * * @throws IllegalStateException if the bit depth is not set. */ public Date getModificationTime() { if (!modificationTimeSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam21")); } return modificationTime; } /** * Suppresses the 'tIME' chunk from being output. */ public void unsetModificationTime() { modificationTime = null; modificationTimeSet = false; } /** * Returns true if a 'tIME' chunk will be output. */ public boolean isModificationTimeSet() { return modificationTimeSet; } // tRNS chunk boolean transparencySet = false; /** * Suppresses the 'tRNS' chunk from being output. */ public void unsetTransparency() { transparencySet = false; } /** * Returns true if a 'tRNS' chunk will be output. */ public boolean isTransparencySet() { return transparencySet; } // zTXT chunk private String[] zText = null; private boolean zTextSet = false; /** * Sets the text strings to be stored in compressed form with this * image. The data is passed to this method as an array of * Strings. * *

The 'zTXt' chunk will encode this information. */ public void setCompressedText(String[] text) { this.zText = text; zTextSet = true; } /** * Returns the text strings to be stored in compressed form with * this image as an array of Strings. * *

If the compressed text strings have not previously been * set, or have been unset, an IllegalStateException * will be thrown. * * @throws IllegalStateException if the compressed text strings are * not set. */ public String[] getCompressedText() { if (!zTextSet) { throw new IllegalStateException(PropertyUtil.getString("PNGEncodeParam22")); } return zText; } /** * Suppresses the 'zTXt' chunk from being output. */ public void unsetCompressedText() { zText = null; zTextSet = false; } /** * Returns true if a 'zTXT' chunk will be output. */ public boolean isCompressedTextSet() { return zTextSet; } // Other chunk types List chunkType = new ArrayList(); List chunkData = new ArrayList(); /** * Adds a private chunk, in binary form, to the list of chunks to * be stored with this image. * * @param type a 4-character String giving the chunk type name. * @param data an array of bytes containing the * chunk data. */ public synchronized void addPrivateChunk(String type, byte[] data) { chunkType.add(type); chunkData.add(data.clone()); } /** * Returns the number of private chunks to be written to the * output file. */ public synchronized int getNumPrivateChunks() { return chunkType.size(); } /** * Returns the type of the private chunk at a given index, as a * 4-character String. The index must be smaller * than the return value of getNumPrivateChunks. */ public synchronized String getPrivateChunkType(int index) { return (String)chunkType.get(index); } /** * Returns the data associated of the private chunk at a given * index, as an array of bytes. The index must be * smaller than the return value of * getNumPrivateChunks. */ public synchronized byte[] getPrivateChunkData(int index) { return (byte[])chunkData.get(index); } /** * Remove all private chunks associated with this parameter instance * whose 'safe-to-copy' bit is not set. This may be advisable when * transcoding PNG images. */ public synchronized void removeUnsafeToCopyPrivateChunks() { List newChunkType = new ArrayList(); List newChunkData = new ArrayList(); int len = getNumPrivateChunks(); for (int i = 0; i < len; i++) { String type = getPrivateChunkType(i); char lastChar = type.charAt(3); if (lastChar >= 'a' && lastChar <= 'z') { newChunkType.add(type); newChunkData.add(getPrivateChunkData(i)); } } chunkType = newChunkType; chunkData = newChunkData; } /** * Remove all private chunks associated with this parameter instance. */ public synchronized void removeAllPrivateChunks() { chunkType = new ArrayList(); chunkData = new ArrayList(); } /** * An abs() function for use by the Paeth predictor. */ private static final int abs(int x) { return (x < 0) ? -x : x; } /** * The Paeth predictor routine used in PNG encoding. This routine * is included as a convenience to subclasses that override the * filterRow method. */ public static final int paethPredictor(int a, int b, int c) { int p = a + b - c; int pa = abs(p - a); int pb = abs(p - b); int pc = abs(p - c); if ((pa <= pb) && (pa <= pc)) { return a; } else if (pb <= pc) { return b; } else { return c; } } /** * Performs filtering on a row of an image. This method may be * overridden in order to provide a custom algorithm for choosing * the filter type for a given row. * *

The method is supplied with the current and previous rows * of the image. For the first row of the image, or of an * interlacing pass, the previous row array will be filled with * zeros as required by the PNG specification. * *

The method is also supplied with five scratch arrays. * These arrays may be used within the method for any purpose. * At method exit, the array at the index given by the return * value of the method should contain the filtered data. The * return value will also be used as the filter type. * *

The default implementation of the method performs a trial * encoding with each of the filter types, and computes the sum of * absolute values of the differences between the raw bytes of the * current row and the predicted values. The index of the filter * producing the smallest result is returned. * *

As an example, to perform only 'sub' filtering, this method * could be implemented (non-optimally) as follows: * *

     * for (int i = bytesPerPixel; i < bytesPerRow + bytesPerPixel; i++) {
     *     int curr = currRow[i] & 0xff;
     *     int left = currRow[i - bytesPerPixel] & 0xff;
     *     scratchRow[PNG_FILTER_SUB][i] = (byte)(curr - left);
     * }
     * return PNG_FILTER_SUB;
     * 
* * @param currRow The current row as an array of bytes * of length at least bytesPerRow + bytesPerPixel. * The pixel data starts at index bytesPerPixel; * the initial bytesPerPixel bytes are zero. * @param prevRow The current row as an array of bytes * The pixel data starts at index bytesPerPixel; * the initial bytesPerPixel bytes are zero. * @param scratchRows An array of 5 byte arrays of * length at least bytesPerRow + * bytesPerPixel, useable to hold temporary results. * The filtered row will be returned as one of the entries * of this array. The returned filtered data should start * at index bytesPerPixel; The initial * bytesPerPixel bytes are not used. * @param bytesPerRow The number of bytes in the image row. * This value will always be greater than 0. * @param bytesPerPixel The number of bytes representing a single * pixel, rounded up to an integer. This is the 'bpp' parameter * described in the PNG specification. * * @return The filter type to be used. The entry of * scratchRows[] at this index holds the * filtered data. */ public int filterRow(byte[] currRow, byte[] prevRow, byte[][] scratchRows, int bytesPerRow, int bytesPerPixel) { int [] badness = {0, 0, 0, 0, 0}; int curr, left, up, upleft, diff; int pa, pb, pc; for (int i = bytesPerPixel; i < bytesPerRow + bytesPerPixel; i++) { curr = currRow[i] & 0xff; left = currRow[i - bytesPerPixel] & 0xff; up = prevRow[i] & 0xff; upleft = prevRow[i - bytesPerPixel] & 0xff; // no filter badness[0] += curr; // sub filter diff = curr - left; scratchRows[1][i] = (byte)diff; badness [1] += (diff>0)?diff:-diff; // up filter diff = curr - up; scratchRows[2][i] = (byte)diff; badness [2] += (diff>=0)?diff:-diff; // average filter diff = curr - ((left+up)>>1); scratchRows[3][i] = (byte)diff; badness [3] += (diff>=0)?diff:-diff; // paeth filter // Original code much simplier but doesn't take full // advantage of relationship between pa/b/c and // information gleaned in abs operations. /// pa = up -upleft; /// pb = left-upleft; /// pc = pa+pb; /// pa = abs(pa); /// pb = abs(pb); /// pc = abs(pc); /// if ((pa <= pb) && (pa <= pc)) /// diff = curr-left; /// else if (pb <= pc) /// diff = curr-up; /// else /// diff = curr-upleft; pa = up -upleft; pb = left-upleft; if (pa<0) { if (pb<0) { // both pa & pb neg so pc is always greater than or // equal to pa or pb; if (pa >= pb) // since pa & pb neg check sense is reversed. diff = curr-left; else diff = curr-up; } else { // pa neg pb pos so we must compute pc... pc = pa+pb; pa=-pa; if (pa <= pb) // pc is positive and less than pb if (pa <= pc) diff = curr-left; else diff = curr-upleft; else // pc is negative and less than or equal to pa, // but since pa is greater than pb this isn't an issue... if (pb <= -pc) diff = curr-up; else diff = curr-upleft; } } else { if (pb<0) { pb =-pb; // make it positive... if (pa <= pb) { // pc would be negative and less than or equal to pb pc = pb-pa; if (pa <= pc) diff = curr-left; else if (pb == pc) // if pa is zero then pc==pb otherwise // pc must be less than pb. diff = curr-up; else diff = curr-upleft; } else { // pc would be positive and less than pa. pc = pa-pb; if (pb <= pc) diff = curr-up; else diff = curr-upleft; } } else { // both pos so pa+pb is always greater than pa/pb if (pa <= pb) diff = curr-left; else diff = curr-up; } } scratchRows[4][i] = (byte)diff; badness [4] += (diff>=0)?diff:-diff; } int filterType = 0; int minBadness = badness[0]; for (int i = 1; i < 5; i++) { if (badness[i] < minBadness) { minBadness = badness[i]; filterType = i; } } if (filterType == 0) { System.arraycopy(currRow, bytesPerPixel, scratchRows[0], bytesPerPixel, bytesPerRow); } return filterType; } } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGRed.java0000644000175000017500000017632513063003442031112 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import org.apache.batik.ext.awt.image.codec.util.PropertyUtil; import java.awt.Color; import java.awt.Point; import java.awt.Rectangle; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferUShort; import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.Collections; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import org.apache.batik.ext.awt.image.GraphicsUtil; import org.apache.batik.ext.awt.image.rendered.AbstractRed; import org.apache.batik.ext.awt.image.rendered.CachableRed; /** * * @version $Id: PNGRed.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGRed extends AbstractRed { static class PNGChunk { int length; int type; byte[] data; int crc; String typeString; public PNGChunk(int length, int type, byte[] data, int crc) { this.length = length; this.type = type; this.data = data; this.crc = crc; typeString = ""; typeString += (char)(type >> 24); typeString += (char)((type >> 16) & 0xff); typeString += (char)((type >> 8) & 0xff); typeString += (char)(type & 0xff); } public int getLength() { return length; } public int getType() { return type; } public String getTypeString() { return typeString; } public byte[] getData() { return data; } public byte getByte(int offset) { return data[offset]; } public int getInt1(int offset) { return data[offset] & 0xff; } public int getInt2(int offset) { return ((data[offset] & 0xff) << 8) | (data[offset + 1] & 0xff); } public int getInt4(int offset) { return ((data[offset] & 0xff) << 24) | ((data[offset + 1] & 0xff) << 16) | ((data[offset + 2] & 0xff) << 8) | (data[offset + 3] & 0xff); } public String getString4(int offset) { String s = new String(); s += (char)data[offset]; s += (char)data[offset + 1]; s += (char)data[offset + 2]; s += (char)data[offset + 3]; return s; } public boolean isType(String typeName) { return typeString.equals(typeName); } } public static final int PNG_COLOR_GRAY = 0; public static final int PNG_COLOR_RGB = 2; public static final int PNG_COLOR_PALETTE = 3; public static final int PNG_COLOR_GRAY_ALPHA = 4; public static final int PNG_COLOR_RGB_ALPHA = 6; private static final String[] colorTypeNames = { "Grayscale", "Error", "Truecolor", "Index", "Grayscale with alpha", "Error", "Truecolor with alpha" }; public static final int PNG_FILTER_NONE = 0; public static final int PNG_FILTER_SUB = 1; public static final int PNG_FILTER_UP = 2; public static final int PNG_FILTER_AVERAGE = 3; public static final int PNG_FILTER_PAETH = 4; private int[][] bandOffsets = { null, { 0 }, // G { 0, 1 }, // GA in GA order { 0, 1, 2 }, // RGB in RGB order { 0, 1, 2, 3 } // RGBA in RGBA order }; private int bitDepth; private int colorType; private int compressionMethod; private int filterMethod; private int interlaceMethod; private int paletteEntries; private byte[] redPalette; private byte[] greenPalette; private byte[] bluePalette; private byte[] alphaPalette; private int bkgdRed; private int bkgdGreen; private int bkgdBlue; private int grayTransparentAlpha; private int redTransparentAlpha; private int greenTransparentAlpha; private int blueTransparentAlpha; private int maxOpacity; private int[] significantBits = null; // Parameter information // If true, the user wants destination alpha where applicable. private boolean suppressAlpha = false; // If true, perform palette lookup internally private boolean expandPalette = false; // If true, output < 8 bit gray images in 8 bit components format private boolean output8BitGray = false; // Create an alpha channel in the destination color model. private boolean outputHasAlphaPalette = false; // Perform gamma correction on the image private boolean performGammaCorrection = false; // Expand GA to GGGA for compatbility with Java2D private boolean expandGrayAlpha = false; // Produce an instance of PNGEncodeParam private boolean generateEncodeParam = false; // PNGDecodeParam controlling decode process private PNGDecodeParam decodeParam = null; // PNGEncodeParam to store file details in private PNGEncodeParam encodeParam = null; private boolean emitProperties = true; private float fileGamma = 45455/100000.0F; private float userExponent = 1.0F; private float displayExponent = 2.2F; private float[] chromaticity = null; private int sRGBRenderingIntent = -1; // Post-processing step implied by above parameters private int postProcess = POST_NONE; // Possible post-processing steps // Do nothing private static final int POST_NONE = 0; // Gamma correct only private static final int POST_GAMMA = 1; // Push gray values through grayLut to expand to 8 bits private static final int POST_GRAY_LUT = 2; // Push gray values through grayLut to expand to 8 bits, add alpha private static final int POST_GRAY_LUT_ADD_TRANS = 3; // Push palette value through R,G,B lookup tables private static final int POST_PALETTE_TO_RGB = 4; // Push palette value through R,G,B,A lookup tables private static final int POST_PALETTE_TO_RGBA = 5; // Add transparency to a given gray value (w/ optional gamma) private static final int POST_ADD_GRAY_TRANS = 6; // Add transparency to a given RGB value (w/ optional gamma) private static final int POST_ADD_RGB_TRANS = 7; // Remove the alpha channel from a gray image (w/ optional gamma) private static final int POST_REMOVE_GRAY_TRANS = 8; // Remove the alpha channel from an RGB image (w/optional gamma) private static final int POST_REMOVE_RGB_TRANS = 9; // Mask to add expansion of GA -> GGGA private static final int POST_EXP_MASK = 16; // Expand gray to G/G/G private static final int POST_GRAY_ALPHA_EXP = POST_NONE | POST_EXP_MASK; // Expand gray to G/G/G through a gamma lut private static final int POST_GAMMA_EXP = POST_GAMMA | POST_EXP_MASK; // Push gray values through grayLut to expand to 8 bits, expand, add alpha private static final int POST_GRAY_LUT_ADD_TRANS_EXP = POST_GRAY_LUT_ADD_TRANS | POST_EXP_MASK; // Add transparency to a given gray value, expand private static final int POST_ADD_GRAY_TRANS_EXP = POST_ADD_GRAY_TRANS | POST_EXP_MASK; private List streamVec = new ArrayList(); private DataInputStream dataStream; private int bytesPerPixel; // number of bytes per input pixel private int inputBands; private int outputBands; // Number of private chunks private int chunkIndex = 0; private List textKeys = new ArrayList(); private List textStrings = new ArrayList(); private List ztextKeys = new ArrayList(); private List ztextStrings = new ArrayList(); private WritableRaster theTile; private Rectangle bounds; /** A Hashtable containing the image properties. */ private Map properties = new HashMap(); private int[] gammaLut = null; private void initGammaLut(int bits) { double exp = (double)userExponent/(fileGamma*displayExponent); int numSamples = 1 << bits; int maxOutSample = (bits == 16) ? 65535 : 255; gammaLut = new int[numSamples]; for (int i = 0; i < numSamples; i++) { double gbright = (double)i/(numSamples - 1); double gamma = Math.pow(gbright, exp); int igamma = (int)(gamma*maxOutSample + 0.5); if (igamma > maxOutSample) { igamma = maxOutSample; } gammaLut[i] = igamma; } } private final byte[][] expandBits = { null, { (byte)0x00, (byte)0xff }, { (byte)0x00, (byte)0x55, (byte)0xaa, (byte)0xff }, null, { (byte)0x00, (byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, (byte)0x55, (byte)0x66, (byte)0x77, (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb, (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff } }; private int[] grayLut = null; private void initGrayLut(int bits) { int len = 1 << bits; grayLut = new int[len]; if (performGammaCorrection) { System.arraycopy( gammaLut, 0, grayLut, 0, len ); } else { for (int i = 0; i < len; i++) { grayLut[i] = expandBits[bits][i]; } } } public PNGRed(InputStream stream) throws IOException { this(stream, null); } public PNGRed(InputStream stream, PNGDecodeParam decodeParam) throws IOException { if (!stream.markSupported()) { stream = new BufferedInputStream(stream); } DataInputStream distream = new DataInputStream(stream); if (decodeParam == null) { decodeParam = new PNGDecodeParam(); } this.decodeParam = decodeParam; // Get parameter values this.suppressAlpha = decodeParam.getSuppressAlpha(); this.expandPalette = decodeParam.getExpandPalette(); this.output8BitGray = decodeParam.getOutput8BitGray(); this.expandGrayAlpha = decodeParam.getExpandGrayAlpha(); if (decodeParam.getPerformGammaCorrection()) { this.userExponent = decodeParam.getUserExponent(); this.displayExponent = decodeParam.getDisplayExponent(); performGammaCorrection = true; output8BitGray = true; } this.generateEncodeParam = decodeParam.getGenerateEncodeParam(); if (emitProperties) { properties.put("file_type", "PNG v. 1.0"); } try { long magic = distream.readLong(); if (magic != 0x89504e470d0a1a0aL) { String msg = PropertyUtil.getString("PNGImageDecoder0"); throw new RuntimeException(msg); } } catch (Exception e) { e.printStackTrace(); String msg = PropertyUtil.getString("PNGImageDecoder1"); throw new RuntimeException(msg); } do { try { PNGChunk chunk; String chunkType = getChunkType(distream); if (chunkType.equals("IHDR")) { chunk = readChunk(distream); parse_IHDR_chunk(chunk); } else if (chunkType.equals("PLTE")) { chunk = readChunk(distream); parse_PLTE_chunk(chunk); } else if (chunkType.equals("IDAT")) { chunk = readChunk(distream); streamVec.add(new ByteArrayInputStream(chunk.getData())); } else if (chunkType.equals("IEND")) { chunk = readChunk(distream); parse_IEND_chunk(chunk); break; // fall through to the bottom } else if (chunkType.equals("bKGD")) { chunk = readChunk(distream); parse_bKGD_chunk(chunk); } else if (chunkType.equals("cHRM")) { chunk = readChunk(distream); parse_cHRM_chunk(chunk); } else if (chunkType.equals("gAMA")) { chunk = readChunk(distream); parse_gAMA_chunk(chunk); } else if (chunkType.equals("hIST")) { chunk = readChunk(distream); parse_hIST_chunk(chunk); } else if (chunkType.equals("iCCP")) { chunk = readChunk(distream); parse_iCCP_chunk(chunk); } else if (chunkType.equals("pHYs")) { chunk = readChunk(distream); parse_pHYs_chunk(chunk); } else if (chunkType.equals("sBIT")) { chunk = readChunk(distream); parse_sBIT_chunk(chunk); } else if (chunkType.equals("sRGB")) { chunk = readChunk(distream); parse_sRGB_chunk(chunk); } else if (chunkType.equals("tEXt")) { chunk = readChunk(distream); parse_tEXt_chunk(chunk); } else if (chunkType.equals("tIME")) { chunk = readChunk(distream); parse_tIME_chunk(chunk); } else if (chunkType.equals("tRNS")) { chunk = readChunk(distream); parse_tRNS_chunk(chunk); } else if (chunkType.equals("zTXt")) { chunk = readChunk(distream); parse_zTXt_chunk(chunk); } else { chunk = readChunk(distream); // Output the chunk data in raw form String type = chunk.getTypeString(); byte[] data = chunk.getData(); if (encodeParam != null) { encodeParam.addPrivateChunk(type, data); } if (emitProperties) { String key = "chunk_" + chunkIndex++ + ':' + type; properties.put(key.toLowerCase(), data); } } } catch (Exception e) { e.printStackTrace(); String msg = PropertyUtil.getString("PNGImageDecoder2"); throw new RuntimeException(msg); } } while (true); // Final post-processing if (significantBits == null) { significantBits = new int[inputBands]; for (int i = 0; i < inputBands; i++) { significantBits[i] = bitDepth; } if (emitProperties) { properties.put("significant_bits", significantBits); } } distream.close(); stream.close(); } private static String getChunkType(DataInputStream distream) { try { distream.mark(8); /* int length = */ distream.readInt(); int type = distream.readInt(); distream.reset(); String typeString = "" + (char)((type >> 24) & 0xff) + (char)((type >> 16) & 0xff) + (char)((type >> 8) & 0xff) + (char)( type & 0xff); return typeString; } catch (Exception e) { e.printStackTrace(); return null; } } private static PNGChunk readChunk(DataInputStream distream) { try { int length = distream.readInt(); int type = distream.readInt(); byte[] data = new byte[length]; distream.readFully(data); int crc = distream.readInt(); return new PNGChunk(length, type, data, crc); } catch (Exception e) { e.printStackTrace(); return null; } } private void parse_IHDR_chunk(PNGChunk chunk) { int width = chunk.getInt4(0); int height = chunk.getInt4(4); bounds = new Rectangle(0, 0, width, height); bitDepth = chunk.getInt1(8); int validMask = (1 << 1) | ( 1 << 2 ) | ( 1 << 4 ) | ( 1 << 8 ) | ( 1 << 16 ); if (( ( 1 << bitDepth ) & validMask ) == 0 ) { // bitDepth is not one of { 1, 2, 4, 8, 16 }: Error -- bad bit depth String msg = PropertyUtil.getString("PNGImageDecoder3"); throw new RuntimeException(msg); } maxOpacity = (1 << bitDepth) - 1; colorType = chunk.getInt1(9); if ((colorType != PNG_COLOR_GRAY) && (colorType != PNG_COLOR_RGB) && (colorType != PNG_COLOR_PALETTE) && (colorType != PNG_COLOR_GRAY_ALPHA) && (colorType != PNG_COLOR_RGB_ALPHA)) { System.out.println(PropertyUtil.getString("PNGImageDecoder4")); } if ((colorType == PNG_COLOR_RGB) && (bitDepth < 8)) { // Error -- RGB images must have 8 or 16 bits String msg = PropertyUtil.getString("PNGImageDecoder5"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_PALETTE) && (bitDepth == 16)) { // Error -- palette images must have < 16 bits String msg = PropertyUtil.getString("PNGImageDecoder6"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_GRAY_ALPHA) && (bitDepth < 8)) { // Error -- gray/alpha images must have >= 8 bits String msg = PropertyUtil.getString("PNGImageDecoder7"); throw new RuntimeException(msg); } if ((colorType == PNG_COLOR_RGB_ALPHA) && (bitDepth < 8)) { // Error -- RGB/alpha images must have >= 8 bits String msg = PropertyUtil.getString("PNGImageDecoder8"); throw new RuntimeException(msg); } if (emitProperties) { properties.put("color_type", colorTypeNames[colorType]); } if (generateEncodeParam) { if (colorType == PNG_COLOR_PALETTE) { encodeParam = new PNGEncodeParam.Palette(); } else if (colorType == PNG_COLOR_GRAY || colorType == PNG_COLOR_GRAY_ALPHA) { encodeParam = new PNGEncodeParam.Gray(); } else { encodeParam = new PNGEncodeParam.RGB(); } decodeParam.setEncodeParam(encodeParam); } if (encodeParam != null) { encodeParam.setBitDepth(bitDepth); } if (emitProperties) { properties.put("bit_depth", new Integer(bitDepth)); } if (performGammaCorrection) { // Assume file gamma is 1/2.2 unless we get a gAMA chunk float gamma = (1.0F/2.2F)*(displayExponent/userExponent); if (encodeParam != null) { encodeParam.setGamma(gamma); } if (emitProperties) { properties.put("gamma", new Float(gamma)); } } compressionMethod = chunk.getInt1(10); if (compressionMethod != 0) { // Error -- only know about compression method 0 String msg = PropertyUtil.getString("PNGImageDecoder9"); throw new RuntimeException(msg); } filterMethod = chunk.getInt1(11); if (filterMethod != 0) { // Error -- only know about filter method 0 String msg = PropertyUtil.getString("PNGImageDecoder10"); throw new RuntimeException(msg); } interlaceMethod = chunk.getInt1(12); if (interlaceMethod == 0) { if (encodeParam != null) { encodeParam.setInterlacing(false); } if (emitProperties) { properties.put("interlace_method", "None"); } } else if (interlaceMethod == 1) { if (encodeParam != null) { encodeParam.setInterlacing(true); } if (emitProperties) { properties.put("interlace_method", "Adam7"); } } else { // Error -- only know about Adam7 interlacing String msg = PropertyUtil.getString("PNGImageDecoder11"); throw new RuntimeException(msg); } bytesPerPixel = (bitDepth == 16) ? 2 : 1; switch (colorType) { case PNG_COLOR_GRAY: inputBands = 1; outputBands = 1; if (output8BitGray && (bitDepth < 8)) { postProcess = POST_GRAY_LUT; } else if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; case PNG_COLOR_RGB: inputBands = 3; bytesPerPixel *= 3; outputBands = 3; if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; case PNG_COLOR_PALETTE: inputBands = 1; bytesPerPixel = 1; outputBands = expandPalette ? 3 : 1; if (expandPalette) { postProcess = POST_PALETTE_TO_RGB; } else { postProcess = POST_NONE; } break; case PNG_COLOR_GRAY_ALPHA: inputBands = 2; bytesPerPixel *= 2; if (suppressAlpha) { outputBands = 1; postProcess = POST_REMOVE_GRAY_TRANS; } else { if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } if (expandGrayAlpha) { postProcess |= POST_EXP_MASK; outputBands = 4; } else { outputBands = 2; } } break; case PNG_COLOR_RGB_ALPHA: inputBands = 4; bytesPerPixel *= 4; outputBands = (!suppressAlpha) ? 4 : 3; if (suppressAlpha) { postProcess = POST_REMOVE_RGB_TRANS; } else if (performGammaCorrection) { postProcess = POST_GAMMA; } else { postProcess = POST_NONE; } break; } } private void parse_IEND_chunk(PNGChunk chunk) throws Exception { // Store text strings int textLen = textKeys.size(); String[] textArray = new String[2*textLen]; for (int i = 0; i < textLen; i++) { String key = (String)textKeys.get(i); String val = (String)textStrings.get(i); textArray[2*i] = key; textArray[2*i + 1] = val; if (emitProperties) { String uniqueKey = "text_" + i + ':' + key; properties.put(uniqueKey.toLowerCase(), val); } } if (encodeParam != null) { encodeParam.setText(textArray); } // Store compressed text strings int ztextLen = ztextKeys.size(); String[] ztextArray = new String[2*ztextLen]; for (int i = 0; i < ztextLen; i++) { String key = (String)ztextKeys.get(i); String val = (String)ztextStrings.get(i); ztextArray[2*i] = key; ztextArray[2*i + 1] = val; if (emitProperties) { String uniqueKey = "ztext_" + i + ':' + key; properties.put(uniqueKey.toLowerCase(), val); } } if (encodeParam != null) { encodeParam.setCompressedText(ztextArray); } // Parse prior IDAT chunks InputStream seqStream = new SequenceInputStream( Collections.enumeration( streamVec )); InputStream infStream = new InflaterInputStream(seqStream, new Inflater()); dataStream = new DataInputStream(infStream); // Create an empty WritableRaster int depth = bitDepth; if ((colorType == PNG_COLOR_GRAY) && (bitDepth < 8) && output8BitGray) { depth = 8; } if ((colorType == PNG_COLOR_PALETTE) && expandPalette) { depth = 8; } int width = bounds.width; int height = bounds.height; int bytesPerRow = (outputBands*width*depth + 7)/8; int scanlineStride = (depth == 16) ? (bytesPerRow/2) : bytesPerRow; theTile = createRaster(width, height, outputBands, scanlineStride, depth); if (performGammaCorrection && (gammaLut == null)) { initGammaLut(bitDepth); } if ((postProcess == POST_GRAY_LUT) || (postProcess == POST_GRAY_LUT_ADD_TRANS) || (postProcess == POST_GRAY_LUT_ADD_TRANS_EXP)) { initGrayLut(bitDepth); } decodeImage(interlaceMethod == 1); // Free resources associated with compressed data. dataStream.close(); infStream.close(); seqStream.close(); streamVec = null; SampleModel sm = theTile.getSampleModel(); ColorModel cm; if ((colorType == PNG_COLOR_PALETTE) && !expandPalette) { if (outputHasAlphaPalette) { cm = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette, bluePalette, alphaPalette); } else { cm = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette, bluePalette); } } else if ((colorType == PNG_COLOR_GRAY) && (bitDepth < 8) && !output8BitGray) { byte[] palette = expandBits[bitDepth]; cm = new IndexColorModel(bitDepth, palette.length, palette, palette, palette); } else { cm = createComponentColorModel(sm); } init((CachableRed)null, bounds, cm, sm, 0, 0, properties); } private static final int[] GrayBits8 = { 8 }; private static final ComponentColorModel colorModelGray8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits8, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); private static final int[] GrayAlphaBits8 = { 8, 8 }; private static final ComponentColorModel colorModelGrayAlpha8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits8, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); private static final int[] GrayBits16 = { 16 }; private static final ComponentColorModel colorModelGray16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits16, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); private static final int[] GrayAlphaBits16 = { 16, 16 }; private static final ComponentColorModel colorModelGrayAlpha16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits16, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT); private static final int[] GrayBits32 = { 32 }; private static final ComponentColorModel colorModelGray32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayBits32, false, false, Transparency.OPAQUE, DataBuffer.TYPE_INT); private static final int[] GrayAlphaBits32 = { 32, 32 }; private static final ComponentColorModel colorModelGrayAlpha32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), GrayAlphaBits32, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_INT); private static final int[] RGBBits8 = { 8, 8, 8 }; private static final ComponentColorModel colorModelRGB8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits8, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); private static final int[] RGBABits8 = { 8, 8, 8, 8 }; private static final ComponentColorModel colorModelRGBA8 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits8, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); private static final int[] RGBBits16 = { 16, 16, 16 }; private static final ComponentColorModel colorModelRGB16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits16, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); private static final int[] RGBABits16 = { 16, 16, 16, 16 }; private static final ComponentColorModel colorModelRGBA16 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits16, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT); private static final int[] RGBBits32 = { 32, 32, 32 }; private static final ComponentColorModel colorModelRGB32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBBits32, false, false, Transparency.OPAQUE, DataBuffer.TYPE_INT); private static final int[] RGBABits32 = { 32, 32, 32, 32 }; private static final ComponentColorModel colorModelRGBA32 = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), RGBABits32, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_INT); /** * A convenience method to create an instance of * ComponentColorModel suitable for use with the * given SampleModel. The SampleModel * should have a data type of DataBuffer.TYPE_BYTE, * TYPE_USHORT, or TYPE_INT and between * 1 and 4 bands. Depending on the number of bands of the * SampleModel, either a gray, gray+alpha, rgb, or * rgb+alpha ColorModel is returned. */ public static ColorModel createComponentColorModel(SampleModel sm) { int type = sm.getDataType(); int bands = sm.getNumBands(); ComponentColorModel cm = null; if (type == DataBuffer.TYPE_BYTE) { switch (bands) { case 1: cm = colorModelGray8; break; case 2: cm = colorModelGrayAlpha8; break; case 3: cm = colorModelRGB8; break; case 4: cm = colorModelRGBA8; break; } } else if (type == DataBuffer.TYPE_USHORT) { switch (bands) { case 1: cm = colorModelGray16; break; case 2: cm = colorModelGrayAlpha16; break; case 3: cm = colorModelRGB16; break; case 4: cm = colorModelRGBA16; break; } } else if (type == DataBuffer.TYPE_INT) { switch (bands) { case 1: cm = colorModelGray32; break; case 2: cm = colorModelGrayAlpha32; break; case 3: cm = colorModelRGB32; break; case 4: cm = colorModelRGBA32; break; } } return cm; } private void parse_PLTE_chunk(PNGChunk chunk) { paletteEntries = chunk.getLength()/3; redPalette = new byte[paletteEntries]; greenPalette = new byte[paletteEntries]; bluePalette = new byte[paletteEntries]; int pltIndex = 0; // gAMA chunk must precede PLTE chunk if (performGammaCorrection) { if (gammaLut == null) { initGammaLut(bitDepth == 16 ? 16 : 8); } for (int i = 0; i < paletteEntries; i++) { byte r = chunk.getByte(pltIndex++); byte g = chunk.getByte(pltIndex++); byte b = chunk.getByte(pltIndex++); redPalette[i] = (byte)gammaLut[r & 0xff]; greenPalette[i] = (byte)gammaLut[g & 0xff]; bluePalette[i] = (byte)gammaLut[b & 0xff]; } } else { for (int i = 0; i < paletteEntries; i++) { redPalette[i] = chunk.getByte(pltIndex++); greenPalette[i] = chunk.getByte(pltIndex++); bluePalette[i] = chunk.getByte(pltIndex++); } } } private void parse_bKGD_chunk(PNGChunk chunk) { switch (colorType) { case PNG_COLOR_PALETTE: int bkgdIndex = chunk.getByte(0) & 0xff; bkgdRed = redPalette[bkgdIndex] & 0xff; bkgdGreen = greenPalette[bkgdIndex] & 0xff; bkgdBlue = bluePalette[bkgdIndex] & 0xff; if (encodeParam != null) { ((PNGEncodeParam.Palette)encodeParam). setBackgroundPaletteIndex(bkgdIndex); } break; case PNG_COLOR_GRAY: case PNG_COLOR_GRAY_ALPHA: int bkgdGray = chunk.getInt2(0); bkgdRed = bkgdGreen = bkgdBlue = bkgdGray; if (encodeParam != null) { ((PNGEncodeParam.Gray)encodeParam). setBackgroundGray(bkgdGray); } break; case PNG_COLOR_RGB: case PNG_COLOR_RGB_ALPHA: bkgdRed = chunk.getInt2(0); bkgdGreen = chunk.getInt2(2); bkgdBlue = chunk.getInt2(4); int[] bkgdRGB = new int[3]; bkgdRGB[0] = bkgdRed; bkgdRGB[1] = bkgdGreen; bkgdRGB[2] = bkgdBlue; if (encodeParam != null) { ((PNGEncodeParam.RGB)encodeParam). setBackgroundRGB(bkgdRGB); } break; } if (emitProperties) { int r = 0, g = 0, b = 0; if ((colorType == PNG_COLOR_PALETTE) || (bitDepth == 8)) { r = bkgdRed; g = bkgdGreen; b = bkgdBlue; } else if (bitDepth < 8) { r = expandBits[bitDepth][bkgdRed]; g = expandBits[bitDepth][bkgdGreen]; b = expandBits[bitDepth][bkgdBlue]; } else if (bitDepth == 16) { r = bkgdRed >> 8; g = bkgdGreen >> 8; b = bkgdBlue >> 8; } properties.put("background_color", new Color(r, g, b)); } } private void parse_cHRM_chunk(PNGChunk chunk) { // If an sRGB chunk exists, ignore cHRM chunks if (sRGBRenderingIntent != -1) { return; } chromaticity = new float[8]; chromaticity[0] = chunk.getInt4(0)/100000.0F; chromaticity[1] = chunk.getInt4(4)/100000.0F; chromaticity[2] = chunk.getInt4(8)/100000.0F; chromaticity[3] = chunk.getInt4(12)/100000.0F; chromaticity[4] = chunk.getInt4(16)/100000.0F; chromaticity[5] = chunk.getInt4(20)/100000.0F; chromaticity[6] = chunk.getInt4(24)/100000.0F; chromaticity[7] = chunk.getInt4(28)/100000.0F; if (encodeParam != null) { encodeParam.setChromaticity(chromaticity); } if (emitProperties) { properties.put("white_point_x", new Float(chromaticity[0])); properties.put("white_point_y", new Float(chromaticity[1])); properties.put("red_x", new Float(chromaticity[2])); properties.put("red_y", new Float(chromaticity[3])); properties.put("green_x", new Float(chromaticity[4])); properties.put("green_y", new Float(chromaticity[5])); properties.put("blue_x", new Float(chromaticity[6])); properties.put("blue_y", new Float(chromaticity[7])); } } private void parse_gAMA_chunk(PNGChunk chunk) { // If an sRGB chunk exists, ignore gAMA chunks if (sRGBRenderingIntent != -1) { return; } fileGamma = chunk.getInt4(0)/100000.0F; // System.out.println("Gamma: " + fileGamma); float exp = performGammaCorrection ? displayExponent/userExponent : 1.0F; if (encodeParam != null) { encodeParam.setGamma(fileGamma*exp); } if (emitProperties) { properties.put("gamma", new Float(fileGamma*exp)); } } private void parse_hIST_chunk(PNGChunk chunk) { if (redPalette == null) { String msg = PropertyUtil.getString("PNGImageDecoder18"); throw new RuntimeException(msg); } int length = redPalette.length; int[] hist = new int[length]; for (int i = 0; i < length; i++) { hist[i] = chunk.getInt2(2*i); } if (encodeParam != null) { encodeParam.setPaletteHistogram(hist); } } private void parse_iCCP_chunk(PNGChunk chunk) { String name = ""; byte b; int textIndex = 0; while ((b = chunk.getByte(textIndex++)) != 0) { name += (char)b; } } private void parse_pHYs_chunk(PNGChunk chunk) { int xPixelsPerUnit = chunk.getInt4(0); int yPixelsPerUnit = chunk.getInt4(4); int unitSpecifier = chunk.getInt1(8); if (encodeParam != null) { encodeParam.setPhysicalDimension(xPixelsPerUnit, yPixelsPerUnit, unitSpecifier); } if (emitProperties) { properties.put("x_pixels_per_unit", new Integer(xPixelsPerUnit)); properties.put("y_pixels_per_unit", new Integer(yPixelsPerUnit)); properties.put("pixel_aspect_ratio", new Float((float)xPixelsPerUnit/yPixelsPerUnit)); if (unitSpecifier == 1) { properties.put("pixel_units", "Meters"); } else if (unitSpecifier != 0) { // Error -- unit specifier must be 0 or 1 String msg = PropertyUtil.getString("PNGImageDecoder12"); throw new RuntimeException(msg); } } } private void parse_sBIT_chunk(PNGChunk chunk) { if (colorType == PNG_COLOR_PALETTE) { significantBits = new int[3]; } else { significantBits = new int[inputBands]; } for (int i = 0; i < significantBits.length; i++) { int bits = chunk.getByte(i); int depth = (colorType == PNG_COLOR_PALETTE) ? 8 : bitDepth; if (bits <= 0 || bits > depth) { // Error -- significant bits must be between 0 and // image bit depth. String msg = PropertyUtil.getString("PNGImageDecoder13"); throw new RuntimeException(msg); } significantBits[i] = bits; } if (encodeParam != null) { encodeParam.setSignificantBits(significantBits); } if (emitProperties) { properties.put("significant_bits", significantBits); } } private void parse_sRGB_chunk(PNGChunk chunk) { sRGBRenderingIntent = chunk.getByte(0); // The presence of an sRGB chunk implies particular // settings for gamma and chroma. fileGamma = 45455/100000.0F; chromaticity = new float[8]; chromaticity[0] = 31270/10000.0F; chromaticity[1] = 32900/10000.0F; chromaticity[2] = 64000/10000.0F; chromaticity[3] = 33000/10000.0F; chromaticity[4] = 30000/10000.0F; chromaticity[5] = 60000/10000.0F; chromaticity[6] = 15000/10000.0F; chromaticity[7] = 6000/10000.0F; if (performGammaCorrection) { // File gamma is 1/2.2 float gamma = fileGamma*(displayExponent/userExponent); if (encodeParam != null) { encodeParam.setGamma(gamma); encodeParam.setChromaticity(chromaticity); } if (emitProperties) { properties.put("gamma", new Float(gamma)); properties.put("white_point_x", new Float(chromaticity[0])); properties.put("white_point_y", new Float(chromaticity[1])); properties.put("red_x", new Float(chromaticity[2])); properties.put("red_y", new Float(chromaticity[3])); properties.put("green_x", new Float(chromaticity[4])); properties.put("green_y", new Float(chromaticity[5])); properties.put("blue_x", new Float(chromaticity[6])); properties.put("blue_y", new Float(chromaticity[7])); } } } private void parse_tEXt_chunk(PNGChunk chunk) { StringBuffer key = new StringBuffer(); StringBuffer value = new StringBuffer(); byte b; int textIndex = 0; while ((b = chunk.getByte(textIndex++)) != 0) { key.append( (char)b ); } for (int i = textIndex; i < chunk.getLength(); i++) { value.append( (char)chunk.getByte(i) ); } textKeys.add(key.toString()); textStrings.add(value.toString()); } private void parse_tIME_chunk(PNGChunk chunk) { int year = chunk.getInt2(0); int month = chunk.getInt1(2) - 1; int day = chunk.getInt1(3); int hour = chunk.getInt1(4); int minute = chunk.getInt1(5); int second = chunk.getInt1(6); TimeZone gmt = TimeZone.getTimeZone("GMT"); GregorianCalendar cal = new GregorianCalendar(gmt); cal.set(year, month, day, hour, minute, second); Date date = cal.getTime(); if (encodeParam != null) { encodeParam.setModificationTime(date); } if (emitProperties) { properties.put("timestamp", date); } } private void parse_tRNS_chunk(PNGChunk chunk) { if (colorType == PNG_COLOR_PALETTE) { int entries = chunk.getLength(); if (entries > paletteEntries) { // Error -- mustn't have more alpha than RGB palette entries String msg = PropertyUtil.getString("PNGImageDecoder14"); throw new RuntimeException(msg); } // Load beginning of palette from the chunk alphaPalette = new byte[paletteEntries]; for (int i = 0; i < entries; i++) { alphaPalette[i] = chunk.getByte(i); } // Fill rest of palette with 255 for (int i = entries; i < paletteEntries; i++) { alphaPalette[i] = (byte)255; } if (!suppressAlpha) { if (expandPalette) { postProcess = POST_PALETTE_TO_RGBA; outputBands = 4; } else { outputHasAlphaPalette = true; } } } else if (colorType == PNG_COLOR_GRAY) { grayTransparentAlpha = chunk.getInt2(0); if (!suppressAlpha) { if (bitDepth < 8) { output8BitGray = true; maxOpacity = 255; postProcess = POST_GRAY_LUT_ADD_TRANS; } else { postProcess = POST_ADD_GRAY_TRANS; } if (expandGrayAlpha) { outputBands = 4; postProcess |= POST_EXP_MASK; } else { outputBands = 2; } if (encodeParam != null) { ((PNGEncodeParam.Gray)encodeParam). setTransparentGray(grayTransparentAlpha); } } } else if (colorType == PNG_COLOR_RGB) { redTransparentAlpha = chunk.getInt2(0); greenTransparentAlpha = chunk.getInt2(2); blueTransparentAlpha = chunk.getInt2(4); if (!suppressAlpha) { outputBands = 4; postProcess = POST_ADD_RGB_TRANS; if (encodeParam != null) { int[] rgbTrans = new int[3]; rgbTrans[0] = redTransparentAlpha; rgbTrans[1] = greenTransparentAlpha; rgbTrans[2] = blueTransparentAlpha; ((PNGEncodeParam.RGB)encodeParam). setTransparentRGB(rgbTrans); } } } else if (colorType == PNG_COLOR_GRAY_ALPHA || colorType == PNG_COLOR_RGB_ALPHA) { // Error -- GA or RGBA image can't have a tRNS chunk. String msg = PropertyUtil.getString("PNGImageDecoder15"); throw new RuntimeException(msg); } } private void parse_zTXt_chunk(PNGChunk chunk) { StringBuffer key = new StringBuffer(); StringBuffer value = new StringBuffer(); byte b; int textIndex = 0; while ((b = chunk.getByte(textIndex++)) != 0) { key.append( (char)b ); } /* int method = */ chunk.getByte(textIndex++); try { int length = chunk.getLength() - textIndex; byte[] data = chunk.getData(); InputStream cis = new ByteArrayInputStream(data, textIndex, length); InputStream iis = new InflaterInputStream(cis); int c; while ((c = iis.read()) != -1) { value.append( (char)c ); } ztextKeys.add(key.toString() ); ztextStrings.add(value.toString() ); } catch (Exception e) { e.printStackTrace(); } } private WritableRaster createRaster(int width, int height, int bands, int scanlineStride, int bitDepth) { DataBuffer dataBuffer; WritableRaster ras = null; Point origin = new Point(0, 0); if ((bitDepth < 8) && (bands == 1)) { dataBuffer = new DataBufferByte(height*scanlineStride); ras = Raster.createPackedRaster(dataBuffer, width, height, bitDepth, origin); } else if (bitDepth <= 8) { dataBuffer = new DataBufferByte(height*scanlineStride); ras = Raster.createInterleavedRaster(dataBuffer, width, height, scanlineStride, bands, bandOffsets[bands], origin); } else { dataBuffer = new DataBufferUShort(height*scanlineStride); ras = Raster.createInterleavedRaster(dataBuffer, width, height, scanlineStride, bands, bandOffsets[bands], origin); } return ras; } // Data filtering methods private static void decodeSubFilter(byte[] curr, int count, int bpp) { for (int i = bpp; i < count; i++) { int val; val = curr[i] & 0xff; val += curr[i - bpp] & 0xff; curr[i] = (byte)val; } } private static void decodeUpFilter(byte[] curr, byte[] prev, int count) { for (int i = 0; i < count; i++) { int raw = curr[i] & 0xff; int prior = prev[i] & 0xff; curr[i] = (byte)(raw + prior); } } private static void decodeAverageFilter(byte[] curr, byte[] prev, int count, int bpp) { for (int i = 0; i < bpp; i++) { int raw = curr[i] & 0xff; int priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + priorRow/2); } for (int i = bpp; i < count; i++) { int raw = curr[i] & 0xff; int priorPixel = curr[i - bpp] & 0xff; int priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + (priorPixel + priorRow)/2); } } private static int paethPredictor(int a, int b, int c) { int p = a + b - c; int pa = Math.abs(p - a); int pb = Math.abs(p - b); int pc = Math.abs(p - c); if ((pa <= pb) && (pa <= pc)) { return a; } else if (pb <= pc) { return b; } else { return c; } } private static void decodePaethFilter(byte[] curr, byte[] prev, int count, int bpp) { int priorPixel, priorRowPixel; for (int i = 0; i < bpp; i++) { int raw = curr[i] & 0xff; int priorRow = prev[i] & 0xff; curr[i] = (byte)(raw + priorRow); } for (int i = bpp; i < count; i++) { int raw = curr[i] & 0xff; priorPixel = curr[i - bpp] & 0xff; int priorRow = prev[i] & 0xff; priorRowPixel = prev[i - bpp] & 0xff; curr[i] = (byte)(raw + paethPredictor(priorPixel, priorRow, priorRowPixel)); } } private void processPixels(int process, Raster src, WritableRaster dst, int xOffset, int step, int y, int width) { int srcX, dstX; // Create an array suitable for holding one pixel int[] ps = src.getPixel(0, 0, (int[])null); int[] pd = dst.getPixel(0, 0, (int[])null); dstX = xOffset; switch (process) { case POST_NONE: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); dst.setPixel(dstX, y, ps); dstX += step; } break; case POST_GAMMA: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); for (int i = 0; i < inputBands; i++) { int x = ps[i]; ps[i] = gammaLut[x]; } dst.setPixel(dstX, y, ps); dstX += step; } break; case POST_GRAY_LUT: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); pd[0] = grayLut[ps[0]]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_LUT_ADD_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = grayLut[val]; if (val == grayTransparentAlpha) { pd[1] = 0; } else { pd[1] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_PALETTE_TO_RGB: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = redPalette[val]; pd[1] = greenPalette[val]; pd[2] = bluePalette[val]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_PALETTE_TO_RGBA: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; pd[0] = redPalette[val]; pd[1] = greenPalette[val]; pd[2] = bluePalette[val]; pd[3] = alphaPalette[val]; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_GRAY_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; if (performGammaCorrection) { val = gammaLut[val]; } pd[0] = val; if (val == grayTransparentAlpha) { pd[1] = 0; } else { pd[1] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_RGB_TRANS: boolean flagGammaCorrection = performGammaCorrection; // local is cheaper int[] workGammaLut = gammaLut; for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int r = ps[0]; int g = ps[1]; int b = ps[2]; if (flagGammaCorrection) { pd[0] = workGammaLut[r]; pd[1] = workGammaLut[g]; pd[2] = workGammaLut[b]; } else { pd[0] = r; pd[1] = g; pd[2] = b; } if ((r == redTransparentAlpha) && (g == greenTransparentAlpha) && (b == blueTransparentAlpha)) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_REMOVE_GRAY_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int g = ps[0]; if (performGammaCorrection) { pd[0] = gammaLut[g]; } else { pd[0] = g; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_REMOVE_RGB_TRANS: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int r = ps[0]; int g = ps[1]; int b = ps[2]; if (performGammaCorrection) { pd[0] = gammaLut[r]; pd[1] = gammaLut[g]; pd[2] = gammaLut[b]; } else { pd[0] = r; pd[1] = g; pd[2] = b; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GAMMA_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int alpha = ps[1]; int gamma = gammaLut[val]; pd[0] = gamma; pd[1] = gamma; pd[2] = gamma; pd[3] = alpha; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_ALPHA_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int alpha = ps[1]; pd[0] = val; pd[1] = val; pd[2] = val; pd[3] = alpha; dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_ADD_GRAY_TRANS_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; if (performGammaCorrection) { val = gammaLut[val]; } pd[0] = val; pd[1] = val; pd[2] = val; if (val == grayTransparentAlpha) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; case POST_GRAY_LUT_ADD_TRANS_EXP: for (srcX = 0; srcX < width; srcX++) { src.getPixel(srcX, 0, ps); int val = ps[0]; int val2 = grayLut[val]; pd[0] = val2; pd[1] = val2; pd[2] = val2; if (val == grayTransparentAlpha) { pd[3] = 0; } else { pd[3] = maxOpacity; } dst.setPixel(dstX, y, pd); dstX += step; } break; } } /** * Reads in an image of a given size and returns it as a * WritableRaster. */ private void decodePass(WritableRaster imRas, int xOffset, int yOffset, int xStep, int yStep, int passWidth, int passHeight) { if ((passWidth == 0) || (passHeight == 0)) { return; } int bytesPerRow = (inputBands*passWidth*bitDepth + 7)/8; int eltsPerRow = (bitDepth == 16) ? bytesPerRow/2 : bytesPerRow; byte[] curr = new byte[bytesPerRow]; byte[] prior = new byte[bytesPerRow]; // Create a 1-row tall Raster to hold the data WritableRaster passRow = createRaster(passWidth, 1, inputBands, eltsPerRow, bitDepth); DataBuffer dataBuffer = passRow.getDataBuffer(); int type = dataBuffer.getDataType(); byte[] byteData = null; short[] shortData = null; if (type == DataBuffer.TYPE_BYTE) { byteData = ((DataBufferByte)dataBuffer).getData(); } else { shortData = ((DataBufferUShort)dataBuffer).getData(); } // Decode the (sub)image row-by-row int srcY, dstY; for (srcY = 0, dstY = yOffset; srcY < passHeight; srcY++, dstY += yStep) { // Read the filter type byte and a row of data int filter = 0; try { filter = dataStream.read(); dataStream.readFully(curr, 0, bytesPerRow); } catch (Exception e) { e.printStackTrace(); } switch (filter) { case PNG_FILTER_NONE: break; case PNG_FILTER_SUB: decodeSubFilter(curr, bytesPerRow, bytesPerPixel); break; case PNG_FILTER_UP: decodeUpFilter(curr, prior, bytesPerRow); break; case PNG_FILTER_AVERAGE: decodeAverageFilter(curr, prior, bytesPerRow, bytesPerPixel); break; case PNG_FILTER_PAETH: decodePaethFilter(curr, prior, bytesPerRow, bytesPerPixel); break; default: // Error -- unknown filter type String msg = PropertyUtil.getString("PNGImageDecoder16"); throw new RuntimeException(msg); } // Copy data into passRow byte by byte if (bitDepth < 16) { System.arraycopy(curr, 0, byteData, 0, bytesPerRow); } else { int idx = 0; for (int j = 0; j < eltsPerRow; j++) { shortData[j] = (short)((curr[idx] << 8) | (curr[idx + 1] & 0xff)); idx += 2; } } processPixels(postProcess, passRow, imRas, xOffset, xStep, dstY, passWidth); // Swap curr and prior byte[] tmp = prior; prior = curr; curr = tmp; } } private void decodeImage(boolean useInterlacing) { int width = bounds.width; int height = bounds.height; if (!useInterlacing) { decodePass(theTile, 0, 0, 1, 1, width, height); } else { decodePass(theTile, 0, 0, 8, 8, (width + 7)/8, (height + 7)/8); decodePass(theTile, 4, 0, 8, 8, (width + 3)/8, (height + 7)/8); decodePass(theTile, 0, 4, 4, 8, (width + 3)/4, (height + 3)/8); decodePass(theTile, 2, 0, 4, 4, (width + 1)/4, (height + 3)/4); decodePass(theTile, 0, 2, 2, 4, (width + 1)/2, (height + 1)/4); decodePass(theTile, 1, 0, 2, 2, width/2, (height + 1)/2); decodePass(theTile, 0, 1, 1, 2, width, height/2); } } public WritableRaster copyData(WritableRaster wr) { GraphicsUtil.copyData(theTile, wr); return wr; } // RenderedImage stuff public Raster getTile(int tileX, int tileY) { if (tileX != 0 || tileY != 0) { // Error -- bad tile requested String msg = PropertyUtil.getString("PNGImageDecoder17"); throw new IllegalArgumentException(msg); } return theTile; } } ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGTranscoderInternalCodecWriteAdapter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGTranscoderInter0000644000175000017500000000747413063003443032565 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import org.apache.batik.ext.awt.image.rendered.IndexImage; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.PNGTranscoder; /** * This class is a helper to PNGTranscoder that writes PNG images * through the internal PNG codec. * * @version $Id: PNGTranscoderInternalCodecWriteAdapter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGTranscoderInternalCodecWriteAdapter implements PNGTranscoder.WriteAdapter { /** * @throws TranscoderException * @see org.apache.batik.transcoder.image.PNGTranscoder.WriteAdapter#writeImage(org.apache.batik.transcoder.image.PNGTranscoder, java.awt.image.BufferedImage, org.apache.batik.transcoder.TranscoderOutput) */ public void writeImage(PNGTranscoder transcoder, BufferedImage img, TranscoderOutput output) throws TranscoderException { TranscodingHints hints = transcoder.getTranscodingHints(); int n=-1; if (hints.containsKey(PNGTranscoder.KEY_INDEXED)) { n=((Integer)hints.get(PNGTranscoder.KEY_INDEXED)).intValue(); if (n==1||n==2||n==4||n==8) //PNGEncodeParam.Palette can handle these numbers only. img = IndexImage.getIndexedImage(img,1< 0) { params.setGamma(gamma); } params.setChromaticity(PNGTranscoder.DEFAULT_CHROMA); } else { // We generally want an sRGB chunk and our encoding intent // is perceptual params.setSRGBIntent(PNGEncodeParam.INTENT_PERCEPTUAL); } float PixSzMM = transcoder.getUserAgent().getPixelUnitToMillimeter(); // num Pixs in 1 Meter int numPix = (int)((1000/PixSzMM)+0.5); params.setPhysicalDimension(numPix, numPix, 1); // 1 means 'pix/meter' try { OutputStream ostream = output.getOutputStream(); PNGImageEncoder pngEncoder = new PNGImageEncoder(ostream, params); pngEncoder.encode(img); ostream.flush(); } catch (IOException ex) { throw new TranscoderException(ex); } } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageWriter.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageWriter.jav0000644000175000017500000000377113063003442032450 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; import org.apache.batik.ext.awt.image.spi.ImageWriter; import org.apache.batik.ext.awt.image.spi.ImageWriterParams; /** * ImageWriter implementation that uses Batik's PNG codec to * write PNG files. * * @version $Id: PNGImageWriter.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGImageWriter implements ImageWriter { /** * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream) */ public void writeImage(RenderedImage image, OutputStream out) throws IOException { writeImage(image, out, null); } /** * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream, org.apache.batik.ext.awt.image.spi.ImageWriterParams) */ public void writeImage(RenderedImage image, OutputStream out, ImageWriterParams params) throws IOException { PNGImageEncoder encoder = new PNGImageEncoder(out, null); encoder.encode(image); } /** * @see ImageWriter#getMIMEType() */ public String getMIMEType() { return "image/png"; } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageEncoder.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageEncoder.ja0000644000175000017500000007731513063003442032372 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import org.apache.batik.ext.awt.image.codec.util.ImageEncoderImpl; import java.awt.Rectangle; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.io.ByteArrayOutputStream; import java.io.DataOutput; import java.io.DataOutputStream; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; class CRC { private static int[] crcTable = new int[256]; static { // Initialize CRC table for (int n = 0; n < 256; n++) { int c = n; for (int k = 0; k < 8; k++) { if ((c & 1) == 1) { c = 0xedb88320 ^ (c >>> 1); } else { c >>>= 1; } crcTable[n] = c; } } } public static int updateCRC(int crc, byte[] data, int off, int len) { int c = crc; for (int n = 0; n < len; n++) { c = crcTable[(c ^ data[off + n]) & 0xff] ^ (c >>> 8); } return c; } } class ChunkStream extends OutputStream implements DataOutput { private String type; private ByteArrayOutputStream baos; private DataOutputStream dos; ChunkStream(String type) throws IOException { this.type = type; this.baos = new ByteArrayOutputStream(); this.dos = new DataOutputStream(baos); } public void write(byte[] b) throws IOException { dos.write(b); } public void write(byte[] b, int off, int len) throws IOException { dos.write(b, off, len); } public void write(int b) throws IOException { dos.write(b); } public void writeBoolean(boolean v) throws IOException { dos.writeBoolean(v); } public void writeByte(int v) throws IOException { dos.writeByte(v); } public void writeBytes(String s) throws IOException { dos.writeBytes(s); } public void writeChar(int v) throws IOException { dos.writeChar(v); } public void writeChars(String s) throws IOException { dos.writeChars(s); } public void writeDouble(double v) throws IOException { dos.writeDouble(v); } public void writeFloat(float v) throws IOException { dos.writeFloat(v); } public void writeInt(int v) throws IOException { dos.writeInt(v); } public void writeLong(long v) throws IOException { dos.writeLong(v); } public void writeShort(int v) throws IOException { dos.writeShort(v); } public void writeUTF(String str) throws IOException { dos.writeUTF(str); } public void writeToStream(DataOutputStream output) throws IOException { byte[] typeSignature = new byte[4]; typeSignature[0] = (byte)type.charAt(0); typeSignature[1] = (byte)type.charAt(1); typeSignature[2] = (byte)type.charAt(2); typeSignature[3] = (byte)type.charAt(3); dos.flush(); baos.flush(); byte[] data = baos.toByteArray(); int len = data.length; output.writeInt(len); output.write(typeSignature); output.write(data, 0, len); int crc = 0xffffffff; crc = CRC.updateCRC(crc, typeSignature, 0, 4); crc = CRC.updateCRC(crc, data, 0, len); output.writeInt(crc ^ 0xffffffff); } /** * this doesnt do much, its main purpose is to stop complaints * about 'outputStream not closed...'. * * @throws IOException */ public void close() throws IOException { if ( baos != null ) { baos.close(); baos = null; } if( dos != null ) { dos.close(); dos= null; } } } class IDATOutputStream extends FilterOutputStream { private static final byte[] typeSignature = {(byte)'I', (byte)'D', (byte)'A', (byte)'T'}; private int bytesWritten = 0; private int segmentLength; byte[] buffer; public IDATOutputStream(OutputStream output, int segmentLength) { super(output); this.segmentLength = segmentLength; this.buffer = new byte[segmentLength]; } public void close() throws IOException { flush(); } private void writeInt(int x) throws IOException { out.write(x >> 24); out.write((x >> 16) & 0xff); out.write((x >> 8) & 0xff); out.write(x & 0xff); } public void flush() throws IOException { if (bytesWritten == 0) return; // Length writeInt(bytesWritten); // 'IDAT' signature out.write(typeSignature); // Data out.write(buffer, 0, bytesWritten); int crc = 0xffffffff; crc = CRC.updateCRC(crc, typeSignature, 0, 4); crc = CRC.updateCRC(crc, buffer, 0, bytesWritten); // CRC writeInt(crc ^ 0xffffffff); // Reset buffer bytesWritten = 0; } public void write(byte[] b) throws IOException { this.write(b, 0, b.length); } public void write(byte[] b, int off, int len) throws IOException { while (len > 0) { int bytes = Math.min(segmentLength - bytesWritten, len); System.arraycopy(b, off, buffer, bytesWritten, bytes); off += bytes; len -= bytes; bytesWritten += bytes; if (bytesWritten == segmentLength) { flush(); } } } public void write(int b) throws IOException { buffer[bytesWritten++] = (byte)b; if (bytesWritten == segmentLength) { flush(); } } } /** * An ImageEncoder for the PNG file format. * * @since EA4 * @version $Id: PNGImageEncoder.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGImageEncoder extends ImageEncoderImpl { private static final int PNG_COLOR_GRAY = 0; private static final int PNG_COLOR_RGB = 2; private static final int PNG_COLOR_PALETTE = 3; private static final int PNG_COLOR_GRAY_ALPHA = 4; private static final int PNG_COLOR_RGB_ALPHA = 6; private static final byte[] magic = { (byte)137, (byte) 80, (byte) 78, (byte) 71, (byte) 13, (byte) 10, (byte) 26, (byte) 10 }; private PNGEncodeParam param; private RenderedImage image; private int width; private int height; private int bitDepth; private int bitShift; private int numBands; private int colorType; private int bpp; // bytes per pixel, rounded up private boolean skipAlpha = false; private boolean compressGray = false; private boolean interlace; private byte[] redPalette = null; private byte[] greenPalette = null; private byte[] bluePalette = null; private byte[] alphaPalette = null; private DataOutputStream dataOutput; public PNGImageEncoder(OutputStream output, PNGEncodeParam param) { super(output, param); if (param != null) { this.param = param; } this.dataOutput = new DataOutputStream(output); } private void writeMagic() throws IOException { dataOutput.write(magic); } private void writeIHDR() throws IOException { ChunkStream cs = new ChunkStream("IHDR"); cs.writeInt(width); cs.writeInt(height); cs.writeByte((byte)bitDepth); cs.writeByte((byte)colorType); cs.writeByte((byte)0); cs.writeByte((byte)0); cs.writeByte(interlace ? (byte)1 : (byte)0); cs.writeToStream(dataOutput); cs.close(); } private byte[] prevRow = null; private byte[] currRow = null; private byte[][] filteredRows = null; private static int clamp(int val, int maxValue) { return (val > maxValue) ? maxValue : val; } private void encodePass(OutputStream os, Raster ras, int xOffset, int yOffset, int xSkip, int ySkip) throws IOException { int minX = ras.getMinX(); int minY = ras.getMinY(); int width = ras.getWidth(); int height = ras.getHeight(); xOffset *= numBands; xSkip *= numBands; int samplesPerByte = 8/bitDepth; int numSamples = width*numBands; int[] samples = new int[numSamples]; int pixels = (numSamples - xOffset + xSkip - 1)/xSkip; int bytesPerRow = pixels*numBands; if (bitDepth < 8) { bytesPerRow = (bytesPerRow + samplesPerByte - 1)/samplesPerByte; } else if (bitDepth == 16) { bytesPerRow *= 2; } if (bytesPerRow == 0) { return; } currRow = new byte[bytesPerRow + bpp]; prevRow = new byte[bytesPerRow + bpp]; filteredRows = new byte[5][bytesPerRow + bpp]; int maxValue = (1 << bitDepth) - 1; for (int row = minY + yOffset; row < minY + height; row += ySkip) { ras.getPixels(minX, row, width, 1, samples); if (compressGray) { int shift = 8 - bitDepth; for (int i = 0; i < width; i++) { samples[i] >>= shift; } } int count = bpp; // leave first 'bpp' bytes zero int pos = 0; int tmp = 0; switch (bitDepth) { case 1: case 2: case 4: // Image can only have a single band int mask = samplesPerByte - 1; for (int s = xOffset; s < numSamples; s += xSkip) { int val = clamp(samples[s] >> bitShift, maxValue); tmp = (tmp << bitDepth) | val; if (pos++ == mask) { currRow[count++] = (byte)tmp; tmp = 0; pos = 0; } } // Left shift the last byte if (pos != 0) { tmp <<= (samplesPerByte - pos)*bitDepth; currRow[count++] = (byte)tmp; } break; case 8: for (int s = xOffset; s < numSamples; s += xSkip) { for (int b = 0; b < numBands; b++) { currRow[count++] = (byte)clamp(samples[s + b] >> bitShift, maxValue); } } break; case 16: for (int s = xOffset; s < numSamples; s += xSkip) { for (int b = 0; b < numBands; b++) { int val = clamp(samples[s + b] >> bitShift, maxValue); currRow[count++] = (byte)(val >> 8); currRow[count++] = (byte)(val & 0xff); } } break; } // Perform filtering int filterType = param.filterRow(currRow, prevRow, filteredRows, bytesPerRow, bpp); os.write(filterType); os.write(filteredRows[filterType], bpp, bytesPerRow); // Swap current and previous rows byte[] swap = currRow; currRow = prevRow; prevRow = swap; } } private void writeIDAT() throws IOException { IDATOutputStream ios = new IDATOutputStream(dataOutput, 8192); DeflaterOutputStream dos = new DeflaterOutputStream(ios, new Deflater(9)); // Future work - don't convert entire image to a Raster It // might seem that you could just call image.getData() but // 'BufferedImage.subImage' doesn't appear to set the Width // and height properly of the Child Raster, so the Raster // you get back here appears larger than it should. // This solves that problem by bounding the raster to the // image's bounds... Raster ras = image.getData(new Rectangle(image.getMinX(), image.getMinY(), image.getWidth(), image.getHeight())); // System.out.println("Image: [" + // image.getMinY() + ", " + // image.getMinX() + ", " + // image.getWidth() + ", " + // image.getHeight() + "]"); // System.out.println("Ras: [" + // ras.getMinX() + ", " + // ras.getMinY() + ", " + // ras.getWidth() + ", " + // ras.getHeight() + "]"); if (skipAlpha) { int numBands = ras.getNumBands() - 1; int[] bandList = new int[numBands]; for (int i = 0; i < numBands; i++) { bandList[i] = i; } ras = ras.createChild(0, 0, ras.getWidth(), ras.getHeight(), 0, 0, bandList); } if (interlace) { // Interlacing pass 1 encodePass(dos, ras, 0, 0, 8, 8); // Interlacing pass 2 encodePass(dos, ras, 4, 0, 8, 8); // Interlacing pass 3 encodePass(dos, ras, 0, 4, 4, 8); // Interlacing pass 4 encodePass(dos, ras, 2, 0, 4, 4); // Interlacing pass 5 encodePass(dos, ras, 0, 2, 2, 4); // Interlacing pass 6 encodePass(dos, ras, 1, 0, 2, 2); // Interlacing pass 7 encodePass(dos, ras, 0, 1, 1, 2); } else { encodePass(dos, ras, 0, 0, 1, 1); } dos.finish(); dos.close(); ios.flush(); ios.close(); } private void writeIEND() throws IOException { ChunkStream cs = new ChunkStream("IEND"); cs.writeToStream(dataOutput); cs.close(); } private static final float[] srgbChroma = { 0.31270F, 0.329F, 0.64F, 0.33F, 0.3F, 0.6F, 0.15F, 0.06F }; private void writeCHRM() throws IOException { if (param.isChromaticitySet() || param.isSRGBIntentSet()) { ChunkStream cs = new ChunkStream("cHRM"); float[] chroma; if (!param.isSRGBIntentSet()) { chroma = param.getChromaticity(); } else { chroma = srgbChroma; // SRGB chromaticities } for (int i = 0; i < 8; i++) { cs.writeInt((int)(chroma[i]*100000)); } cs.writeToStream(dataOutput); cs.close(); } } private void writeGAMA() throws IOException { if (param.isGammaSet() || param.isSRGBIntentSet()) { ChunkStream cs = new ChunkStream("gAMA"); float gamma; if (!param.isSRGBIntentSet()) { gamma = param.getGamma(); } else { gamma = 1.0F/2.2F; // SRGB gamma } // TD should include the .5 but causes regard to say // everything is different. cs.writeInt((int)(gamma*100000/*+0.5*/)); cs.writeToStream(dataOutput); cs.close(); } } private void writeICCP() throws IOException { if (param.isICCProfileDataSet()) { ChunkStream cs = new ChunkStream("iCCP"); byte[] ICCProfileData = param.getICCProfileData(); cs.write(ICCProfileData); cs.writeToStream(dataOutput); cs.close(); } } private void writeSBIT() throws IOException { if (param.isSignificantBitsSet()) { ChunkStream cs = new ChunkStream("sBIT"); int[] significantBits = param.getSignificantBits(); int len = significantBits.length; for (int i = 0; i < len; i++) { cs.writeByte(significantBits[i]); } cs.writeToStream(dataOutput); cs.close(); } } private void writeSRGB() throws IOException { if (param.isSRGBIntentSet()) { ChunkStream cs = new ChunkStream("sRGB"); int intent = param.getSRGBIntent(); cs.write(intent); cs.writeToStream(dataOutput); cs.close(); } } private void writePLTE() throws IOException { if (redPalette == null) { return; } ChunkStream cs = new ChunkStream("PLTE"); for (int i = 0; i < redPalette.length; i++) { cs.writeByte(redPalette[i]); cs.writeByte(greenPalette[i]); cs.writeByte(bluePalette[i]); } cs.writeToStream(dataOutput); cs.close(); } private void writeBKGD() throws IOException { if (param.isBackgroundSet()) { ChunkStream cs = new ChunkStream("bKGD"); switch (colorType) { case PNG_COLOR_GRAY: case PNG_COLOR_GRAY_ALPHA: int gray = ((PNGEncodeParam.Gray)param).getBackgroundGray(); cs.writeShort(gray); break; case PNG_COLOR_PALETTE: int index = ((PNGEncodeParam.Palette)param).getBackgroundPaletteIndex(); cs.writeByte(index); break; case PNG_COLOR_RGB: case PNG_COLOR_RGB_ALPHA: int[] rgb = ((PNGEncodeParam.RGB)param).getBackgroundRGB(); cs.writeShort(rgb[0]); cs.writeShort(rgb[1]); cs.writeShort(rgb[2]); break; } cs.writeToStream(dataOutput); cs.close(); } } private void writeHIST() throws IOException { if (param.isPaletteHistogramSet()) { ChunkStream cs = new ChunkStream("hIST"); int[] hist = param.getPaletteHistogram(); for (int i = 0; i < hist.length; i++) { cs.writeShort(hist[i]); } cs.writeToStream(dataOutput); cs.close(); } } private void writeTRNS() throws IOException { if (param.isTransparencySet() && (colorType != PNG_COLOR_GRAY_ALPHA) && (colorType != PNG_COLOR_RGB_ALPHA)) { ChunkStream cs = new ChunkStream("tRNS"); if (param instanceof PNGEncodeParam.Palette) { byte[] t = ((PNGEncodeParam.Palette)param).getPaletteTransparency(); for (int i = 0; i < t.length; i++) { cs.writeByte(t[i]); } } else if (param instanceof PNGEncodeParam.Gray) { int t = ((PNGEncodeParam.Gray)param).getTransparentGray(); cs.writeShort(t); } else if (param instanceof PNGEncodeParam.RGB) { int[] t = ((PNGEncodeParam.RGB)param).getTransparentRGB(); cs.writeShort(t[0]); cs.writeShort(t[1]); cs.writeShort(t[2]); } cs.writeToStream(dataOutput); cs.close(); } else if (colorType == PNG_COLOR_PALETTE) { int lastEntry = Math.min(255, alphaPalette.length - 1); int nonOpaque; for (nonOpaque = lastEntry; nonOpaque >= 0; nonOpaque--) { if (alphaPalette[nonOpaque] != (byte)255) { break; } } if (nonOpaque >= 0) { ChunkStream cs = new ChunkStream("tRNS"); for (int i = 0; i <= nonOpaque; i++) { cs.writeByte(alphaPalette[i]); } cs.writeToStream(dataOutput); cs.close(); } } } private void writePHYS() throws IOException { if (param.isPhysicalDimensionSet()) { ChunkStream cs = new ChunkStream("pHYs"); int[] dims = param.getPhysicalDimension(); cs.writeInt(dims[0]); cs.writeInt(dims[1]); cs.writeByte((byte)dims[2]); cs.writeToStream(dataOutput); cs.close(); } } private void writeSPLT() throws IOException { if (param.isSuggestedPaletteSet()) { ChunkStream cs = new ChunkStream("sPLT"); System.out.println("sPLT not supported yet."); cs.writeToStream(dataOutput); cs.close(); } } private void writeTIME() throws IOException { if (param.isModificationTimeSet()) { ChunkStream cs = new ChunkStream("tIME"); Date date = param.getModificationTime(); TimeZone gmt = TimeZone.getTimeZone("GMT"); GregorianCalendar cal = new GregorianCalendar(gmt); cal.setTime(date); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DAY_OF_MONTH); int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); cs.writeShort(year); cs.writeByte(month + 1); cs.writeByte(day); cs.writeByte(hour); cs.writeByte(minute); cs.writeByte(second); cs.writeToStream(dataOutput); cs.close(); } } private void writeTEXT() throws IOException { if (param.isTextSet()) { String[] text = param.getText(); for (int i = 0; i < text.length/2; i++) { byte[] keyword = text[2*i].getBytes(); byte[] value = text[2*i + 1].getBytes(); ChunkStream cs = new ChunkStream("tEXt"); cs.write(keyword, 0, Math.min(keyword.length, 79)); cs.write(0); cs.write(value); cs.writeToStream(dataOutput); cs.close(); } } } private void writeZTXT() throws IOException { if (param.isCompressedTextSet()) { String[] text = param.getCompressedText(); for (int i = 0; i < text.length/2; i++) { byte[] keyword = text[2*i].getBytes(); byte[] value = text[2*i + 1].getBytes(); ChunkStream cs = new ChunkStream("zTXt"); cs.write(keyword, 0, Math.min(keyword.length, 79)); cs.write(0); cs.write(0); DeflaterOutputStream dos = new DeflaterOutputStream(cs); dos.write(value); dos.finish(); dos.close(); cs.writeToStream(dataOutput); cs.close(); } } } private void writePrivateChunks() throws IOException { int numChunks = param.getNumPrivateChunks(); for (int i = 0; i < numChunks; i++) { String type = param.getPrivateChunkType(i); byte[] data = param.getPrivateChunkData(i); ChunkStream cs = new ChunkStream(type); cs.write(data); cs.writeToStream(dataOutput); cs.close(); } } /** * Analyzes a set of palettes and determines if it can be expressed * as a standard set of gray values, with zero or one values being * fully transparent and the rest being fully opaque. If it * is possible to express the data thusly, the method returns * a suitable instance of PNGEncodeParam.Gray; otherwise it * returns null. */ private PNGEncodeParam.Gray createGrayParam(byte[] redPalette, byte[] greenPalette, byte[] bluePalette, byte[] alphaPalette) { PNGEncodeParam.Gray param = new PNGEncodeParam.Gray(); int numTransparent = 0; int grayFactor = 255/((1 << bitDepth) - 1); int entries = 1 << bitDepth; for (int i = 0; i < entries; i++) { byte red = redPalette[i]; if ((red != i*grayFactor) || (red != greenPalette[i]) || (red != bluePalette[i])) { return null; } // All alphas must be 255 except at most 1 can be 0 byte alpha = alphaPalette[i]; if (alpha == (byte)0) { param.setTransparentGray(i); ++numTransparent; if (numTransparent > 1) { return null; } } else if (alpha != (byte)255) { return null; } } return param; } /** * This method encodes a RenderedImage into PNG. * The stream into which the PNG is dumped is not closed at * the end of the operation, this should be done if needed * by the caller of this method. */ public void encode(RenderedImage im) throws IOException { this.image = im; this.width = image.getWidth(); this.height = image.getHeight(); SampleModel sampleModel = image.getSampleModel(); int[] sampleSize = sampleModel.getSampleSize(); // Set bitDepth to a sentinel value this.bitDepth = -1; this.bitShift = 0; // Allow user to override the bit depth of gray images if (param instanceof PNGEncodeParam.Gray) { PNGEncodeParam.Gray paramg = (PNGEncodeParam.Gray)param; if (paramg.isBitDepthSet()) { this.bitDepth = paramg.getBitDepth(); } if (paramg.isBitShiftSet()) { this.bitShift = paramg.getBitShift(); } } // Get bit depth from image if not set in param if (this.bitDepth == -1) { // Get bit depth from channel 0 of the image this.bitDepth = sampleSize[0]; // Ensure all channels have the same bit depth for (int i = 1; i < sampleSize.length; i++) { if (sampleSize[i] != bitDepth) { throw new RuntimeException(); } } // Round bit depth up to a power of 2 if (bitDepth > 2 && bitDepth < 4) { bitDepth = 4; } else if (bitDepth > 4 && bitDepth < 8) { bitDepth = 8; } else if (bitDepth > 8 && bitDepth < 16) { bitDepth = 16; } else if (bitDepth > 16) { throw new RuntimeException(); } } this.numBands = sampleModel.getNumBands(); this.bpp = numBands*((bitDepth == 16) ? 2 : 1); ColorModel colorModel = image.getColorModel(); if (colorModel instanceof IndexColorModel) { if (bitDepth < 1 || bitDepth > 8) { throw new RuntimeException(); } if (sampleModel.getNumBands() != 1) { throw new RuntimeException(); } IndexColorModel icm = (IndexColorModel)colorModel; int size = icm.getMapSize(); redPalette = new byte[size]; greenPalette = new byte[size]; bluePalette = new byte[size]; alphaPalette = new byte[size]; icm.getReds(redPalette); icm.getGreens(greenPalette); icm.getBlues(bluePalette); icm.getAlphas(alphaPalette); this.bpp = 1; if (param == null) { param = createGrayParam(redPalette, greenPalette, bluePalette, alphaPalette); } // If param is still null, it can't be expressed as gray if (param == null) { param = new PNGEncodeParam.Palette(); } if (param instanceof PNGEncodeParam.Palette) { // If palette not set in param, create one from the ColorModel. PNGEncodeParam.Palette parami = (PNGEncodeParam.Palette)param; if (parami.isPaletteSet()) { int[] palette = parami.getPalette(); size = palette.length/3; int index = 0; for (int i = 0; i < size; i++) { redPalette[i] = (byte)palette[index++]; greenPalette[i] = (byte)palette[index++]; bluePalette[i] = (byte)palette[index++]; alphaPalette[i] = (byte)255; } } this.colorType = PNG_COLOR_PALETTE; } else if (param instanceof PNGEncodeParam.Gray) { redPalette = greenPalette = bluePalette = alphaPalette = null; this.colorType = PNG_COLOR_GRAY; } else { throw new RuntimeException(); } } else if (numBands == 1) { if (param == null) { param = new PNGEncodeParam.Gray(); } this.colorType = PNG_COLOR_GRAY; } else if (numBands == 2) { if (param == null) { param = new PNGEncodeParam.Gray(); } if (param.isTransparencySet()) { skipAlpha = true; numBands = 1; if ((sampleSize[0] == 8) && (bitDepth < 8)) { compressGray = true; } bpp = (bitDepth == 16) ? 2 : 1; this.colorType = PNG_COLOR_GRAY; } else { if (this.bitDepth < 8) { this.bitDepth = 8; } this.colorType = PNG_COLOR_GRAY_ALPHA; } } else if (numBands == 3) { if (param == null) { param = new PNGEncodeParam.RGB(); } this.colorType = PNG_COLOR_RGB; } else if (numBands == 4) { if (param == null) { param = new PNGEncodeParam.RGB(); } if (param.isTransparencySet()) { skipAlpha = true; numBands = 3; bpp = (bitDepth == 16) ? 6 : 3; this.colorType = PNG_COLOR_RGB; } else { this.colorType = PNG_COLOR_RGB_ALPHA; } } interlace = param.getInterlacing(); writeMagic(); writeIHDR(); writeCHRM(); writeGAMA(); writeICCP(); writeSBIT(); writeSRGB(); writePLTE(); writeHIST(); writeTRNS(); writeBKGD(); writePHYS(); writeSPLT(); writeTIME(); writeTEXT(); writeZTXT(); writePrivateChunks(); writeIDAT(); writeIEND(); dataOutput.flush(); dataOutput.close(); } } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGRegistryEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGRegistryEntry.j0000644000175000017500000001171513063003442032531 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.io.IOException; import java.io.InputStream; import org.apache.batik.ext.awt.image.GraphicsUtil; import org.apache.batik.ext.awt.image.renderable.DeferRable; import org.apache.batik.ext.awt.image.renderable.Filter; import org.apache.batik.ext.awt.image.renderable.RedRable; import org.apache.batik.ext.awt.image.rendered.Any2sRGBRed; import org.apache.batik.ext.awt.image.rendered.CachableRed; import org.apache.batik.ext.awt.image.rendered.FormatRed; import org.apache.batik.ext.awt.image.spi.ImageTagRegistry; import org.apache.batik.ext.awt.image.spi.MagicNumberRegistryEntry; import org.apache.batik.util.ParsedURL; /** * * @version $Id: PNGRegistryEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGRegistryEntry extends MagicNumberRegistryEntry { static final byte [] signature = {(byte)0x89, 80, 78, 71, 13, 10, 26, 10}; public PNGRegistryEntry() { super("PNG", "png", "image/png", 0, signature); } /** * Decode the Stream into a RenderableImage * * @param inIS The input stream that contains the image. * @param origURL The original URL, if any, for documentation * purposes only. This may be null. * @param needRawData If true the image returned should not have * any default color correction the file may * specify applied. */ public Filter handleStream(InputStream inIS, ParsedURL origURL, boolean needRawData) { final DeferRable dr = new DeferRable(); final InputStream is = inIS; final boolean raw = needRawData; final String errCode; final Object [] errParam; if (origURL != null) { errCode = ERR_URL_FORMAT_UNREADABLE; errParam = new Object[] {"PNG", origURL}; } else { errCode = ERR_STREAM_FORMAT_UNREADABLE; errParam = new Object[] {"PNG"}; } Thread t = new Thread() { public void run() { Filter filt; try { PNGDecodeParam param = new PNGDecodeParam(); param.setExpandPalette(true); if (raw) param.setPerformGammaCorrection(false); else { param.setPerformGammaCorrection(true); param.setDisplayExponent(2.2f); // sRGB gamma } CachableRed cr = new PNGRed(is, param); dr.setBounds(new Rectangle2D.Double (0, 0, cr.getWidth(), cr.getHeight())); cr = new Any2sRGBRed(cr); cr = new FormatRed(cr, GraphicsUtil.sRGB_Unpre); WritableRaster wr = (WritableRaster)cr.getData(); ColorModel cm = cr.getColorModel(); BufferedImage image; image = new BufferedImage (cm, wr, cm.isAlphaPremultiplied(), null); cr = GraphicsUtil.wrap(image); filt = new RedRable(cr); } catch (IOException ioe) { filt = ImageTagRegistry.getBrokenLinkImage (PNGRegistryEntry.this, errCode, errParam); } catch (ThreadDeath td) { filt = ImageTagRegistry.getBrokenLinkImage (PNGRegistryEntry.this, errCode, errParam); dr.setSource(filt); throw td; } catch (Throwable t) { filt = ImageTagRegistry.getBrokenLinkImage (PNGRegistryEntry.this, errCode, errParam); } dr.setSource(filt); } }; t.start(); return dr; } } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGSuggestedPaletteEntry.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGSuggestedPalett0000644000175000017500000000330713063003442032551 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import java.io.Serializable; /** * A class representing the fields of a PNG suggested palette entry. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: PNGSuggestedPaletteEntry.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGSuggestedPaletteEntry implements Serializable { /** The name of the entry. */ public String name; /** The depth of the color samples. */ public int sampleDepth; /** The red color value of the entry. */ public int red; /** The green color value of the entry. */ public int green; /** The blue color value of the entry. */ public int blue; /** The alpha opacity value of the entry. */ public int alpha; /** The probable frequency of the color in the image. */ public int frequency; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootbatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGDecodeParam.javabatik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGDecodeParam.jav0000644000175000017500000003135213063003443032372 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.ext.awt.image.codec.png; import org.apache.batik.ext.awt.image.codec.util.ImageDecodeParam; import org.apache.batik.ext.awt.image.codec.util.PropertyUtil; /** * An instance of ImageDecodeParam for decoding images in * the PNG format. * * PNGDecodeParam allows several aspects of the decoding * process for PNG images to be controlled. By default, decoding produces * output images with the following properties: * *

Images with a bit depth of 8 or less use a * DataBufferByte to hold the pixel data. 16-bit images * use a DataBufferUShort. * *

Palette color images and non-transparent grayscale images with * bit depths of 1, 2, or 4 will have a * MultiPixelPackedSampleModel and an * IndexColorModel. For palette color images, the * ColorModel palette contains the red, green, blue, and * optionally alpha palette information. For grayscale images, the * palette is used to expand the pixel data to cover the range 0-255. * The pixels are stored packed 8, 4, or 2 to the byte. * *

All other images are stored using a * PixelInterleavedSampleModel with each sample of a pixel * occupying its own byte or short within * the DataBuffer. A ComponentColorModel is * used which simply extracts the red, green, blue, gray, and/or alpha * information from separate DataBuffer entries. * *

Five aspects of this process may be altered by means of methods * in this class. * *

setSuppressAlpha() prevents an alpha channel * from appearing in the output. * *

setExpandPalette() turns palette-color images into * 3-or 4-channel full-color images. * *

setOutput8BitGray() causes 1, 2, or 4 bit * grayscale images to be output in 8-bit form, using a * ComponentSampleModel and * ComponentColorModel. * *

setDecodingExponent() causes the output image to be * gamma-corrected using a supplied output gamma value. * *

setExpandGrayAlpha() causes 2-channel gray/alpha * (GA) images to be output as full-color (GGGA) images, which may * simplify further processing and display. * *

This class is not a committed part of the JAI API. It may * be removed or changed in future releases of JAI. * * @version $Id: PNGDecodeParam.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class PNGDecodeParam implements ImageDecodeParam { /** * Constructs a default instance of PNGDecodeParam. */ public PNGDecodeParam() {} private boolean suppressAlpha = false; /** * Returns true if alpha (transparency) will * be prevented from appearing in the output. */ public boolean getSuppressAlpha() { return suppressAlpha; } /** * If set, no alpha (transparency) channel will appear in the * output image. * *

The default is to allow transparency to appear in the * output image. */ public void setSuppressAlpha(boolean suppressAlpha) { this.suppressAlpha = suppressAlpha; } private boolean expandPalette = false; /** * Returns true if palette-color images will be expanded to * produce full-color output. */ public boolean getExpandPalette() { return expandPalette; } /** * If set, palette color images (PNG color type 3) will * be decoded into full-color (RGB) output images. The output * image may have 3 or 4 channels, depending on the presence of * transparency information. * *

The default is to output palette images using a single * channel. The palette information is used to construct the * output image's ColorModel. */ public void setExpandPalette(boolean expandPalette) { this.expandPalette = expandPalette; } private boolean output8BitGray = false; /** * Returns the current value of the 8-bit gray output parameter. */ public boolean getOutput8BitGray() { return output8BitGray; } /** * If set, grayscale images with a bit depth less than 8 * (1, 2, or 4) will be output in 8 bit form. The output values * will occupy the full 8-bit range. For example, gray values * 0, 1, 2, and 3 of a 2-bit image will be output as * 0, 85, 170, and 255. * *

The decoding of non-grayscale images and grayscale images * with a bit depth of 8 or 16 are unaffected by this setting. * *

The default is not to perform expansion. Grayscale images * with a depth of 1, 2, or 4 bits will be represented using * a MultiPixelPackedSampleModel and an * IndexColorModel. */ public void setOutput8BitGray(boolean output8BitGray) { this.output8BitGray = output8BitGray; } private boolean performGammaCorrection = true; /** * Returns true if gamma correction is to be performed * on the image data. The default is true. * *

If gamma correction is to be performed, the * getUserExponent() and * getDisplayExponent() methods are used in addition to * the gamma value stored within the file (or the default value of * 1/2.2 used if no value is found) to produce a single exponent * using the formula: *

     * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
     * 
*/ public boolean getPerformGammaCorrection() { return performGammaCorrection; } /** * Turns gamma corection of the image data on or off. */ public void setPerformGammaCorrection(boolean performGammaCorrection) { this.performGammaCorrection = performGammaCorrection; } private float userExponent = 1.0F; /** * Returns the current value of the user exponent parameter. * By default, the user exponent is equal to 1.0F. */ public float getUserExponent() { return userExponent; } /** * Sets the user exponent to a given value. The exponent * must be positive. If not, an * IllegalArgumentException will be thrown. * *

The output image pixels will be placed through a transformation * of the form: * *

     * sample = integer_sample / (2^bitdepth - 1.0)
     * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
     * output = sample ^ decoding_exponent
     * 
* * where gamma_from_file is the gamma of the file * data, as determined by the gAMA, sRGB, * and/or iCCP chunks, and display_exponent * is the exponent of the intrinsic transfer curve of the display, * generally 2.2. * *

Input files which do not specify any gamma are assumed to * have a gamma of 1/2.2; such images may be displayed * on a CRT with an exponent of 2.2 using the default user * exponent of 1.0. * *

The user exponent may be used in order to change the * effective gamma of a file. If a file has a stored gamma of * X, but the decoder believes that the true file gamma is Y, * setting a user exponent of Y/X will produce the same result * as changing the file gamma. * *

This parameter affects the decoding of all image types. * * @throws IllegalArgumentException if userExponent is * negative. */ public void setUserExponent(float userExponent) { if (userExponent <= 0.0F) { throw new IllegalArgumentException(PropertyUtil.getString("PNGDecodeParam0")); } this.userExponent = userExponent; } private float displayExponent = 2.2F; /** * Returns the current value of the display exponent parameter. * By default, the display exponent is equal to 2.2F. */ public float getDisplayExponent() { return displayExponent; } /** * Sets the display exponent to a given value. The exponent * must be positive. If not, an * IllegalArgumentException will be thrown. * *

The output image pixels will be placed through a transformation * of the form: * *

     * sample = integer_sample / (2^bitdepth - 1.0)
     * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
     * output = sample ^ decoding_exponent
     * 
* * where gamma_from_file is the gamma of the file * data, as determined by the gAMA, sRGB, * and/or iCCP chunks, and user_exponent * is an additional user-supplied parameter. * *

Input files which do not specify any gamma are assumed to * have a gamma of 1/2.2; such images should be * decoding using the default display exponent of 2.2. * *

If an image is to be processed further before being displayed, * it may be preferable to set the display exponent to 1.0 in order * to produce a linear output image. * *

This parameter affects the decoding of all image types. * * @throws IllegalArgumentException if userExponent is * negative. */ public void setDisplayExponent(float displayExponent) { if (displayExponent <= 0.0F) { throw new IllegalArgumentException(PropertyUtil.getString("PNGDecodeParam1")); } this.displayExponent = displayExponent; } private boolean expandGrayAlpha = false; /** * Returns the current setting of the gray/alpha expansion. */ public boolean getExpandGrayAlpha() { return expandGrayAlpha; } /** * If set, images containing one channel of gray and one channel of * alpha (GA) will be output in a 4-channel format (GGGA). This * produces output that may be simpler to process and display. * *

This setting affects both images of color type 4 (explicit * alpha) and images of color type 0 (grayscale) that contain * transparency information. * *

By default, no expansion is performed. */ public void setExpandGrayAlpha(boolean expandGrayAlpha) { this.expandGrayAlpha = expandGrayAlpha; } private boolean generateEncodeParam = false; private PNGEncodeParam encodeParam = null; /** * Returns true if an instance of * PNGEncodeParam will be available after an image * has been decoded via the getEncodeParam method. */ public boolean getGenerateEncodeParam() { return generateEncodeParam; } /** * If set, an instance of PNGEncodeParam will be * available after an image has been decoded via the * getEncodeParam method that encapsulates information * about the contents of the PNG file. If not set, this information * will not be recorded and getEncodeParam() will * return null. */ public void setGenerateEncodeParam(boolean generateEncodeParam) { this.generateEncodeParam = generateEncodeParam; } /** * If getGenerateEncodeParam() is true, * this method may be called after decoding has completed, and * will return an instance of PNGEncodeParam containing * information about the contents of the PNG file just decoded. */ public PNGEncodeParam getEncodeParam() { return encodeParam; } /** * Sets the current encoder param instance. This method is * intended to be called by the PNG decoder and will overwrite the * current instance returned by getEncodeParam. */ public void setEncodeParam(PNGEncodeParam encodeParam) { this.encodeParam = encodeParam; } } batik-1.9.orig/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/package.html0000644000175000017500000000036513063003442030653 0ustar mans0954mans0954 org.apache.batik.ext.awt.image.codec Provides a set of classes to encode/decode images in various raster image file formats. batik-1.9.orig/batik-codec/src/test/0000755000175000017500000000000013063003441016643 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/test/resources/0000755000175000017500000000000013063003441020655 5ustar mans0954mans0954batik-1.9.orig/batik-codec/src/test/java/0000755000175000017500000000000013063003441017564 5ustar mans0954mans0954batik-1.9.orig/batik-codec/pom.xml0000644000175000017500000000462513063004314016421 0ustar mans0954mans0954 4.0.0 batik-codec ${project.groupId}:${project.artifactId} Batik image codecs org.apache.xmlgraphics batik 1.9 ${project.groupId} batik-awt-util ${project.version} ${project.groupId} batik-bridge ${project.version} ${project.groupId} batik-transcoder ${project.version} ${project.groupId} batik-util ${project.version} src/main/resources ${basedir}/.. LICENSE NOTICE META-INF batik-1.9.orig/NOTICE0000644000175000017500000000125413063003463013642 0ustar mans0954mans0954Apache Batik Copyright 1999-2017 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). This software contains code from the World Wide Web Consortium (W3C) for the Document Object Model API (DOM API) and SVG Document Type Definition (DTD). This software contains code from the International Organisation for Standardization for the definition of character entities used in the software's documentation. This product includes images from the Tango Desktop Project (http://tango.freedesktop.org/). This product includes images from the Pasodoble Icon Theme (http://www.jesusda.com/projects/pasodoble). batik-1.9.orig/batik-xml/0000755000175000017500000000000013153020772014626 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/0000755000175000017500000000000013063003357015415 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/0000755000175000017500000000000013063003357016341 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/0000755000175000017500000000000013063003357020353 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/0000755000175000017500000000000013063003357021142 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/apache/0000755000175000017500000000000013063003357022363 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/0000755000175000017500000000000013063003357023455 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/xml/0000755000175000017500000000000013063003357024255 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/xml/scanner/0000755000175000017500000000000013063003357025706 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/xml/scanner/resources/0000755000175000017500000000000013153020772027720 5ustar mans0954mans0954././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootbatik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/xml/scanner/resources/Messages.propertiesbatik-1.9.orig/batik-xml/src/main/resources/org/apache/batik/xml/scanner/resources/Messages.properti0000644000175000017500000000312213063003361033246 0ustar mans0954mans0954# ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # The error messages for the XML scanner. # # Author: stephane@hillion.org # $Id: Messages.properties 1733416 2016-03-03 07:07:13Z gadams $ # ----------------------------------------------------------------------------- character = \ Invalid character. comment = \ Malformed comment. eof = \ Unexpected end of stream. character.reference = \ Malformed character reference. parameter.entity = \ Malformed parameter entity. pi.target = \ Invalid processing instruction target. xml.reserved = \ 'x' or 'X', 'm' or 'M' and 'l' or 'L' cannot start PI targets. comment.or.doctype = \ Comment or DOCTYPE expected. tag.end = \ Malformed end of tag. pi.end = \ Malformed end of processing instruction. name = \ Malformed name. batik-1.9.orig/batik-xml/src/main/java/0000755000175000017500000000000013063003357017262 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/java/org/0000755000175000017500000000000013063003357020051 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/java/org/apache/0000755000175000017500000000000013063003357021272 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/0000755000175000017500000000000013063003357022364 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/0000755000175000017500000000000013153020772023164 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/XMLUtilities.java0000644000175000017500000002714513063003360026366 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PushbackInputStream; import java.io.Reader; import org.apache.batik.util.EncodingUtilities; /** * A collection of utility functions for XML. * * @author Stephane Hillion * @version $Id: XMLUtilities.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class XMLUtilities extends XMLCharacters { // Bitfield constants used in the return value of testXMLQName. public static final int IS_XML_10_NAME = 1; public static final int IS_XML_10_QNAME = 2; /** * This class does not need to be instantiated. */ protected XMLUtilities() { } /** * Tests whether the given character is a valid space. */ public static boolean isXMLSpace(char c) { return (c <= 0x0020) && (((((1L << 0x0009) | (1L << 0x000A) | (1L << 0x000D) | (1L << 0x0020)) >> c) & 1L) != 0); } /** * Tests whether the given character is usable as the * first character of an XML name. */ public static boolean isXMLNameFirstCharacter(char c) { return (NAME_FIRST_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given character is usable as the * first character of an XML 1.1 name. */ public static boolean isXML11NameFirstCharacter(char c) { return (NAME11_FIRST_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given character is a valid XML name character. */ public static boolean isXMLNameCharacter(char c) { return (NAME_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given character is a valid XML 1.1 name character. */ public static boolean isXML11NameCharacter(char c) { return (NAME11_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given 32 bits character is valid in XML documents. * Because the majority of code-points is covered by the table-lookup-test, * we do it first. * This method gives meaningful results only for c >= 0. */ public static boolean isXMLCharacter(int c) { return ( ( ( XML_CHARACTER[c >>> 5 ] & (1 << (c & 0x1F ))) != 0 ) || (c >= 0x10000 && c <= 0x10ffff) ); } /** * Tests whether the given 32 bit character is a valid XML 1.1 character. */ public static boolean isXML11Character(int c) { return c >= 1 && c <= 0xd7ff || c >= 0xe000 && c <= 0xfffd || c >= 0x10000 && c <= 0x10ffff; } /** * Tests whether the given character is a valid XML public ID character. */ public static boolean isXMLPublicIdCharacter(char c) { return (c < 128) && (PUBLIC_ID_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given character is a valid XML version character. */ public static boolean isXMLVersionCharacter(char c) { return (c < 128) && (VERSION_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Tests whether the given character is a valid aphabetic character. */ public static boolean isXMLAlphabeticCharacter(char c) { return (c < 128) && (ALPHABETIC_CHARACTER[c / 32] & (1 << (c % 32))) != 0; } /** * Test whether the given string is an XML 1.0 Name and/or QName. * @return A bitfield of {@link #IS_XML_10_NAME} and * {@link #IS_XML_10_QNAME}. */ public static int testXMLQName(String s) { int isQName = IS_XML_10_QNAME; boolean foundColon = false; int len = s.length(); if (len == 0) { return 0; } char c = s.charAt(0); if (!isXMLNameFirstCharacter(c)) { return 0; } if (c == ':') { isQName = 0; } for (int i = 1; i < len; i++) { c = s.charAt(i); if (!isXMLNameCharacter(c)) { return 0; } if (isQName != 0 && c == ':') { if (foundColon || i == len - 1) { isQName = 0; } else { foundColon = true; } } } return IS_XML_10_NAME | isQName; } /** * Creates a Reader initialized to scan the characters in the given * XML document's InputStream. * @param is The input stream positionned at the beginning of an * XML document. * @return a Reader positionned at the beginning of the XML document * It is created from an encoding figured out from the first * few bytes of the document. As a consequence the given * input stream is not positionned anymore at the beginning * of the document when this method returns. */ public static Reader createXMLDocumentReader(InputStream is) throws IOException { PushbackInputStream pbis = new PushbackInputStream(is, 128); byte[] buf = new byte[4]; int len = pbis.read(buf); if (len > 0) { pbis.unread(buf, 0, len); } if (len == 4) { switch (buf[0] & 0x00FF) { case 0: if (buf[1] == 0x003c && buf[2] == 0x0000 && buf[3] == 0x003f) { return new InputStreamReader(pbis, "UnicodeBig"); } break; case '<': switch (buf[1] & 0x00FF) { case 0: if (buf[2] == 0x003f && buf[3] == 0x0000) { return new InputStreamReader(pbis, "UnicodeLittle"); } break; case '?': if (buf[2] == 'x' && buf[3] == 'm') { Reader r = createXMLDeclarationReader(pbis, "UTF8"); String enc = getXMLDeclarationEncoding(r, "UTF8"); return new InputStreamReader(pbis, enc); } } break; case 0x004C: if (buf[1] == 0x006f && (buf[2] & 0x00FF) == 0x00a7 && (buf[3] & 0x00FF) == 0x0094) { Reader r = createXMLDeclarationReader(pbis, "CP037"); String enc = getXMLDeclarationEncoding(r, "CP037"); return new InputStreamReader(pbis, enc); } break; case 0x00FE: if ((buf[1] & 0x00FF) == 0x00FF) { return new InputStreamReader(pbis, "Unicode"); } break; case 0x00FF: if ((buf[1] & 0x00FF) == 0x00FE) { return new InputStreamReader(pbis, "Unicode"); } } } return new InputStreamReader(pbis, "UTF8"); } /** * Creates a reader from the given input stream and encoding. * This method assumes the input stream working buffer is at least * 128 byte long. The input stream is restored before this method * returns. The 4 first bytes are skipped before creating the reader. */ protected static Reader createXMLDeclarationReader(PushbackInputStream pbis, String enc) throws IOException { byte[] buf = new byte[128]; int len = pbis.read(buf); if (len > 0) { pbis.unread(buf, 0, len); } return new InputStreamReader(new ByteArrayInputStream(buf, 4, len), enc); } /** * Reads an XML declaration to get the encoding declaration value. * @param r a reader positioned just after '<?xm'. * @param e the encoding to return by default or on error. */ protected static String getXMLDeclarationEncoding(Reader r, String e) throws IOException { int c; if ((c = r.read()) != 'l') { return e; } if (!isXMLSpace((char)(c = r.read()))) { return e; } while (isXMLSpace((char)(c = r.read()))); if (c != 'v') { return e; } if ((c = r.read()) != 'e') { return e; } if ((c = r.read()) != 'r') { return e; } if ((c = r.read()) != 's') { return e; } if ((c = r.read()) != 'i') { return e; } if ((c = r.read()) != 'o') { return e; } if ((c = r.read()) != 'n') { return e; } c = r.read(); while (isXMLSpace((char)c)) { c = r.read(); } if (c != '=') { return e; } while (isXMLSpace((char)(c = r.read()))); if (c != '"' && c != '\'') { return e; } char sc = (char)c; for (;;) { c = r.read(); if (c == sc) { break; } if (!isXMLVersionCharacter((char)c)) { return e; } } if (!isXMLSpace((char)(c = r.read()))) { return e; } while (isXMLSpace((char)(c = r.read()))); if (c != 'e') { return e; } if ((c = r.read()) != 'n') { return e; } if ((c = r.read()) != 'c') { return e; } if ((c = r.read()) != 'o') { return e; } if ((c = r.read()) != 'd') { return e; } if ((c = r.read()) != 'i') { return e; } if ((c = r.read()) != 'n') { return e; } if ((c = r.read()) != 'g') { return e; } c = r.read(); while (isXMLSpace((char)c)) { c = r.read(); } if (c != '=') { return e; } while (isXMLSpace((char)(c = r.read()))); if (c != '"' && c != '\'') { return e; } sc = (char)c; StringBuffer enc = new StringBuffer(); for (;;) { c = r.read(); if (c == -1) { return e; } if (c == sc) { return encodingToJavaEncoding(enc.toString(), e); } enc.append((char)c); } } /** * Converts the given standard encoding representation to the * corresponding Java encoding string. * @param e the encoding string to convert. * @param de the encoding string if no corresponding encoding was found. */ public static String encodingToJavaEncoding(String e, String de) { String result = EncodingUtilities.javaEncoding(e); return (result == null) ? de : result; } } batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/XMLException.java0000644000175000017500000001067513063003361026352 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; /** * This class encapsulates a general XML error or warning. * *

This class can contain basic error or warning information from * either the parser or the application. * *

If the application needs to pass through other types of * exceptions, it must wrap those exceptions in a XMLException. * * @author Stephane Hillion * @version $Id: XMLException.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class XMLException extends RuntimeException { /** * @serial The embedded exception if tunnelling, or null. */ protected Exception exception; /** * Creates a new XMLException. * @param message The error or warning message. */ public XMLException (String message) { super(message); exception = null; } /** * Creates a new XMLException wrapping an existing exception. * *

The existing exception will be embedded in the new * one, and its message will become the default message for * the XMLException. * @param e The exception to be wrapped in a XMLException. */ public XMLException (Exception e) { exception = e; } /** * Creates a new XMLException from an existing exception. * *

The existing exception will be embedded in the new * one, but the new exception will have its own message. * @param message The detail message. * @param e The exception to be wrapped in a SAXException. */ public XMLException (String message, Exception e) { super(message); exception = e; } /** * Return a detail message for this exception. * *

If there is a embedded exception, and if the XMLException * has no detail message of its own, this method will return * the detail message from the embedded exception. * @return The error or warning message. */ public String getMessage () { String message = super.getMessage(); if (message == null && exception != null) { return exception.getMessage(); } else { return message; } } /** * Return the embedded exception, if any. * @return The embedded exception, or null if there is none. */ public Exception getException () { return exception; } /** * Prints this Exception and its backtrace to the * standard error stream. */ public void printStackTrace() { if (exception == null) { super.printStackTrace(); } else { synchronized (System.err) { System.err.println(this); super.printStackTrace(); } } } /** * Prints this Exception and its backtrace to the * specified print stream. * * @param s PrintStream to use for output */ public void printStackTrace(java.io.PrintStream s) { if (exception == null) { super.printStackTrace(s); } else { synchronized (s) { s.println(this); super.printStackTrace(); } } } /** * Prints this Exception and its backtrace to the specified * print writer. * * @param s PrintWriter to use for output */ public void printStackTrace(java.io.PrintWriter s) { if (exception == null) { super.printStackTrace(s); } else { synchronized (s) { s.println(this); super.printStackTrace(s); } } } } batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/XMLCharacters.java0000644000175000017500000010567713063003360026501 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; /** * This class contains the definitions of the arrays used to find * the type of the characters found in an XML document. * * @author Stephane Hillion * @version $Id: XMLCharacters.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class XMLCharacters { /** * The bit array representing the first character of an XML name. */ public static final int[] NAME_FIRST_CHARACTER = { 0,67108864,-2013265922,134217726,0,0,-8388609,-8388609,-1,2146697215, -514,2147483647,-1,-1,-8177,-63832065,16777215,0,-65536,-1,-1, -134217217,3,0,0,0,0,0,-10432,-5,1417641983,1048573,-8194,-1, -536936449,-1,-65533,-1,-58977,54513663,0,-131072,41943039,-2,127,0, -65536,460799,0,134217726,2046,-131072,-1,2097151999,3112959,96,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,-32,603979775,-16777216,3,-417824, 63307263,-1342177280,196611,-423968,57540095,1577058304,1835008, -282656,602799615,0,1,-417824,600702463,-1342177280,3,-700594208, 62899992,0,0,-139296,66059775,0,3,-139296,66059775,1073741824,3, -139296,67108351,0,3,0,0,0,0,-2,884735,63,0,-17816170,537750702,31,0, 0,0,-257,1023,0,0,0,0,0,0,0,0,0,-1,-65473,8388607,514797,1342177280, -2110697471,2908843,1073741824,-176109312,7,33622016,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,268435455,-1,-1, 67108863,1061158911,-1,-1426112705,1073741823,-1,1608515583, 265232348,534519807,0,0,0,0,0,0,0,0,0,19520,0,0,7,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,128,1022,-2,-1,2097151,-2,-1,134217727,-32,8191,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; /** * The bit array representing the first character of an XML 1.1 name. */ public static final int[] NAME11_FIRST_CHARACTER = { 0,32,2147483617,2147483616,0,0,-257,-257,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,65533,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,786432,0,0,65535,-65536,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65536,2147483647,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65536,65535,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-4, }; /** * The bit array representing a character compositing an XML name. */ public static final int[] NAME_CHARACTER = { 0,134176768,-2013265922,134217726,0,8388608,-8388609,-8388609,-1, 2146697215,-514,2147483647,-1,-1,-8177,-63832065,16777215,0,-65536, -1,-1,-134217217,196611,0,-1,-1,63,3,-10304,-5,1417641983,1048573, -8194,-1,-536936449,-1,-65413,-1,-58977,54513663,0,-131072,41943039, -2,-130945,-1140850693,-65514,460799,0,134217726,524287,-64513,-1, 2097151999,-1081345,67059199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-18, -201326593,-14794753,65487,-417810,-741999105,-1333773921,262095, -423964,-747766273,1577073031,2097088,-282642,-202506753,15295,65473, -417810,-204603905,-1329579633,65475,-700594196,-1010841832,8404423, 65408,-139282,-1007682049,6307295,65475,-139284,-1007682049, 1080049119,65475,-139284,-1006633473,8404431,65475,0,0,0,0,-2, 134184959,67076095,0,-17816170,1006595246,67059551,0,50331648, -1029700609,-257,-130049,-21032993,50216959,0,0,0,0,0,0,0,-1,-65473, 8388607,514797,1342177280,-2110697471,2908843,1073741824,-176109312, 7,33622016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1, -1,-1,-1,268435455,-1,-1,67108863,1061158911,-1,-1426112705, 1073741823,-1,1608515583,265232348,534519807,0,0,0,0,0,0,536805376,2, 0,19520,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,4128766,-2,-1,1713373183, -2,-1,2013265919,-32,8191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,63,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, }; /** * The bit array representing a character compositing an XML 1.1 name. */ public static final int[] NAME11_CHARACTER = { 0,458720,2147483617,2147483616,0,256,-257,-257,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,786432,1,-2147483648,65535,-65536,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65536, 2147483647,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-65536,65535,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4, }; /** * The bit array representing a valid XML character in the unicode range [0-FFFF]. */ public static final int[] XML_CHARACTER = { 9728,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,1073741823, }; /** * The bit array representing the valid XML public ID characters. */ public static final int[] PUBLIC_ID_CHARACTER = { 9216,-1342177349,-2013265921,134217726, }; /** * The bit array representing the valid XML version characters. */ public static final int[] VERSION_CHARACTER = { 0,134176768,-2013265922,134217726, }; /** * The bit array representing an alphabetic character. */ public static final int[] ALPHABETIC_CHARACTER = { 0,0,134217726,134217726, }; /** * This class does not need to be instantiated. */ protected XMLCharacters() { } } batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/XMLStreamNormalizingReader.java0000644000175000017500000000770413063003360031202 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; import java.io.Reader; import org.apache.batik.util.io.StreamNormalizingReader; import org.apache.batik.util.io.UTF16Decoder; /** * This class represents a normalizing reader with encoding detection * management. * * @author Stephane Hillion * @version $Id: XMLStreamNormalizingReader.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class XMLStreamNormalizingReader extends StreamNormalizingReader { /** * Creates a new XMLStreamNormalizingReader. * @param is The input stream to read. * @param encod The character encoding to use if the auto-detection fail. */ public XMLStreamNormalizingReader(InputStream is, String encod) throws IOException { PushbackInputStream pbis = new PushbackInputStream(is, 128); byte[] buf = new byte[4]; int len = pbis.read(buf); if (len > 0) { pbis.unread(buf, 0, len); } if (len == 4) { switch (buf[0] & 0x00FF) { case 0: if (buf[1] == 0x003c && buf[2] == 0x0000 && buf[3] == 0x003f) { charDecoder = new UTF16Decoder(pbis, true); return; } break; case '<': switch (buf[1] & 0x00FF) { case 0: if (buf[2] == 0x003f && buf[3] == 0x0000) { charDecoder = new UTF16Decoder(pbis, false); return; } break; case '?': if (buf[2] == 'x' && buf[3] == 'm') { Reader r = XMLUtilities.createXMLDeclarationReader (pbis, "UTF8"); String enc = XMLUtilities.getXMLDeclarationEncoding (r, "UTF-8"); charDecoder = createCharDecoder(pbis, enc); return; } } break; case 0x004C: if (buf[1] == 0x006f && (buf[2] & 0x00FF) == 0x00a7 && (buf[3] & 0x00FF) == 0x0094) { Reader r = XMLUtilities.createXMLDeclarationReader (pbis, "CP037"); String enc = XMLUtilities.getXMLDeclarationEncoding (r, "EBCDIC-CP-US"); charDecoder = createCharDecoder(pbis, enc); return; } break; case 0x00FE: if ((buf[1] & 0x00FF) == 0x00FF) { charDecoder = createCharDecoder(pbis, "UTF-16"); return; } break; case 0x00FF: if ((buf[1] & 0x00FF) == 0x00FE) { charDecoder = createCharDecoder(pbis, "UTF-16"); return; } } } encod = (encod == null) ? "UTF-8" : encod; charDecoder = createCharDecoder(pbis, encod); } } batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/LexicalUnits.java0000644000175000017500000001561113063003361026432 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; /** * This interface defines the constants that represent XML lexical units. * * @author Stephane Hillion * @version $Id: LexicalUnits.java 1733416 2016-03-03 07:07:13Z gadams $ */ public interface LexicalUnits { /** * Represents the EOF lexical unit. */ int EOF = 0; /** * Represents the S (space) lexical unit. */ int S = 1; /** * Represents an XML declaration start lexical unit, i.e. '<?xml'. */ int XML_DECL_START = 2; /** * Represents a doctype start lexical unit, i.e. <!DOCTYPE. */ int DOCTYPE_START = 3; /** * Represents a comment lexical unit. */ int COMMENT = 4; /** * Represents a PI start lexical unit, i.e. '<?Name'. */ int PI_START = 5; /** * Represents a PI data lexical unit. */ int PI_DATA = 6; /** * Represents a PI end lexical unit, i.e. '?>'. */ int PI_END = 7; /** * Represents a character data lexical unit, i.e. the content of * an element. */ int CHARACTER_DATA = 8; /** * Represents a start tag lexical unit, i.e. '<Name'. */ int START_TAG = 9; /** * Represents an end tag lexical unit, i.e. '</Name'. */ int END_TAG = 10; /** * Represents a CDATA section start lexical unit, i.e. * '<![CDATA['. */ int CDATA_START = 11; /** * Represents a character reference lexical unit. */ int CHARACTER_REFERENCE = 12; /** * Represents an entity reference lexical unit. */ int ENTITY_REFERENCE = 13; /** * Represents a name lexical unit. */ int NAME = 14; /** * Represents '=' lexical unit. */ int EQ = 15; /** * Represents a first attribute fragment lexical unit. */ int FIRST_ATTRIBUTE_FRAGMENT = 16; /** * Represents an attribute fragment lexical unit. */ int ATTRIBUTE_FRAGMENT = 17; /** * Represents a last attribute fragment lexical unit. */ int LAST_ATTRIBUTE_FRAGMENT = 18; /** * Represents an empty element end lexical unit, i.e. '/>'. */ int EMPTY_ELEMENT_END = 19; /** * Represents a end character lexical unit, i.e. '>'. */ int END_CHAR = 20; /** * Represents a section end lexical unit, i.e. ']]>'. */ int SECTION_END = 21; /** * Represents a 'version' lexical unit. */ int VERSION_IDENTIFIER = 22; /** * Represents a 'encoding' lexical unit. */ int ENCODING_IDENTIFIER = 23; /** * Represents a 'standalone' lexical unit. */ int STANDALONE_IDENTIFIER = 24; /** * Represents a string lexical unit. */ int STRING = 25; /** * Represents a 'SYSTEM' lexical unit. */ int SYSTEM_IDENTIFIER = 26; /** * Represents a 'PUBLIC' lexical unit. */ int PUBLIC_IDENTIFIER = 27; /** * Represents a '[' lexical unit. */ int LSQUARE_BRACKET = 28; /** * Represents a ']' lexical unit. */ int RSQUARE_BRACKET = 29; /** * Represents a element declaration start lexical unit, i.e. * '<!ELEMENT'. */ int ELEMENT_DECLARATION_START = 30; /** * Represents an ATTLIST declaration start lexical unit, i.e. * '<!ATTLIST'. */ int ATTLIST_START = 31; /** * Represents an entity start lexical unit, i.e. '<!ENTITY'. */ int ENTITY_START = 32; /** * Represents a notation start lexical unit, i.e. * '<!NOTATION'. */ int NOTATION_START = 33; /** * Represents a parameter entity reference lexical unit, i.e. * '%Name;'. */ int PARAMETER_ENTITY_REFERENCE = 34; /** * Represents a 'EMPTY' lexical unit. */ int EMPTY_IDENTIFIER = 35; /** * Represents a 'ANY' lexical unit. */ int ANY_IDENTIFIER = 36; /** * Represents a '?' lexical unit. */ int QUESTION = 37; /** * Represents a '+' lexical unit. */ int PLUS = 38; /** * Represents a '*' lexical unit. */ int STAR = 39; /** * Represents a '(' lexical unit. */ int LEFT_BRACE = 40; /** * Represents a ')' lexical unit. */ int RIGHT_BRACE = 41; /** * Represents a '|' lexical unit. */ int PIPE = 42; /** * Represents a ',' lexical unit. */ int COMMA = 43; /** * Represents a '#PCDATA' lexical unit. */ int PCDATA_IDENTIFIER = 44; /** * Represents a 'CDATA' lexical unit. */ int CDATA_IDENTIFIER = 45; /** * Represents a 'ID' lexical unit. */ int ID_IDENTIFIER = 46; /** * Represents a 'IDREF' lexical unit. */ int IDREF_IDENTIFIER = 47; /** * Represents a 'IDREFS' lexical unit. */ int IDREFS_IDENTIFIER = 48; /** * Represents a 'NMTOKEN' lexical unit. */ int NMTOKEN_IDENTIFIER = 49; /** * Represents a 'NMTOKENS' lexical unit. */ int NMTOKENS_IDENTIFIER = 50; /** * Represents a 'ENTITY' lexical unit. */ int ENTITY_IDENTIFIER = 51; /** * Represents a 'ENTITIES' lexical unit. */ int ENTITIES_IDENTIFIER = 52; /** * Represents a '#REQUIRED' lexical unit. */ int REQUIRED_IDENTIFIER = 53; /** * Represents a '#IMPLIED' lexical unit. */ int IMPLIED_IDENTIFIER = 54; /** * Represents a '#FIXED' lexical unit. */ int FIXED_IDENTIFIER = 55; /** * Represents a Nmtoken lexical unit. */ int NMTOKEN = 56; /** * Represents a 'NOTATION' lexical unit. */ int NOTATION_IDENTIFIER = 57; /** * Represents a '%' lexical unit. */ int PERCENT = 58; /** * Represents a 'NDATA' lexical unit. */ int NDATA_IDENTIFIER = 59; } batik-1.9.orig/batik-xml/src/main/java/org/apache/batik/xml/XMLScanner.java0000644000175000017500000016665613063003362026021 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.xml; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.Locale; import java.util.MissingResourceException; import org.apache.batik.i18n.Localizable; import org.apache.batik.i18n.LocalizableSupport; import org.apache.batik.util.io.NormalizingReader; import org.apache.batik.util.io.StreamNormalizingReader; import org.apache.batik.util.io.StringNormalizingReader; /** * This class represents a scanner for XML documents. * * @author Stephane Hillion * @version $Id: XMLScanner.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class XMLScanner implements Localizable { /** * The document start context. */ public static final int DOCUMENT_START_CONTEXT = 0; /** * The top level context. */ public static final int TOP_LEVEL_CONTEXT = 1; /** * The processing instruction context. */ public static final int PI_CONTEXT = 2; /** * The XML declaration context. */ public static final int XML_DECL_CONTEXT = 3; /** * The doctype context. */ public static final int DOCTYPE_CONTEXT = 4; /** * The start tag context. */ public static final int START_TAG_CONTEXT = 5; /** * The content context. */ public static final int CONTENT_CONTEXT = 6; /** * The DTD declarations context. */ public static final int DTD_DECLARATIONS_CONTEXT = 7; /** * The CDATA section context. */ public static final int CDATA_SECTION_CONTEXT = 8; /** * The end tag context. */ public static final int END_TAG_CONTEXT = 9; /** * The attribute value context. */ public static final int ATTRIBUTE_VALUE_CONTEXT = 10; /** * The ATTLIST context. */ public static final int ATTLIST_CONTEXT = 11; /** * The element declaration context. */ public static final int ELEMENT_DECLARATION_CONTEXT = 12; /** * The entity context. */ public static final int ENTITY_CONTEXT = 13; /** * The notation context. */ public static final int NOTATION_CONTEXT = 14; /** * The notation type context. */ public static final int NOTATION_TYPE_CONTEXT = 15; /** * The enumeration context. */ public static final int ENUMERATION_CONTEXT = 16; /** * The entity value context. */ public static final int ENTITY_VALUE_CONTEXT = 17; /** * The default resource bundle base name. */ protected static final String BUNDLE_CLASSNAME = "org.apache.batik.xml.resources.Messages"; /** * The localizable support. */ protected LocalizableSupport localizableSupport = new LocalizableSupport(BUNDLE_CLASSNAME, XMLScanner.class.getClassLoader()); /** * The reader. */ protected NormalizingReader reader; /** * The current char. */ protected int current; /** * The type of the current lexical unit. */ protected int type; /** * The recording buffer. */ protected char[] buffer = new char[1024]; /** * The current position in the buffer. */ protected int position; /** * The start offset of the last lexical unit. */ protected int start; /** * The end offset of the last lexical unit. */ protected int end; /** * The current scanning context. */ protected int context; /** * The depth in the xml tree. */ protected int depth; /** * A PI end has been previously read. */ protected boolean piEndRead; /** * The scanner is in the internal DTD. */ protected boolean inDTD; /** * The last attribute delimiter encountered. */ protected char attrDelimiter; /** * A CDATA section end is the next token */ protected boolean cdataEndRead; /** * Creates a new XML scanner. * @param r The reader to scan. */ public XMLScanner(Reader r) throws XMLException { context = DOCUMENT_START_CONTEXT; try { reader = new StreamNormalizingReader(r); current = nextChar(); } catch (IOException e) { throw new XMLException(e); } } /** * Creates a new XML scanner. * @param is The input stream to scan. * @param enc The character encoding to use. */ public XMLScanner(InputStream is, String enc) throws XMLException { context = DOCUMENT_START_CONTEXT; try { reader = new StreamNormalizingReader(is, enc); current = nextChar(); } catch (IOException e) { throw new XMLException(e); } } /** * Creates a new XML scanner. * @param s The string to parse. */ public XMLScanner(String s) throws XMLException { context = DOCUMENT_START_CONTEXT; try { reader = new StringNormalizingReader(s); current = nextChar(); } catch (IOException e) { throw new XMLException(e); } } /** * Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}. */ public void setLocale(Locale l) { localizableSupport.setLocale(l); } /** * Implements {@link org.apache.batik.i18n.Localizable#getLocale()}. */ public Locale getLocale() { return localizableSupport.getLocale(); } /** * Implements {@link * org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}. */ public String formatMessage(String key, Object[] args) throws MissingResourceException { return localizableSupport.formatMessage(key, args); } /** * Sets the current depth in the XML tree. */ public void setDepth(int i) { depth = i; } /** * Returns the current depth in the XML tree. */ public int getDepth() { return depth; } /** * Sets the current context. */ public void setContext(int c) { context = c; } /** * Returns the current context. */ public int getContext() { return context; } /** * The current lexical unit type like defined in LexicalUnits. */ public int getType() { return type; } /** * Returns the current line. */ public int getLine() { return reader.getLine(); } /** * Returns the current column. */ public int getColumn() { return reader.getColumn(); } /** * Returns the buffer used to store the chars. */ public char[] getBuffer() { return buffer; } /** * Returns the start offset of the last lexical unit. */ public int getStart() { return start; } /** * Returns the end offset of the last lexical unit. */ public int getEnd() { return end; } /** * Returns the last encountered string delimiter. */ public char getStringDelimiter() { return attrDelimiter; } /** * Returns the start offset of the current lexical unit. */ public int getStartOffset() { switch (type) { case LexicalUnits.SECTION_END: return -3; case LexicalUnits.PI_END: return -2; case LexicalUnits.STRING: case LexicalUnits.ENTITY_REFERENCE: case LexicalUnits.PARAMETER_ENTITY_REFERENCE: case LexicalUnits.START_TAG: case LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT: return 1; case LexicalUnits.PI_START: case LexicalUnits.END_TAG: case LexicalUnits.CHARACTER_REFERENCE: return 2; case LexicalUnits.COMMENT: return 4; default: return 0; } } /** * Returns the end offset of the current lexical unit. */ public int getEndOffset() { switch (type) { case LexicalUnits.STRING: case LexicalUnits.ENTITY_REFERENCE: case LexicalUnits.CHARACTER_REFERENCE: case LexicalUnits.PARAMETER_ENTITY_REFERENCE: case LexicalUnits.LAST_ATTRIBUTE_FRAGMENT: return -1; case LexicalUnits.PI_DATA: return -2; case LexicalUnits.COMMENT: return -3; case LexicalUnits.CHARACTER_DATA: if (cdataEndRead) { return -3; } return 0; default: return 0; } } /** * Clears the buffer. */ public void clearBuffer() { if (position <= 0) { position = 0; } else { buffer[0] = buffer[position - 1]; position = 1; } } /** * Advances to the next lexical unit. * @return The type of the lexical unit like defined in LexicalUnits. */ public int next() throws XMLException { return next(context); } /** * Advances to the next lexical unit. * @param ctx The context to use for scanning. * @return The type of the lexical unit like defined in LexicalUnits. */ public int next(int ctx) throws XMLException { start = position - 1; try { switch (ctx) { case DOCUMENT_START_CONTEXT: type = nextInDocumentStart(); break; case TOP_LEVEL_CONTEXT: type = nextInTopLevel(); break; case PI_CONTEXT: type = nextInPI(); break; case START_TAG_CONTEXT: type = nextInStartTag(); break; case ATTRIBUTE_VALUE_CONTEXT: type = nextInAttributeValue(); break; case CONTENT_CONTEXT: type = nextInContent(); break; case END_TAG_CONTEXT: type = nextInEndTag(); break; case CDATA_SECTION_CONTEXT: type = nextInCDATASection(); break; case XML_DECL_CONTEXT: type = nextInXMLDecl(); break; case DOCTYPE_CONTEXT: type = nextInDoctype(); break; case DTD_DECLARATIONS_CONTEXT: type = nextInDTDDeclarations(); break; case ELEMENT_DECLARATION_CONTEXT: type = nextInElementDeclaration(); break; case ATTLIST_CONTEXT: type = nextInAttList(); break; case NOTATION_CONTEXT: type = nextInNotation(); break; case ENTITY_CONTEXT: type = nextInEntity(); break; case ENTITY_VALUE_CONTEXT: return nextInEntityValue(); case NOTATION_TYPE_CONTEXT: return nextInNotationType(); case ENUMERATION_CONTEXT: return nextInEnumeration(); default: throw new IllegalArgumentException("unexpected ctx:" + ctx ); } } catch (IOException e) { throw new XMLException(e); } end = position - ((current == -1) ? 0 : 1); return type; } /** * Reads the first token in the stream. */ protected int nextInDocumentStart() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); context = (depth == 0) ? TOP_LEVEL_CONTEXT : CONTENT_CONTEXT; return LexicalUnits.S; case '<': switch (nextChar()) { case '?': int c1 = nextChar(); if (c1 == -1 || !XMLUtilities.isXMLNameFirstCharacter((char)c1)) { throw createXMLException("invalid.pi.target"); } context = PI_CONTEXT; int c2 = nextChar(); if (c2 == -1 || !XMLUtilities.isXMLNameCharacter((char)c2)) { return LexicalUnits.PI_START; } int c3 = nextChar(); if (c3 == -1 || !XMLUtilities.isXMLNameCharacter((char)c3)) { return LexicalUnits.PI_START; } int c4 = nextChar(); if (c4 != -1 && XMLUtilities.isXMLNameCharacter((char)c4)) { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.PI_START; } if (c1 == 'x' && c2 == 'm' && c3 == 'l') { context = XML_DECL_CONTEXT; return LexicalUnits.XML_DECL_START; } if ((c1 == 'x' || c1 == 'X') && (c2 == 'm' || c2 == 'M') && (c3 == 'l' || c3 == 'L')) { throw createXMLException("xml.reserved"); } return LexicalUnits.PI_START; case '!': switch (nextChar()) { case '-': return readComment(); case 'D': context = DOCTYPE_CONTEXT; return readIdentifier("OCTYPE", LexicalUnits.DOCTYPE_START, -1); default: throw createXMLException("invalid.doctype"); } default: context = START_TAG_CONTEXT; depth++; return readName(LexicalUnits.START_TAG); } case -1: return LexicalUnits.EOF; default: if (depth == 0) { throw createXMLException("invalid.character"); } else { return nextInContent(); } } } /** * Advances to the next lexical unit in the top level context. * @return The type of the lexical unit like defined in LexicalUnits. */ protected int nextInTopLevel() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '<': switch (nextChar()) { case '?': context = PI_CONTEXT; return readPIStart(); case '!': switch (nextChar()) { case '-': return readComment(); case 'D': context = DOCTYPE_CONTEXT; return readIdentifier("OCTYPE", LexicalUnits.DOCTYPE_START, -1); default: throw createXMLException("invalid.character"); } default: context = START_TAG_CONTEXT; depth++; return readName(LexicalUnits.START_TAG); } case -1: return LexicalUnits.EOF; default: throw createXMLException("invalid.character"); } } /** * Returns the next lexical unit in the context of a processing * instruction. */ protected int nextInPI() throws IOException, XMLException { if (piEndRead) { piEndRead = false; context = (depth == 0) ? TOP_LEVEL_CONTEXT : CONTENT_CONTEXT; return LexicalUnits.PI_END; } switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '?': if (nextChar() != '>') { throw createXMLException("pi.end.expected"); } nextChar(); if (inDTD) { context = DTD_DECLARATIONS_CONTEXT; } else if (depth == 0) { context = TOP_LEVEL_CONTEXT; } else { context = CONTENT_CONTEXT; } return LexicalUnits.PI_END; default: do { do { nextChar(); } while (current != -1 && current != '?'); nextChar(); } while (current != -1 && current != '>'); nextChar(); piEndRead = true; return LexicalUnits.PI_DATA; } } /** * Returns the next lexical unit in the context of a start tag. */ protected int nextInStartTag() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '/': if (nextChar() != '>') { throw createXMLException("malformed.tag.end"); } nextChar(); context = (--depth == 0) ? TOP_LEVEL_CONTEXT : CONTENT_CONTEXT; return LexicalUnits.EMPTY_ELEMENT_END; case '>': nextChar(); context = CONTENT_CONTEXT; return LexicalUnits.END_CHAR; case '=': nextChar(); return LexicalUnits.EQ; case '"': attrDelimiter = '"'; nextChar(); for (;;) { switch (current) { case '"': nextChar(); return LexicalUnits.STRING; case '&': context = ATTRIBUTE_VALUE_CONTEXT; return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; case '<': throw createXMLException("invalid.character"); case -1: throw createXMLException("unexpected.eof"); } nextChar(); } case '\'': attrDelimiter = '\''; nextChar(); for (;;) { switch (current) { case '\'': nextChar(); return LexicalUnits.STRING; case '&': context = ATTRIBUTE_VALUE_CONTEXT; return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; case '<': throw createXMLException("invalid.character"); case -1: throw createXMLException("unexpected.eof"); } nextChar(); } default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of an attribute value. */ protected int nextInAttributeValue() throws IOException, XMLException { if (current == -1) { return LexicalUnits.EOF; } if (current == '&') { return readReference(); } else { loop: for (;;) { switch (current) { case '&': case '<': case -1: break loop; case '"': case '\'': if (current == attrDelimiter) { break loop; } } nextChar(); } switch (current) { case -1: break; case '<': throw createXMLException("invalid.character"); case '&': return LexicalUnits.ATTRIBUTE_FRAGMENT; case '\'': case '"': nextChar(); if (inDTD) { context = ATTLIST_CONTEXT; } else { context = START_TAG_CONTEXT; } } return LexicalUnits.LAST_ATTRIBUTE_FRAGMENT; } } /** * Returns the next lexical unit in the context of an element content. */ protected int nextInContent() throws IOException, XMLException { switch (current) { case -1: return LexicalUnits.EOF; case '&': return readReference(); case '<': switch (nextChar()) { case '?': context = PI_CONTEXT; return readPIStart(); case '!': switch (nextChar()) { case '-': return readComment(); case '[': context = CDATA_SECTION_CONTEXT; return readIdentifier("CDATA[", LexicalUnits.CDATA_START, -1); default: throw createXMLException("invalid.character"); } case '/': nextChar(); context = END_TAG_CONTEXT; return readName(LexicalUnits.END_TAG); default: depth++; context = START_TAG_CONTEXT; return readName(LexicalUnits.START_TAG); } default: loop: for (;;) { switch (current) { default: nextChar(); break; case -1: case '&': case '<': break loop; } } return LexicalUnits.CHARACTER_DATA; } } /** * Returns the next lexical unit in the context of a end tag. */ protected int nextInEndTag() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': if (--depth < 0) { throw createXMLException("unexpected.end.tag"); } else if (depth == 0) { context = TOP_LEVEL_CONTEXT; } else { context = CONTENT_CONTEXT; } nextChar(); return LexicalUnits.END_CHAR; default: throw createXMLException("invalid.character"); } } /** * Returns the next lexical unit in the context of a CDATA section. */ protected int nextInCDATASection() throws IOException, XMLException { if (cdataEndRead) { cdataEndRead = false; context = CONTENT_CONTEXT; return LexicalUnits.SECTION_END; } while (current != -1) { while (current != ']' && current != -1) { nextChar(); } if (current != -1) { nextChar(); if (current == ']') { nextChar(); if (current == '>') { break; } } } } if (current == -1) { throw createXMLException("unexpected.eof"); } nextChar(); cdataEndRead = true; return LexicalUnits.CHARACTER_DATA; } /** * Returns the next lexical unit in the context of an XML declaration. */ protected int nextInXMLDecl() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case 'v': return readIdentifier("ersion", LexicalUnits.VERSION_IDENTIFIER, -1); case 'e': return readIdentifier("ncoding", LexicalUnits.ENCODING_IDENTIFIER, -1); case 's': return readIdentifier("tandalone", LexicalUnits.STANDALONE_IDENTIFIER, -1); case '=': nextChar(); return LexicalUnits.EQ; case '?': nextChar(); if (current != '>') { throw createXMLException("pi.end.expected"); } nextChar(); context = TOP_LEVEL_CONTEXT; return LexicalUnits.PI_END; case '"': attrDelimiter = '"'; return readString(); case '\'': attrDelimiter = '\''; return readString(); default: throw createXMLException("invalid.character"); } } /** * Returns the next lexical unit in the context of a doctype. */ protected int nextInDoctype() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': nextChar(); context = TOP_LEVEL_CONTEXT; return LexicalUnits.END_CHAR; case 'S': return readIdentifier("YSTEM", LexicalUnits.SYSTEM_IDENTIFIER, LexicalUnits.NAME); case 'P': return readIdentifier("UBLIC", LexicalUnits.PUBLIC_IDENTIFIER, LexicalUnits.NAME); case '"': attrDelimiter = '"'; return readString(); case '\'': attrDelimiter = '\''; return readString(); case '[': nextChar(); context = DTD_DECLARATIONS_CONTEXT; inDTD = true; return LexicalUnits.LSQUARE_BRACKET; default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context dtd declarations. */ protected int nextInDTDDeclarations() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case ']': nextChar(); context = DOCTYPE_CONTEXT; inDTD = false; return LexicalUnits.RSQUARE_BRACKET; case '%': return readPEReference(); case '<': switch (nextChar()) { case '?': context = PI_CONTEXT; return readPIStart(); case '!': switch (nextChar()) { case '-': return readComment(); case 'E': switch (nextChar()) { case 'L': context = ELEMENT_DECLARATION_CONTEXT; return readIdentifier ("EMENT", LexicalUnits.ELEMENT_DECLARATION_START, -1); case 'N': context = ENTITY_CONTEXT; return readIdentifier("TITY", LexicalUnits.ENTITY_START, -1); default: throw createXMLException("invalid.character"); } case 'A': context = ATTLIST_CONTEXT; return readIdentifier("TTLIST", LexicalUnits.ATTLIST_START, -1); case 'N': context = NOTATION_CONTEXT; return readIdentifier("OTATION", LexicalUnits.NOTATION_START, -1); default: throw createXMLException("invalid.character"); } default: throw createXMLException("invalid.character"); } default: throw createXMLException("invalid.character"); } } /** * Reads a simple string, like the ones used for version, encoding, * public/system identifiers... * The current character must be the string delimiter. * @return type. */ protected int readString() throws IOException, XMLException { do { nextChar(); } while (current != -1 && current != attrDelimiter); if (current == -1) { throw createXMLException("unexpected.eof"); } nextChar(); return LexicalUnits.STRING; } /** * Reads a comment. '<!-' must have been read. */ protected int readComment() throws IOException, XMLException { if (nextChar() != '-') { throw createXMLException("malformed.comment"); } int c = nextChar(); while (c != -1) { while (c != -1 && c != '-') { c = nextChar(); } c = nextChar(); if (c == '-') { break; } } if (c == -1) { throw createXMLException("unexpected.eof"); } c = nextChar(); if (c != '>') { throw createXMLException("malformed.comment"); } nextChar(); return LexicalUnits.COMMENT; } /** * Reads the given identifier. * @param s The portion of the identifier to read. * @param type The lexical unit type of the identifier. * @param ntype The lexical unit type to set if the identifier do not * match or -1 if an error must be signaled. */ protected int readIdentifier(String s, int type, int ntype) throws IOException, XMLException { int len = s.length(); for (int i = 0; i < len; i++) { nextChar(); if (current != s.charAt(i)) { if (ntype == -1) { throw createXMLException("invalid.character"); } else { while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)) { nextChar(); } return ntype; } } } nextChar(); return type; } /** * Reads a name. The current character must be the first character. * @param type The lexical unit type to set. * @return type. */ protected int readName(int type) throws IOException, XMLException { if (current == -1) { throw createXMLException("unexpected.eof"); } if (!XMLUtilities.isXMLNameFirstCharacter((char)current)) { throw createXMLException("invalid.name"); } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return type; } /** * Reads a processing instruction start. * @return type. */ protected int readPIStart() throws IOException, XMLException { int c1 = nextChar(); if (c1 == -1) { throw createXMLException("unexpected.eof"); } if (!XMLUtilities.isXMLNameFirstCharacter((char)current)) { throw createXMLException("malformed.pi.target"); } int c2 = nextChar(); if (c2 == -1 || !XMLUtilities.isXMLNameCharacter((char)c2)) { return LexicalUnits.PI_START; } int c3 = nextChar(); if (c3 == -1 || !XMLUtilities.isXMLNameCharacter((char)c3)) { return LexicalUnits.PI_START; } int c4 = nextChar(); if (c4 != -1 && XMLUtilities.isXMLNameCharacter((char)c4)) { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.PI_START; } if ((c1 == 'x' || c1 == 'X') && (c2 == 'm' || c2 == 'M') && (c3 == 'l' || c3 == 'L')) { throw createXMLException("xml.reserved"); } return LexicalUnits.PI_START; } /** * Returns the next lexical unit in the context of a element declaration. */ protected int nextInElementDeclaration() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': nextChar(); context = DTD_DECLARATIONS_CONTEXT; return LexicalUnits.END_CHAR; case '%': nextChar(); int t = readName(LexicalUnits.PARAMETER_ENTITY_REFERENCE); if (current != ';') { throw createXMLException("malformed.parameter.entity"); } nextChar(); return t; case 'E': return readIdentifier("MPTY", LexicalUnits.EMPTY_IDENTIFIER, LexicalUnits.NAME); case 'A': return readIdentifier("NY", LexicalUnits.ANY_IDENTIFIER, LexicalUnits.NAME); case '?': nextChar(); return LexicalUnits.QUESTION; case '+': nextChar(); return LexicalUnits.PLUS; case '*': nextChar(); return LexicalUnits.STAR; case '(': nextChar(); return LexicalUnits.LEFT_BRACE; case ')': nextChar(); return LexicalUnits.RIGHT_BRACE; case '|': nextChar(); return LexicalUnits.PIPE; case ',': nextChar(); return LexicalUnits.COMMA; case '#': return readIdentifier("PCDATA", LexicalUnits.PCDATA_IDENTIFIER, -1); default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of an attribute list. */ protected int nextInAttList() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': nextChar(); context = DTD_DECLARATIONS_CONTEXT; return type = LexicalUnits.END_CHAR; case '%': int t = readName(LexicalUnits.PARAMETER_ENTITY_REFERENCE); if (current != ';') { throw createXMLException("malformed.parameter.entity"); } nextChar(); return t; case 'C': return readIdentifier("DATA", LexicalUnits.CDATA_IDENTIFIER, LexicalUnits.NAME); case 'I': nextChar(); if (current != 'D') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.ID_IDENTIFIER; } if (current != 'R') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'E') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'F') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.IDREF_IDENTIFIER; } if (current != 'S') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.IDREFS_IDENTIFIER; } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return type = LexicalUnits.NAME; case 'N': switch (nextChar()) { default: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; case 'O': context = NOTATION_TYPE_CONTEXT; return readIdentifier("TATION", LexicalUnits.NOTATION_IDENTIFIER, LexicalUnits.NAME); case 'M': nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'T') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'O') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'K') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'E') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'N') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NMTOKEN_IDENTIFIER; } if (current != 'S') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NMTOKENS_IDENTIFIER; } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } case 'E': nextChar(); if (current != 'N') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'T') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'I') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'T') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return type = LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } switch (current) { case 'Y': nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.ENTITY_IDENTIFIER; } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; case 'I': nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'E') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } nextChar(); if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } if (current != 'S') { do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } return LexicalUnits.ENTITIES_IDENTIFIER; default: if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) { return LexicalUnits.NAME; } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); return LexicalUnits.NAME; } case '"': attrDelimiter = '"'; nextChar(); if (current == -1) { throw createXMLException("unexpected.eof"); } if (current != '"' && current != '&') { do { nextChar(); } while (current != -1 && current != '"' && current != '&'); } switch (current) { case '&': context = ATTRIBUTE_VALUE_CONTEXT; return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; case '"': nextChar(); return LexicalUnits.STRING; default: throw createXMLException("invalid.character"); } case '\'': attrDelimiter = '\''; nextChar(); if (current == -1) { throw createXMLException("unexpected.eof"); } if (current != '\'' && current != '&') { do { nextChar(); } while (current != -1 && current != '\'' && current != '&'); } switch (current) { case '&': context = ATTRIBUTE_VALUE_CONTEXT; return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; case '\'': nextChar(); return LexicalUnits.STRING; default: throw createXMLException("invalid.character"); } case '#': switch (nextChar()) { case 'R': return readIdentifier("EQUIRED", LexicalUnits.REQUIRED_IDENTIFIER, -1); case 'I': return readIdentifier("MPLIED", LexicalUnits.IMPLIED_IDENTIFIER, -1); case 'F': return readIdentifier("IXED", LexicalUnits.FIXED_IDENTIFIER, -1); default: throw createXMLException("invalid.character"); } case '(': nextChar(); context = ENUMERATION_CONTEXT; return LexicalUnits.LEFT_BRACE; default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of a notation. */ protected int nextInNotation() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': nextChar(); context = DTD_DECLARATIONS_CONTEXT; return LexicalUnits.END_CHAR; case '%': int t = readName(LexicalUnits.PARAMETER_ENTITY_REFERENCE); if (current != ';') { throw createXMLException("malformed.parameter.entity"); } nextChar(); return t; case 'S': return readIdentifier("YSTEM", LexicalUnits.SYSTEM_IDENTIFIER, LexicalUnits.NAME); case 'P': return readIdentifier("UBLIC", LexicalUnits.PUBLIC_IDENTIFIER, LexicalUnits.NAME); case '"': attrDelimiter = '"'; return readString(); case '\'': attrDelimiter = '\''; return readString(); default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of an entity. */ protected int nextInEntity() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '>': nextChar(); context = DTD_DECLARATIONS_CONTEXT; return LexicalUnits.END_CHAR; case '%': nextChar(); return LexicalUnits.PERCENT; case 'S': return readIdentifier("YSTEM", LexicalUnits.SYSTEM_IDENTIFIER, LexicalUnits.NAME); case 'P': return readIdentifier("UBLIC", LexicalUnits.PUBLIC_IDENTIFIER, LexicalUnits.NAME); case 'N': return readIdentifier("DATA", LexicalUnits.NDATA_IDENTIFIER, LexicalUnits.NAME); case '"': attrDelimiter = '"'; nextChar(); if (current == -1) { throw createXMLException("unexpected.eof"); } if (current != '"' && current != '&' && current != '%') { do { nextChar(); } while (current != -1 && current != '"' && current != '&' && current != '%'); } switch (current) { default: throw createXMLException("invalid.character"); case '&': case '%': context = ENTITY_VALUE_CONTEXT; break; case '"': nextChar(); return LexicalUnits.STRING; } return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; case '\'': attrDelimiter = '\''; nextChar(); if (current == -1) { throw createXMLException("unexpected.eof"); } if (current != '\'' && current != '&' && current != '%') { do { nextChar(); } while (current != -1 && current != '\'' && current != '&' && current != '%'); } switch (current) { default: throw createXMLException("invalid.character"); case '&': case '%': context = ENTITY_VALUE_CONTEXT; break; case '\'': nextChar(); return LexicalUnits.STRING; } return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of an entity value. */ protected int nextInEntityValue() throws IOException, XMLException { switch (current) { case '&': return readReference(); case '%': int t = nextChar(); readName(LexicalUnits.PARAMETER_ENTITY_REFERENCE); if (current != ';') { throw createXMLException("invalid.parameter.entity"); } nextChar(); return t; default: while (current != -1 && current != attrDelimiter && current != '&' && current != '%') { nextChar(); } switch (current) { case -1: throw createXMLException("unexpected.eof"); case '\'': case '"': nextChar(); context = ENTITY_CONTEXT; return LexicalUnits.STRING; } return LexicalUnits.FIRST_ATTRIBUTE_FRAGMENT; } } /** * Returns the next lexical unit in the context of a notation type. */ protected int nextInNotationType() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '|': nextChar(); return LexicalUnits.PIPE; case '(': nextChar(); return LexicalUnits.LEFT_BRACE; case ')': nextChar(); context = ATTLIST_CONTEXT; return LexicalUnits.RIGHT_BRACE; default: return readName(LexicalUnits.NAME); } } /** * Returns the next lexical unit in the context of an enumeration. */ protected int nextInEnumeration() throws IOException, XMLException { switch (current) { case 0x9: case 0xA: case 0xD: case 0x20: do { nextChar(); } while (current != -1 && XMLUtilities.isXMLSpace((char)current)); return LexicalUnits.S; case '|': nextChar(); return LexicalUnits.PIPE; case ')': nextChar(); context = ATTLIST_CONTEXT; return LexicalUnits.RIGHT_BRACE; default: return readNmtoken(); } } /** * Reads an entity or character reference. The current character * must be '&'. * @return type. */ protected int readReference() throws IOException, XMLException { nextChar(); if (current == '#') { nextChar(); int i = 0; switch (current) { case 'x': do { i++; nextChar(); } while ((current >= '0' && current <= '9') || (current >= 'a' && current <= 'f') || (current >= 'A' && current <= 'F')); break; default: do { i++; nextChar(); } while (current >= '0' && current <= '9'); break; case -1: throw createXMLException("unexpected.eof"); } if (i == 1 || current != ';') { throw createXMLException("character.reference"); } nextChar(); return LexicalUnits.CHARACTER_REFERENCE; } else { int t = readName(LexicalUnits.ENTITY_REFERENCE); if (current != ';') { throw createXMLException("character.reference"); } nextChar(); return t; } } /** * Reads a parameter entity reference. The current character must be '%'. * @return type. */ protected int readPEReference() throws IOException, XMLException { nextChar(); if (current == -1) { throw createXMLException("unexpected.eof"); } if (!XMLUtilities.isXMLNameFirstCharacter((char)current)) { throw createXMLException("invalid.parameter.entity"); } do { nextChar(); } while (current != -1 && XMLUtilities.isXMLNameCharacter((char)current)); if (current != ';') { throw createXMLException("invalid.parameter.entity"); } nextChar(); return LexicalUnits.PARAMETER_ENTITY_REFERENCE; } /** * Reads a Nmtoken. The current character must be the first character. * @return LexicalUnits.NMTOKEN. */ protected int readNmtoken() throws IOException, XMLException { if (current == -1) { throw createXMLException("unexpected.eof"); } while (XMLUtilities.isXMLNameCharacter((char)current)) { nextChar(); } return LexicalUnits.NMTOKEN; } /** * Sets the value of the current char to the next character or -1 if the * end of stream has been reached. */ protected int nextChar() throws IOException { current = reader.read(); if (current == -1) { return current; } if (position == buffer.length) { char[] t = new char[ 1+ position + position / 2]; System.arraycopy( buffer, 0, t, 0, position ); buffer = t; } return buffer[position++] = (char)current; } /** * Returns an XMLException initialized with the given message key. */ protected XMLException createXMLException(String message) { String m; try { m = formatMessage(message, new Object[] { new Integer(reader.getLine()), new Integer(reader.getColumn()) }); } catch (MissingResourceException e) { m = message; } return new XMLException(m); } } batik-1.9.orig/batik-xml/src/test/0000755000175000017500000000000013063003357016374 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/test/resources/0000755000175000017500000000000013063003357020406 5ustar mans0954mans0954batik-1.9.orig/batik-xml/src/test/java/0000755000175000017500000000000013063003357017315 5ustar mans0954mans0954batik-1.9.orig/batik-xml/pom.xml0000644000175000017500000000363113063004314016140 0ustar mans0954mans0954 4.0.0 batik-xml ${project.groupId}:${project.artifactId} Batik XML utilities org.apache.xmlgraphics batik 1.9 ${project.groupId} batik-util ${project.version} src/main/resources ${basedir}/.. LICENSE NOTICE META-INF batik-1.9.orig/batik-slideshow/0000755000175000017500000000000013153020772016027 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/0000755000175000017500000000000013063003266016615 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/0000755000175000017500000000000013063003266017541 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/resources/0000755000175000017500000000000013063003266021553 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/resources/org/0000755000175000017500000000000013063003266022342 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/resources/org/apache/0000755000175000017500000000000013063003266023563 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/resources/org/apache/batik/0000755000175000017500000000000013063003266024655 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/resources/org/apache/batik/apps/0000755000175000017500000000000013063003266025620 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/0000755000175000017500000000000013063003266020462 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/0000755000175000017500000000000013063003266021251 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/apache/0000755000175000017500000000000013063003266022472 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/apache/batik/0000755000175000017500000000000013063003266023564 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/apache/batik/apps/0000755000175000017500000000000013063003266024527 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/apache/batik/apps/slideshow/0000755000175000017500000000000013153020772026531 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/main/java/org/apache/batik/apps/slideshow/Main.java0000644000175000017500000003677513063003270030274 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.apps.slideshow; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.ArrayList; import javax.swing.JComponent; import javax.swing.JWindow; import org.apache.batik.bridge.BridgeContext; import org.apache.batik.bridge.DocumentLoader; import org.apache.batik.bridge.GVTBuilder; import org.apache.batik.bridge.UserAgent; import org.apache.batik.bridge.UserAgentAdapter; import org.apache.batik.bridge.ViewBox; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.renderer.StaticRenderer; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGDocument; /** * * @version $Id: Main.java 1733416 2016-03-03 07:07:13Z gadams $ */ public class Main extends JComponent { StaticRenderer renderer; UserAgent userAgent; DocumentLoader loader; BridgeContext ctx; BufferedImage image; BufferedImage display; File [] files; static int duration = 3000; static int frameDelay = duration+7000; volatile boolean done = false; public Main(File []files, Dimension size) { setBackground(Color.black); this.files = files; UserAgentAdapter ua = new UserAgentAdapter(); renderer = new StaticRenderer(); userAgent = ua; loader = new DocumentLoader(userAgent); ctx = new BridgeContext(userAgent, loader); ua.setBridgeContext(ctx); if (size == null) { size = Toolkit.getDefaultToolkit().getScreenSize(); } setPreferredSize(size); setDoubleBuffered(false); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { if (done) System.exit(0); else togglePause(); } }); size.width += 2; size.height += 2; display = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_BGR); Thread t = new RenderThread(); t.start(); JWindow w = new JWindow(); w.setBackground(Color.black); w.getContentPane().setBackground(Color.black); w.getContentPane().add(this); w.pack(); w.setLocation(new Point(-1, -1)); w.setVisible(true); } class RenderThread extends Thread { RenderThread(){ super("RenderThread"); setDaemon( true ); } public void run() { renderer.setDoubleBuffered(true); for (int i=0; i 500) { System.gc(); currTrans = System.currentTimeMillis(); stime = frameDelay-(currTrans-startLastTransition); } if (stime > 0) sleep(stime); } catch (InterruptedException ie) { } currTrans = System.currentTimeMillis(); } synchronized(this) { while (paused) { try { wait(); } catch (InterruptedException ie) { } } } long last = startLastTransition = System.currentTimeMillis(); for (int i=0; i src.getWidth()) w = src.getWidth()-x; if (y+h > src.getHeight()) h = src.getHeight()-y; synchronized (display) { g2d.fillRect(x, y, w, h); BufferedImage sub; sub = src.getSubimage(x, y, w, h); g2d.drawImage(sub, null, x, y); } repaint(x, y, w, h); long current = System.currentTimeMillis(); try { long dt = current-last; if (dt < tblock) sleep(tblock-dt); } catch (InterruptedException ie) { } last = current; } synchronized (Main.this) { transitionThread = null; Main.this.notifyAll(); } } } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; if (display == null) return; // System.out.println("Drawing Image: " + display); g2d.drawImage(display, null, 0, 0); } public static void readFileList(String file, List fileVec) { BufferedReader br; try { br = new BufferedReader(new FileReader(file)); } catch(FileNotFoundException fnfe) { System.err.println("Unable to open file-list: " + file); return; } try { URL flURL = new File(file).toURI().toURL(); String line; while ((line = br.readLine()) != null) { String str = line; int idx = str.indexOf('#'); if (idx != -1) str = str.substring(0, idx); str = str.trim(); if (str.length() == 0) continue; try { URL imgURL = new URL(flURL, str); fileVec.add(imgURL.getFile()); } catch (MalformedURLException mue) { System.err.println("Can't make sense of line:\n " + line); } } } catch (IOException ioe) { System.err.println("Error while reading file-list: " + file); } finally { try { br.close(); } catch (IOException ioe) { } } } public static void main(String []args) { List fileVec = new ArrayList(); Dimension d = null; if (args.length == 0) { showUsage(); return; } for (int i=0; i\n" + " --file-list : file contains list of images to\n" + " show one per line\n" + " -ws [,]\n" + " -window-size [,] : Set the size of slideshow window\n" + " defaults to full screen\n" + " -ft \n" + " --frame-time : Amount of time in millisecs to\n" + " show each frame.\n" + " Includes transition time.\n" + " -tt \n" + " --transition-time : Amount of time in millisecs to\n" + " transition between frames.\n" + " : SVG file to display"); } } batik-1.9.orig/batik-slideshow/src/test/0000755000175000017500000000000013063003266017574 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/test/resources/0000755000175000017500000000000013063003266021606 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/src/test/java/0000755000175000017500000000000013063003266020515 5ustar mans0954mans0954batik-1.9.orig/batik-slideshow/pom.xml0000644000175000017500000000435613063004314017346 0ustar mans0954mans0954 4.0.0 batik-slideshow ${project.groupId}:${project.artifactId} Batik SVG Slideshow Application org.apache.xmlgraphics batik 1.9 ${project.groupId} batik-bridge ${project.version} ${project.groupId} batik-gvt ${project.version} xml-apis xml-apis-ext ${xmlapis.version} src/main/resources ${basedir}/.. LICENSE NOTICE META-INF batik-1.9.orig/documentation-sources/0000755000175000017500000000000013153020772017270 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/0000755000175000017500000000000013153020772020742 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/0000755000175000017500000000000013153020772022062 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/tabs.xml0000644000175000017500000000302213063003360023524 0ustar mans0954mans0954 batik-1.9.orig/documentation-sources/content/xdocs/faq.xml0000644000175000017500000011032313063003361023346 0ustar mans0954mans0954 Frequently Asked Questions General questions What is Batik?

Batik is a Java-based toolkit for applications or applets that want to use images in the Scalable Vector Graphics (SVG) format for various purposes, such as display, generation or manipulation.

What is SVG?

SVG (Scalable Vector Graphics) is an open-standard language for describing two-dimensional (2D) graphics in XML. It is a Recommendation from the W3C. SVG lets you describe rich images with features such as gradients, transparency, filter effects and animation.

SVG has three types of graphic objects: shapes (e.g., paths consisting of straight lines and curves), images and text. Graphical objects can be grouped, styled, transformed and composited (e.g., drawn with transparency). SVG has a large set of static features which includes nested transformations, clipping paths, masking and filter effects.

In addition, SVG images can be dynamic and interactive. A rich set of event handlers such as for mouse movement and clicks can be assigned to any SVG graphical object. These handlers can invoke scripts, which, in response to an event, can dynamically modify the SVG graphic through the SVG Document Object Model (DOM) API, allowing, for example scripts to change the color or location of graphical elements.

SVG graphical elements can be animated through scripting. Alternatively, animation sequences can be expressed directly in XML because SVG leverages the SMIL Animation specification for multimedia, another W3C specification.

What can I do with Batik?

Batik contains several core modules which can be used independently or jointly to generate SVG content (see the SVG Generator and SVG DOM implementation documentation) view SVG content (see the JSVGCanvas) or convert to and from the SVG format (see the SVG Transcoder page).

In addition, Batik contains low level modules, such as an object-oriented Graphic Vector Toolkit (GVT), a set of low level parsers specific to the SVG syntax and a set of extensions to the Java 2D API (such as sophisticated fill types and filter effects).

Finally, Batik comes with packaged applications to help developers get familiar with the code and be quickly able to use the various modules: Squiggle, an SVG browser (in the org.apache.batik.apps.svgbrowser package) an SVG rasterizer (in the org.apache.batik.apps.rasterizer package), a Font converter (in the org.apache.batik.apps.ttf2svg package) and an SVG pretty printer (in the org.apache.batik.apps.svgpp package).

Squiggle, the SVG browser can display SVG documents and lets the user zoom, pan and rotate any SVG document, view the SVG source, link between SVG documents, view a tree representation of the SVG DOM and more. One important component of the SVG viewer is the org.apache.batik.swing.JSVGCanvas component, which can be plugged in to any Java application or applet to provide SVG viewing capability.

The SVG rasterizer lets the user convert SVG files to raster formats such as JPEG, PNG or TIFF . It contains an extensible mechanism so that arbitrary raster formats can be added. For example, the rasterizer lets you create one SVG file with a special effect (e.g., shadows, gradients, etc.), turn it into a PNG image, then modify the SVG source (e.g., modify a piece of text or a color), and generate another PNG image from it. This way, you can easily generate a series of images sharing a common theme or look and feel to post on a web site. (Note that the rasterizer can also be used on a web server to do this conversion automatically).

The SVG Font Converter lets the user easily create an SVG Font for a set of characters from a TrueType Font file. That SVG Font definition can be embedded in a document using the characters. This allows users to create SVG documents that are self contained and do not rely on system fonts, and guarantees that the SVG file will be displayed exactly as it was authored on all platforms.

The SVG Pretty Printer is a convenience tool to pretty print an SVG document, which means that you can reformat any existing SVG document to produce a nicely formatted and highly legible version.

These applications show that Batik can be used client side (the browser can be used on any client machine) and server side (the rasterizer can be used to serve SVG images to client machines that do not have SVG support).

Why do we have such a project at Apache?

The mission of the Apache XML Graphics Project is to promote the use of XML-based graphics by “providing robust, full-featured, commercial-quality, and freely available software packages for the conversion of XML to graphical output and for related components”. Batik as an open source implementation of a key format for today’s and tomorrow’s web fits well in this mission.

How does Batik relate to other Apache projects?

Batik is used in Cocoon for server side rasterization of SVG images. In addition, the Batik is used in the FOP project to convert SVG images to PDF format.

How did it start?

Batik started out because several teams doing SVG related projects decided to join efforts with the idea that the whole will be greater than the sum of the parts. The following companies or institutions are part of the team that contributed and/or created the initial Batik project, during the fall of 2000:

In addition, the Batik project is supported by IBM.

We encourage anyone to participate. As with all ASF projects, all efforts are volunteer-based. We are looking for individuals to work with us on fulfilling our goals for Batik in the spirit of collaborative open-source software development.

Where is Batik going? What is next?

The SVG implementation is not complete (see the current status), and there is more work to do to achieve a fully functional viewer.

Batik 1.1 supports all static SVG features, linking and a limited support for scripting, and the 1.5 release completed support for scripting and dynamic documents. With Batik 1.6 came many improvements to the implementation of SVG DOM functions, bug fixes, performance improvements, and the beginning of some SVG 1.2 support. Declarative animation and some SVG 1.2 features were introduced in Batik 1.7beta1. The 1.7 release brought mostly bug fixes. Completion of remaining SVG 1.1 functionality and the addition of Further SVG 1.2 functionality should be supported in the 2.0 release.

The type of applications (e.g., transcoding applications) that can or will be added to Batik depends on contributions and feedback.

How can I create and author SVG content?

Well, you can always use a plain text editor such as vi or xemacs, but there are many graphic authoring packages that can export SVG documents and that will let you author SVG content visually.

You can get a list of tools exporting SVG from the SVG implementation section of the SVG Home page on the W3C web site. You can also imagine building a tool on top of Batik: feel free to contribute!

Authoring is one way of creating SVG content, and graphic authoring packages are useful for that purpose. However, there are many types of graphics which can be generated, such as stock quotes, statistical data, etc. For these types of graphics, there are many ways to generate SVG content. For example, if your data (say stock information) is contained in an XML document, you could use XSLT to transform your XML data into SVG. If your data comes from a database and you retrieve that data in a servlet on a Web server (e.g., using JDBC), you could use the Java binding for the DOM API to generate an SVG document from the database data. You could also use Batik’s SVG generator and use the Java 2D API to generate that graphic.

The following URLs will be useful to learn more about each of these solutions:

What other SVG products are out there?

There are many companies supporting SVG and you will find a list of available implementations on the W3C’s SVG implementation page.

Where can I find the SVG specification?

The SVG specification is available from the W3C web site.

How much of SVG does Batik implement?

The status page shows how much of the SVG specification Batik implements by showing which of the tests in the SVG Basic Effectivity test suite Batik successfully passes.

What are the benefits of SVG being an XML grammar?

Being an XML grammar means SVG can leverage work done around XML, and SVG actually leverages other grammars such as XLink, for linking and SMIL for the animation.

Beyond the use and mix with other XML syntaxes, being an XML grammar lets SVG benefit from the plethora of XML tools that make it so easy to manipulate, generate, search and edit XML files.

Where does the name come from?

Batik is a highly evolved art tradition that developed in Java (one of the islands comprising what is now called Indonesia). Batik is generally thought of as the quintessentially Indonesian textile. Motifs of flowers, twining plants, leaves, buds, birds, butterflies, fish, insects and geometric forms are rich in symbolic association and variety; there are about three thousand recorded batik patterns.

We think that Batik gracefully evokes Java, graphics and high-quality, terms that constitute the core of the toolkit.

This page shows examples of what Batik textures look like.

Getting started with Apache Batik/SVG What are the system requirements to run Batik?

Batik is written in the Java language and requires a version 1.4 implementation at this time.

How do I install Batik?

You will need a JRE/JDK version 1.4 or above to run Batik.

To install Batik you need to download the binary or source distribution and unzip it on your computer.

You can have a look at the installation instructions for more information.

How can I see a demo?

You can see an online demonstration of Squiggle the SVG browser on the demo page. Alternatively, you can download Batik or see screenshots of the Batik SVG viewer, images created from the rasterizer and an example of how to use the SVGGraphics2D generator.

What scripting languages can I use in my SVG files?

A limited support of scripting in SVG files is provided with the current version of Batik (script are executed but dynamic update is not supported).

Batik can recognize the following scripting languages:

  • ECMAScript thanks to the Mozilla Rhino JavaScript engine included in the distribution,
  • Python for which you need to download the Jython engine, and
  • Tcl for which you need to download the Jacl engine.

To get more information on how to install optional scripting languages you can have a look at the installation instructions.

Troubleshooting Apache Batik When I try to run Batik it results in a NoSuchMethodException. What is the problem?

There is certainly something wrong with your classpath. Clear your CLASSPATH environment variable and be sure to remove all the libraries which use the W3C’s DOM bindings from jre/lib/ext before running any of the Batik’s applications.

When I change the document in Java it doesn’t update the display, even if I call repaint?

There are two common causes for this. The first is that the JSVGCanvas doesn’t know it’s a dynamic document. Normally Batik detects this by looking for script elements but when you modify the document from Java it can’t tell. So call

myJSVGCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);

before loading the document (with setURI, setDocument, setSVGDocument, etc.).

The second common reason is that the changes aren’t made in the UpdateManager’s thread. You can run code in the UpdateManager’s thread with the following:

UpdateManager um = JSVGCanvas.getUpdateManager(); um.getUpdateRunnableQueue().invokeLater(Runnable);

NOTE: The update manager only becomes available after the first rendering completes. You can be notified when this happens by registering a GVTTreeRendererListener.

When I change the document in Java it only updates if I move the mouse over the canvas?

The most common causes for this, is that the changes are not made in the UpdateManager’s thread. See previous FAQ for example code to run code in the Update Manager’s thread. Moving the mouse works because it delivers the mouse move events in the update thread, and after a runnable completes in the UpdateManager’s thread it checks if the canvas needs repainting.

When I create new SVG elements or modify some SVG attributes through the DOM API, from ECMAScript, nothing happens, the changes are not rendered. Why not?

A common problem is that script contain the wrong DOM calls to create elements or modify attributes.

SVG elements need to be created in the SVG namespace. For example, to create a rect element, you should use

document.createElementNS(svgNS, "rect");

(where svgNS is equal to "http://www.w3.org/2000/svg"), which appropriately creates the rect element in the SVG namespace. A call to

document.createElement("rect")

creates an element with the name rect but which does not belong to the SVG namespace. As such, it is ignored by Batik.

Most SVG attributes belong to what is called the “per element type partition namespace” (see the Namespaces in XML specification). The appropriate way to set attributes on an SVG element is a call to setAttributeNS with a namespace value of null, for example:

elt.setAttributeNS(null, "width", "40");

In the Batik SVG DOM implementation, you can also use a call to setAttribute and you can write

elt.setAttribute("width", "40")

However, it is important to know that some implementations make a difference between setAttribute(x, y) and setAttributeNS(null, x, y), so it is goo practice to use setAttributeNS which is the only guaranteed interoperable way of setting attributes in a namespace aware DOM implementation.

Finally, for attributes which belong to a specific namespace, like the the href attribute on the image element, you have to use the setAttributeNS method with the XLink namespace. For example, assuming img references an image DOM Element, you can modify the href as follows:

img.setAttributeNS(xlinkNS, "xlink:href", "myImage.jpg");

where xlinkNS is equal to "http://www.w3.org/1999/xlink".

For more information on common authoring pitfalls, see Jonathan Watt’s SVG Authoring Guidelines.

When I get the UpdateManager from the canvas sometimes it is null, why?

The JSVGCanvas is highly asynchronous so when you call setURI, setDocument or setSVGDocument they return essentially immediately. Behind the scenes, the canvas creates the rendering tree and does a first rendering after dispatching the document SVGLoad event. Only after this first rendering does the UpdateManger become available.

Why do I have to go through the UpdateManager to run my code? Can’t you just synchronize the DOM?

It would be possible to synchronize individual calls to the DOM, however in general this is almost useless for the way DOM works. For example creating a single rectangle element takes approximately 6 individual DOM calls. So higher level synchronization is needed.

The use of a Runnable is a common way of accomplishing synchronization for a block of code. This is essentially the approach that Swing takes (all Swing modification should take place in the Swing thread). It was considered to use the Swing event thread, but this would lock the user interface while scripts were working.

I can use the Batik extension tags with the source distribution but not with the binary distribution. What am I missing?

When running from the source distribution you automatically get the service provider entries for the Batik extension elements (such as regularPolygon and star). We chose not to include these by default in the binary distribution for the Batik applications.

There is a subdirectory called extensions that has jar files that enable the extended elements from Batik.

Why do I get red circles when I view the samples/extensions files?

You are using the binary distribution. This distribution does not include support for our example extensions (they are just examples and other people can do more sophisticated things).

If you want to view these examples you need to use the extension enabled versions of the applications in the extensions subdirectory.

I am modifying the DOM after displaying it in the JSVGCanvas, but my changes aren’t shown (even if I call repaint).

For efficiency, if Batik loads a static document it doesn’t set up any dynamic support. Batik normally decides whether a document is dynamic by checking if it contains any script elements or event handler attributes. However, if your Java application is modifying the DOM directly there may be no script elements. In this case you need to tell Batik to set up dynamic support regardless.

You can inform the JSVGCanvas that a document should be handled dynamically by calling the setDocumentState method, just before loading the document:

JSVGCanvas myCanvas = ...; myCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); myCanvas.setURI("myFile.svg");
I am trying to use Batik and FOP together but Batik does not work and fails on the org.w3c.* packages. What is happening?

Both FOP and Batik use the org.w3c.* packages. Depending on the version of FOP and Batik, Batik has been using a version of these packages which is more recent than the one in the xml-apis.jar file FOP uses. However, if the xml-apis.jar file that comes with the FOP distribution is loaded before the Batik jar files, then the version coming with FOP takes precedence (i.e., that is the version the Java Virtual Machine loads). Because that version is incompatible with Batik, you encounter this problem.

The solution is to either repackage the xml-apis.jar file with the classes in the Batik distribution (you will need the Batik source distribution to do that), or you will need to make sure the Batik jars are loaded before FOP’s xml-apis.jar, for example by putting Batik’s jar file before FOP’s in your classpath. If you are copying your jar files to .../jre/lib/ext, you can simply remove the FOP xml-apis.jar file from that directory.

How do I checkout the latest SVN version of Batik?

You just have to follow the instructions on the download page.

I’m using Mac OS X, and some of the SVG files I view are messed up (things appear clipped or out of place). What do I need to do to fix this?

As of Mac OS X release 10.1.1 there still appears to be problems in the Apple implementation of the Java 2D APIs. The true source of these problems and/or workarounds have yet to be identified (although the problems appear to be closely tied to a “gstack underflow” error message from the Apple JVM). We are interested in finding the source of these problems and reasonable workarounds, so if you know what causes these errors the Batik team would be very interested in hearing from you (either directly or through the user/developer mailing lists).

Other things to be aware of on Mac OS X, due to fixes for other problems with Java 2D under Mac OS X, you may find that some filtering operations take significantly more memory than on other platforms. This will be especially true for deeply nested filter trees (where the result of one filtering operation is filtered by another filtering operation).

Finally a few hints on avoiding problems under Mac OS X. The bugs seems to be triggered by filters, and pure raster SVG documents have not been found to cause problems. The use of the filterRes attribute on the filter element seems especially problematic. The bug isn’t 100% reproducible, so while some content exhibits the problem, if you play with the document enough it will often “fix” itself for a while, then later it will go back to being broken (which indicates that the problem may be some sort of race condition in the JVM).

I cannot run the Batik demo on Mac OS X (10.1.1). The Batik splash screen hangs. What is happening?

The Batik demo uses Java Web Start. Java Web Start (under the Applications/Utilities folder), lets you start a Java application from a web browser. You can see the debug traces by enabling the Java console for Java Web Start. If you do, you will see that there is a java.lang.NoSuchMethodError exception thrown.

This is happening because the Java Web Start jar file (javaws.jar in /Applications/Utilities/Java Web Start/Content/MacOS) contains an older version of the DOM bindings.

One work around is to manually patch the javaws.jar file to remove the DOM bindings so that they do not take precedence over the Batik ones.

How do I contribute to Batik Development? How can I contribute to Apache Batik development?

The Batik Project is an open volunteer project in the spirit of the Apache Software Foundation (ASF). This means that there are many ways to contribute to the project, either with direct participation (coding, documenting, answering questions, proposing ideas, reporting bugs, suggesting bug-fixes, etc.) or by resource donation (publicity, hardware, software, conference presentations, speeches, etc.). Applications that use the Batik modules, such as tools or extensions, are of special interest to the project.

The process for contributing to Batik is the same as for other Java projects at Apache. A formal description of that process can be found on the Jakarta web site. You can also view a list of who has contributed to Batik.

For direct participation, we suggest that you subscribe to the Batik mailing lists and to checkout the latest code.

How do I submit patches or bug fixes?

You can submit bug fixes and patches to the Batik developers mailing list and you can enter bugs in Bugzilla.

batik-1.9.orig/documentation-sources/content/xdocs/using/0000755000175000017500000000000013153020772023207 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/using/glossary.xml0000644000175000017500000000675313063003361025602 0ustar mans0954mans0954
Batik Glossary
Bridge

A bridge is a class that handles an element in an SVG document, either by constructing a corresponding node in the GVT tree, or by informing the user agent that it has encountered the element.

GVT (Graphic Vector Toolkit)

GVT (Graphic Vector Toolkit) is an object oriented framework that describes complex 2D graphics in terms of a tree of Java objects. GVT is used in Batik to represent how SVG images are to be rendered.

SVG DOM

The SVG DOM (Document Object Model) defines the API that programming languages use to interact with SVG documents. There are different “bindings” of the DOM API for different languages. For example, there is an ECMAScript binding that allows SVG scripts to access or modify SVG documents, for example in reaction to events. There is also a Java binding which allows Java programs to dynamically interact with SVG documents. The Java binding and the ECMAScript binding are both available in Batik.

SVG Generator

The SVG Generator is a module of Batik that allows Java applications to create SVG content without needing specific knowledge of SVG. Applications doing graphics in Java use an API, embodied by the Graphics2D class, to do all their rendering operations. They use the same code, but different implementations of that API, to render to various outputs such as a screen or a printer. The SVG Generator is another implementation of that API that, instead of drawing to a screen or a printer, generates SVG content. Because it implements the same API as for printing or drawing to the screen, the same code that does screen rendering and printing can be used with the generator to generate SVG content.

batik-1.9.orig/documentation-sources/content/xdocs/using/parsers.xml0000644000175000017500000002546713063003361025421 0ustar mans0954mans0954
Parser module

SVG has a number of microsyntaxes that are used within attribute values, such as the transform attribute on SVGTransformable elements, and the path data d attribute on path elements. Since these are not trivial to parse, this functionality has been factored out into a separate package that can be used by other SVG-processing applications if needed.

Parsers, handlers and producers

In the parser module, each microsyntax is supported by a pair of classes: a parser and a handler. The parser is a class that implements the Parser interface, which has methods to parse values from a Reader or a String. The handler is an interface specific to the microsyntax that will have its methods called whenever the corresponding element in the input is parsed. For those handler interfaces that have more than one method, adapter classes are provided (named Default*).

Parsers can also have an error handler associated with them, whose single method error will be called when there is a problem parsing the input. If an error handler is not associated with a parser, a ParseException will be thrown if an error occurs.

The microsyntaxes supported by the parser module are:

Angles

Implemented by AngleParser, handled with AngleHandler. This parser is used for parsing angles formed by a floating point number followed by deg, grad or rad. It is not currently used by the rest of the Batik codebase.

Clock values

Implemented by ClockParser, handled with ClockHandler. This parser is used for parsing SMIL clock values.

Fragment identifiers

Implemented by FragmentIdentifierParser, handled with FragmentIdentifierHandler. This parser is used for parsing the various formats of fragment identifier that SVG allows.

Lengths

Implemented by LengthParser, handled with LengthHandler. This parser is used for parsing SVG length values.

Length lists

Implemented by LengthListParser, handled with LengthListHandler. This parser is used for parsing lists of comma or space separated SVG lengths.

Numbers

Implemented by NumberListParser, handled with NumberListHandler. This parser is used for parsing SVG number values.

Number lists

Implemented by NumberListParser, handled with NumberListHandler. This parser is used for parsing lists of comma or space separated SVG numbers.

Path data

Implemented by PathParser, handled with PathHandler. This parser is used for parsing SVG path data, as found in path element d attributes.

Points

Implemented by PointsParser, handled with PointsHandler. This parser is used for parsing point lists, as found in polygon element points attributes.

Preserve aspect ratio values

Implemented by PreserveAspectRatioParser, handled with PreserveAspectRatioHandler. This parser is used for parsing the values found in the preserveAspectRatio attribute of svg elements.

Transform lists

Implemented by TransformListParser, handled with TransformListHandler. This parser is used for parsing transform lists, as found in the transform attribute of any transformable element.

Some microsyntaxes also have a corresponding producer class, which is an implementation of the handler interface that generates an object while parsing.

Examples

The following example code demonstrates how to use the parser classes to parse a list of points:

import java.awt.geom.Point2D; import java.util.LinkedList; import java.util.List; import org.apache.batik.parser.DefaultPointsHandler; import org.apache.batik.parser.ParseException; import org.apache.batik.parser.PointsHandler; import org.apache.batik.parser.PointsParser; public class PointsParserExample { public List extractPoints(String s) throws ParseException { final LinkedList points = new LinkedList(); PointsParser pp = new PointsParser(); PointsHandler ph = new DefaultPointsHandler() { public void point(float x, float y) throws ParseException { Point2D p = new Point2D.Float(x, y); points.add(p); } }; pp.setPointsHandler(ph); pp.parse(s); return points; } }

This example uses the AWTTransformProducer class to generate an AffineTransform object from an SVG transform list:

import java.awt.geom.AffineTransform; import org.apache.batik.parser.AWTTransformProducer; import org.apache.batik.parser.ParseException; import org.apache.batik.parser.TransformListParser; public class TransformParserExample { public AffineTransform parseTransformList(String s) throws ParseException { TransformListParser p = new TransformListParser(); AWTTransformProducer tp = new AWTTransformProducer(); p.setTransformListHandler(tp); p.parse(s); return tp.getAffineTransform(); } }
batik-1.9.orig/documentation-sources/content/xdocs/using/css.xml0000644000175000017500000000371313063003362024521 0ustar mans0954mans0954
Batik CSS engine

Batik includes a fully functional CSS engine that supports CSS Level 2. While this engine is used to support CSS functionality in SVG documents, it is generic and can be used for any application where a CSS engine is required to perform the cascade.

Note that Batik’s CSS engine does not implement the box model to perform layout, as used by HTML browsers. It implements only the interfaces needed to apply stylesheets to an XML document and to then query or update the elements’ cascaded values.

batik-1.9.orig/documentation-sources/content/xdocs/using/scripting/0000755000175000017500000000000013153020772025211 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/using/scripting/security.xml0000644000175000017500000003126313063003361027602 0ustar mans0954mans0954
Script security

With the addition of scripting support in Batik 1.5, security features have also been added to enable users of the Batik toolkit to run scripts in a secure manner.

If you are using script, please make sure you have reviewed the Script Security Warning with regards to the Batik 1.5 release.

Running scripts securely

The Java platform offers a lot of options for running applications securely. Running an application securely requires that it runs in a so-called security sand-box which controls all the access the application makes to restricted resources (such as the file system).

The concept of Java security is an application-wide concept. As such, it has to be applied at the application level (and not at the framework level). In the Batik distribution, the sample applications (such as the Squiggle Browser and the SVG rasterizer) apply security (or disable it) but the framework does not apply it: it is security-aware (meaning that it is able to handle security exceptions).

Enforcing security in a Batik application

Enforcing security in a Batik application is done by setting a java.lang.SecurityManager. This security manager will apply the security settings of the Java platform (as defined by the jre-dir/lib/security/java.policy and, optionally, by the policy file whose URL is defined in the java.security.policy system property).

The org.apache.batik.util.ApplicationSecurityEnforcer helper class makes it easier for Batik application developers to add security support in their applications. That helper class is used by the sample Batik applications.

Squiggle security

The Squiggle browser lets the user decide whether or not scripts should be run securely (see the “Browser Options” in the preference dialog box). When scripts are run securely, Squiggle will enforce the security settings as follows:

  • The default policy is defined by the policy file found in the distribution: org/apache/batik/apps/svgbrowser/svgbrowser.policy. In the binary distribution, that file would be in the batik-squiggle.jar file. In the source distribution, that file would be in the resources directory. The default policy file gives appropriate permissions to the Batik code, the XML parser and the Rhino scripting engine and very limited permissions to scripts.
  • At startup time, and whenever the preference settings are modified, Squiggle makes a copy of the default policy and appends any additional permissions granted to scripts by the user through the preference settings. This policy file can be found in the [user.home]/.batik directory, and is called __svgbrowser.policy. Note that this file is automatically generated and should not be modified manually (as any edits would be lost).
  • The policy defined as described above is enforced unless the java.security.policy system property is defined. In that case, the policy defined by the system property takes precedence and the policy file generated from the Squiggle preferences is ignored.

Important note: The default policy files assume that the applications use the Xerces parser and give appropriate permissions to its lib/xerces-2_5_0.jar jar file. If you are using a different XML parser, you need to modify the policy files to grant the propser permissions to your XML parser instead of Xerces. You will have to replace:

grant codeBase "${app.dev.base}/lib/xerces_2_5_0.jar" { permission java.security.AllPermission; };

with:

grant codeBase "${app.dev.base}/lib/myXMLParser.jar" { permission java.security.AllPermission; };

in the resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy file (for the source distribution) and do the same in resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.bin.policy (for the binary distribution which will then need to be rebuilt with the build dist-zip command.

Alternatively, you can write your own policy file and specify its URL through the java.security.policy system property (which you can specify through the -Djava.security.policy=url command line option).

Controlling access to external resources

SVG makes a very powerful use of external resources in many elements such as image, use, font, script and radialGradient. There are over fifteen SVG elements that may reference external resources that way.

In some environments, and typically for security reasons, it is important to control the resources referenced by an SVG document and be able to accept or reject these resources.

In the Batik toolkit, this flexibility is provided by the org.apache.batik.bridge.UserAgent interface which can define various strategies with regards to external resources. By providing a new implementation of the UserAgent interface, it is possible to apply the desired security strategy for scripts and external resources.

The following UserAgent methods are provided for that purpose:

  • getScriptSecurity(scriptType, scriptURL, docURL) should return the ScriptSecurity strategy for a script of type scriptType (e.g., text/ecmascript) coming from scriptURL, when referenced from the document whose URL is docURL.
  • getExternalResourceSecurity(resourceURL, docURL) should return the ExternalResourceSecurity strategry for a resource coming from resourceURL referenced from the document at URL docURL.

The ScriptSecurity and ExternalResourceSecurity interfaces have methods (checkLoadScript and checkLoadExternalResource respectively) which should throw a SecurityException if accessing the script or resource is considered a security violation.

The UserAgent interface has two additional methods (checkLoadScript and checkLoadExternalResource which are meant to provide a short hand for getting a security strategy object and calling the checkLoad* method on that object. This is how the org.apache.batik.bridge.UserAgentAdapter class implements this method.

Batik provides the following set of ScriptSecurity implementations:

NoLoadScriptSecurity

The script resource should not be loaded.

EmbededScriptSecurity

The script resource will only be loaded if it is embeded in the SVG document referencing it. This means that script attributes (such as onclick on a rect element), inline script elements and script elements using a data: URL as its xlink:href attribute value will be allowed. All other script resources should not be loaded.

DefaultScriptSecurity

The script resource will only be loaded if it is embeded in the SVG document (see the description of EmbededScriptSecurity) or if it is coming from the same location as the document referencing the script. If the document comes from a network server, then any script coming from that server will be allowed. If the document comes from the file system, then only scripts under the same directory root as the SVG document will be allowed.

RelaxedScriptSecurity

Scripts from any location can be loaded.

In addition, Batik provides the following set of ExternalResourceSecurity implementations:

NoLoadExternalResourceSecurity

No external references are allowed.

EmbededExternalResourceSecurity

Only resources embeded into the file are allowed (i.e., references through the data: protocol).

DefaultExternalResourceSecurity

Embeded external resources (see above) and resources coming from the same location as the document referencing them are allowed.

RelaxedExternalResourceSecurity

Resources from any location can be loaded.

batik-1.9.orig/documentation-sources/content/xdocs/using/scripting/ecmascript.xml0000644000175000017500000002663113063003362030071 0ustar mans0954mans0954
Scripting with ECMAScript

This page is a brief introduction to scripting SVG documents with ECMAScript, and how Batik’s ECMAScript environment can be extended.

Scripting basics

As the ECMAScript language (the standardised version of JavaScript) is one of the most popular scripting languages, and as the SVG specification states that an SVG conforming implementation must support it, SVG documents processed by Batik support scripting with ECMAScript using Mozilla’s ECMAScript interpreter, Rhino.

There are two places in an SVG file where you can put scripts.

The first one is in the script element, where you can place any code, including function definitions, to be executed just before the document SVGLoad event is fired.

]]>

You can also attach script to respond to user or document events using attributes on SVG elements. As shown in the previous example, the scripting language must be set on the script element. However, for event handling the default language type text/ecmascript is assumed. If you want to change it you can use the contentScriptType attribute on the svg element.

The event attribute can contain any script code to execute when the event reaches the element (as described by the DOM event flow) in either the bubbling or at-target phases. The following example will change the rect to be filled in blue when it is clicked.

]]>

Note that inside the event attribute script, there is a variable called evt that is a reference to the Event object that represents the event that is being handled.

For more information on using scripting in SVG you can have a look at:

Using Rhino features

Rhino has a number of features beyond those supported by standard ECMAScript interpreters, and these can be used with Batik. One useful feature is that ECMAScript code can use Java classes and objects, and not just the standard ECMAScript primitive types and host objects exposed by Batik.

To create an instance of a Java class from ECMAScript, you first need to import the package in which it resides. This is done using the importPackage global function that Rhino provides. For example, to import the javax.swing.JFrame class, you use:

importPackage(Packages.javax.swing);

This then exposes a global property for each class in the javax.swing package that you can use to create a new object of this class, similar to a import javax.swing.*; statement in Java. We can use the exposed JFrame property to create a new instance of this class:

var frame = new JFrame("My test frame");

Note how an ECMAScript string value is passed as the parameter to JFrame’s constructor. Rhino will attempt to convert ECMAScript values into appropriate Java primitive types or objects to make underlying constructor or method calls. In this instance, the ECMAScript string value is converted into a java.lang.String object to be passed to the constructor.

Now that we have a reference to this Java object, we can call any method on it as we usually would from Java code. The following complete example demonstrates this, where clicking the green circle will pop up a frame:

]]>

For more information on scripting Java classes from ECMAScript code, see Rhino's Scripting Java document.

Customizing the Rhino interpreter

A useful example of customization of the Rhino interpreter comes from the fact that the ECMAScript specification doesn’t provide any predefined I/O facilities to interact with the console. However, it is very common for ECMAScript compatible languages to provide a function named print to output messages to the console. We will describe here an example of cutomization of the Batik Rhino interpreter to add such functionality to it.

You should first subclass the default Batik ECMAScript interpreter to add the functionality to it as below.

import org.apache.batik.script.rhino.RhinoInterpreter; import java.net.URL; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.PropertyException; public class ExtendedRhinoInterpreter extends RhinoInterpreter { public ExtendedRhinoInterpreter(URL documentURL) { super(documentURL); // Array of functions to put in the global object. final String[] names = { "print" } try { // Add the functions to the global object. getGlobalObject().defineFunctionProperties (names, ExtendedRhinoInterpreter.class, ScriptableObject.DONTENUM); } catch (PropertyException e) { throw new Error(e); } } public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) { for (int i = 0; i < args.length; i++) { if (i > 0) { System.out.print(" "); } // Convert the ECMAScript value into a string form. String s = Context.toString(args[i]); System.out.print(s); } System.out.println(); } }

Now, you need to tell to Batik to use this interpreter instead of the default one. For that, you must first define a factory to create instances of your interpreter.

import org.apache.batik.script.Interpreter; import org.apache.batik.script.rhino.RhinoInterpreterFactory; public class ExtendedRhinoInterpreterFactory extends RhinoInterpreterFactory { public Interpreter createInterpreter(URL documentURL, boolean isSVG12) { return new ExtendedRhinoInterpreter(documentURL); } }

Then, you must build an IntepreterPool that will use this factory, and then set the pool on the BridgeContext of your application.

org.apache.batik.bridge.BridgeContext ctx = ...; org.apache.batik.script.InterpreterPool pool = new org.apache.batik.script.InterpreterPool(); InterpreterFactory f = new ExtendedRhinoInterpreterFactory(); // Register the interpreter factory for all four MIME types that // Batik normally supports for ECMAScript. pool.putInterpreterFactory("text/ecmascript", f); pool.putInterpreterFactory("text/javascript", f); pool.putInterpreterFactory("application/ecmascript", f); pool.putInterpreterFactory("application/javascript", f); ctx.setIntepreterPool(pool);

For example if you are using the Batik SVG browser application you should be able to use the previous piece of code on a subclass of the JSVGCanvas class in the createBridgeContext() method.

For further information on working with Rhino, consult the Rhino website.

batik-1.9.orig/documentation-sources/content/xdocs/using/scripting/java.xml0000644000175000017500000002700713063003362026656 0ustar mans0954mans0954
Scripting With Java

This page explains how to manipulate the DOM tree of an SVG document from a Java program.

How to manipulate a document in a JSVGCanvas

The follow code template demonstrates how to manipulate an SVG document displayed in a JSVGCanvas directly from a Java program.

You don’t have to worry about graphics updates; after each event listener invocation the canvas is updated if needed. import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.svg.SVGLoadEventDispatcherAdapter; import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent; import org.apache.batik.script.Window; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.events.Event; import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; public class SVGApplication { public static void main(String[] args) { new SVGApplication(); } JFrame frame; JSVGCanvas canvas; Document document; Window window; public SVGApplication() { frame = new JFrame(); canvas = new JSVGCanvas(); // Forces the canvas to always be dynamic even if the current // document does not contain scripting or animation. canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); canvas.addSVGLoadEventDispatcherListener (new SVGLoadEventDispatcherAdapter() { public void svgLoadEventDispatchStarted (SVGLoadEventDispatcherEvent e) { // At this time the document is available... document = canvas.getSVGDocument(); // ...and the window object too. window = canvas.getUpdateManager(). getScriptingEnvironment().createWindow(); // Registers the listeners on the document // just before the SVGLoad event is // dispatched. registerListeners(); // It is time to pack the frame. frame.pack(); } }); frame.addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { // The canvas is ready to load the base document // now, from the AWT thread. canvas.setURI("doc.svg"); } }); frame.getContentPane().add(canvas); frame.setSize(800, 600); frame.show(); } public void registerListeners() { // Gets an element from the loaded document. Element elt = document.getElementById("elt-id"); EventTarget t = (EventTarget)elt; // Adds a 'onload' listener t.addEventListener("SVGLoad", new OnLoadAction(), false); // Adds a 'onclick' listener t.addEventListener("click", new OnClickAction(), false); } public class OnLoadAction implements EventListener { public void handleEvent(Event evt) { // Perform some actions here... // ...for example start an animation loop: window.setInterval(new Animation(), 50); } } public class OnClickAction implements EventListener { public void handleEvent(Event evt) { // Perform some actions here... // ...for example schedule an action for later: window.setTimeout(new DelayedTask(), 500); } } public class Animation implements Runnable { public void run() { // Insert animation code here... } } public class DelayedTask implements Runnable { public void run() { // Perform some actions here... // ...for example displays an alert dialog: window.alert("Delayed Action invoked!"); } } }
Writing thread-safe code

The DOM listeners registered on the SVG document are called from the canvas update thread. To avoid race conditions, do not manipulate the DOM tree from another thread.

The way to switch from an external thread to the canvas update thread is to use the following code:

// Returns immediately canvas.getUpdateManager().getUpdateRunnableQueue(). invokeLater(new Runnable() { public void run() { // Insert some actions on the DOM here } });

or:

// Waits until the Runnable is invoked canvas.getUpdateManager().getUpdateRunnableQueue(). invokeAndWait(new Runnable() { public void run() { // Insert some actions on the DOM here } });

Like with event listeners, when a Runnable is invoked from the update thread, the graphics are updated.

It is very dangerous to call invokeAndWait from the Swing event thread. This is the only thread that can be used to interact with Swing components. In some cases DOM calls may need to query the canvas for information (such as actual Swing component size, etc). If this happens you will get a thread deadlock. You should only make invokeAndWait calls from “third party” threads.
Using the SVG DOM

Batik provides a fairly complete implementation of the SVG DOM. The SVG DOM provides all the functionality most applications require. In particular, the DOM implements DOM Events, including mutation and UI Events. As an example, DOM events allow you to get notified when the cursor moves over elements of interest:

// Element of Interest. Element theElem = ...; ((EventTarget) theElem).addEventListener("mouseover", mouseOverListener, true);

where mouseOverListener implements the org.w3c.dom.events.EventListener interface. This interface consists of the method:

void handleEvent(Event evt);

This is called whenever the event occurs with the element it is registered on. It is worth reviewing the DOM Events specification as there are many useful features to this interface that are not immediately obvious.

It is also worth looking at the DOM interfaces defined by the SVG specification as they provide a large number of useful methods, in particular those of SVGLocatable:

// Returns Bounding box of SVG Element. public SVGRect getBBox ( ); // Returns the transformation matrix to the screen. public SVGMatrix getScreenCTM ( ); // Returns the transformation matrix to the given element. public SVGMatrix getTransformToElement ( SVGElement element ) throws SVGException;

In particular, getScreenCTM is very useful for taking the clientX and clientY attributes of the DOM UIEvent and mapping them to the coordinate system of an element in the SVG document:

SVGMatrix mat = elem.getScreenCTM(); SVGMatrix imat = mat.inverse(); SVGPoint cPt = document.getRootElement().createSVGPoint(); cPt.setX(uiEvt.getClientX()); cPt.setY(uiEvt.getClientY()); cPt = cPt.matrixTransform(imat);
Referencing Java code from a document

Batik implements the Java bindings for SVG, and thus allows Java code to be referenced from script elements. This feature is available to any application of Batik that uses the bridge module (for example the Swing component and the transcoders).

In order to use this extension, the type attribute of a script element must be set to application/java-archive. In addition, the xlink:href attribute must be the URI of a jar file that contains the code to run.

The manifest of this jar file must contains an entry of the form:

SVG-Handler-Class: classname

where classname must be the name of a class that implements the org.w3c.dom.svg.EventListenerInitializer interface. Just before the document SVGLoad event is fired, an instance of this class is created, and this instance has its initializeEventListeners method invoked. Note that there is no way to specify Java handlers in event attributes on SVG elements, so having the initializeEventListeners call addEventListener on a node is the only way to attach a Java listener from within the document.

The class specified by SVG-Handler-Class can be contained directly in the jar file, but it is also possible for it to be contained in a jar file added to the classpath using the Class-Path entry of the manifest.

batik-1.9.orig/documentation-sources/content/xdocs/using/architecture.xml0000644000175000017500000001646513063003362026423 0ustar mans0954mans0954
Architecture overview

This document briefly describes the Batik architecture and the role of each of its modules. For detailed module design, you can refer to the Batik UML diagrams Object by Design or yWorks.

The Batik modules are of one of three types: application modules, core modules and low level modules. The following figure illustrates these three module types.

Batik Architecture

Application modules illustrate how to use the core modules and let users evaluate the Batik software by experimenting with its features.

The Core modules are the heart of Batik and the primary deliverables for the projects. These are the modules developers use to manipulate, generate, create, convert, render and view SVG content.

Finally, the Low level modules are used internally by the core modules to accomplish their work. These modules are not typically used by developers directly.

Application modules

As mentioned earlier, the application modules illustrate the functionality that Batik offers.

For example, the SVG browser is built using several Batik core modules (such as the JSVGCanvas GUI component and the ImageTranscoders) and illustrates how Batik lets you not only view, zoom, pan and rotate SVG documents, but also search them and convert them to other formats (such as JPEG, TIFF or PNG).

The SVG pretty printer is another example that shows how Batik lets you manipulate and transform SVG content, here for the purposed of tidying up potentially disorganized SVG files.

The SVG font converter illustrates how Batik can help you embed SVG font definitions in an SVG file by providing an application that converts ranges of characters from a TrueType Font format to the SVG font format.

Finally, the SVG rasterizer shows how to leverage the transcoder API to convert to and from SVG content.

Note that even though the application modules are meant to be useful and fun to use, they are not the primary deliverables of the Batik project. Instead, they are illustrations of how the Batik core modules might be used and combined.

Core modules

The Batik core modules are the heart of the Batik architecture. They can be used individually or in combination for various purposes, and the application modules offer some usage examples.

  • The SVG generator is a module containing SVGGraphics2D class, that lets all Java applications or applets easily convert their graphics to the SVG format, as easily as they draw to a screen or a printer, by leveraging the Java 2D API’s extensible design.
  • SVG DOM an implementation of the SVG DOM API defined in the SVG recommendation. It lets the programmer manipulate SVG documents in a Java program.
  • The Swing components module includes, primarily, the JSVGCanvas class, a UI component that can display SVG content and let the user interact with that content (zoom, pan, rotate, select text, etc.).
  • The Bridge module is rarely used directly. It is responsible for creating and maintaining an appropriate object corresponding to an SVG element. The bridge converts an SVG document into the internal representation Batik uses for graphics (GVT, the Graphic Vector Toolkit).
  • The transcoder is a module that provides a generic API for transcoding an input to an output. This module transcodes an input stream or a document into a particular ouput format, used for converting SVG documents to other types.
Low level modules

The low level modules are not expected to be used directly by developers using the Batik API. Rather, they support the operation of the core modules. The low level modules include:

  • The Graphic Vector Toolkit (GVT) module, which represents a view of the DOM tree that is more suitable for for rendering and event handling purposes. This module describes DOM tree in terms of a tree of Java graphics objects.
  • The Renderer module is responsible for rendering a GVT tree and any related task. For example, a raster based renderer may perform some caching (the default renderer in Batik does that). However, a renderer could perform any task deemed necessary and does not have to be raster based.
  • The SVG parser module contains parser classes for complex SVG attributes such as the transform or color attributes. Higher level modules rely on the SVG parser module.
batik-1.9.orig/documentation-sources/content/xdocs/using/dom-api.xml0000644000175000017500000002360213063003362025256 0ustar mans0954mans0954
SVG DOM API

The Document Object Model (DOM) is an API for XML documents. It defines the logical structure of documents and the way a document is accessed and manipulated. This page shows how to create an SVG document using the DOM API.

Getting started

The DOM API defines an interface called DOMImplementation, which represents the bootstrap of any DOM implementation. The role of this class is to bootstrap a particular implementation of the DOM by providing a method to create a Document. Then, the concrete Document represents an XML document and also acts like a factory for the various DOM objects such as Element, Attr and Text.

How to get an instance of the DOMImplementation interface depends on the DOM implementation you are using. In Batik, the DOM implementation is located in the package org.apache.batik.dom.svg and the class is named SVGDOMImplementation. The following example shows how to get a concrete DOMImplementation object.

import org.w3c.dom.DOMImplementation; import org.apache.batik.dom.svg.SVGDOMImplementation; DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();

Once you have an instance of a DOMImplementation, you are not relying on Batik-specific code any more and ready to use the DOM API.

Creating a Document

Using the DOMImplementation, you are now able to create a Document. The following example illustrates how to create an SVG document. Note that the Batik’s DOM implementation can be used to represent either an SVG document fragment or any kind of XML document. Note that by choosing the namespace URI and the local name of the root element of SVG, we are creating an SVG document.

import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.Document; // We are using a constant available on the SVGDOMImplementation, // but we could have used "http://www.w3.org/2000/svg". String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); Document doc = impl.createDocument(svgNS, "svg", null);

As we have created an SVG Document, we can cast this document to an SVGDocument (defined in the org.w3c.dom.svg package) if needed.

Building an SVG Document

Finally, using the Document object, we are now able to construct SVG content. Note that the document created before supports both generic XML and SVG. Though the DOM implementation of Batik is an SVG DOM implementation, the SVG-specific methods that rely on the document having been rendered (particularly geometry related methods, such as SVGLocatable.getBBox) cannot be used at this point.

The document can be built using DOM Level 2 Core methods. The following example shows how to create a red rectangle located at (10, 20), with a size of (100, 50) placed in a (400, 450) SVG canvas:

import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document doc = impl.createDocument(svgNS, "svg", null); // Get the root element (the 'svg' element). Element svgRoot = doc.getDocumentElement(); // Set the width and height attributes on the root 'svg' element. svgRoot.setAttributeNS(null, "width", "400"); svgRoot.setAttributeNS(null, "height", "450"); // Create the rectangle. Element rectangle = doc.createElementNS(svgNS, "rect"); rectangle.setAttributeNS(null, "x", "10"); rectangle.setAttributeNS(null, "y", "20"); rectangle.setAttributeNS(null, "width", "100"); rectangle.setAttributeNS(null, "height", "50"); rectangle.setAttributeNS(null, "fill", "red"); // Attach the rectangle to the root 'svg' element. svgRoot.appendChild(rectangle);

The example given constructs a document equivalent to parsing the following SVG file:

]]>
Creating a Document from an SVG file

With Batik, you can also create an SVG DOM tree from a URI, an InputStream, or a Reader, using the SAXSVGDocumentFactory. The following example illustrates how to create an SVG document from a URI using the SAXSVGDocumentFactory class.

import java.io.IOException; import org.apache.batik.dom.svg.SAXSVGDocumentFactory; import org.apache.batik.util.XMLResourceDescriptor; import org.w3c.dom.Document; try { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); String uri = "http://www.example.org/diagram.svg"; Document doc = f.createDocument(uri); } catch (IOException ex) { // ... }

As we have created an SVG Document, we can cast this document to an SVGDocument (defined in the org.w3c.dom.svg package) if needed.

Rendering an SVG Document

Batik provides several ways to use an SVG DOM tree. Two modules can be immediately used to render your SVG document.

JSVGCanvas

The JSVGCanvas is a Swing component that can display SVG document. A SVG document can be specified using a URI or an SVG DOM tree (using the setSVGDocument method). For futher information about the JSVGCanvas, see the Swing components module documentation.

ImageTranscoder
The ImageTranscoder is a transcoder that can take a URI, an InputStream or an SVG DOM tree and produces a raster image (such JPEG, PNG or TIFF). By creating a TranscoderInput object with the SVG DOM tree, you will be able to transform your SVG content to a raster image. For futher information, see the transcoder module documentation.
batik-1.9.orig/documentation-sources/content/xdocs/using/svg-generator.xml0000644000175000017500000005735513063003361026526 0ustar mans0954mans0954
SVG Generator: SVGGraphics2D
Flow diagram illustrating that Java programs can have their graphics converted to SVG and then viewed in any SVG viewer

As SVG is emerging as a promising graphics format for a wide range of domains and applications, bridging it with Java becomes important. This page explains how Batik’s SVGGraphics2D, referred to as the SVG Generator, makes this possible.

The <code>SVGGraphics2D</code> class

On the Java platform, all rendering goes through the Graphics2D abstract class, which offers methods such as drawRect, fillRect, and drawString. There are specialized implementations of this abstract class for each type of output, such as a screen or a printer. SVGGraphics2D is a new implementation of that interface that generates SVG content instead of drawing to a screen or a printer.

SVGGraphics2D has the following features:

  • it allows applications to export their graphics into SVG format,
  • it does not require any modification of the graphics code to export to SVG, and
  • it offers the user the ability to use the DOM API to manipulate the generated document.
Diagram illustrating how the SVGGraphics2D inherits from Graphics2D, and uses Document to generate a DOM tree

The above figure shows how the generator works with the DOM API. The W3C has defined an API for representing XML content with a Java object. That API allows programmers to manipulate, create, and/or modify XML content in memory. The DOM API contains interfaces such as Document, Element, and Attr, which model the Java programming language equivalent of XML documents, elements and attributes.

The generator manages a tree of DOM objects that represent the SVG content corresponding to the rendering calls made on the SVGGraphics2D instance. In other words, every time a program invokes a rendering method, such as fillRect, on a SVGGraphics2D instance, a new DOM object, representing the SVG equivalent, is appended to the DOM tree. For example, a rect element will be appended after the fillRect method has been invoked).

The programmer, using this generator, can then access the DOM tree to further manipulate it or can directly write the content to an output stream, as we see in the following section.

How to use SVGGraphics2D

From the figure in the previous section we can see that in order for an instance of SVGGraphics2D to build the SVG content (the DOM tree), an instance of a Document class is needed. The DOM tree is an in-memory representation of the SVG document, which can be further manipulated by the user using DOM API or be streamed out by a Writer object.

The following example program demonstrates how to generate SVG content from Java graphics.

We can see that generating SVG content from our TestSVGGen instance is a three step process:

  1. Create an instance of org.w3c.dom.Document that the generator will use to build its XML content, and create an SVG generator using the Document instance.

    // Get a DOMImplementation. DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); // Create an instance of org.w3c.dom.Document. String svgNS = "http://www.w3.org/2000/svg"; Document document = domImpl.createDocument(svgNS, "svg", null); // Create an instance of the SVG Generator. SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
  2. Invoke the rendering code on our SVG generator. In our example, we invoke TestSVGGen‘s paint method:

    // Ask the test to render into the SVG Graphics2D implementation. TestSVGGen test = new TestSVGGen(); test.paint(svgGenerator);
  3. Stream out the SVG content. The SVG generator can stream its content into any java.io.Writer. In our example, we stream the content to the standard output stream:

    // Finally, stream out SVG to the standard output using // UTF-8 encoding. boolean useCSS = true; // we want to use CSS style attributes Writer out = new OutputStreamWriter(System.out, "UTF-8"); svgGenerator.stream(out, useCSS);

SVG has two ways to specify styling properties, such as the fill color: presentation attributes (one XML attribute per property) or the CSS style attribute (any number of properties in one CSS inline stylesheet). The useCss parameter allows the user to control that option.

SVG Generator customization

In the previous section, we have just seen that the SVG generation process can be customized to output SVG styling properties as presentation attributes or CSS inline stylesheets. In this section we will talk about some examples of more advanced customizations.

Instead of creating the SVGGraphics2D just by using the Document that will be used as a factory for creating the SVG elements, we can use the constructor that uses an SVGGeneratorContext instance. By providing your own SVGGeneratorContext instance, you will be able to do advanced customization. You will find below several examples of possible customizations.

Have your own comment in the generated SVG file

We begin with the simplest possible example. If you integrate the Batik SVG generator in your own Java application, you may want to specialize the comment generated in the XML code.

DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String svgNS = "http://www.w3.org/2000/svg"; Document myFactory = impl.createDocument(svgNS, "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); ctx.setComment("Generated by FooApplication with Batik SVG Generator"); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);
Use embedded SVG Fonts in the generated SVG file

In order to have a self-contained SVG file that doesn't have to use system fonts to be displayed, you can embed the fonts you used for drawing strings in the SVG file through the SVG fonts facility.

DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String svgNS = "http://www.w3.org/2000/svg"; Document myFactory = impl.createDocument(svgNS, "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); ctx.setEmbeddedFontsOn(true); SVGGraphics2D g2d = new SVGGraphics2D(ctx, true);
Customizing the way images are stored

Every time you call one of the drawImage methods provided by the Graphics2D interface, a default representation of your image is created in a location and put in a default file. For instance, a base64 encoding is created and embedded in the SVG file by default. Alternatively, you can choose to have your images written to separate files in a predefined directory, in one of the two raster formats required by the SVG specification: JPEG or PNG.

You can change the default behavior by explicitly providing the image handler to be used by the SVG generator. Once again, you use the SVGGeneratorContext for this. In the example below, all images are converted to PNG format and written to directory res/images.

DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String svgNS = "http://www.w3.org/2000/svg"; Document myFactory = impl.createDocument(svgNS, "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); GenericImageHandler ihandler = new ImageHandlerPNGEncoder("res/images", null); ctx.setImageHandler(ihandler); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);

Using the default image handlers results in a new copy of the image data being written to the SVG file or an external file, for every single drawImage call. If you use the same images over and over again, then this may result in an SVG file containing a lot of redundant data. At the price of a slight performance penalty during initial generation of the SVG DOM tree, you can choose to have your image data reused. For this you use a specialized image handler, as shown below.

DOMImplementation impl = GenericDOMImplementation.getDOMImplementation(); String svgNS = "http://www.w3.org/2000/svg"; Document myFactory = impl.createDocument(svgNS, "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); // Reuse our embedded base64-encoded image data. GenericImageHandler ihandler = new CachedImageHandlerBase64Encoder(); ctx.setGenericImageHandler(ihandler); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);

With the caching image handlers, it is even possible to reuse the same copy of your image data across several different SVG documents. Just keep a reference to the image handler, and pass it to the SVGGraphics2D instance used for generating the SVG DOM tree. The following simplified example shows how different SVG trees might be created by separate SVG generators, efficiently storing any common images just once.

class MySVGGenerator { // The image handler will write all images files to "res/images". private static ImageHandler ihandler = new CachedImageHandlerPNGEncoder("res/images", null); public void generateSVG(JPanel myCanvas, OutputStream outStream) { DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); Document myFactory = domImpl.createDocument(svgNS, "svg", null); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); ctx.setGenericImageHandler(ihandler); SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx, false); // Create the SVG DOM tree. myCanvas.paintComponent(svgGenerator); Writer out = new OutputStreamWriter(outStream, "UTF-8"); svgGenerator.stream(out, true); } }
Customizing the generated SVG style

Your needs in matter of styling may be different from the two provided options (XML presentation attributes or CSS inline stylesheets). For example, you may want to put the CSS properties in a SVG style element section and reference them through the class attribute. In this case you will need to define a new StyleHandler as below.

public class StyleSheetStyleHandler implements StyleHandler { // The CDATA section that holds the CSS stylesheet. private CDATASection styleSheet; // Build the handler with a reference to the stylesheet section. public StyleSheetStyleHandler(CDATASection styleSheet) { this.styleSheet = styleSheet; } public void setStyle(Element element, Map styleMap, SVGGeneratorContext generatorContext) { Iterator iter = styleMap.keySet().iterator(); // Create a new class in the style sheet. String id = generatorContext.getIDGenerator().generateID("C"); styleSheet.appendData("."+ id +" {"); // Append each key/value pair. while (iter.hasNext()) { String key = (String) iter.next(); String value = (String) styleMap.get(key); styleSheet.appendData(key + ":" + value + ";"); } styleSheet.appendData("}\n"); // Reference the stylesheet class on the element to be styled. element.setAttributeNS(null, "class", id); } }

Then you can create and use an SVGGraphics2D with a correctly configured SVGGeneratorContext.

// Configure the SVGGraphics2D for a given Document myFactory. SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); CDATASection styleSheet = myFactory.createCDATASection(""); ctx.setStyleHandler(new StyleSheetStyleHandler(styleSheet)); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false); // Use the g2d to draw (e.g., component.paint(g2d)). // Add a stylesheet to the definition section. SVGSVGElement root = (SVGSVGElement) g2d.getRoot(); Element defs = root.getElementById(SVGSyntax.ID_PREFIX_GENERIC_DEFS); Element style = myFactory.createElementNS (SVGSyntax.SVG_NAMESPACE_URI, SVGSyntax.SVG_STYLE_TAG); style.setAttributeNS(null, SVGSyntax.SVG_TYPE_ATTRIBUTE, "text/css"); style.appendChild(styleSheet); defs.appendChild(style); // Dump the root content to a given Writer myWriter. g2d.stream(root, myWriter);
Extending Paint object to SVG element translation

The SVGGraphics2D is able to generate SVG elements for generic Java 2D objects, but you sometimes have your own classes such as implementations of the Java 2D Paint interface. In this case, you will need to write an ExtensionHandler that you will set on your SVGGeneratorContext.

In the following example we define the first draft of an ExtensionHandler allowing to translate a Batik implementation of the Paint interface named LinearGradientPaint.

class MyExtensionHandler extends DefaultExtensionHandler { public SVGPaintDescriptor handlePaint(Paint paint, SVGGeneratorContext generatorCtx) { if (paint instanceof LinearGradientPaint) { LinearGradientPaint gradient = (LinearGradientPaint) paint; // Create a new SVG 'linearGradient' element to represent the // LinearGradientPaint being used. String id = generatorCtx.getIDGenerator().generateID("gradient"); Document doc = generatorCtx.getDOMFactory(); Element grad = doc.createElementNS (SVGSyntax.SVG_NAMESPACE_URI, SVGSyntax.SVG_LINEAR_GRADIENT_TAG); // Set the relevant attributes on the 'linearGradient' element. grad.setAttributeNS(null, SVGSyntax.SVG_ID_ATTRIBUTE, id); grad.setAttributeNS(null, SVGSyntax.SVG_GRADIENT_UNITS_ATTRIBUTE, SVGSyntax.SVG_USER_SPACE_ON_USE_VALUE); Point2D pt = gradient.getStartPoint(); grad.setAttributeNS(null, "x1", pt.getX()); grad.setAttributeNS(null, "y1", pt.getY()); pt = gradient.getEndPoint(); grad.setAttributeNS(null, "x2", pt.getX()); grad.setAttributeNS(null, "y2", pt.getY()); switch (gradient.getCycleMethod()) { case MultipleGradientPaint.REFLECT: grad.setAttributeNS (null, SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE, SVGSyntax.SVG_REFLECT_VALUE); break; case MultipleGradientPaint.REPEAT: grad.setAttributeNS (null, SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE, SVGSyntax.SVG_REPEAT_VALUE); break; // 'pad' is the default... } // Here we should write the transform of the gradient // in the transform attribute... // Here we should write the stops of the gradients as // children elements... return new SVGPaintDescriptor ("url(#" + ref + ")", SVGSyntax.SVG_OPAQUE_VALUE, grad); } else { // Let the default mechanism do its job. return null; } } }

You should then set it on the SVGGeneratorContext by using the setExtensionHandler method.

SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory); ctx.setExtensionHandler(new MyExtensionHandler()); SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);
How to view the generated SVG document

The following code example illustrates how to view the SVG content generated by an SVGGraphics2D object.

import java.awt.*; import java.awt.geom.*; import javax.swing.*; import org.apache.batik.swing.*; import org.apache.batik.svggen.*; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.*; import org.w3c.dom.svg.*; public class ViewGeneratedSVGDemo { public static void main(String[] args) { // Create an SVG document. DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; SVGDocument doc = (SVGDocument) impl.createDocument(svgNS, "svg", null); // Create a converter for this document. SVGGraphics2D g = new SVGGraphics2D(doc); // Do some drawing. Shape circle = new Ellipse2D.Double(0, 0, 50, 50); g.setPaint(Color.red); g.fill(circle); g.translate(60, 0); g.setPaint(Color.green); g.fill(circle); g.translate(60, 0); g.setPaint(Color.blue); g.fill(circle); g.setSVGCanvasSize(new Dimension(180, 50)); // Populate the document root with the generated SVG content. Element root = doc.getDocumentElement(); g.getRoot(root); // Display the document. JSVGCanvas canvas = new JSVGCanvas(); JFrame f = new JFrame(); f.getContentPane().add(canvas); canvas.setSVGDocument(doc); f.pack(); f.setVisible(true); } }
batik-1.9.orig/documentation-sources/content/xdocs/using/extending.xml0000644000175000017500000010710513063003361025715 0ustar mans0954mans0954
Extending Batik

This page provides an overview of the built in extension mechanisms of Batik. As an open source project, people can of course make any extension they feel is interesting, however Batik has been designed with several forms of extension in mind.

In general, extensions are added through the Service Provider Interface mechanism as described in the jar file documentation. This allows for the extension of Batik simply by adding a new jar file(s) to the class path, and thus no modification of the Batik source is required!

If you feel that the Batik team has overlooked an important area for extension please let your feelings be known on the mailing lists.
Custom XML elements

First one must ask what it means to support custom XML elements? There are three basic options Batik considers:

Having your elements appear in the DOM tree

As long as your custom elements are well formed XML they will appear in the SVG DOM tree. When rendering Batik will skip branches of the tree that use elements it doesn’t know about (so even if standard SVG elements are child nodes they will not be displayed). Note that you must make use of XML namespaces for your personal elements even if you are not planning on validating the XML.

This can be useful if you want to add extra pieces of data into the standard SVG drawing. These might be annotations, or other application specific data. In general this wouldn’t be particularly useful with squiggle (the SVG browser) or the rasterizer, but might be very useful if you were writing a custom browser, rasterizer, or pre/post processing tools.

Adding functionality to your custom element DOM objects

If you need your elements to use a custom element subclass in the DOM tree (for behavioral or performance reasons) then you need to provide an extension to the Batik DOM.

Doing this gives you the opportunity to override the standard methods on DOM elements, or to provide additional methods to your DOM elements. For example, you may wish to add specialized get and set methods for attributes on your custom elements, so that they can be manipulated more easily than just using the string-based getAttribute and setAttribute methods provided by DOM Core.

Having your custom elements be rendered

Probably the most common reason to develop custom elements is to add new rendering primitives to the SVG language. In this case you must provide an extension to the Batik bridge. The bridge extension is resposible for constructing the class(es) that will handle the rendering of the new primitive in Batik.

In most cases it will also be necessary to write a DOM extension to make the element behave like other SVG elements (most notably for support of styling).

Writing a Batik DOM extension

The ability to extend the elements used in the SVG DOM tree allows users to provide implementations for nodes that can be used in place of Batik’s default implementation of a node. This may be done for a variety of reasons, but is most commonly done to extend the behavior of standard node calls (such as to include styling in attribute lookup), or to implement the DOM interface for an element.

The key class for building the DOM tree is org.apache.batik.dom.ExtensibleSVGDOMImplementation. When an instance of this class is constructed it searches for instances of the org.apache.batik.dom.svg.DomExtension Service Provider Interface. It then calls the registerTags method, passing itself as the only parameter. This method typically would typically call registerCustomElementFactory for each element that it wishes to handle.

With Batik the most likely reason to extend a node is to provide proper CSS styling of the node attributes. To this end Batik provides a class you can extend: org.apache.batik.extension.PrefixableStylableExtensionElement. If you derive a new DOM class from this class you are only required to implement three methods: getLocalName, getNamespaceURI, and newNode (plus constructors). If all you want is proper style support (commonly the case) then you are done implementing your element at this point.

The distribution comes with a number of examples:

  • org.apache.batik.extension.svg.BatikStarElement
  • org.apache.batik.extension.svg.BatikRegularPolygonElement
  • org.apache.batik.extension.svg.BatikHistogramNormalizationElement
  • org.apache.batik.extension.svg.SolidColorElement
  • org.apache.batik.extension.svg.ColorSwitchElement

Included with these examples is org.apache.batik.extension.svg.BatikDomExtension, which is the required instance of DomExtension used to register the elements with the ExtensibleSVGDOMImplementation.

If your new element requires new “presentation attributes” (XML attributes that can be modified through CSS, or, depending on your viewpoint, the other way around—CSS properties that can be specified using XML attributes), you will also need to extend the CSS engine. This can be done by registering a custom CSS value factory. Both of the color examples do this (see BatikDomExtension).

Writing a Batik bridge extension

Before you write a bridge extension it may be useful to understand what role the bridge package plays in Batik. The bridge package is responsible for creating and maintaining elements in the Graphics Vector Toolkit (GVT) tree based on the corresponding element in the SVG DOM. This is done because, for a variety of reasons, the SVG DOM is not well suited for rendering, thus the GVT tree is used for all rendering and transcoding operations.

The key class for managing this link is the BridgeContext. This class maintains an association between a element name with namespace and a particular bridge instance that will handle it. The work of constructing the proper entity or entities in the GVT tree is then deferred to the Bridge registered for a particular element. If no bridge is regiestered nothing is done.

New associations can be added by implementors of the BridgeExtension Service Provider Interface. This interface has a number of methods that provide information about the particular extension being registered (including contact information, and the list of implemented extensions). It also has a registerTags method which is responsible for registering the bridge instances with a BridgeContext. All the built-in bridges are bundled together with a BridgeExtension (the org.apache.batik.bridge.SVGBridgeExtension class), as are the example extensions (org.apache.batik.extension.svg), so these are both good places to start.

The Bridge interface itself is very simple. It only includes methods to get the namespace and local name of the element the bridge is responsible for. This interface is then extended for each of the major concepts present in SVG:

GraphicsNodeBridge

These are probably the most common SVG elements, as they represent graphic elements in the “visible” SVG tree. These are the elements most other bridges modify in some way (by clipping, masking, filtering, etc).

Example SVG elements: svg, g, path, rect.

Example extension bridges: BatikRegularPolygonElementBridge, BatikStarElementBridge.

FilterBridge

This handles the SVG filter element. If you wanted to implement a new element that could be referenced from the filter attribute on an SVG graphics node then you would need to subclass this bridge. However, adding new types of filters to the existing SVG filter element is accomplished via the FilterPrimitiveBridge.

Example SVG element: filter

FilterPrimitiveBridge

This constructs an element in the filter chain applied to an SVG graphics node.

Example SVG elements: feBlend, feCompose, feGaussianBlur.

Example extension bridge: BatikHistogramNormalizationElementBridge

PaintBridge

This constructs a Java Paint object to be used in filling or stroking graphic elements.

Example SVG elements: gradient, pattern.

Example extension bridge: ColorSwitchBridge.

ClipBridge

This constructs a ClipRable to apply to a graphics node. This provides a path that data is clipped to.

Example SVG element: clipPath.

MarkerBridge

This constructs a Marker for annotating the path of a graphics node.

Example SVG element: marker.

MaskBridge

This constructs a mask filter to apply to a graphics node. Mask filters typically modify the alpha channel of the graphics node output to make portions fully or partially transparent that wouldn’t be otherwise.

Example SVG element: mask.

Extension writers are free to work with any of the above bridges, however the three most common are likely to be the GraphicsNodeBridge, the FilterPrimitiveBridge, and the PaintBridge (each of which has example extensions available for inspection). Each of these interfaces has several very useful subclasses that handle much of the common behavior among elements.

In some simple cases it is possible to provide only an extension to the bridge and achieve your desired effect, however in most cases you will find that for your element to behave like a normal SVG element (for example, to support styling) you will need to provide a DOM extension as well.

GraphicsNodeBridge

The graphics node bridge is oriented around constructing a new GraphicsNode in the GVT tree. The GraphicsNode is the basic object that makes up the GVT tree. Each GraphicsNode has a paint method that is responsible for painting the object (including considering clipping, masking, filtering, and opacity for the node).

If you want to you can implement the GraphicsNodeBridge interface directly, or you can subclass the AbstractGraphicsNodeBridge class. This gives you the most flexibility since you can construct your new subclass of GraphicsNode, where you can implement the paint method to do essentially anything you want. This is quite involved, however, and the steps necessary to create a full GraphicsNodeBridge are not detailed here.

However, if you just want to generate a custom filled or stroked shape the easiest way is to subclass one of the following two classes. In this case you are essentially only responsible for constructing a standard Java Shape object to describe the desired area to operate on:

SVGShapeElementBridge

Subclasses of this class only need to implement buildShape, getNamespaceURI, and getLocalName. buildShape generally constructs a Shape object and sets it on the provided shapeNode object, however it may adjust other features of the given shape node.

SVGDecoratedShapeElementBridge

This is very similar to SVGShapeElementBridge, except that it also handles the standard marker properties. Markers will be placed at the end of each segment of the path that describes the shape.

If you decide that you need to implement a new subclass of GraphicsNode it is strongly suggested that you extend AbstractGraphicsNode, as this class does much of the work to behave like other rendered elements in SVG (like clipping, filtering and masking). In this case you implement the primitivePaint method instead of the paint method.

FilterPrimitiveBridge

The FilterPrimitiveBridge is concerned with the construction of individual elements of the filter chain. Unlike graphics nodes, which generally just draw new objects on top of the destination, filters take existing image data and modify it to apply effects.

This part of GVT rendering is based on the Java2D java.awt.image.renderable.RenderableImage and java.awt.image.RenderedImage interfaces. These provide a convenient framework to handle image processing (an inherently resolution dependent operation) in the resolution independent system defined by SVG.

The org.apache.batik.ext.awt.image package hierarchy contains a large set of generally useful extensions to the core JDK classes and methods, that help to implement SVG-related graphics operations.

Note that the FilterPrimitiveBridge is invoked once for each reference to the filter element that the filter primitive is part of. So if a filter effect is used a half dozen times the createFilter method will be called a half dozen times, even though the element may only appear once in the file. This means that it is safe for the filters returned to be “fixed” for a particular GraphicsNode being filtered.

You will notice that Batik uses extended versions of the standard RenderableImage and RenderedImage interfaces to provide additional information about surrounding requirements for operations as well as a few convenience methods. These interfaces are called: org.apache.batik.ext.awt.image.renderable.Filter and org.apache.batik.ext.awt.image.rendered.CacheableRed. Batik contains simple wrapper classes that can take the default JDK RenderableImage and RenderedImage interfaces. Within the codebase the naming convention “Red” for classes implementing RenderedImage and “Rable” for classes implementing RenderableImage is commonly used (“Red” is to be pronounced like the color, and “Rable” is to be pronounced like “horrible” with a silent “h”).

The FilterPrimitiveBridge has only one method, createFilter, that must construct an instance of Filter to perform the required operation. This is still a fairly complex task given the general need to support accessing the various standard sources of image data. To this end there is a provided subclass, AbstractSVGFilterPrimitiveElementBridge, that provides convenience methods to handle many common tasks.

Generally the bulk of the work in writing a filter extension is the writing of the concrete Filter class, not tying it into the GVT tree. Batik does contain several base classes that make this processes a bit easier: org.apache.batik.ext.awt.image.renderable.AbstractRable, org.apache.batik.ext.awt.image.rendered.AbstractRed, and org.apache.batik.ext.awt.image.rendered.AbstractTiledRed, TiledRed ties into the Batik tile cache (use this with caution as it is a complex area of the Batik code).

The org.apache.batik.ext.awt.image.rendered and org.apache.batik.ext.awt.image.renderable packages contain quite a number of fairly general examples covering most common cases, please refer to them for more detail.

PaintBridge

The PaintBridge constructs an instance of java.awt.Paint to be used to fill or stroke shapes/text (part of the paint server architecture of SVG).

Like the filter primitive bridge, the PaintBridge is invoked for each reference to the paint. This makes it possible to customize the Paint returned for the particular element to be painted.

This is how gradients and patterns are implemented in Batik, so it is possible to construct rather complex paint effects through this mechanism.

For paints you are mostly on your own, because unlike the other cases there aren’t any really generally useful base classes to derive off, the closest is the AbstractSVGGradientElementBridge, which is used to handle most of the radial and linear gradient attributes.

The existing gradient paint implementations are in the org.apache.batik.ext.awt, and the pattern implementation is in org.apache.batik.gvt since it requires access to GVT internals.

New image file formats

When Batik encounters an image element and it determines the element does not reference an SVG file, it defers the loading of the referenced image to org.apache.batik.ext.awt.image.spi.ImageTagRegistry. This class maintains a list of RegistryEntrys, generally one for each format.

Since the formats supported natively by Batik are also implemented through this mechanism. The JPEGRegistryEntry and PNGRegistryEntry classes should be used as good references for extensions.

RegistryEntry

There are currently two flavors of RegistryEntry:

URLRegistryEntry

A URLRegistryEntry takes a ParsedURL and tries to decide if the URL is intended for it. This group of entries is mostly intended to handle alternate network protocols. It can also be useful for interfacing with libraries that want a URL instead of a stream.

StreamRegistryEntry

A StreamRegistryEntry works with a markable InputStream. This is the preferred form of registry entry as it generally avoids opening a potentially expensive connection multiple times, instead it opens the stream once and relies on mark and reset to allow entries to check the stream.

Helper classes

There exists quite a number of classes to assist in implementing a RegistryEntry. It is strongly recommended that you review these classes and make use of them where appropriate. They will likely save you time and improve the integration with Batik.

MagicNumberRegistryEntry

MagicNumberRegistryEntry is an abstract class that can handle the isCompatibleStream method for formats that make use of “magic numbers.” Magic numbers are a well known sequence of bytes at a well known offset in the file, that are commonly used to identify image file formats.

RedRable

RedRable takes any java.awt.image.RenderedImage and wraps it into a Filter (Batik’s subinterface of RenderableImage). This is very useful for single resolution file formats.

DeferRable

DeferRable allows one to load the image in a background thread, rather than hold up the construction of the GVT tree while reading the image (useful since reading the image is generally I/O bound, so it makes a good background task). This is used by most of the current image readers.

AbstractRable

AbstractRable is an abstract base class that makes it relatively easy to implement the Filter interface.

AbstractRed

AbstractRed is an abstract base class that makes it relatively easy to implement the CacheableRed interface (Batik's subclass of RenderedImage).

New URL protocols

For a variety of reasons (not the least of which is the heavy use of the data: URL protocol in SVG), several parts of Batik use a ParsedURL instead of the JDK’s java.net.URL class.

ParsedURL offers a few advantages over the JDK’s URL class. First, it is designed to make minimal use of exceptions, so it is possible to use it to parse a malformed URL and get “the good parts”. Second, it is extensible, so support for new URL protocols can be added, even those that change the normal parsing rules for URLs (such as our friend the data: protocol). Third, it can automatically check a when a stream can be opened for common compression types and decode them for you (this behavior can also be bypassed if needed).

The service class is org.apache.batik.util.ParsedURLProtocolHandler. This interface consists of three methods: one returns the protocol to be handled, one is for parsing an absolute URL string and one is for parsing relative URL strings. Both the parsing methods return an object of type ParsedURLData (the instance may of course be a subclass of ParsedURLData).

The ParsedURLData class holds all the data and implements all the stream handling commands for the ParsedURL class. This allows ParsedURLProtocolHandlers to return custom subclasses for particular protocols.

Additional script interpreters

While conforming SVG browsers need support only ECMAScript as a scripting language, Batik can support any scripting language given the right glue to connect it to the rest of the system.

Script interpreters are also handled via the Service Provider Interface, The interface that needs to be implemented to expose a new interpreter to Batik is InterpreterFactory. This class has two methods: getMimeType, which returns a string that specifies what script type this intepreter handles (specifically, what the type attribute of script elements must be for them to be handled by this intepreter), and createInterpreter, which creates an instance of the Interpreter interface.

Batik comes with implementations of Interpreter and IntepreterFactory to support TCL and Python script in SVG documents, if the Jacl and Jython distributions are installed, respectively. See the classes in the org.apache.batik.script.jacl and org.apache.batik.script.jython packages to guidance on how to implement the interpreter interfaces, and the installation notes on what jar files are needed for TCL and Python support.

batik-1.9.orig/documentation-sources/content/xdocs/using/index.xml0000644000175000017500000001103513063003362025034 0ustar mans0954mans0954
Using Batik

The Batik toolkit has a number of modules that can be used to provide SVG support to your application. This section includes resources for explaining how to use these modules.

Architecture

The architecture page gives an overview of how the various modules in Batik fit together.

Javadoc APIs

The Javadoc APIs document all of the classes packaged with Batik.

DOM API

The DOM API page explains how to use the DOM interfaces to create and render SVG documents.

Parsers

The Parsers page describes the parser classes that can be used for parsing the microsyntaxes of SVG (such as path data and transform lists).

Scripting

The scripting pages (Scriping with ECMAScript, Scripting with Java and Security) document how to programmatically manipulate SVG documents, and how script interpreters can be used and extended in Batik.

SVG generator

The SVG Generator page documents the SVGGraphics2D class, which can be used to construct SVG documents from Java2D drawing commands.

Swing components

The Swing components page describes the SVG canvas component, the primary method for displaying SVG content in Swing applications.

Transcoder API

The Transcoder API page explains how to use the transcoder classes to convert SVG content to other formats (raster or vector).

Extending Batik

The Extending Batik page lists the parts of the Batik API that are extensible and explains how to add functionality to the existing modules.

batik-1.9.orig/documentation-sources/content/xdocs/using/swing.xml0000644000175000017500000003160713063003362025063 0ustar mans0954mans0954
Batik Swing components

The goal of the Batik Swing component module is to provide a Swing component that can used to display SVG documents. With the JSVGCanvas class, you can easily display an SVG document (from a URI or a DOM tree) and allow the user to manipulate it, such as rotating, zooming, panning, selecting text or activating hyperlinks. First this document explains how to create a JSVGCanvas and integrate it in to a Swing application. Then, it descibes some advanced features such as the listener mechanism used to track all events that occurred while displaying or manipulating an SVG document.

Creating a JSVGCanvas

The following example illustrates how to create a JSVGCanvas, which is a Swing component that follows the Swing design rule. This means that the component is not thread safe and all operations on the component or the document it is displaying must be performed as described in the Swing tutorial. The JSVGCanvas is also a JavaBean, so it can be used in visual application builders.

If you try this example, do not forget to set your CLASSPATH so that it contains the Batik classes and resources, as well as Xerces (lib/xerces_2_5_0.jar) and the XML APIs jars (lib/xml-apis.jar and lib/xml-apis-ext.jar). import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.swing.gvt.GVTTreeRendererAdapter; import org.apache.batik.swing.gvt.GVTTreeRendererEvent; import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter; import org.apache.batik.swing.svg.SVGDocumentLoaderEvent; import org.apache.batik.swing.svg.GVTTreeBuilderAdapter; import org.apache.batik.swing.svg.GVTTreeBuilderEvent; public class SVGApplication { public static void main(String[] args) { // Create a new JFrame. JFrame f = new JFrame("Batik"); SVGApplication app = new SVGApplication(f); // Add components to the frame. f.getContentPane().add(app.createComponents()); // Display the frame. f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(400, 400); f.setVisible(true); } // The frame. protected JFrame frame; // The "Load" button, which displays up a file chooser upon clicking. protected JButton button = new JButton("Load..."); // The status label. protected JLabel label = new JLabel(); // The SVG canvas. protected JSVGCanvas svgCanvas = new JSVGCanvas(); public SVGApplication(JFrame f) { frame = f; } public JComponent createComponents() { // Create a panel and add the button, status label and the SVG canvas. final JPanel panel = new JPanel(new BorderLayout()); JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); p.add(button); p.add(label); panel.add("North", p); panel.add("Center", svgCanvas); // Set the button action. button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { JFileChooser fc = new JFileChooser("."); int choice = fc.showOpenDialog(panel); if (choice == JFileChooser.APPROVE_OPTION) { File f = fc.getSelectedFile(); try { svgCanvas.setURI(f.toURL().toString()); } catch (IOException ex) { ex.printStackTrace(); } } } }); // Set the JSVGCanvas listeners. svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() { public void documentLoadingStarted(SVGDocumentLoaderEvent e) { label.setText("Document Loading..."); } public void documentLoadingCompleted(SVGDocumentLoaderEvent e) { label.setText("Document Loaded."); } }); svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() { public void gvtBuildStarted(GVTTreeBuilderEvent e) { label.setText("Build Started..."); } public void gvtBuildCompleted(GVTTreeBuilderEvent e) { label.setText("Build Done."); frame.pack(); } }); svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() { public void gvtRenderingPrepare(GVTTreeRendererEvent e) { label.setText("Rendering Started..."); } public void gvtRenderingCompleted(GVTTreeRendererEvent e) { label.setText(""); } }); return panel; } }
Screenshot of the example SVGApplication program
Handling events

Each time you set a URI or an SVG DOM tree to be displayed in a JSVGCanvas (using the setURI or setSVGDocument method), the specified document is first parsed (in case of a URI), built, rendered and optionally updated. The proper way to be notified of these different phases is to implement a listener and attach it to the component. There are five types of listener:

SVGDocumentLoaderListener

The SVGDocumentLoaderListener provides a set of methods that can be used to track SVGDocumentLoaderEvent events. It describes the loading phase: contructing an SVG DOM tree using an SVG file.

GVTTreeBuilderListener

The GVTTreeBuilderListener provides a set of methods that can be used to track GVTTreeBuilderEvent events. It describes the building phase: contructing a GVT (Graphics Vector Toolkit) tree using an SVG DOM tree. The GVT tree will then be used to render the document.

SVGLoadEventDispatcherListener

The SVGLoadEventDispatcherListener provides a set of methods that can be used to track SVGLoadEventDispatcherEvent events. It describes the DOM SVGLoad event dispatch phase.

This event is triggered only in dynamic documents.

GVTTreeRendererListener

The GVTTreeRendererListener provides a set of methods that can be used to track GVTTreeRendererEvent events. It describes the rendering phase: constructing an image using a GVT tree.

In dynamic documents this event is fired only once for the initial rendering.

UpdateManagerListener

The UpdateManagerListener provides a set of methods that can be used to track UpdateManagerEvent events. It describes the running phase: the update manager is started and then it can be suspended, resumed or stopped, and graphics updates can be tracked.

This event is triggered only in dynamic documents.

These listeners give a complete description of the different steps of the five phases (including error states). Adapter classes are available to ease the creation of new listener implementation—SVGDocumentLoaderAdapter, GVTTreeBuilderListenerAdapter, SVGLoadEventDispatcherAdapter, GVTTreeRendererAdapter and UpdateManagerAdapter,

For static documents, you can assume that the JSVGCanvas has completed its job (parsing, building and rendering) when the gvtRenderingCompleted method call is called, following a setURI or a setSVGDocument method call.

In the case of dynamic documents, the end of the computation (parsing, building, SVGLoad dispatch, initial rendering and updates) is marked by a call to the updateManagerStopped method.

Adding an Interactor

The JSVGCanvas provides a set of build-in interactors that let the users manipulate the displayed document, including ones for zooming, panning and rotating. Interactors catch user input to the JSVGCanvas component and translate them into behaviour. If you want to add new behaviors to the JSVGCanvas, you can implement the Interactor interface. Then, you can register this new interactor to the component by adding an element to the List returned by the getInteractors() method of the canvas.

batik-1.9.orig/documentation-sources/content/xdocs/using/transcoder.xml0000644000175000017500000005266713063003362026111 0ustar mans0954mans0954
Transcoder API

The goal of the transcoder API (package org.apache.batik.transcoder) is to provide a generic API for transcoding an input to an output. First, this document explains the basic transcoder API that Transcoder, TranscoderInput and TranscoderOutput define, and thus all transcoders have in common. Next, it describes how to use the image transcoder API (package org.apache.batik.transcoder.image), which lets you rasterize an SVG document fragment to a raster image such as JPEG, PNG or TIFF.

The transcoder API

The org.apache.batik.transcoder package defines 5 major classes:

Transcoder

The Transcoder interface defines the interface that all transcoders implement. You can transcode a specific input using a specific output by invoking the transcode method. Although there is no assumption on the input and output format, a specific transcoder may or may not support a particular type of input or output. For example, the image transcoders accept an SVG Document, a Reader, an InputStream, or a URI as an input but only supports a byte stream for the output.

TranscoderInput

The TranscoderInput interface defines the input of a transcoder. There are various ways to create an input and the most common are already part of the API. The default implementation lets you create an input using a org.w3c.dom.Document, a Reader, an InputStream, a org.xml.sax.XMLReader, or a URI.

TranscoderOutput

The TranscoderOutput interface defines the output of a transcoder. There are various ways to create an output and the most commons are already part of the API. The default implementation lets you create an output using a Document, a Writer, an OutputStream, a XMLFilter, or a URI.

TranscodingHints

The TranscodingHints class contains different hints that can be used to control the various options or parameters of a transcoder. Each transcoder provides its own set of hints. A hint is specified by (key, value) pair. For example, the JPEGTranscoder provides a hint to control the encoding quality.

ErrorHandler

The ErrorHandler class provides a way to get any errors or warnings that might occur while transcoding. A default implementation is provided but you can, for example, implement your own handler that displays a dialog instead of stack trace.

How to use the image transcoder API

The org.apache.batik.transcoder.image package provides an easy way to transcode an SVG document to a raster image such as JPEG, PNG or TIFF. Additional raster image formats can be added by subclassing the ImageTranscoder class and implementing the writeImage method. Although, in next sections, the examples will use the JPEG transcoder, the PNG transcoder works the same way.

Creating an image

The following example, using the JPEGTranscoder, shows how to transform an SVG document to a JPEG image.

import java.io.*; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; public class SaveAsJPEG { public static void main(String[] args) throws Exception { // Create a JPEG transcoder JPEGTranscoder t = new JPEGTranscoder(); // Set the transcoding hints. t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); // Create the transcoder input. String svgURI = new File(args[0]).toURL().toString(); TranscoderInput input = new TranscoderInput(svgURI); // Create the transcoder output. OutputStream ostream = new FileOutputStream("out.jpg"); TranscoderOutput output = new TranscoderOutput(ostream); // Save the image. t.transcode(input, output); // Flush and close the stream. ostream.flush(); ostream.close(); System.exit(0); } }

The code creates a JPEGTranscoder and sets a transcoding hint. The hint indicates the encoding quality. Then, an input and an output are created. The input is created using the first command line argument, which should be a URI. The output is a byte stream for a file called out.jpg. Finally, the transcode method is invoked and the byte stream is closed.

Although not shown above, the program might have specified additional hints to indicate a user stylesheet, the preferred language of the document or the background color.

To try this program:

  1. Save the above program as SaveAsJPEG.java.

  2. Compile the program.

  3. Choose an SVG file to transcode, and perform the transcoding by running:

    java SaveAsJPEG filename.svg
  4. Inspect the output file out.jpg.

Defining the size of the image

By adding the following line of code to the previous example, you will specify the raster image size (in pixels). The transcoding hint KEY_WIDTH lets you specify the raster image width. If the raster image height is not provided (using the KEY_HEIGHT), the transcoder will compute the raster image height by keeping the aspect ratio of the SVG document.

t.addTranscodingHint(JPEGTranscoder.KEY_WIDTH, new Float(100));

The transcoder will have the same behavior if you specify the KEY_HEIGHT without initializing the KEY_WIDTH. In all cases (even if both keys are provided), the transcoder will preserve the apsect ratio of the SVG document.

Selecting an area of interest

The image transcoder lets you specify an area of interest (that is, a part of the SVG document). The key KEY_AOI allows you to select the region of the SVG document to render. The value of this key must be a java.awt.Rectangle specified in pixels, using the coordinate space of the SVG document. The following example shows how you can split an SVG document into 4 tiles.

import java.io.*; import java.awt.*; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; public class SaveAsJPEGTiles { JPEGTranscoder trans = new JPEGTranscoder(); public SaveAsJPEGTiles() { trans.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); } public void tile(String inputFilename, String outputFilename, Rectangle aoi) throws Exception { // Set hints to indicate the dimensions of the output image // and the input area of interest. trans.addTranscodingHint(JPEGTranscoder.KEY_WIDTH, new Float(aoi.width)); trans.addTranscodingHint(JPEGTranscoder.KEY_HEIGHT, new Float(aoi.height)); trans.addTranscodingHint(JPEGTranscoder.KEY_AOI, aoi); // Transcode the file. String svgURI = new File(inputFilename).toURL().toString(); TranscoderInput input = new TranscoderInput(svgURI); OutputStream ostream = new FileOutputStream(outputFilename); TranscoderOutput output = new TranscoderOutput(ostream); trans.transcode(input, output); // Flush and close the output. ostream.flush(); ostream.close(); } public static void main(String[] args) throws Exception { // Rasterize the samples/anne.svg document and save it // as four tiles. SaveAsJPEGTiles p = new SaveAsJPEGTiles(); String in = "samples/anne.svg"; int documentWidth = 450; int documentHeight = 500; int dw2 = documentWidth / 2; int dh2 = documentHeight / 2; p.tile(in, "tileTopLeft.jpg", new Rectangle(0, 0, dw2, dh2)); p.tile(in, "tileTopRight.jpg", new Rectangle(dw2, 0, dw2, dh2)); p.tile(in, "tileBottomLeft.jpg", new Rectangle(0, dh2, dw2, dh2)); p.tile(in, "tileBottomRight.jpg", new Rectangle(dw2, dh2, dw2, dh2)); System.exit(0); } }

This code splits the same document anne.svg into four tiles of the same size. Considering the document and its original size, we can determine four regions. Then we rasterize each region using the KEY_AOI key. Note that we also specify the image width and height to be the same as the area of interest width and height (so we keep a 1:1 zoom factor). You can of course use different values for the KEY_WIDTH and KEY_HEIGHT, that do not match the dimensions of the KEY_AOI key. In that case, first the area of interest will determine which part of the SVG document has to be rendered, then that part could be zoomed in or out depending on the specified raster image size.

To try this program:

  1. Save the above program as SaveAsJPEGTiles.java.

  2. Compile the program.

  3. Copy the samples/anne.svg document from the Batik distribution into the current directory.

  4. Run the program by typing:

    java SaveAsJPEGTiles
  5. Inspect the output files tileTopRight.jpg, tileTopRight.jpg, tileBottomRight.jpg and tileBottomLeft.jpg.

Other transcoding hints

The ImageTranscoder provides additional TranscodingHints that let you customize the generated images.

ImageTranscoder.KEY_MEDIA

This hint lets you choose the CSS medium to use. The author of the SVG document to transcode can control CSS media using the CSS media rule. For example:

trans.addTranscodingHint(ImageTranscoder.KEY_MEDIA, "print");
ImageTranscoder.KEY_ALTERNATE_STYLESHEET

This hint lets you choose an alternate stylesheet the author of the SVG document to transcode might have provided using the xml-stylesheet processing instruction. For exxample:

trans.addTranscodingHint(ImageTranscoder.KEY_ALTERNATE_STYLESHEET, alternateStylesheetName);
ImageTranscoder.KEY_USER_STYLESHEET_URI

This hint lets you use a user stylesheet. A user stylesheet can override some styles of the SVG document to transcode. For example:

trans.addTranscodingHint(ImageTranscoder.KEY_USER_STYLESHEET_URI, "http://...");
ImageTranscoder.KEY_PIXEL_TO_MM

This hint lets you use the pixel to millimeter conversion factor. This factor is used to determine how units are converted into pixels. For example:

// 96dpi trans.addTranscodingHint(ImageTranscoder.KEY_PIXEL_TO_MM, new Float(0.2645833f));

or

// 72pi trans.addTranscodingHint(ImageTranscoder.KEY_PIXEL_TO_MM, new Float(0.3528f));
ImageTranscoder.KEY_BACKGROUND_COLOR

This hint lets you choose a background color. For example:

trans.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, Color.white);
Generating an image from an SVG DOM tree

The following code creates and saves an SVG DOM tree to a raster image.

import java.io.*; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.DOMImplementation; public class DOMRasterizer { public Document createDocument() { // Create a new document. DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document document = impl.createDocument(svgNS, "svg", null); Element root = document.getDocumentElement(); root.setAttributeNS(null, "width", "450"); root.setAttributeNS(null, "height", "500"); // Add some content to the document. Element e; e = document.createElementNS(svgNS, "rect"); e.setAttributeNS(null, "x", "10"); e.setAttributeNS(null, "y", "10"); e.setAttributeNS(null, "width", "200"); e.setAttributeNS(null, "height", "300"); e.setAttributeNS(null, "style", "fill:red;stroke:black;stroke-width:4"); root.appendChild(e); e = document.createElementNS(svgNS, "circle"); e.setAttributeNS(null, "cx", "225"); e.setAttributeNS(null, "cy", "250"); e.setAttributeNS(null, "r", "100"); e.setAttributeNS(null, "style", "fill:green;fill-opacity:.5"); root.appendChild(e); return document; } public void save(Document document) throws Exception { // Create a JPEGTranscoder and set its quality hint. JPEGTranscoder t = new JPEGTranscoder(); t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); // Set the transcoder input and output. TranscoderInput input = new TranscoderInput(document); OutputStream ostream = new FileOutputStream("out.jpg"); TranscoderOutput output = new TranscoderOutput(ostream); // Perform the transcoding. t.transcode(input, output); ostream.flush(); ostream.close(); } public static void main(String[] args) throws Exception { // Runs the example. DOMRasterizer rasterizer = new DOMRasterizer(); Document document = rasterizer.createDocument(); rasterizer.save(document); System.exit(0); } }

This code is divided into two distinct parts.

Creating an SVG DOM tree

See the createDocument method.

Three steps are required at this time. The first step is to get the Batik SVG DOM implementation (via the SVGDOMImplementation class). Then, you can create a org.w3c.dom.Document (which also implements the SVGDocument interface) by invoking the createDocument method with the SVG namespace URI and the svg document element name. Finally, you can get the document element and start building your DOM tree.

Rasterizing the DOM

See the save method.

Similar to the previous examples, you can transcode an SVG document to a raster image by creating a TranscoderInput, but passing to it the SVG Document this time.

To try this example:

  1. Save the code as DOMRasterizer.java.

  2. Compile the program.

  3. Run it, by typingL

    java DOMRasterizer
  4. Inspect the output file out.jpg.

batik-1.9.orig/documentation-sources/content/xdocs/site.xml0000644000175000017500000001350313063003361023545 0ustar mans0954mans0954 " " batik-1.9.orig/documentation-sources/content/xdocs/demo.xml0000644000175000017500000001074513063003361023532 0ustar mans0954mans0954
Batik Demo

This page demonstrates the use of Batik’s JSVGCanvas swing component in a Java applet.

[Your browser doesn’t seem to support Java applets, which is required for this demo.]
ExpenseAmount
Shoe
Car
Travel
Computer

The applet (view source) displays the barChart.svg sample from the Batik distribution using a JSVGCanvas. Script in the web page then interacts with the applet, by calling the updateBar method of the applet object when the Update chart button is pressed. This method modifies the SVG document being displayed to update the heights of the bars.

batik-1.9.orig/documentation-sources/content/xdocs/status.xml0000644000175000017500000054252413063003361024136 0ustar mans0954mans0954
Batik implementation status

This page details information about Batik’s implementation of the SVG 1.1 and related specifications. The features of the implementation are annotated with their level of support, which can be at one of three levels:

Not supported

If a feature is not supported, this means that Batik performs no useful processing for it. This feature could be silently ignored or an exception might be thrown when trying to use it.

Partially supported

If a feature is partially suppored, this means that Batik performs some processing for it, but there are known bugs with this processing.

Fully supported

If a feature is fully supported, this means that Batik performs the correct processing for it, as detailed in the relevant specification.

Note that the information on this page is based on the code in the Subversion repository trunk.

Elements, attributes and properties

The table below lists the SVG elements and the attributes and properties on them that are supported by Batik. For an element to be fully supported, its attributes and the properties that apply to it must also be fully supported. If an attribute of the element or a property that applies to the element is only partially supported or is not supported, the element can be at most partially supported. An element is not supported if it is not processed by Batik, even if some of its attributes are supported (such as the core attributes id or xml:base).

Note that all presentation attributes are supported on all stylable elements. These attributes are not listed in the table. Only those properties that apply to a given element are listed.

While target is not supported, new windows can be opened with xlink:show="new". [1] [1] URI references to animation elements will not trigger the animation when the link is activated. [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [2] [2] [2] [2] [2] [2] [2] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] Author specified path length is ignored. [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] The :hover, :link, :visited, :active and :focus pseudo-classes are not supported in selectors. text/css is always the default style type. The event listener is added, but the error event is never fired by the implementation. Attribute not animatable. align is always used. exact is always used. [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] No highlighting is performed.

Notes:

  1. Values for the XLink attributes other than xlink:href that are not those required by SVG are ignored. For example, setting xlink:title="Something" or xlink:actuate="other" has no effect.

  2. glyphRef elements can reference glyphs only by URI, not by font properties.

DOM interfaces

The table below lists the SVG DOM interfaces that are supported by Batik. For each interface, the name of each IDL attribute and operation introduced on the interface is given, along with its level of support. For cases where the implementation of an attribute or operation introduced in a superinterface may differ depending on which subinterface has inherited it, this is noted next to that attribute or operation. Both the ECMAScript and Java bindings have the same implementation level as specified for the IDL interfaces in the table.

Implemented for <svg> elements. No objects implement this interface. Not implemented for any SVGPoint in an SVGPointList.
ECMAScript objects

In addition to the host objects exposed to ECMAScript that implement the SVG DOM, the following objects are also available.

The current SVG document.

The most recently dispatched event object.

An alias for event.

Implementation of the Location interface. Methods assign and reload are available.

This interface is available since version 1.8.

The global object (a self-reference).

Displays an alert dialog with the specified message.

Displays a confirmation dialog with the specified message. The window has an OK and a Cancel button. The function returns true if the user clicks on the OK button, and false otherwise.

Displays an input dialog with the specified message. The defaultValue parameter specifies the initial contents of the text box in the window. The function returns the string entered by the user, or null if the window was cancelled.

Evaluates the given script repeatedly after the specified amount of time. The value for script must be either a string, which is evaluated by eval every interval, or an ECMAScript function object, which is called every interval. This method does not stall the script: the evaluation is scheduled and the script continues its execution. The function returns an object that can be passed to the clearInterval function.

Cancels an interval that was set by a call to setInterval. The intervalID must be an object that has been returned by a previous setInterval call.

Evaluates the given script after the specified amount of time. The value for script must be either a string, which is evaluated by eval after the timeout, or an ECMAScript function object, which is called after the timeout. This method does not stall the script: the evaluation is scheduled and the script continues its execution. The function returns an object that can be passed to the clearInterval function. The function returns an object that can be passed to the clearTimeout function.

Cancels a timeout that was set by a call to setTimeout. The timeoutID must be an object that has been returned by a previous clearTimeout call.

Returns a string that is the serialization of the given DOM node.

Parses and returns a DocumentFragment object. text is the string that is to be parsed as XML data, and document is a Document that will be used for creating new DOM objects.

Gets data from the given uri. This method returns immediately and the given function is called when the data is fully downloaded. The optional encoding argument is the encoding to assume the data is in, defaulting to UTF-8. The argument passed to the function is an object with three properties:

success
true if the data is available, false otherwise.
contentType
The content type of the data, if it is known by the implementation.
content
A string holding the data.

Sends data to the given uri. This method returns immediately and the given function is called when the data is fully downloaded. The optional type argument will specify the Content-Type HTTP header to use, defaulting to text/plain. The optional encoding argument is the encoding to assume the data is in, defaulting to UTF-8. The argument passed to the function is an object with three properties:

success
true if the data is available, false otherwise.
contentType
The content type of the data, if it is known by the implementation.
content
A string holding the data.
SVG 1.1 test suite

The table below lists the test cases from the December 2006 release of the SVG 1.1 test suite and whether the latest Batik code in the Subversion repository passes each one.

Performing interpolating animation of paths between an absolute and a corresponding relative path command (e.g. from "M0,0 L10,10" to "M0,0 l10,20") is not supported. Performing interpolating animation of colors to or from the currentColor keyword is not supported. Font glyph selection based on certain properties is not supported. Test is incorrect. The target attribute of the a element is ignored. Animation of gradients do not affect referencing elements. The :hover, :link, :visited, :active and :focus pseudo-classes are not supported in selectors.
batik-1.9.orig/documentation-sources/content/xdocs/uses.xml0000644000175000017500000001542313063003361023563 0ustar mans0954mans0954
Projects using Batik
Examples of projects and products using Batik

While it is hard to track projects and products which are using Batik, here are a few that are known of:

  • The Apache Cocoon project uses Batik to rasterize SVG images.
  • The Apache FOP project uses Batik to handle SVG images. It uses the SVG rasterizer and extends the Batik transcoder architecture to offer SVG to PDF conversion.
  • eDoc Studio, a page layout package, uses the Batik SVG generator to export pages to SVG.
  • ElixirTech’s ElixirReport uses Batik for charting and for its SVG component.
  • GLIPS Graffiti is an Open Source Extensible Full Feature Native SVG Editor.
  • ILOG Discovery Preview, a free visual data analysis tool letting you visualize and edit data sets in a very wide variety of views (2D graphs and charts, various kinds of treemaps, parallel coordinates, parallel histograms and much more), uses the Batik SVG export module.
  • ILOG JViews Component Suite, a product for advanced visualization, uses and extends the Batik SVG export module.
  • The JFreeChart Project uses Batik to export charts in the SVG format.
  • Lagoon, an XML-based framework for web site maintenance, uses the Batik SVG Rasterizer to render SVG as bitmap graphics for web publishing.
  • Lords Map is a program to allow players and visitors to view the current map of various campaigns. Lords Map uses Batik’s SVG DOM and SVG Generator.
  • Luxor XUL is a free, open-source XML User Interface Language (XUL) toolkit in Java released under the GNU GPL that supports hand-picked Mozilla XUL goodies and also includes a ultra-lightweight, multi-threaded web server, a portal engine, a scripting engine, a template engine and much more. Gerard Bauer, the Luxor project lead, has written an extensive SVG presentation.
  • OptimalJ, a UML Class Diagram Editor for NetBeans, uses Batik to export SVG.
  • Oracle Corp.’s JDeveloper10i uses Batik to export class diagrams in SVG. It uses the SVG export module.
  • Sketsa is a vector drawing application based on Batik. With Sketsa, you can create vector graphics that can be scaled and printed at any resolution, without losing detail or clarity.
  • Svolgo, a Graph Visualisation/Transformation Framework for the Semantic Web Cross-model transformation, node and arc diagrams, representation in SVG. This project uses Batik’s SVG DOM implementation.
  • Volity is an open platform for Internet-based multiplayer casual gaming. Its official client, Gamut, uses Batik, allowing developers to create game UI files that use ECMAScript-driven SVG.
  • XML_svg2image is a PHP class which translates SVG files to PNG or JPEG using Batik.
  • XWeb, a tool to create websites automatically out of XML input. Uses the Batik SVG Rasterizer.
batik-1.9.orig/documentation-sources/content/xdocs/favicon.ico0000644000175000017500000000137613063003360024204 0ustar mans0954mans0954 ( @ݐ ]D@ DIDL DِDِ DِDMٙ DِDMٙ Dݙ MٙDݙ Dݐ DݙMM;=XX?????batik-1.9.orig/documentation-sources/content/xdocs/dev/0000755000175000017500000000000013153020772022640 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/dev/svg12.xml0000644000175000017500000003027413063003362024326 0ustar mans0954mans0954
SVG 1.2 support

This page details information atbout Batik’s implementation of features from SVG 1.2, Tiny and Full. Note that the information on this page is based on the code in the Subversion repository trunk.

DOM Level 3

DOM Level 3 Core, Events and XPath are all supported. These features are available regardless of whether the document has version="1.1" or version="1.2" set on the root svg element.

There are a few issues with the DOM Level 3 Core implementation:

  1. The Document.compareDocumentPosition method does not give the correct result when used on DTD notation or entity nodes in the document.
  2. Node.renameNode always creates a new node and replaces the old node with it. This is technically allowed, but sub-optimal.
  3. XML Schema information is never used. Batik does not implement XML Schema, so any methods or attributes that would utilise or expose schema information (such as the schemaTypeInfo attribute on the Attr and Element interfaces) do not do so.
  4. Document.normalizeDocument ignores the "entities" parameter in the document’s DOMConfiguration.
Using DOM Level 3 functionality from Java

JREs before 1.5 include the DOM Level 2 interfaces and this can cause problems when trying to use the DOM Level 3 versions of these same interface files (org.w3c.dom.*). Though the concrete Batik DOM classes implement the DOM Level 3 functionality, you won’t be able to access those methods through the org.w3c.dom interfaces on these earlier JREs.

There are two ways to overcome this problem. The first is to install the DOM Level 3 interfaces using the Endorsed Standards Override Mechanism. Copy the file lib/xml-apis-ext.jar into the endorsed standards override directory and the DOM Level 3 interfaces will be visible. You can then write code against them (for example, call Document.renameNode directly). However, this will mean that other people cannot run or compile your code unless they have JRE 1.5 or later, or they have also installed the xml-apis-ext.jar in the same way.

The second method, which requires less messing about with the JRE, is to cast your DOM objects to the concrete Batik DOM objects and call your DOM Level 3 methods directly on them. The Batik DOM classes are in the org.apache.batik.dom package. The classes named Abstract* implement the DOM interfaces, and also contain the DOM Level 3 methods. The advantage of this method is that for your code to compile and run in others’ environments, they need not install any jars with the endorsed standards overrides.

Here is an example of using the second method to get access to DOM Level 3 specific methods:

import org.apache.batik.dom.AbstractDocument; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; public class C { public void f() { // Create a new SVG document DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null); // Create a 'g' element and append it to the root 'svg' element Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g"); doc.getDocumentElement().appendChild(e); // Cast the document object to org.apache.batik.dom.AbstractDocument, // so that DOM 3 methods will be guaranteed to be visible AbstractDocument document = (AbstractDocument) doc; // Now a DOM 3 method can be used document.renameNode(e, "http://www.w3.org/2000/svg", "text"); } }

For cases where the DOM Level 3 versions of these interfaces contain constants that you wish to use, the constants have been copied into the Batik DOM classes. For example:

import org.apache.batik.dom.AbstractNode; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; public class C { public void f() { // Create a new SVG document DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null); // Create a 'g' element and append it to the root 'svg' element Element svg = doc.getDocumentElement(); Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g"); svg.appendChild(e); AbstractNode n1 = (AbstractNode) svg; AbstractNode n2 = (AbstractNode) e; int position = n1.compareDocumentPosition(n2); if (position == AbstractNode.DOCUMENT_POSITION_PRECEDING | AbstractNode.DOCUMENT_POSITION_CONTAINS) { System.out.println("The svg element contains the g element."); } else { System.out.println("Something is wrong!"); } } }

Note that using these org.apache.batik.dom interfaces is only needed for the DOM Level 3 Core and Events interfaces. There were no earlier versions of the DOM XPath interfaces to conflict with, so these can be used directly (org.w3c.dom.xpath).

Of course, none of this matters if you are just using the DOM 3 functionality in ECMAScript, as the matter of interfaces is hidden from the scripting environment.

XML Binding Language for SVG (sXBL)

sXBL is supported in documents with version="1.2". However, the following issues exist:

  1. sXBL cannot be used for SVG resources or visual effects.
  2. The traitDef element is not implemented.
  3. The handling of CSS is probably not quite correct.

Two content selector languages are supported: XPath 1.0 Patterns and the drastically reduced XPath subset. XPath Patterns is the default language. To change the language used to the XPath subset, put an attribute batik:selectorLanguage="XPathSubset" on the xbl:content element or on the svg document element. (The batik extension namespace prefix should be declared with xmlns:batik="http://xml.apache.org/batik/ext".)

Note that sXBL is likely to be dropped in favor of XBL 2.0 in SVG 1.2 Full.

Flowing text and graphics

The flowRoot, flowRegion, flowDiv, flowPara, flowSpan, flowRegionBreak and flowLine elements from SVG 1.2 Full’s Flowing Text and Graphics chapter are supported in documents with version="1.2".

The more recent SVG 1.2 Tiny draft specifies a different syntax for (a more restricted version of) flowing text, and the full flowing text syntax is therefore likely to change.

Other SVG 1.2 features

The following other features from SVG 1.2 are supported:

batik-1.9.orig/documentation-sources/content/xdocs/dev/test.xml0000644000175000017500000006320613063003361024343 0ustar mans0954mans0954
Test infrastructure

This document describes the Batik test infrastructure whose goals are to:

  • make it easy to detect regressions,
  • make it easy to run test suites, and
  • make it easy to write new tests and add them to an existing test suite.

The intent for the test infrastructure is that it grows along with Batik and keeps monitoring the health of the code base.

While the test suites in the infrastructure will be run every day by build/test machines, they are also intended to help the commiters and developers get confident that their code modifications did not introduce regressions.

The test infrastructure
High-level interfaces

The following are the high level interfaces in the infrastructure.

Test

A Test is performing whatever check is needed in its run method, and each run produces a TestReport.

TestReport

A TestReport describes whether a Test run passed or failed and provides a description of the failure in terms of an error code (unique in the context of a given Test) and a set of key/value pairs.

TestSuite

A TestSuite is a test aggregation which can run a set of Test instances.

TestReportProcessor

A TestReportProcessor is used to analyze a TestReport. A specific implementation can choose to create graphs, send an email or write an HTML file.

Default implementations

The test infrastructure comes with a number of default implementations for the interfaces described above. Specifically:

AbstractTest

This implementation of the Test interface is intended to make it easier to write a “safe” Test implementation. See the Writing new tests section for a description of how to use that class.

DefaultTestReport

This class provides a simple implementation of the TestReport interface that most Test implementations will be able to use. See the Writing new tests section for more details.

DefaultTestSuite

This class provides an implementation of the TestSuite interface and makes it easy to aggregate Test instances.

SimpleTestReportProcessor

This class is a sample TestReportProcessor implementation that simply traces the content of a TestReport to an output stream.

TestReportMailer

This is another implementation of the TestReportProcessor interface that emails a test report to a list of destination e-mail addresses.

XML implementations

The test infrastructure is using XML-out (and XML-in too, see the Running a test suite section) as a favorite way to generate test reports. The XMLTestReportProcessor implementation of the TestReportProcessor interface. It outputs reports in XML in a configurable directory.

The XMLTestReportProcessor can notify an XMLReportConsumer when it has created a new report. There is one implementation of that interface that can run an XSL stylesheet on the XML report (e.g., to generate an HTML report), called XSLXMLReportConsumer. This is used by the regard rule in the Batik build to produce an HTML report for the default regression test suite.

Managing test suites

The infrastructure is designed to make it easy to create, update and modify test suites. This section describes how to describe a set of tests to be run and how to actually run that test suite.

Describing a test suite

Test suites can be described in XML (XML-in refered to earlier in this document). The general format for describing a test suite is:

]]>

Note that tests can be grouped in testGroup elements, which can have their own id and class attributes. This is useful because it allows developers to run specific tests or test groups by specifying their IDs. In addition, because the class attribute is inherited by a test element from its parent, testGroups allow the developers to group tests which use the same class and specify that class on the group.

Test instances listed in a test suite can have arguments passed to them, as defined by the test class. These arguments are passed in using arg child elements.

The following example shows a test suite with two tests:

]]>
Running a test suite

Yet another XML file describes which test to run and how to process the generated test reports. The general syntax is something like:

]]>

testRun elements can be nested. In a nutshell, you can specify a set of TestReportProcessors which should process the TestReport generated by the TestSuite built from the list of Test instances described in the files referenced by the testSuite elements.

For example:

]]>

There is a rule in Batik's build.xml file to run a test suite defined in an XML file as the one above. At the command line, type the following, for Windows:

build runtestsuite path/to/my/newly/created/testSuite.xml

and for Unix:

build.sh runtestsuite path/to/my/newly/created/testSuite.xml

In addition, the regard rule runs a specific set of tests by default, so that you do not need to pass any testRun file argument.

regard is the project’s safeguard against regressions.

regard: the Batik regression test suite

The regard test suite contains all the regression tests for the Batik project. The regard tool is a specific test suite description, regard.xml (which you can find in the test-resources/org/apache/batik/test directory). That file contains a set of test suite files which sould be run.

The following describes how to use the regard tool and some of the most important tests in the regard test suite.

Running regard

The regard tool lets you run either all the tests or any specific test you want in the test suite. To run all the tests in the regard test suite, type the following at the command line, for Windows:

build regard

and for Unix:

build.sh regard

To run a specific test in the test suite, type the qualified test ID or any substring of that ID:

build.sh regard id-list

For example:

build.sh regard unitTesting.ts batikFX.svg

will run all the tests with an ID containing unitTesting.ts (i.e., all the test selection unit testing, see test-resources/org/apache/batik/gvt/unitTesting.xml) and the accuracy rendering test on batikFX.svg (because it is the only test with batikFX.svg in its ID).

Rendering accuracy tests

There is a Test implementation, SVGRenderingAccuracyTest, which checks that Batik’s rendering of an SVG document stays accurate. It compares reference images with the rendering Batik produces and reports any discrepency.

An SVGRenderingAccuracyTest’s constructor configuration is made of:

  • the URL to the SVG it should render, and
  • the URL to a reference PNG file.

The default behavior for the test is to render the SVG into a PNG file and compare with the reference image. If there is no difference, the test passes. Otherwise, it fails.

In addition to this default behavior, the SVGRenderingAccuracyTest can take an optional configuration parameter, an image URL defined as an “accepted” variation around the reference image. If such a variation image is specified, then the test will pass if:

  • the rasterized SVG is equal to the reference image, or
  • the difference between the rasterized SVG and the reference image is exactly the same as the accepted variation image.

Finally, to ease the process of creating “accepted” variation images, SVGRenderingAccuracyTest can take an optional file name (called saveVariation) describing where the variation between the rasterized SVG and the reference image will be stored in case the rasterized SVG is different from the reference image and the difference is not equal to the variation image, if any was defined. That way, it becomes possible to run a test, and if that test fails, the developer can review the saveVariation image and decide whether it is an acceptable variation or not and use it in subsequent test run as the “accepted” variation image, which will allow the test to pass if that exact same variation remains constant.

Day to day use of regard
Initial set up

To set up the test environment the first time, you need to:

  • check out the latest version of the code, including the test-* directories (sources, resources and references) and the build.xml file, and
  • run the regard test suite once: build regard

This will generate an HTML test report (report.html) in the test-reports/yyyy.mm.dd-HHhMMmSSs/html directory. Depending on how much different text rendering is between your work environment and the environment used to create the reference images, you will get more or less test that will fail, because of differences in the way text is rendered on various platforms and because of fonts not being available on some platforms. For example, a running the test on a Windows 2000 laptop against images generated on the Solaris platform caused 16 tests out of 71 to fail.

Review the HTML report to make sure that the differences are really due to text variations. This will usually be the case and you can make sure by clicking on the diff images contained in the report to see them at full scale. You can you can then turn the “candidate” variations generated by the test into “accepted” variations by moving files from one directory to another:

mv test-references/samples/candidate-variations/*.png test-references/samples/accepted-variations/*.png mv test-references/samples/tests/candidate-variations/*.png test-references/samples/tests/accepted-variations/*.png

You can now run the test again:

build regard

Check the newly generated HTML report in the test-reports/html directory: there should no longer be any test failure.

Daily usage

Once the intial set up has been done, you can use regard by simply updating your SVN copy, including the test-references. If no change occurs, your test will keep passing with your reference images. If a test fails (e.g., if someone checks in a new reference image from a platform different than the one you are using, you will have to check if it is because of system specific reasons or if there is a bigger problem.

SVG generator tests

Regard contains over 100 tests for checking regressions on the SVG generator. If you use svggen as an argument to regard, all the SVG generator tests will be run (because regard.xml points to test-resources/org/apache/batik/svggen/regsvggen.xml, which is a test suite description for the SVG generator and that file’s root testSuite element has the “svggen” ID).

Writing new tests

Writing a new test involves either configuring a new test or writing a new Test class. In both cases, you will need to add an entry to a test suite’s XML description. This section uses two test suites as an example: the “regard” test suite to show how to configure a new test and the “unitTests” test suite to show how to add a new Test implementation.

Adding a new test configuration

Imagine that you add a cool new test case to the samples directory, such as linking-viewBox.svg. In order to check for regressions on that file you can add the following entry:

]]>

to the test-resources/org/apache/batik/test/samplesRendering.xml test suite description, the description of the regard test suite. If you have access to the build machine where the reference images are typically generated, you can check 0n the reference image in test-references/samples/tests. Otherwise (and this is OK), you can let the test fail the first time it is run on the build/test machine and that will be a reminder for whoever is responsible for that machine that a valid reference image should be checked in.

Writing a new test

Imagine you want to validate some aspect of your code, and let's take the bridge error handling as an example. You could create a new class in the test-sources directory, in test-sources/org/apache/batik/bridge in our example, and let's call it ErrorHandlingTest. To simplify the implementation of the Test interface, you can choose to derive from the AbstractTest class and generate a DefaultTestReport.

While writing the Test you may want to use your own XML file with just your test, for example:

]]>

This is just an example and does not pretend to be the right way to go about implementing or specifying this specific type of test. Once done with tuning the test, one or multiple configurations for the test can be added to the relevant test suite’s XML description. In some cases, it will be interesting to create a separate test suite.

batik-1.9.orig/documentation-sources/content/xdocs/dev/index.xml0000644000175000017500000000450213063003361024465 0ustar mans0954mans0954
Batik Development

This section has information on the working on Batik, and on the features that are supported by the code in the Subversion repository that haven’t yet made it to a release.

Branches

The branches page lists the branches of development that are in the Subversion repository and their purpose.

SVG 1.2 support

Some features of SVG 1.2 Tiny and Full are supported in the trunk, and these are listed on the SVG 1.2 support page.

Test infrastructure

Finally, there is a description of Regard, the test infrastructure used to test Batik functionality and avoid regressions.

batik-1.9.orig/documentation-sources/content/xdocs/dev/branches.xml0000644000175000017500000000635713063003361025155 0ustar mans0954mans0954
Subversion repository branches

This page contains information on the current work that is being done in Batik’s Subversion repository. There are currently three main branches in use in the repository:

trunk

The trunk is the main development branch. All bug fixes and most new non-experimental features are checked in to this branch. While it is the bleeding edge of the available Batik code, it is generally stable enough to use. For more information on SVG 1.2 features that are supported by the trunk, see the SVG 1.2 support page.

webapi

The webapi branch is where some experimental support for some of the work being produced by the Web API WG (specifically, support for XMLHttpRequest and the Window object). When the specifications and the implementation mature enough, the code will be folded back into the trunk.

svg11

The svg11 branch contains the code that was the trunk before the old svg12 branch became the trunk. Bug fixes that are made on the trunk are also ported to the svg11 branch. This branch will be deprecated at some point in the future.

batik-1.9.orig/documentation-sources/content/xdocs/tools/0000755000175000017500000000000013153020772023222 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/xdocs/tools/rasterizer.xml0000644000175000017500000005633613063003361026146 0ustar mans0954mans0954
SVG Rasterizer

This page describes the features of the SVG Rasterizer utility that comes with the Batik distribution. The SVG Rasterizer is a utility that can convert SVG files to a raster format. The tool can convert individual files or sets of files, making it easy to convert entire directories of SVG files. The provided formats are JPEG, PNG and TIFF, however the design allows new formats to be added easily. In addition, the rasterizer can (despite its name) transcode to PDF.

Downloading the rasterizer

Refer to the install page and the download area to find out what to download and how to install it. Remember that you can get either the source or binary distribution.

Rasterizing one or several SVG files

The method for starting the rasterizer depends on the distribution of Batik that you chose to download. The following describes how to start the viewer for each distribution.

Using the binary distribution

If you downloaded the binary distribution of Batik, you should have a file called batik-1.6.zip (or similar), and, after expanding that file, a jar file called batik-rasterizer.jar. To start the rasterizer, open a console, go to the directory where you expanded the distribution (and where batik-rasterizer.jar is located) and simply type the following at the command prompt:

java -jar batik-rasterizer.jar FILES

For example, if you type:

java -jar batik-rasterizer.jar samples/batikFX.svg

you will see the following printout:

Converting file: samples/BatikFX.svg to samples/BatikFX.png

Once the conversion is complete, you will find a batikFX.png file in the samples directory.

You can pass options on the command line:

java -jar batik-rasterizer.jar [OPTIONS] FILES

where, as options:

-d dir|file

specifies the output directory, or the output file if there is only a single input file,

-m mime-type

specifies the output MIME type, which should be one of image/png, image/jpeg, image/tiff or application/pdf,

-w width

specifies the output width as a floating point value,

-h height

specifies the output height as a floating point value,

-maxw width

specifies the maximum output width as a floating point value,

-maxh height

specifies the maximum output height as a floating point value,

-a x,y,width,height

specifies the area of interest (as floating point values) of the SVG file to rasterize (and if not specified, will be determined by the width/height/viewBox attributes if specified in the document, and be 0,0,400,400 otherwise),

-bg alpha.red.green.blue

specifies the background fill color as an ARGB quadruple, where each component is an integer in the range 0—255,

-cssMedia media

specifies the CSS media type used for matching CSS rules,

-cssAlternate file|uri

specifies the CSS alternate stylesheet to use,

-cssUser file|uri

specifies the CSS user stylesheet to use in addition to any other referenced or embedded stylesheets,

-font-family defaultFontFamily

specifies default font family to be used when none is specified,

-lang language-code

specifies the RFC 3066 language code to use,

-q quality

specifies the quality of the output image, as a floating point number in the range 0 < quality < 1 when generating JPEG images,

-indexed 1|2|4|8

specifies the number of bits per pixel of the output image, using an adaptive pallete, resulting in an indexed image when generating PNG images,

-dpi resolution

specifies the resolution of the output image in dots per inch,

-validate

specifies that the source SVG files must be validated against their DTDs,

-onload

specifies that the SVG files should be rasterized after dispatching the SVG load event,

-snapshotTime

specifies the document time that should be seeked to before rasterizing the document, implying -onload,

-scriptSecurityOff

specifies that any security checks on the scripts running as a result of dispatching the SVG load event will be bypassed,

-anyScriptOrigin

specifies that scripts can be loaded from any location, while by default they can only be loaded from the same location as the document, and

-scripts allowed-script-types

specifies a list of script types (i.e., values for the type attribute on script elements) that should be loaded.

For example:

java -jar batik-rasterizer.jar -d myDir -m image/jpeg samples/*.svg

will generate JPEG images for all the SVG files found in the samples directory.

Using the source distribution

If you downloaded the source distribution of Batik, you got a zip or tar file that expanded into a directory called xml-batik or batik-version. In that directory, you can find build scripts for the platform you are running on. For example, there is a build.bat script for users of the Windows platform and there is a build.sh script for UNIX users.

To start the rasterizer you should:

  • Make sure that your JAVA_HOME environment variable is set to your JDK installation directory.
  • Open a command line window and go to the xml-batik or batik-version directory where the Batik distribution was expanded.
  • For windows, type the following at the command prompt:

    build svgrasterizer

    and for Unix:

    ./build.sh svgrasterizer

    This will print out a help message for the rasterizer.

You can pass options to the rasterizer as follows, for Windows:

build svgrasterizer [OPTIONS] FILES

and for Unix:

./build.sh svgrasterizer [OPTIONS] FILES

Refer to “Using the binary distribution” for an explanation of the options.

Rasterizer Ant task

The Rasterizer task is an Ant version of the rasterizer utility. It fulfills the same basic purpose as the utility but has a different syntax and a slightly different set of features.

The task is able to produce four raster formats: PNG, JPEG, TIFF and PDF.

Using the rasterizer task

The first thing to do is to compile rasterizer task classes. Download the source distribution of Batik and see the README file in the contrib/rasterizertask directory for more instructions. The build procedure works the same way as when building Batik itself.

After building, ensure that the generated batik-rasterizer.jar and the classes (or jar file) of the rasterizer task are in your CLASSPATH.

Next you have to define the task in your Ant project. To do this, add the following line either after the project start tag or after the target start tag in the target you are using the rasterizer task:

<taskdef name="rasterize" classname="org.apache.tools.ant.taskdefs.optional.RasterizerTask"/>

Now you can use the rasterizer task in your project. See the parameters section for an explanation of the available parameters or the examples section to see few usage examples.

Parameters of the Ant task

The following table lists the attributes that may be specified on the rasterize task element.

Attribute Description Required
result Sets the type of the result image. Only one of the following values must be used: image/png, image/jpeg, image/tiff and application/pdf. The value must be in lowercase letters. Yes
height Sets the height of the result image in pixels. The task calculates the height from the SVG file if this parameter has not been set. The rasterizer keeps the aspect ratio of the SVG file even if the both height and width have been set. No
width Sets the width of the result image in pixels. The task calculates the width from the SVG file if this parameter has not been set. The rasterizer keeps the aspect ratio of the SVG file even if the both height and width have been set. No
maxheight Sets the maximum height of the result image in pixels. The image won’t be higher than defined in this parameter, regardless of the size set in the image itself or in other parameters. This is a floating point value. No
maxwidth Sets the maximum width of the result image in pixels. The image won’t be wider than defined in this parameter, regardless of the size set in the image itself or in other parameters. This is a floating point value. No
quality Sets the quality of the produced image. The value must be greater than 0 but smaller than 1, larger numbers meaning higher quality. The quality value is used only with JPEG images. The default quality value is 0.99. No
area Defines the area in the SVG file which will be rasterized. Parts outside this area are discarded and don’t show in the result image. The area attribute value has four integers separated by commas. The first two integers set the x and y coordinates of the upper left corner of the area, respectively. The last two integers set the width and height of the area, respectively. For example, 10, 20, 100, 200 sets the rectangular area from point 10, 10 to point 110, 220. The specified area is applied to all images if more than one file is rasterized during one task. No
bg Sets the background color of the result image. The bg attribute value is either three or four integers separated with commas. The four values are alpha channel, red, green, and blue, respectively. If only three values are given, then the values are red, green, and blue and the alpha channel is automatically set to 255 (opaque). All values have to between 0 and 255. The default value is none which means that background is transparent and not filled with any color. No
media CSS media type that is used to select a CSS stylesheet. The selected stylesheet is then used to rasterize the SVG files. Only the visual media group is supported (see the CSS2 specification for more information about media groups). The default value is screen. No
dpi Resolution for the result image. The attribute value is used to compute the “pixel to millimeter” ratio used when processing SVG files. The default value is 96. No
lang Language which is used select language specific areas from the SVG file during the rasterizing process. The valid values are defined in RFC3066. The default value is en. No
src Name of a one input file. Use this parameter to convert just one file whose name and location are known. The dest parameter must also be given. One of the following is required: src attribute, srcdir attribute or fileset element(s).
dest Name of a one output file. Used this with src parameter only. The output directory is created if it doesn’t exist. Required if src is used.
srcdir Name of the input directory. srcdir and fileset elements can be combined and srcdir can be omitted if there is at least one fileset child element. srcdir file selection can be controlled with include, exclude, etc. child elements. Note that without control parameters the task tries to rasterize all files in the given directory. One of the following is required: src attribute, srcdir attribute or fileset element(s).
destdir Name of an output directory. Use this with the srcdir attribute or fileset elements. The task generates the names of the output images by changing the suffix of the input file names to correspond the result image type. A suffix is added if the input file doesn’t have one. Output directories are created if they don’t exist. Required if srcdir attribute or fileset elements are used.
classname Class name of the XML parser used to parse SVG images. The value can be either the complete classname with package information included or the special name jaxp, which means any available parser in the CLASSPATH that supports JAXP. See the Batik code for the default value. No

You can use fileset elements to select input files and directories. See the Ant documentation to learn how to use filesets.

Examples of using the rasterizer task

The following example is the complete Ant project that converts an SVG image (called input.svg) to a PNG image (called output.png):

]]>

The next example is just one task in a project. It converts all files with a .svg suffix in the images directory and all files in the images2 directory to TIFF images. The resulting image files are placed in the results directory.

]]>
batik-1.9.orig/documentation-sources/content/xdocs/tools/browser.xml0000644000175000017500000006060113063003361025425 0ustar mans0954mans0954
Squiggle, the SVG Browser

This page describes the main features of Squiggle, the SVG browser that comes with Batik.

Downloading the browser

Refer to the download page to find out how to download Batik. Refer to the installation page for instructions on how to install the Batik download on your system.

Starting the browser

The method for starting the browser depends on the distribution of Batik that you chose to download. The following describes how to start the browser for each distribution (binary and source).

Starting the browser for the binary distribution

If you downloaded the binary distribution of Batik, you should have a file called batik-1.6.zip (or similar), which, when expanded, created a batik-squiggle.jar file. To start the browser, type the following on the command line:

cd installation-directory java -jar batik-squiggle.jar

You can pass options on the command line:

java -jar batik-squiggle.jar [-font-size font-size] [URIs]

where:

-font-size font-size

specifies the font size to use in windows and menus, and

[URIs]

specifies the URIs for the SVG documents the browser should open when it starts.

For example:

java -jar batik-squiggle.jar -font-size 10

starts the browser with a small widget text font size, and:

java -jar batik-squiggle.jar -font-size 10 samples/batikLogo.svg

starts the browser with the batikLogo.svg file open and uses a small widget text font size.

If you are using Mac OS X, and you have generated the Squiggle application bundle, you can use its icon to start the browser. This is the preferred way to start the browser under Mac OS X, as it ensures better integration with the operating system (a nicer looking menu and dock icon).

Starting the browser for the source distribution

If you downloaded the source distribution of Batik, you should have a zip file called batik-src-1.6.zip (or similar) that expanded into a directory called xml-batik or batik-version. In that directory, you can find build scripts for the platform you are running on. For example, there is a build.bat script for users of the Windows platform and there is a build.sh script for UNIX users.

To start the browser you should:

  • Make sure that your JAVA_HOME environment variable is set to your JDK installation directory
  • Open a command line window and change to the xml-batik or batik-version directory where the Batik distribution was expanded
  • For Windows, type the following at the command prompt:

    build squiggle

    and for Unix and Mac OS X:

    ./build.sh squiggle

    This will start the browser.

You can pass options to the browser as follows, for Windows:

build squiggle [-font-size font-size] [URIs]

and for Unix:

./build.sh squiggle [-font-size font-size] [URIs]

Refer to “Starting the browser for the binary distribution” for an explanation of these options.

Note that the number of files that can be opened on Windows from the command line is limited because batch files take at most 9 parameters.

Squiggle screenshot

The following image shows the result of starting the browser, from the binary or source distribution, with the -font-size 10 samples/batikFX.svg options.

Screenshot of Squiggle showing the batikFX.svg sample
Viewing SVG documents

The browser has several features to view and browse SVG documents:

Opening a local SVG file

In situations where you want to open SVG files locally on the machine where you are running Squiggle, you can use File→Open File menu item to open that file, or use the Ctrl-F key accelerator. Doing so brings up a file chooser that lets you select the file you want to view.

Screenshot of Squiggle showing the 'File→Open' menu and file chooser
Opening an SVG file from the web

There are many situations where the SVG content you want to view is not local to the machine where Squiggle is running. In that case, you can use the File→Open Location menu item, or use the Ctrl-A key accelerator to open that page. Doing so brings up a dialog box where you can type in the URL for the file you want to view.

Screenshot of Squiggle showing the 'File→Open Location' menu and window
Using the location bar text field to view an SVG file

When you know the URL of the document you want to view, you can enter it directly in the location bar text field at the top of Squiggle, the same way you can enter a URL in an HTML browser.

Screenshot of Squiggle showing the location bar
Browsing SVG files

As with HTML content, it is common to navigate back and forth between SVG files (remember that SVG files contain hyperlinks, just like HTML does) and, as described later in this document, it is possible to zoom into SVG documents, pan and rotate.

Screnshot of Squiggle showing the 'Go' menu

Squiggle offers multiple features to help you browse SVG files:

Navigating between files

The Go→Back menu item (or the Ctrl-left arrow keyboard accelerator) and the Go→Forward menu item (or the Ctrl-right arrow keyboard accelerator) let you move to the previous and next visited SVG documents.

History

The Go menu also contains a list of previously viewed SVG documents, which gives you a way to randomly access any document you have already visited.

Navigating between views

The View→Previous Transform menu item (Ctrl-K) and the View→Next Transform menu item (Ctrl-L) let you go to the previous or next view of the document. This is useful when, for example, you pan or rotate the document and want to go back to the previous view you had of the document (i.e., before you panned or rotated it).

Viewing multiple SVG files
Screenshot of Squiggle with two windows open

Squiggle can display multiple files simultaneously in different windows. To view a new file in a separate window, simply select the File→New Window menu item or use the Ctrl-N keyboard accelerator.

Reloading an SVG document

When working on an SVG document, you may want the browser to reprocess a document that you have modified. The File→Reload Document menu item or the Ctrl-R keyboard accelerator will cause the document to be reprocessed by the browser.

Exporting and printing SVG documents

The File→Print menu item or Ctrl-P will print the currently displayed SVG document.

The File→Export As menu item offers the option to export the currently displayed SVG document to various raster formats. Currently, the browser supports the PNG, JPEG and TIFF formats.

Inspecting the SVG source

The browser offers two ways to inspect the source of an SVG document: viewing the plain source or viewing the document tree. Both are explained below.

Viewing the source
Screenshot of Squiggle showing the 'View→View Source' menu item and the source window

When the browser displays an SVG file, you can select the View→View Source... menu item or use the Ctrl-U keyboard accelerator to view the source code.

Viewing the document tree
Screenshot of Squiggle showing the 'View→DOM Viewer...' menu item and the DOM viewer window

When the browser displays an SVG file, you can select the View→DOM Viewer... menu item or use the Ctrl-D keyboard accelerator to open a window that shows the SVG document in the form of a tree. The window lets you navigate the tree, select individual elements, such as a path elements, and view the attributes and CSS values that apply to these elements. While the View Source window shows the SVG source as it was when it was loaded, the DOM Viewer window reflects the current state of the document, including any modifications that have occurred due to script.

Configuring Squiggle

The Edit→Preferences menu item or Ctrl-G brings up the dialog box shown in the following figure.

Screenshot of Squiggle with the Preferences window open

This dialog contains several types of options, which can be selected with the left-hand side list. For each type of option, a panel lets you configure various browser parameters:

General panel

This panel lets you choose some optional behavior:

Enable double buffering
When on, the browser uses additional memory resources which improves the quality of effects such as zooming and panning.
Show Rendering
When on, the browser will update the canvas while processing an SVG document. This turns on progressive rendering.
Automatically resize window to document size
When on, the browser window is resized to fit any newly loaded document.
Animation rate limiting
This set of radio buttons determines how often animation updates are performed. This can be set as a maximum percentage of CPU time to use, a maximum number of frames per second, or to perform as many updates as possible (unlimited).
Print debugging information to console
When on, some debug messages will be printed to the standard output. This is will likely interest only developers.
Use a validating XML parser
When on, the XML parser used to load documents will be in validating mode. This means that the document will be validated against the DTD when it is loaded, and external DTD subsets will be fetched.
Security panel

This panel has options relating to the script and resource access in documents.

Language panel

This is the panel shown in the above figure. That panel lets you select your languages. The user language can be used in SVG documents to choose between alternate contents. For example, open the samples/moonPhases.svg example. Then, change the user language to French and reload the document (Ctrl-R). You will see that the text is now displayed in French. You can do the same with Japanese and the text will be shown in Japanese.

Stylesheet panel
This panel lets you specify a user stylesheet which can override some of the default settings in viewed SVG documents. This might be useful if you want, for example, to override the font size used in text elements.
Network panel

This panel lets you configure the proxy server to use if you are working from behind a firewall.

Navigating SVG documents: zooming, panning, rotating, transform and thumbnail

The Batik browser offers multiple way to navigate SVG documents:

Zooming in and out

There are several methods to zoom in or out an SVG document:

  • You can select the View→Zoom In or View→Zoom Out menu item.
  • You can click on the Zoom In/Out tool bar buttons (the ones that show a magnifying glass with +/- signs).
  • You can use the Ctrl+I and Ctrl+O keyboard accelerators.
  • If the mouse is over the document in the display area, you can press the Ctrl key then click the left mouse button and drag to select the area of interest in the document. This can only be used to zoom into a document.
  • If the mouse is over the document in the display area, you can press the Shift key then click the right mouse button and drag it. This is called the real time zoom and can be used both for zooming in and out.
Screenshot of Squiggle showing the Zoom In and Zoom Out menu items and tool bar buttons
Screenshot of Squiggle zooming to an area of interest
Panning a document

Some documents are too big to fit into the browser, especially when you zoom in with a large zoom factor. In these circumstances, it is useful to be able to move around the document and pan to view different parts of the documents. Again, there are multiple ways to do this:

  • With the mouse cursor over the SVG document, press the Shift key and then click and drag the left mouse button to a new location. When you release the mouse, the document will be translated to the new mouse location.
  • If you have the thumbnail open, you can select the marker showing the current area of interest and move it to the desired location.
Screenshot of Squiggle illustrating the panning gesture
Rotating a document

It is sometimes useful to be able to rotate a document (maps for example). You can do this in the Batik browser by first pressing the Ctrl key and then clicking and dragging the right mouse button to a new location. The browser will dynamically rotate the image as you move your cursor. When you are satisfied with that angle, you can release the mouse button and the document will be displayed with that new angle.

Using the Transform dialog

While the mouse and keyboard interactions give interactive way to navigate an SVG document, it is sometimes desirable to be able to define precisely the amount of zoom, pan or rotation desired. The Transform dialog, available through the View→Transform menu (Ctrl-E) offers that feature.

Thumbnail

Panning in the document window can be difficult after you have zoomed into a document because you cannot see the whole document. Panning on large documents (or with a large zoom factor) is made easy by the thumbnail that you can bring up through the View→Thumbnail menu item or the Ctrl-Y keyboard accelerator. The thumbnail shows a rectangular marker that represents the “Area of Interest”, i.e., the region currently displayed in the window (the visible portion of the document). You can drag out a rectangular marker with the left mouse button pushed down to select a new area of interest which will then be shown in the main window.

Screenshot of Squiggle showing the Thumbnail window
batik-1.9.orig/documentation-sources/content/xdocs/tools/index.xml0000644000175000017500000000627713063003362025063 0ustar mans0954mans0954
About the tools

The Batik distribution contains several pre-packaged demos:

Squiggle SVG Browser

The Squiggle SVG Browser lets you view SVG file, zoom, pan and rotate in the content and select text items in the image and much more.

SVG Rasterizer

The SVG Rasterizer is a utility that can convert SVG files to a raster format. The tool can convert individual files or sets of files, making it easy to convert entire directories of SVG files. The supported formats are JPEG, PNG, and TIFF, however the design allows new formats to be added easily. In addition (and despite the name) the rasterizer tool can also convert SVG files into PDF.

SVG Font Converter

The SVG Font Converter lets developers convert character ranges from the True Type Font format to the SVG Font format to embed in SVG documents. This allows SVG document to be fully self-contained and have their rendered identically on all systems.

SVG Pretty Printer

The SVG Pretty Printer lets developers “pretty-up” their SVG files and get their tabulations and other cosmetic parameters in order. It can also be used to modify the DOCTYPE declaration on SVG files.

batik-1.9.orig/documentation-sources/content/xdocs/tools/font-converter.xml0000644000175000017500000001222013063003361026707 0ustar mans0954mans0954
SVG Font Converter

The TrueType Font to SVG (ttf2svg) application lets you convert a range of characters from a TrueType Font into the SVG font format.

Running the font converter

If you are using the Batik binary distribution, type the following at the command line:

java -jar batik-ttf2svg.jar OPTIONS

If you are using the Batik source distribution, type the following at the command line:

build ttf2svg OPTIONS

In both cases, the options are the same:

ttf-path [-l range-begin] [-h range-end] [-autorange] [-ascii] [-id id] [-o output-path] [-testcard]

where:

ttf-path

specifies the TrueType Font file containing the characters to be converted,

-l range-begin -h range-end

specifies the range of characters (by codepoint, in decimal) to be converted,

-autorange

automatically determines the available character range, instead of using the default, ASCII printable characters (ranging from 32 to 126),

-ascii

forces usage of the ASCII character map in the font, instead of the Unicode character map,

-id id

specifies the value for the id attribute of the generated font element,

-o output-path

specifies the pathname of the output SVG document containing the generated SVG font, and

-testcard

specifies that a sequence of SVG text elements should be appended to the output SVG file to test the characters in the SVG font, providing an easy way to validate that generated SVG font visually.

For example:

java -jar batik-ttf2svg.jar /usr/home/myFont.ttf -l 48 -h 57 -id MySVGFont -o mySVGFont.svg -testcard

will convert characters 48 to 57, i.e., '0' to '9', in the myFont.ttf file into their SVG equivalent in the mySVGFont.svg file, appending a test card so that the font can be visualized.

Use cases

The TrueType Font converter application is helpful to be able to embed font definitions in SVG files. This will ensure that the SVG document will look exactly the same on all platform by not relying on system fonts.

Note that users of the tool should make sure that they have the right to embed the font before embedding it in an SVG file and should refer to the font license for information. Note that TrueType Font files contain a flag that defines the “embeddability” of a font and there are tools for checking that flag.

batik-1.9.orig/documentation-sources/content/xdocs/tools/pretty-printer.xml0000644000175000017500000001671213063003362026757 0ustar mans0954mans0954
SVG Pretty Printer

This page describes the features of the SVG pretty printer utility that comes with the Batik distribution. The SVG pretty printer is a utility that can format SVG files. The tool formats an SVG document according to the arguments passed on the command line.

Downloading the pretty printer

Refer to the install page and the download page to find out what to download and how to download it. Remember that you can get either the source or binary distribution.

Pretty printing an SVG file

The method for starting the pretty-printer depends on the distribution of Batik that you chose to download. The following describes how to run the pretty printer for each distribution.

Using the binary distribution

If you downloaded the binary distribution of Batik, you should have a file called batik-1.6.zip (or similar), and, after expanding that file, a jar file called batik-svgpp.jar. To start the pretty printer, open a console, change to the directory where you expanded the distribution (and where batik-svgpp.jar is located) and simply type the following at the command prompt:

java -jar batik-svgpp.jar [OPTIONS] FILES

For example, if you type:

java -jar batik-svgpp.jar samples/batikFX.svg

you will see the indented document written to standard output.

For the options:

-newline cr|cr-lf|lf

specifies the newline character(s) generated in the printed document, the default being lf (Unix-style newlines),

-tab-width number

specifies the tabulation width, the default being 4,

-doc-width number

specifies the maximum number of columns for the whole document, the default being 80,

-no-format

specifies that the current indentation should be preserved, useful for performing doctype or newline substitutions,

-xml-decl string

specifies the XML declaration,

-doctype change|remove

specifies whether the doctype should be changed or removed,

-publid-id string

specifies the public ID to in the doctype declaration, when -doctype change is specified, and

-system-id string

specifies the system ID to in the doctype declaration, when -doctype change is specified.

For example:

java -jar batik-svgpp.jar -tab-width 2 -newline cr-lf src.svg dest.svg

will format src.svg and write it to dest.svg using a tabulation width of 2 and Windows-style newlines, and:

java -jar batik-svgpp.jar -no-format -doctype change -public-id "-//W3C//DTD SVG 1.1//EN" \ -system-id "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" src.svg dest.svg

will format src.svg and write it to dest.svg unchanged, except for the doctype public and system IDs, which will be replaced by those specified.

Using the source distribution

If you downloaded the source distribution of Batik, you will have a zip or tar file that expanded into a directory called xml-batik or batik-version. In that directory, you can find build scripts for the platform you are running on. For example, there is a build.bat script for users of the Windows platform and there is a build.sh script for UNIX users.

To start the pretty printer you should:

  • Make sure that your JAVA_HOME environment variable is set to your JDK installation directory.

  • Open a command line window and go to the xml-batik or batik-version directory where the Batik distribution was expanded.

  • For windows, type the following at the command prompt:

    build svgpp

    and for Unix:

    ./build.sh svgpp

    This will print out a help message for the pretty printer.

You can pass options to the rasterizer as follows, for Windows:

build svgpp [OPTIONS] FILES

and for Unix:

./build.sh svgpp [OPTIONS] FILES

Refer to “Using the binary distribution” for an explanation of these options.

batik-1.9.orig/documentation-sources/content/xdocs/index.xml0000644000175000017500000002123213063003362023707 0ustar mans0954mans0954
Batik SVG Toolkit
Overview

Batik is a Java-based toolkit for applications or applets that want to use images in the Scalable Vector Graphics (SVG) format for various purposes, such as display, generation or manipulation.

The project’s ambition is to give developers a set of core modules that can be used together or individually to support specific SVG solutions. Examples of modules are the SVG Parser, the SVG Generator and the SVG DOM. Another ambition for the Batik project is to make it highly extensible—for example, Batik allows the developer to handle custom SVG elements. Even though the goal of the project is to provide a set of core modules, one of the deliverables is a full fledged SVG browser implementation which validates the various modules and their inter-operability.

What Batik can be used for

Batik use cases With Batik, you can manipulate SVG documents anywhere Java is available. You can also use the various Batik modules to generate, manipulate and transcode SVG images in your applications or applets.

Batik makes it easy for Java based applications or applets to deal with SVG content. For example, using Batik’s SVG generator module, a Java application or applet can very easily export its graphics into the SVG format. Using Batik’s SVG viewing component, an application or applet can very easily integrate SVG viewing and interaction capabilities. Another possibility is to use Batik’s modules to convert SVG to various formats, such as raster images (JPEG, PNG or TIFF) or other vector formats (EPS or PDF, the latter two due to the transcoders provided by Apache FOP).

The Batik toolkit includes the following:

Modules

Tools and applications

See examples of projects and products using Batik for real-life example of how Batik is already integrated in projects and products.

The SVG specification

Scalable Vector Graphics, SVG, is a W3C Recommendation. It defines an XML grammar for rich 2D graphics which includes features such as transparency, arbitrary geometry, filter effects (shadows, lighting effects, etc.), scripting and animation.

The SVG specification states:

This specification defines the features and syntax for Scalable Vector Graphics (SVG). SVG is a language for describing two-dimensional graphics in XML [XML10]. SVG allows for three types of graphic objects: vector graphic shapes (e.g., paths consisting of straight lines and curves), images and text. Graphical objects can be grouped, styled, transformed and composited into previously rendered objects. The feature set includes nested transformations, clipping paths, alpha masks, filter effects and template objects.

SVG documents can be interactive and dynamic. Animations can be defined and triggered either declaratively (i.e., by embedding SVG animation elements in SVG content) or via scripting.

Implementation status

The latest revision of Batik, release 1.7, is a conformant static SVG implementation and supports interactivity, linking and scripting features of the SVG specification. This release supports a nearly complete implementation of declarative animation, too.

See the status page for a detailed description of the set of SVG features Batik supports.

Download Batik

You can get the Batik distribution, source and binary, from the download page.

All other libraries needed by Batik are included in the distribution. As a consequence the Batik archive is quite big, but after you have downloaded it, you will not need anything else.

This is a warning that a script security issue was reported in the Batik Squiggle browser. Squiggle uses the Rhino scripting engine and some features of that engine can be leveraged by malicious scripts to gain access to otherwise protected resources (like the file system). This issue was fixed in the 1.5.1 release of Batik. If you are using a version of Batik older than 1.5.1, you should upgrade.

batik-1.9.orig/documentation-sources/content/xdocs/contributors.xml0000644000175000017500000004202513063003361025337 0ustar mans0954mans0954
Batik contributors

This page contains information about the current Batik developers and the features they are working on at the moment.

Committers

This section lists all developers with commit access to the Batik subversion repository.

The following people are active Batik developers:

Thomas DeWeese (TD)

Thomas.DeWeese@Kodak.com

Thomas DeWeese is a Senior Software Engineer at Eastman Kodak Company, in Rochester New York where he has worked for the Image Science Division’s image application development group since 1994. Thomas has made contributions to the imaging portions of the Java2D API, and was a major contributor to the Java Advanced Image API (version 1.0). Since then he has participated in the Jini Printing Working group and has recently become a member of Kodak’s SVG Working Group team.

Cameron McCormack (CM)

cam@mcc.id.au

Cameron McCormack is a postgraduate student at Monash University in Melbourne, Australia, where he is undertaking his PhD. His thesis relates to adaptive layout of diagrams, and he has worked on an extension to SVG to allow expressions as attribute values. He also is an invited expert on the SVG Working Group. Cameron has been a committer since 2004, and has contributed code mostly related to SMIL animation and upcoming SVG 1.2 support.

Dieter von Holten (DH)

Dieter is a freelance programmer living in Hamburg, Germany. He spends his time on projects in refineries and tankfarms, chasing bits from ERP to PLC and back. Although not specifically an expert with graphics, he tries to help out “maintaining and enhancing this interesting, non-trivial piece of code”.

Helder Magalhães (HM)

helder.magalhaes@gmail.com

Helder is a software engineer at the Power Systems Automation unit of Efacec, in Maia, Portugal. He is an SVG enthusiast and has been involved with the technology since 2005. In his spare time, he tries to help out in several open-source projects, mostly SVG-related, with an emphasis in Batik. He is also an invited expert on the SVG Interest Group.

The following people are some of the Batik project founders and helped define and implement the initial Batik architecture:

Bill Haneman

bill.haneman@ireland.sun.com

Bill Haneman works for Sun Microsystems’ Desktop Enabling Middleware group in Dublin, Ireland, and implemented much of the Batik’s text support (though not SVG Fonts, thanks Bella, Dean, and David!). He is also technical lead for the GNOME Accessibility Project, an open project to provide an accessibility framework for Linux and Solaris(TM) desktops. A twenty-year veteran of scientific programming and application development, he is a US expatriate who plays traditional Irish music on the uilleann pipes.

Vincent Hardy

vincent.hardy@eng.sun.com

Vincent is one of the founders of the SVG Batik project at Apache. He is a Senior Staff Engineer at Sun Microsystems Inc., where he is part of the XML technology center. Vincent represented Sun in the W3C’s SVG Working Group and is currently a W3C fellow in the W3C office in Sophia Antipolis, France. Vincent is the author of papers and a book on the Java 2D API.

Stephane Hillion

shillion@ilog.fr

Stephane is a software engineer at the Koala project, part of ILOG’s visualization R&D team, located in Sophia-Antipolis, France. His main interests are in programming languages and web standards. He wrote the Apache Batik’s DOM, CSS and Swing modules.

Dean Jackson

dean.jackson@cmis.csiro.au

Dean is employed by CSIRO Australia and is currently working at the World Wide Web Consortium (W3C) full time on SVG. He is a member of the W3C’s SVG working group, and was a developer of the CSIRO SVG Toolkit, one of the first and most complete open source SVG libraries.

Christophe Jolif

cjolif@ilog.fr

Christophe Jolif is a Software Architect mainly working on the ILOG JViews Component Suite, the ILOG Java visualization framework. He has been working for ILOG since 1997, and is representing the company in the Scalable Vector Graphics (SVG) W3C Working Group since 1999. He has implemented SVG import and export features in ILOG JViews and is now also working on the SVG Batik project at Apache.

Thierry Kormann

tkormann@ilog.fr

Thierry is a software engineer, at the Koala project of ILOG located at Sophia-Antipolis, France and a member of the SVG working group. Thierry has contributed to most of Koala’s projects involving Java and XML. Since then, he co-founded the Apache Batik project. His daytime job is focused on Graphics and XML related technologies. Prior to joining ILOG, Thierry worked as a software engineer for Bull.

Nicolas Socheleau

nicolas.socheleau@bitflash.com

Nicolas Socheleau is a software engineer at BitFlash Inc, Ottawa, Canada where he worked on different SVG related projects. He joined the Batik team in June 2002. His interests include XML technologies and Graphics. He contributed some text functionality and SVG DOM interface implementations.

Emmanuel Tissandier

tissandi@ilog.fr

Emmanuel Tissandier has been working for 10 years as a software engineer in object oriented environments. He started with the development of CASE tools at Rank Xerox and joined the visualization R&D team of ILOG in 1995. Since 1997, he has been the R&D Project Manager for the ILOG JViews Component Suite, a product for delivering two-dimensional structured graphics, cartography, diagrams, and Gantt charts in Java.

Bella Robinson implemented the SVG font support in Batik:

Bella Robinson

bella.robinson@cmis.csiro.au

Bella is a Software Engineer working for CSIRO Australia. She was one of the main developers of the CSIRO SVG Toolkit and has also been working on a Pocket SVG Viewer for handheld devices. Her interests include graphics and XML programming.

In addition, James Davidson and Stefano Mazzochi, two Apache veterans who helped the Batik team start the project at Apache, also have commit access to the Subversion repository.

Batik contributors

The following people have contributed to Batik:

  • Ivan Andjelkovic—Google Summer of Code student who worked on enhancements to the DOM Viewer window.
  • Curt Arnold—Contributed many bug reports and fixes.
  • Robert A. DiBlasi—Contributed a lot of feedback on the Batik documentation and suggestions on how to improve it.
  • Archie Cobbs—Contributed a thread deadlocking fix.
  • Paul Evenblij—Contributed an improvement to the way images are handled by the SVGGraphics2D component. Also contributed bug fixes on the SVGGraphics2D component.
  • Pier Fumagalli—Helped with the Batik web site and mailing lists.
  • Hervé Girod—Contributed many improvements to the WMF transcoder.
  • Christophe Held—Contributed a math formula in SVG generated from MathML.
  • Tonny Kohar—Contributed a syntax highlight XML editor component for use in Squiggle.
  • Clay Leeds—Helped getting Batik’s new site set up.
  • Keiron Liddle—A FOP member who worked on an SVG to PDF transcoder that is a part of FOP but works in the Batik infrastructure.
  • Jeremias Märki—Another FOP member who contributed code to improve compatibility with GNU Classpath.
  • John Morrison—Contributed a set of XSL stylesheets to generate SVG charts, such as line graphs, bar charts or pie charts.
  • Andreas Neumann—Contributed two SVG maps which Bert Bos has internationalized (adding an English version to the original German text).
  • Luan O’Carroll—Contributed the original WMF transcoder.
  • Sheng Pei—Contributed to filter support and the regard tool.
  • Neeme Praks—Contributed patches, feedback and scripts for building charts from John Morrisson’s XSL stylesheets.
  • Henri Ruini—Contributed to a rewrite of the rasterizer application.
  • David Schweinsberg—Contributed the True Type Font to SVG Font converter.
  • Eric Suen—Tracked down some memory leaks.
  • Nicholas Talian—Contributed on gradients.
  • Andres Toussaint—Contributed SVGAnimatedPathData functionality.
Areas of expertise

The following table summarizes the areas of expertise of each active committer. It allows better coordination of both internal and external development efforts.

TDCMDHHM
Team Contact X
Bridge X
Browser X
CSS XX
Documentation XXX
SVG DOM X
GVT Core X
GVT Filters X
GVT Renderer X
GVT Text X
SVGGraphics2D X
SMIL Animation X
Micro Parsers X
Rasterizer X
Scripting X
Swing Components X
Test XXX
batik-1.9.orig/documentation-sources/content/xdocs/license.xml0000644000175000017500000003047313063003362024231 0ustar mans0954mans0954
Batik License

Batik is licensed according to the Apache License, Version 2.0, the text of which is included below.

batik-1.9.orig/documentation-sources/content/xdocs/install.xml0000644000175000017500000003303013063003361024244 0ustar mans0954mans0954
Installing Batik
System requirements

Batik requires the following to be already installed in your system:

Java Runtime Environment

A Java 1.4 or above compatible runtime environment must be present.

Choosing a distribution to download

To install Batik, you will need to go to the download page and download one or more ZIP file containing the distribution of your choice. It is good practice to verify the integrity of the distribution files, especially if you are using one of our mirror sites. Here are the various components you will find in the download area and their intended use:

  • batik-version.zip (e.g., batik-1.6.zip)

    The binary distribution contains compiled executable JAR files that let you get started with Batik easily. This is the recommended distribution if you want to look at Batik’s features, or you want to experiment with SVG and see the fun things you can do with Batik. The binary distribution comes with a set of sample SVG files.

  • batik-src-version.zip (e.g., batik-src-1.6.zip)

    The source distribution contains a complete snapshot of the Batik source code, documentation, regression tools and utilities as well as the script for building Batik. That distribution is a snapshot of the SVN repository. This is the recommended distribution for developers who want to dive into the code and understand how Batik can be integrated in their applications or how Batik can be extended.

  • batik-docs-version.zip (e.g., batik-docs-1.6.zip)

    The documentation bundle contains a copy of the Javadoc for the Batik source code.

We make nightly copies of the source tree available from the Apache build server. These builds represent the current state of development and may or may not be as stable as releases. There are two types of distributions provided:

  • batik-svn-date.zip (e.g., batik-svn-06-03-29.zip)

    This contains a complete copy of the Subversion repository trunk, including support for running regard, Batik’s regression testing utility. In particular this includes all the reference images for testing. Developers are encouraged to get these or better use Subversion directly.

  • batik-src-date.zip (e.g., batik-src-06-03-29.zip)

    This contains all the source code and libraries needed to build and run Batik from source, but does not include the testing facilities.

Older releases are available from the Apache archives. However, we strongly recommend using the current release of Batik.

In all cases, the user should:

  • Make sure a Java Development Kit (JDK) is installed on the computer where Batik will be installed. See the system requirements. Make sure that the java runtime is in the PATH environment variable.
  • Select the directory where he/she wants to download the distribution.
  • Download the desired distribution from the download page.
  • Download the associated PGP signature (.asc) and KEYS file (preferable) or MD5 hash (.md5). This must be done directly from the Apache download area to mean anything.
  • Open a console and go to the directory where the distribution was downloaded.
  • Verify the integrity of the distribution.
  • Unpack the distribution with Java’s JAR utility:

    jar xvf <distribution>

    For example, if you have downloaded batik-1.6.zip into /home/IamHere, type the following at the command prompt:

    cd /home/IamHere jar xvf batik-1.6.zip

    IMPORTANT: UNIX users, do not use the unzip utility to unpack the various Batik zip files, as this would not set the directories access rights properly.

  • If you are using Mac OS X, you can now generate an application bundle for Squiggle, Batik's SVG browser:

    sh lib/make-squiggle-app.sh

    After running this script, a Finder window will be opened where you can find the generated Squiggle application bundle. Drag this to your Applications folder to install it.

  • Now you can follow the instructions specific to the application you want to use. For example, see the SVG Browser page or the SVG Rasterizer page for an explanation on how to use these tools.
Optional components

By default, the Batik source distribution comes with the Mozilla Rhino JavaScript Engine (js.jar).

To enable other scripting languages support, you will only need to install the correct jar files in lib directory of Batik and recompile your distribution.

  • For Python, you need to download Jython distribution at http://www.jython.org/. Then you put the jython.jar file in the Batik lib directory.
  • For Tcl, you need to download Jacl & TclBlend distribution at http://dev.scriptics.com/software/java/. Then you put the jacl.jar and tcljava.jar files in the Batik lib directory.

Conversely, you can remove the js.jar of the Batik lib directory to remove JavaScript support and have a smaller distribution.

Jar file dependency graph

Note that the dependency graph in this section is out of date, and needs to be updated.

The Batik distribution comes with many jar files. Not all of them are needed in every case (although the provided applications tend to use most of them). The following is a diagram showing the dependencies between the various jar files in the Batik binary distribution (it also shows the major package interdependencies for source developers).

Jar files in white boxes are library jar files that Batik includes from external sources. The light blue boxes correspond to library jar files (those found in the lib directory of a binary distribution) built from Batik source code. The dark blue boxes represent the application jar files.

When boxes touch, the box on top depends on the box below it (there is no horizontal touching). Arrows also indicate dependencies (the source of the arrow depends on the destination). In some cases a thick underline with an arrow is used to indicate that a large number of jar files share a common dependency, this however does not indicate any dependency between the jar files underlined.

Batik jar file dependency graph
Some jar file names are shortened for clarity. All batik package references are short for org.apache.batik.

It is worth pointing out that a determined/clever programmer may be able to pare down some of these dependencies. For example the batik-dom.jar depends on xerces.jar because of the SAXDocumentFactory class in org.apache.batik.dom.util. If you didn’t need to parse XML it would be possible to ignore or break this dependency and still use the batik-dom.jar file for its DOM implementation.

Verify releases

It is essential that you verify the integrity of the downloaded files using the PGP or MD5 signatures.

The PGP signatures can be verified using PGP or GPG. First download the KEYS as well as the asc signature file for the particular distribution you choose. Make sure you get these files from the main distribution directory, rather than from a mirror. Then verify the signatures using:

pgpk -a KEYS pgpv batik-1.6.zip.asc

or

pgp -ka KEYS pgp batik-1.6.zip.asc or
gpg --import KEYS pgp batik-1.6.zip.asc

or

gpg --import KEYS gpg --verify batik-1.6.zip.asc

Alternatively, you can verify the MD5 signature on the files. A UNIX program called md5 or md5sum is included in many UNIX distributions. It is also available as part of GNU Textutils. Windows users can get binary md5 programs from here, here, or here.

We recommend using PGP signatures as they can provide a much higher level of assurance compared with MD5.

batik-1.9.orig/documentation-sources/content/xdocs/download.html0000644000175000017500000001700013063003361024550 0ustar mans0954mans0954 Download Batik

Download Batik

There are several ways you can obtain Batik's binary or sources:

Download a distribution

Every Batik release provides three distributions: a binary distribution (named batik-version.zip), a source distribution (named batik-src-version,zip) and a documentation distribution (named batik-docs-version.zip). These distributions are provided as ZIP files on the Apache mirrors. Note that it is good practice to verify the integrity of the distribution files.

After downloading the distribution, consult the installation notes for details on how to install.

Current official release (closest mirror site selected automatically)

You are currently using [preferred]. If you encounter a problem with this mirror, then please select another. If all mirrors are failing, there are backup mirrors at the end of the list. See status of mirrors.

Other mirrors:

The current release is Apache Batik 1.7 (see the release change log).

Binary distribution for JRE 1.4+
batik-1.7.zip [PGP] [MD5]
Binary distribution for JRE 1.3
batik-1.7-jre13.zip [PGP] [MD5]
Source distribution
batik-src-1.7.zip [PGP] [MD5]
Documentation distribution
batik-docs-1.7.zip [PGP] [MD5]
Squiggle Mac OS X disk image
Squiggle-1.7.dmg [PGP] [MD5]

Older releases are available from the Apache archives. However, we strongly recommend using the current release of Batik.

As mentioned in the installation notes, it is important that you verify the release that you download, using either the MD5 hash or verifying the PGP signature against the PGP key of the developer who signed the release.

Current development snapshot

Nightly snapshots of the source tree are available from the Apache build server. These snapshots represent the current state of development and may or may not be as stable as releases. There are two distributions provided: a complete copy of the Subversion repository trunk (named batik-svn-date.zip), including Batik's regression testing utility and reference images; and a snapshot of the aforementioned source code without any of the testing facilities (named batik-src-date.zip).

Subversion repository

To fetch the latest Subversion repository trunk, just run the following command:

svn checkout http://svn.apache.org/repos/asf/xmlgraphics/batik/trunk/

You can also browse the Subversion repository using ViewVC at http://svn.apache.org/viewvc/xmlgraphics/batik/.

batik-1.9.orig/documentation-sources/content/xdocs/mailing-lists.xml0000644000175000017500000001056613063003361025363 0ustar mans0954mans0954
Mailing Lists

Before posting a question or problem to any mailing list, please first look at the following resources in this order:

  1. Batik FAQs
  2. Batik users list archive (check links below)
  3. Batik development list archive (check links below)
Batik users list

batik-users@xmlgraphics.apache.org

(Subscribe, Unsubscribe)

Archives:

This is the general Batik list, for problems using Batik, bug reports, etc. This is not an appropriate list for general SVG questions. You might try the public SVG mailing list for specification related questions, or the SVG Developers list for general help with SVG.

Important: If you are posting about a problem you are having (as most people do), please provide details about the system configuration (operating system, JDK version, window manager, etc.), and detailed information about the problem such as any available stack trace or, ideally, a test case that isolates the problem. This will help get a quick resolution.

Batik development list

batik-dev@xmlgraphics.apache.org

(Subscribe, Unsubscribe)

Archives:

This list is for developers working on or wanting to work on Batik itself (not developers merely working with Batik), for patches to Batik to be posted, etc.

batik-1.9.orig/documentation-sources/content/demo/0000755000175000017500000000000013153020772021666 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/content/demo/AppletDemo.java0000644000175000017500000001241313063003367024565 0ustar mans0954mans0954/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import java.io.IOException; import java.net.URL; import javax.swing.JApplet; import org.apache.batik.dom.svg.SAXSVGDocumentFactory; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.util.XMLResourceDescriptor; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * A applet demonstrating the JSVGCanvas. * * @version $Id: AppletDemo.java 1733420 2016-03-03 07:41:59Z gadams $ */ public class AppletDemo extends JApplet { protected JSVGCanvas canvas; protected Document doc; protected Element svg; public void init() { // Create a new JSVGCanvas. canvas = new JSVGCanvas(); getContentPane().add(canvas); try { // Parse the barChart.svg file into a Document. String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); URL url = new URL(getCodeBase(), "barChart.svg"); doc = f.createDocument(url.toString()); svg = doc.getDocumentElement(); // Change the document viewBox. svg.setAttributeNS(null, "viewBox", "40 95 370 265"); // Make the text look nice. svg.setAttributeNS(null, "text-rendering", "geometricPrecision"); // Remove the xml-stylesheet PI. for (Node n = svg.getPreviousSibling(); n != null; n = n.getPreviousSibling()) { if (n.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) { doc.removeChild(n); break; } } // Remove the Batik sample mark 'use' element. for (Node n = svg.getLastChild(); n != null; n = n.getPreviousSibling()) { if (n.getNodeType() == Node.ELEMENT_NODE && n.getLocalName().equals("use")) { svg.removeChild(n); break; } } } catch (Exception ex) { } } public void start() { // Display the document. canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); canvas.setDocument(doc); } public void stop() { // Remove the document. canvas.setDocument(null); } public void destroy() { canvas.dispose(); } public void updateBar(final String name, final float value) { canvas.getUpdateManager().getUpdateRunnableQueue().invokeLater (new Runnable() { public void run() { Element bar = doc.getElementById(name); if (bar == null) { return; } Node n; Element path1, path2, path3; for (n = bar.getFirstChild(); n.getNodeType() != Node.ELEMENT_NODE; n = n.getNextSibling()) { } path1 = (Element) n; for (n = n.getNextSibling(); n.getNodeType() != Node.ELEMENT_NODE; n = n.getNextSibling()) { } path2 = (Element) n; for (n = n.getNextSibling(); n.getNodeType() != Node.ELEMENT_NODE; n = n.getNextSibling()) { } path3 = (Element) n; int offset; if (name.equals("ShoeBar")) { offset = 0; } else if (name.equals("CarBar")) { offset = 79; } else if (name.equals("TravelBar")) { offset = 158; } else { offset = 237; } String d = "M " + (offset + 86) + ",240 v -" + (3.7 * value) + " l 15,-15 v " + (3.7 * value) + " l -15,15 z"; path1.setAttributeNS(null, "d", d); d = "M " + (offset + 86) + "," + (240 - 3.7 * value) + " h -39 l 15,-15 h 39 l -15,15 z"; path2.setAttributeNS(null, "d", d); d = "M " + (offset + 47) + "," + (240 - 3.7 * value) + " v " + (3.7 * value) + " h 39 v -" + (3.7 * value) + " h -39 z"; path3.setAttributeNS(null, "d", d); } }); } } batik-1.9.orig/documentation-sources/content/demo/barChart.svg0000644000175000017500000001355713063003361024143 0ustar mans0954mans0954 Bar Chart Shoe Car Travel Computer 0 10 20 30 40 50 60 batik-1.9.orig/documentation-sources/content/demo/Makefile0000644000175000017500000000042613063003363023325 0ustar mans0954mans0954AppletDemo.class : AppletDemo.java javac -classpath .:batik-awt-util.jar:batik-bridge.jar:batik-css.jar:batik-dom.jar:batik-ext.jar:batik-gvt.jar:batik-parser.jar:batik-script.jar:batik-svg-dom.jar:batik-swing.jar:batik-util.jar:batik-xml.jar:xml-apis-dom3.jar AppletDemo.java batik-1.9.orig/documentation-sources/content/demo/demo.html0000644000175000017500000000410513063003362023474 0ustar mans0954mans0954 Batik demo batik-1.9.orig/documentation-sources/content/doap.rdf0000644000175000017500000000660513063003362022365 0ustar mans0954mans0954 2000-10-01 Apache Batik The Apache Foundation’s Java-based toolkit for SVG generation and manipulation. Batik is a Java-based toolkit for applications or applets to use images in the Scalable Vector Graphics (SVG) format for various purposes, such as display, generation and manipulation. Java Batik 1.6 2005-04-11 1.6 Batik 1.7beta1 2007-03-29 1.7beta1 Batik 1.7 2008-01-09 1.7 Scalable Vector Graphics (SVG) 1.1 W3C SVG 1.1 Scalable Vector Graphics (SVG) Tiny 1.2 W3C SVG Tiny 1.2 Scalable Vector Graphics (SVG) Full 1.2 W3C SVG 1.2 batik-1.9.orig/documentation-sources/content/download.cgi0000644000175000017500000000246513063003361023237 0ustar mans0954mans0954#!/bin/sh # ----------------------------------------------------------------------------- # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Wrapper script around mirrors.cgi script # # $Id: download.cgi 1733420 2016-03-03 07:41:59Z gadams $ # ----------------------------------------------------------------------------- # (we must change to that directory in order for python to pick up the # python includes correctly) # Copied from Stefan's http://www.apache.org/~bodewig/mirror.html cd /www/www.apache.org/dyn/mirrors /www/www.apache.org/dyn/mirrors/mirrors.cgi $* batik-1.9.orig/documentation-sources/content/.htaccess0000644000175000017500000000351713063003360022540 0ustar mans0954mans0954# redirections from the old site Redirect /batik/faqs.html http://xmlgraphics.apache.org/batik/faq.html Redirect /batik/batikDemo.html http://xmlgraphics.apache.org/batik/demo.html Redirect /batik/toolsAndApps.html http://xmlgraphics.apache.org/batik/tools/ Redirect /batik/svgviewer.html http://xmlgraphics.apache.org/batik/tools/browser.html Redirect /batik/svgrasterizer.html http://xmlgraphics.apache.org/batik/tools/rasterizer.html Redirect /batik/ttf2svg.html http://xmlgraphics.apache.org/batik/tools/font-converter.html Redirect /batik/svgpp.html http://xmlgraphics.apache.org/batik/tools/pretty-printer.html Redirect /batik/architecture.html http://xmlgraphics.apache.org/batik/using/architecture.html Redirect /batik/svggen.html http://xmlgraphics.apache.org/batik/using/svg-generator.html Redirect /batik/domapi.html http://xmlgraphics.apache.org/batik/using/dom-api.html Redirect /batik/svgcanvas.html http://xmlgraphics.apache.org/batik/using/swing.html Redirect /batik/rasterizerTutorial.html http://xmlgraphics.apache.org/batik/using/transcoder.html Redirect /batik/scripting.html http://xmlgraphics.apache.org/batik/using/scripting/ecmascript.html Redirect /batik/scriptingFeatures.html http://xmlgraphics.apache.org/batik/status.html Redirect /batik/javaScripting.html http://xmlgraphics.apache.org/batik/using/scripting/java.html Redirect /batik/security.html http://xmlgraphics.apache.org/batik/using/scripting/security.html Redirect /batik/extendingBatik.html http://xmlgraphics.apache.org/batik/using/extending.html Redirect /batik/test.html http://xmlgraphics.apache.org/batik/dev/test.html Redirect /batik/whoAreWe.html http://xmlgraphics.apache.org/batik/contributors.html Redirect /batik/mailList.html http://xmlgraphics.apache.org/batik/mailing-lists.html Redirect /batik/svn.html http://xmlgraphics.apache.org/batik/download.cgi batik-1.9.orig/documentation-sources/classes/0000755000175000017500000000000013153020772020725 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/classes/CatalogManager.properties0000644000175000017500000000555013063003371025711 0ustar mans0954mans0954# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #======================================================================= # CatalogManager.properties for Catalog Entity Resolver. # # This is the default properties file for your project. # This facilitates local configuration of application-specific catalogs. # If you have defined any local catalogs, then they will be loaded # before Forrest's core catalogs. # # See the Apache Forrest documentation: # http://forrest.apache.org/docs/your-project.html # http://forrest.apache.org/docs/validation.html # verbosity: # The level of messages for status/debug (messages go to standard output). # The setting here is for your own local catalogs. # The verbosity of Forrest's core catalogs is controlled via # main/webapp/WEB-INF/cocoon.xconf # # The following messages are provided ... # 0 = none # 1 = ? (... not sure yet) # 2 = 1+, Loading catalog, Resolved public, Resolved system # 3 = 2+, Catalog does not exist, resolvePublic, resolveSystem # 10 = 3+, List all catalog entries when loading a catalog # (Cocoon also logs the "Resolved public" messages.) verbosity=1 # catalogs ... list of additional catalogs to load # (Note that Apache Forrest will automatically load its own default catalog # from main/webapp/resources/schema/catalog.xcat) # Use either full pathnames or relative pathnames. # pathname separator is always semi-colon (;) regardless of operating system # directory separator is always slash (/) regardless of operating system # The project catalog is expected to be at ../resources/schema/catalog.xcat #catalogs=../resources/schema/catalog.xcat # FIXME: Workaround FOR-548 "project DTD catalogs are not included # when running as a servlet WAR". # Same catalog, different path catalogs=../resources/schema/catalog.xcat;../../project/src/documentation/resources/schema/catalog.xcat # relative-catalogs # If false, relative catalog URIs are made absolute with respect to the # base URI of the CatalogManager.properties file. This setting only # applies to catalog URIs obtained from the catalogs property in the # CatalogManager.properties file # Example: relative-catalogs=[yes|no] relative-catalogs=no batik-1.9.orig/documentation-sources/sitemap.xmap0000644000175000017500000000241613063003374021623 0ustar mans0954mans0954 batik-1.9.orig/documentation-sources/conf/0000755000175000017500000000000013153020772020215 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/conf/cli.xconf0000644000175000017500000003217713063003364022033 0ustar mans0954mans0954 . WEB-INF/cocoon.xconf ../tmp/cocoon-work ../site index.html */* batik-1.9.orig/documentation-sources/resources/0000755000175000017500000000000013063003363021277 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/resources/themes/0000755000175000017500000000000013063003363022564 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/resources/stylesheets/0000755000175000017500000000000013153020772023656 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/resources/stylesheets/status2document.xsl0000644000175000017500000001600213063003363027546 0ustar mans0954mans0954
Your browser doesn't seem to support Java applets, which is required for this demo.
ExpenseAmount
Shoe
Car
Travel
Computer

vertical-bar yes partial no no partial yes SVG 1.1 test suite
Properties
Function properties
( )
vertical-bar yes partial no no partial yes Attributes Properties Operations yes partial no batik-1.9.orig/documentation-sources/resources/schema/0000755000175000017500000000000013153020772022542 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/resources/schema/catalog.xcat0000644000175000017500000000223513063003372025034 0ustar mans0954mans0954 batik-1.9.orig/documentation-sources/resources/images/0000755000175000017500000000000013153020772022547 5ustar mans0954mans0954batik-1.9.orig/documentation-sources/resources/images/jarDependImg.png0000644000175000017500000031575313063003364025622 0ustar mans0954mans0954PNG  IHDRXr5 cHRMz&u0`:pQ<gAMA|QsRGBbKGD pHYs+ IDATxx]űW]%۲n\p/7=H^#yJ !@!HBظ޻ܭJ{Ε%Yێ|u˞-;S<YS-T'O^Xy+eJ春RʤlZ)LX˓'O`yd@S=hQR*˃-Oɓ'<.)'8a Z(S)T,_nY)=/ݔ 4~RzI*%%7HKELexɓ'<3 _5-FpR$AkUc,HJ5RF/)oK)ql)YH=qz^єۯk"쌤x?G'Un߾u#OZ[G ГR׀a\e+ "hN[=;fڴy{F5s_Gd56x@RAol59-WEGkw S!Q.N,;8O3|5>2ݟvNOʍq ~_w3h~:/ONg 3OSJJ\OKms3[+7xt RnQ`&g$+<1Oȭ4U/-NE_(4 N?ƀZЩ-\?fy>vPŕÒ $-i5 yӱGc3@ڼSvᄱz*̏.Ei|YO}KV+$e57fЊ.(KELiF@QޟV.5T&>7cj"y/[~p5,k~Q*W&CNU?V_@7THRAmZcjӢE_3~B]ϓZKW5.m.v$4vݥ,H?lvҗ-b5ggաe%;tߪ4j."Pw?b,2P&ī9v5d[ۧJ0Z+p|NqR"sTDM=h.پ[£E2d-^/3/_>\91_sWR\#83TYe,Bdns-lB`M}H?]3Z赥g̿Kk+Q%]x3g~VLUXYoLU(}v~*!xP,ч_G?yM ?zsu˸Zy*)mu rvթT;yKR/@:| X65Nu eV k~f~\,ן}GƩBgLS ];N睹c)*;v upu ɳk<9i̿5>|M>!kOz~%ɏޝV d.L{Z/)_C p{g|y;h. ,^S.4'چSHo 'uU ?_b-c+Lr|/Ae,~,ݞ^B"kozAn,W(Bl?]}(;_Ǣ9I9BL6 ,]ZlrE?pCHzƔSzhg لqਯ?_oQ78H,>]UyD^O0}mP5sszZ76MBeiIf+~Je@XMٰM=BYctv?i_zyɚ@4fxV9ZUWn7 `(,+oTITkz2dY*bwI9OϥLu)U"BuoܠX^rf.ssLRJ'D@ß͋h;_|/}usfKYo9N? %['X)SX6Zƛ+@}۟R'ρ0s@/H."<=of#W{@q"?wJ@Fb*$h"U5iJrMU⃙j ׵i )O8|:򉔿Jy|߽Qyдz~?&*rD|U V|\y~HIR[WַZ8)Z's:~VZc `"`yvx9 C | ~VJ.Ho`d:G@ 'x޴~ReyЂQñ}]5#kMϪUT~0~T[b yX< ;Uy0Z`BĎ`vx[ZdX3Nԅ$B}flrb-d'ݕU@fEduNItל #|4HjTϨLAEH&|S4J<,J)G~BiիC~+7n=HRQ5WA"JAG K\"14S~aY9J zp; 2Z)S@ijT_{Nӵ0R5ֿgXŒ HޛSXhj&@Z3;s{uAjAWvN۰MH-7(@(F 00[ ZjZ7.wam^nz\8p1O[Q R8+ F3O=˓Q'ua`c ^ŬsqT`1h۶6I V ]4WeƟhҺjlԊW{Eic25z@xbnL@  ?Ђ!|-=SNݍze:5k' 狐MhhíNLv;m?_'~\֚&E7y' gAIDgrBNٙ-"7fC7Z]!BU`WJY"sYVߎ\:ұ^k:oۥMumSSu:4X W2whmh#`G 7vKT[ẅu,ܾ[ }H |ggl>=1e֘ʤrvK+ux.Zњdg]{pS,N*Z/c(\9äTuʀ t) )@$8] R"wnS[Um<̘:_93r7̑sVO^ C2~ k۝U2eҭr=R>jE2[O|򖀖R/p||gVsm~*e _!˫,nlu.~:-˥epCFs꺃uiqۆxO4"A,ڲ 'v˓֜ʭb;6חUdvJ; =57:jYTi6} Jv!Օr>'jyb<(f+_2ل)es^% 9忿fz1pս1T^=15Tn~XvM^*b*F7|^vTG Bɔz:ț=57YmNiq B; ms=9U Szvzl|}~nc5p{eCAi>.8O@+ȋ6{^ UwF=~EU$[k% ~z O`y:)y:"~T}Uu x8uB8$NavXwV)n"xw*F-ȢOS,OG!v&PP,2JTt``pHnz,OKk֖R5{P,{s:I6Q[6z'OMFC+ؼ\Sn5Y6b|Rd+@ғc|nOIk:-KdycvWH^ =|}Qv };/ Os|@VǽVMsR5</ևHrLj(@h#wC?`1gl dɓX jHrQꣵ[uĺ+e41Zu1/5i}[D]LPiw[bٲC]:j lz4lR6NKb}sǩ>Z9y<m$Bm}'j ZW"uv=Ss{p O[gE"'#GHD\'_!!™D\[8j=t$gr GBWNY~CvW2a|NQnO1%6B?k4vh/8{Z7O~Rf<&KԈƍ:7`A~:iaH`$a3Q'5H g\9t[5mm;RAh3A!?\Yh.y:%ɵ2M2Kwd5:=NƊ :s$ڈۤ$>CVn7Tuʪyh*TT'~z$tse (cu0׏e~Iwts_P 80;QߐyٌUJLsBM2wkmEc广&e Iɡ_i{0]D߾'Ig ov@_:<zl¢u9kuq]5_JVm|}e=VGOv>;szɨ+'ԼΫEDv73pCdCԉevm-r$rs5$0< \ !XH p%)-o$H%s4f|JV/puôQh@"Ijr|/5uvG$A"=P Z"ѥI0MEү!]:15ix>{I~ƪ"&}}xh(fAPypȳ#5&7atʝ}:G q"h<ҩm?#^5Vb%> \UV71r ǹ#<-sʜglض̋ j0-XF2k%4$4gm0y+vrx_\?5-X FK$gzB>X'h7m/6x{ "&{YC cCIݪS!nY4xdM]|Ϥ ҇gŵutx'<q+!bHqșciu{^*ua#-Qg7Jh_*!b)\t-p5|d\ n$}: Pie1c,ߵ ic%0Ѹm G%ΘZ @H$u:{4Bѳh- ZL@;3 9誄^Ș2G58HI 594X:gw7f]#p, IDATk|VoIyuZd˷YdߝU' Rl hPkb'jնiUШC>8aԓX\/ԝvNhU3(Bmif-*tL0(bmL !6aNl^4/nAFFgG|FV9&Ƴ?d& iApSPNʹiE6nf,3%={o&}Y">< KCV S9 S!>.G. "eAh0b6}70S=1mϴ"pB^+~EڛXU̡a8 >m}`<Vh ?s6Nk U I'ݢ.wCx-pY5֗3 ѳ$!FMiE6/ b aaFP~Z.rpYSg7"f-,uiݧ\ cڬW<=pl;'MӡL6DWk^-a^y1Zc&d9в[TQQSpC Ǽ37&^&LӸ-oMDN6S4 @~ |^푀%#>]YXپɉ7ɠ1P/[f){3Oz.N }f۝BT8H="6Y>ĸɉ@+q;3 0F D,69\|pAwP` F#;GyhnkY NZ2ۘPaeL I=ֻK G|Ł[mD |oЁ seosj5 ؆.^֓獏h}3kуS6 otQXvY@!u=#b8#X.C}FfM?n;9G8ݨC;էmvt1A1E:`'},XJ𷼏9D}3J>ŵAEB&p4L9FKV!_q_U?uj}u_Dow>hxO\_5\ a@uSTj|c:5 C~jCs%9nNޱ~ٛsB~Ofț=N>憒W~,NK8Ao2v9cO=n{{˚%ª ⚩Q|F~Orb ZYVfwqqZ~iyW;7'pUoK**C'=UyU)-8FLÁ&E*eN)ᬧ>Z%ѰbN5@ܟ.-7&<7cضm?@G(Ş { +'GZ,Ovx+Umfٛw0 2v x2yiʟmKTUM_R+7&z9vyVw:|ãYnBgϟcvw6tN;A>RC=t8: [〬@~r5W`sҳMfK|"HABFԋmY4 xE C`'MI]>6w?h=Rj dMHM|C"ƸΉ;EC{ꭍأgdt27cZk>zNo>!ٷN_wN.$q'LDV OIDg4ar۹>X`aZ|gmM%llWefC84tmp8(BNGĖM8n{'RM[ xDsLJ!};pD s{an1|h[YjBbQt6Ry^:Q7ʼ28F MCYx$%)Ԓdq)Iv:<[\Y1N5:]  Rvn3X=NsE2פCz|Bg@SR84u|kTfmޡwӝ8Z}wIOHKj9N{ p(VCSC:)ɦnܮ^[.8OIk>ȵ^e,OIYOuW*0ɦڡ -P| `w~ש#mAjOlRA0ʼn7Z )A oL3M,LD=R7ԢNm2#)WTV4*l)NLԋkW%gig[BB-_5<6ϴR8g4*@ys*ES7QXgV'!Ƴ̎&ώz]am0ͭ_x~}19u#TZ:^=io7<::h$J6+MUXuP4S;mrb:4%ea4Pbb >gz~k@۫6?].E&cD:HOIobli;W.u z`y:\WꛀfhP7e?USb9eU)u`5u9MB#N#f)ĆyW/TlZ+ߞ~Gp 48J x3~qj8qyAk7M5Ƙtv*IsӵF멳V}v!R<2u*GϪ~|6\6ԫE`D%J9qB%mĩk;"O_=gcJRMY{? f<>}Z,# }+ƿʟh *CбxVmZZ[ 2x*M|74Tof/ "3MNQk^8\ /Զ'1|rkku[.W?n aTxA!1GT#fW),72%eNDS/Y@-+b0wzl,C!Zu`EE ~H1|62T Q M4k>`ؖWTk=k<15^שj$NnKlиCJ1@ s\$N58ul 0oa\fRPqlzV p_h  Wt-r ն>ԭUZYsMϦljtwH-t_>ʀ0ѐ遲{aMhD '045$27h4D@hn0\^MY 5-ď6i"骡}\-ZV@9ML=mĴknW 1_aĚ8j V3vZ[,~knFAIk3"-ƌy wA=hYKnLO?A}G@/aK^"rzB.p3o w4eωk;̓zd[w1"'{{ D<'~V|~4phѲtj,nC6k@ZNjj/ߏO Xe:,ط!czdBypP6?Ε 0Tb3ifMGPl.]7!~.]];rhmTa')1VMgWv x!_Kjpo"N{(,+)skSQG! അ;ßQ Ъ-9L//Z~(|͊]΅xadz=a`E0iV]h46o7`,<4&uzqr} k].r =h'`0]ިSn:m~ޞ@`0D;jPbgsON~'KļǸ^X)>k=>su͈zMӇڍ6+Sm3GnAk__x>8>˚p)#{:FPB $TWe &8k'}C 4ce $>6B9"fˉG Pe\cfD3O@ PRB~vk3 怾3ql d46Ca镥t~2q>'WoқCւ-5ed>pV8Gr f8f&:և㛂?i2W2;xfpAbd+X]7xfDI4x+N<0;mvIB){31Ŀ xcn/=>H`h1hVq~EY.;4Sr1+'55LsFjM9T`uzڼTɘrroxqC2N7MZ ND /{^^~zª6YKfiCK'M($hZ,Oj Zʷ3 kS7"(d5 ԴA~*`;[#Ы+CsvӎŜ٤؀f 0T*/׾"fq_1Aigr:3o*~-ƴzp\ud@ &{}G]+A&קmyj.m͊?~-·d#}FvмJ6i '_LC=0PqׄG^BC Bɳթ^Uc뷪Sͭ+wט_/קd^7AH?2u:{v &x/?zw:-s4.&K ;Zucن"|OuڛXL2`\zX+d1fGs{܌rO7c>kg{xcsEX6Ƹ iWX5jL"!U$ T4AL-F#1Mo {Ucfx }oi'АpPճMzE4H6ETKvn69 DVUcSNᎣf0v00c΋j,Xy@>q/( ,CƯ_3`)XeR7#_2&ú-Vmo!k6!sH8}Y&ii hjg{hR `*LUѱIl`b&XUoJ9CX6 ͩ /-=%I&kߨWDog/UW׷쭕.ˉ'O([@9ړWCA@Seel-[Y:xXFX Nv)W@sD mS b`F6E%)7~>eO&]a/O'O>w$R JMdx&eoG#q&\C7`6yuZޝJ%e[o_gtyNEkZƠ<oj+*rc0ktsw.e~f\UEK;5.\`۔7u%ɞLl}}~"$%=g/ 8A ЉٳOС OPɻkzՇ_Ƶ} כ]3HB}3Y+MPՃv{)@OŻ?gܫ {Nt^^*JQM>M!( "|KA,Eƀ9Rm^)*ժh~?&ɡRGU K IDATGxMNTbiyc;hּ%\Kޚ[K[6Km&Ɛp48y>6ďSv9=m[+7o"׿#bS1~ө_9kll&h5h}Uʯ*X4`Ɇ/5z^f X_-{MYE? P"TG}C\tTg1$8D\woS':وfW# Ɨ <<[CD9L]޻yPK6^x1p3eĖ6}ܘ`&c+{*aooIH@O0e?0L_hnH @&7I:@GAŷ1u~9'`ŕZS[{WqLdnTB # c0_R82LCh~-qh_怫!pb۝PPD,Pb*$P'8"(( Jxr ggUu9@9-!@rR(h7ZoO`vsl`/5kz{FBڈKnNjF \v'wϒ,O^@'a/‚\tPʂ")Kw4\Gc`$6zHeC& yf%dzIy PvlʆN@JfB<SUuZ# mq$wd5lB{*ɜ}YD&1iC/4>!5{s5P@+˳˘arHnR,Rgc#H|n }=_~_e(^%q +TO,]$ʜ[K m*Gh{0ºC۷ZL&\6`ChC^03N.-Uh >CC$`A0kuq]\5Ek[g.M)ZOvxk Ƶd1zI_c$K?S25_t `&bKmi+YgaZ!mck 6Z&dfH|Sᇲ&VWeҧL->m2tߔߐڇg{\Hvnlj$vZs~Dڈ=ats\uh,&:-վ*QO+Ki|*{=:ʀs3V-G[VīO럨HQ <@U;[b\Uk.ӷڜq\3e?t3A4  0bG=AF`segZVE=w"~(p"IWI%pTI=>ƌg6vz9Yyhӳ&49kֱ5H;)FIF.b<` Chzt:C*l11ߵ'uBfd/1?̷L7'09;VHAS٨O @7$ J7ѥ/7i`_ȇʳ#cGJ;H9&>(},=0~7J6cq\b֟ zIcO[ 5ȶ p翗Ӊ?nw:e,`N|If¶@Mx.h@ʚ"s5|vէ kϮKƂy60Ju] .@m鳭 p )1< 9tdr +m?V/%־mjmxdhe4Gu4z6٫ښC3M8 lS5} *4CV:VPslRؤqMJK2eNr?<[ @Y6 `yV(EF+@^KXJ^_[NkH,h"bd'fS9Y اnڮD`"%ĩrddÚ."ec$:<>EAM~6c5,ia5MbcedwzZ@Ta/36@3?;e6ns!ڣgxlN3l9C}kSZ?0D B`<*'r4Bhh0G Z6uI 'dL(pI ~< ֯j] !d5zKUBUiG\5~d,ڀ0 Rr[B^w@5möCuqPu&߇Օ7ϫ[:5@$9%gOY3μ㳅.UȚa`z-H?T2F1F1U/Xh (Zi]I[$sccnZhiٽ#4{X{Ob=v4h R[ &J6i{b$u_7ZJP3hml-0gJRbWDLFUu~[d@UׇVfZZW c.%'p z9_YIgDa"rX?-;f3m 14q8>3c֌e{6?2ǘ Wd4Z}"Oт~a['\L5|׋ 8l%ؠyP m"TO?°7eWDI*7`nKOh?N >Z+r\ͯAZ!#59LM^E].0[I=j3 !AGNkWK+*՟O3mzh@\W:IksYHY \b֦5I+m^, YqY',]WUWy * 6>_L^MbF z[xM\,HLx#]c&v_c~6MֻBCk|!9xTu@pQ76%Yfa$7ρsm 碉}џHoX-BKo ҟާ˜^ 5mM47qc= 2t*fQWr?/w䷥$38n+3Ѝ|^dFsTƠ%똞(WsU`7`ZL6 5'߹9 BEho-1O5F {*@#w7TѽDϑ- E94Lp[ 8g3M[v,vEȁbFHbN7)G#:6uV>A J4jU&ONhH9bOS_wɚ'>ĪA-6s$uʼn-hl8H="0Y>ĸɉp+qٿzgWTGsk GUۡeRO\p֢ <9~,۵/* 2Gh>#W^&2&r-E<=hmX4n.3>s[]f A ]Z'Ѵ$:ϬFR G7ZW@&|? տq@YUZ0}"{ k08nlXn?RkMєW> QAEap"m]66k0o6^Eh_pACΥ Gkh<m"l(a~7 @Q0 ˢbTҜL %xFk?B\xhɭ6rMCiGid&NBÆuq},$raOoad[lZ؝278qZ"+!do^}U0NTwI:WMu0H8O\=lڑW͂V)KEǹ*WAHC4WdYP[Fz^[RzЛg`77롶[2E{ Z6ۺl]j_?ks~=D %;.*ݷ!`{랢E89" YnI>,+{JVo/>ucװvU`uZN$8rݲPq"veԽHAc;kJkqla/N2f 7j#nAaFiDŽYSC@0X@0B@bipҪi I!mmKOq0^T1~%-jS-1չ`o49/)abTZʽ5hZ7 8*h ɽƽ6USk>{ѧ Tk6sbœU׮]MpIbV*'WzYFԖjrZ;-sJ woUjHT=K936¢'*0<蚞 r}ǟqv\Y 5>ln/U/gh2&7;]eJvb&QxޣS}Xhx$=ᙫO[2`9O 㟮-sm,p$wB*UԀ%pa5:"R7N{ܔ ܌)2Tc*6q~N2L<+ @EȷE!}ѻȞ8E٭{_7>0o *q,kl:[@@peuSTbV5`p[Y0Ŵ/Q<:JN6hcU;zH}K|8cb$5#vF\&?5ϐ}AMW?5 @F7t I`ovQGIvܸ̋$l$jjP9&jk * pe(i[g}|7ڹs=ɓ'Oȑ*SNSWʊ୉SQvH7p[A7Pb%}c%䙱jg]<ǽU~I;n3X/hFr$$}2bh;9q*:lh g#wxp)ؘd]"-m$n+TPyNz0;WreS~sX/U> X k׫ԒD98 GeWE"J׍)>IǺ*,*z I[ ֠ޭ3]iUÛlTH }0]v8=LcTFۆLNPY'\!Ӥ,WL J &UYLXYhpE>A_l@zQ,S2Zn햍 IDATWMD9P 5 @pg7g4&"}=_QShCc@?1y C*M=$]9*Tiv,n.VezXXA:5`QD@og- 4v\pe {suLٽW2enn-fM qXthvi)ݔMuxYQ79ulJ9[skJuX͑Ŷ=j57K#7?uJZ_=5[ѿ6j٪KXlߥC`3 ZVW !v}:y}8h,p6WAec`u1vlh ڍNUw cR2^ z? xa,2e̞Xԑ 5_#K.Cgj|AՋW68A0Kecmhσ}S0"8b4)XoWVVCOGQU|<K z)b\2=::owuֆ8hw~wIj@VLY-&ϟ  "]RX, XycTcyk }vzm: #`dސ:\JQ?k[Qm-P}}!ک) ir.135W{sΰŧUVzd+g$D;toJ}sdۥjuO5ީ]U7r/h@97_GM&N3ҧ*:rXpƆ]ն7UuL0PUyn&R#=)ON5?{Q!>l;?Ǯ==y:ja&”$(:Hʘ\)VuRR"`AH OmܽO̔PڧT+r -VɴC;Os!>fyN jn;D[v^&hKn S,oۥ' Ւm4mg3!saM s$hH"MÒ (SlS1 UDCKUu-U3p[c2˦4 FM@HWt(\qzok\,6['OQ#|>{θ4~\]a+r4Q34b- ۆ)sUjB!mowi+o+T|HI;thۅg򺭡_A]Ǧ-cj6T=?g+V}E=+K2m72yP)=uj9SനoU3V1U}]5dU!hBǂ, ֱJ0 3 BKUG0cTɓ'OG&ڜWN z&E%jtvGuvL_AZ-g֝ZsqԌM9'џAm+Np1Ї$AH`^:] Yp U}fVoҚrسKSՅ}3zelz֎c4'g]=s~Y-x5['~l7L =};15q۵z{ņHŽzOD74h4ypu-SMQMVbHhEi=FP@5{QGu}{?et~i:縮j="盶ka"@]*SoS[ӄ9lnV%ej͞jSnJS@Ȋ]_c~WAJZu vhDCiL۸M@OW}&|DxDMٸ]bv? 8Ĥe-Rg=oܨ>]UGvQ^~aپT{I"]z3w""[$Sۏi282ҏzevm˼h3hB|zm:dл噫 c]"jUxca>%~I*:2D5DbC)kifxN Pf ]G"c4J6 jm7{s[O V\\q];ފXL8=K jcz$ {^`~ץ]E(ZZ'z0('Xm$` 8޻Tg|aNݸgQB.g/h:.߷{pW^5 2q|`q*yЛ Gu>ۢ'hcӱ JtPq٤U5 wUy@dv>>OJq!8\]5o?tghc*:lB[^0Bs8$Rf&;)4jͫunz-E4< ȒT39@5܍:HJ]-%jw(l+˖͔se{H8 Ԑs3N=}? 2I=Ƙ{W) E9؁%TCd:&ƫٌI?qMV"U$K)$DLdO`]Sȶs{Mp S<:M7&\,Ur cHmАjHZRuHrPg8G:+u;)C(POXOYΉt- r[F'3Z Ҟ:VܘxUcߕ*|NجF;NF]H[PΰAW.䢬&XhrFGz` FrL6:I& ;֑$IQYճ95T6g2 q )Իʞ?lA%VPT2Ί@Ǒm [z8L6I%Uj*`& +Cl,VN*d2:I n"l&J)קmnpX2I֤D6Vg "l4HgIkCj]k:EE 6)0~@'XCCd:Z2J#ςdI{('ȓq $kBR=V #T<&J0b"2]j>$F[[N&Ք:u2E[յYpǀ +PcSfeAeꘄ`S$KC$ 2SkB"eyQ'4HvjEy'5tj$mo2meH-EE$JFep]~Hu _^W Md֒ [Ao5bUz`N&-pTEj=cqw2yk6WNF~>u*nԫtHi#XtXeb$M)ђBiBƈ,%JqvSwa^oH4)GjLy鶕(qK)ɂQ*&W8i7p2lBa&X7xMHXr"5م,}œ}N<w2].e KTԈK뭣Į,St]]}3y^6q[f8VX#=|7u R"Y Pp4zD!w5>a{dGG# ;?"A P tdĩ%B(deYRv,=xȬ#jURYE3C^t}ж%(x]s7r9[yk=ٱ(o]/FkhCooyOi ,Jc`ղK9u1zYOo7 B wJkD壕wʥ)::}vʸCLjx'2.544$Kxt"K[cWow*INWKW/Xll '-?n6rx8w4OJzH}];AԸպs*>SQOG*w[E *oJda.o_w1wEZjFy >Oڦ:V=Jkhh HJvpnxf؍쏺Sحvg©citE9Y5k~_78b-qKN.x=4HE"./y" PNQ"-}BPG)o pDRjy[i_&Իe ƣUZвGZG .V`Ą"M\HN/Qʵ-VҞ>YTL;-tZLY|sQO$$R怉sT<`Ͼw}|r1NV+_Sn3y 񽽳_x~kcY2o%^~ngPѢT^3ݽ2Q(WB/oU<Y]E :zYzW:$Up<5N:JK=Bʻp)_|.AYaE{{;%/_LD@]gP>rn٨G3'(AKSyǻ(MIw|x\gJx9By ')2@In( k9)Y=.:@٠m]~!5BЯR*o<凾@}m{mwU:< xGu\A>Okp { ~Ηsc'.kOs VDE& !چX &'tP1nݍr-0)4.*XXALsf8K 097 nTzTJU4+ {K#3'/&otL9hujTlִٜܵiA'y~pN𠅣ӨxrݱX\yg(XLzAkЃ+=</ޛ/DwS13s,^]RfX:B޷f8 \yyGRZ ot&6J@ދc뷠!s&EcMO)zW*F|K" LVC2v?uйD{nݸJoKR! #,4]OuɅ|:_bcw1owP_vc\ +֦l\'-e;iQrTDyr+}=ӕɤM>7mU:%2sj}nb*X1W($ya0s?7j6h%7.T(}c'ڥm &֐9'Aˤ,:`!UC 8t)!~mIЉ,IL,̃܂E3y!:o{i;-xR0mObXJ[ 1œЭ ߬q4<@~F%NW'6OhmAy;WhÙLwўxr oooj]ڱ%X2Or|9uk&&՚7hlt`ۦDKVуfrT'}k&ـ[Iz1H'ճDz&|H{%YszzD!f7v oQOn&xZa\w-/m$` U뿛 lP*Ŷlݪ1~Êzrwak\5_}̤h/K2)cVY#H u5 A\YUV11DQT%4,G)ٵ?Y͋)!v rw1͊=٢ vP&#/f ixϔ ;w~Q XD2J)Chٌ&]i{ZG,łJN, 9vz?A)i ",xLs1Wp&r[cLɾ[%h54+/%a9*Cr4y$5ݦTR-2] )%`:|2ҰevAz}%Xy RoӨvn<%mǒcf* )N/_BJ 7QL 9B@Yd~71$Yrv_3=|$W.eU YZ#H9ʬ\`CowiҐ.&"6~ JiʹȿP1MEl!{N: AE&߂Wm@C箷n(wub˦.!_ aHO|/ Gcy"eq\] IDAThV%v<2'_7g"غXwU|LX@ n3H7.*U&߼XZ {8?HH d+cw>ru#_;L4#w1owQo1B+|dޒxSKC`V(Q!Y DA  +gX=$"Fnç&Vz!ݘy1y/۟*}2$ wb~1kҬ]hȼVcƠOOߥbUs<ٺg"7,cRuĚXv+hة@u2H ,T=11t⿴Z$4N8 )o:gM.G|,bG)qf=BZCLK~#iEeV╪&H GSR.wE-OZkT:O+{,K`Sm8Gʖ#oj9z}]8~|5$S m׋ vZPn]?Z8v۰ `˒6̎..,1>W>|[', &LrssܲkAқ%8ޱP!ί׶'K'|bbX) #I& egsrvʍ[St;2\ jwQGP/(Gg']) = Ϫڴ_seiTuwp_j ?A ~ء֋Oz Z%j8'8^mى37-S83vx_:OM Ӎk΍kԪpʑ'?#&vcw- !u6J0PJ]wmg]8/YJdG۾_ԣT ;?Lx?[XTE!&ӛ.q=2+r$gW>{gBr)PHAdŏ|<Ĺ ԰K?x֤DCQ-wݶk*w[onw;VyB*uܫųjpAb;ԿHMն+)HM00Sdu(:2B/P7p=zK*ۓ{&/߿Mr5p; \ eI"˸_kߦvG#v=+k.|[~go0pqkR|2,uR۠.z=+ w. 5dJ¶1uuaHf d?2!M6&k4|?6̛B>a4ߧ_L"wurΰ)h jѩ kxgy6 Yh[w\.,: };Y<Ÿ/0cHdId?\-DӅ :u à19oho.:Yh(\i&XJB~:zxP*P1I$ 3*C3nR-V]`YjP5ࠡ-WD/vL92`z<+cOQI[[KCCC>u#;DZ&:nQB\Xk¥ F+eLGr6/|ˏe$[.2~q _`8"Ȱ3k0rϦԻ-e7+gyq;LU*hw*LLMq>sIE@yl ;@lEb5dکnHD*.<_+%(M4c)/SЖ7bGo'#@ u\ ՗l^1U9h'cy/癏0ݸz9ܓmr!?!5˸jVrA@;yRPOZP^cnw>S7rJ mG,{3::axt'gjؠ%Mp2R~t>X!"ui>6H`\%+"攏A\j<_*ŒM01 +Y}VWUv Z:ZbqXX@Tw]]X5#b*P|;&ݿ}=ED*9p,{Kl"Q7ʑ'utE,@HV^˭I {.T@LU_q GoxFX\g5>N!1,tx&*r 9j&] <1yǵM[q{(GsHwo\Fw^{ `иQF杨~|bEKQyIe3VQp8  3eNzQ-SǒJ=;gs-3=PnB҄z7s1gy.ܨ0 RSxWo%b98$' @Kzud/qc1ױ=Q t"(P8;{$Bպ+ $ZvkY"tz\ÿ|{wL*oUD0gD.ptH |^gx~<^<[YwPdE6lgV5oCwxϜDr5kic(v.5RH=E*j Ģm؅K  QK4CXqIT P`qb"*nKp챛ר akx7P 'qX[/7oc`VDGGԬ`I{Cu*0gIWKc^vӓ?m-kRŝ=q'̾9dbe-Y։ݠ/8H1ws/CAr+B7yLbDOnr'5[LmY B\<,ʫq{8qubrftj0xL2i.`@%W.ɿ`1zyx\nr"&`u9jsQ/?_Lb@ѲjXI?7y&UCQfA!9A,@ԗObo,&T G-=)N }CyGK(mHΤV>m\^s.} ڼx&Bnm /.<1ܛ%%R#6fr~9s]77HWqtdgm!}"W9iLφ8uhk9WY;n'eaMCP+0N!G2c`X'k׭PLQ6P, @cx]J0tW1xZO~~Tco*_ܵ\>"Y ɲ< -+eL0]?( &cG eH0q0;X 1i`hJGUB37^+&9 MdX,H, 0Z%Xv.Jl$ E,сԣIlS%fɉ5tOͥSwwM/kYrGbi ⇑lA9kHAZ3D/l+w!5lXF̦6GFX8* ưS5 k%{o W4Xڥ RBŞxck]c9/A汄.H +5nvn* u0&WꨤRFo6A凄ͪ7çp$ geFk4($`BQ##Xcbo]D?ΚP Rq!.KmeMPËVߙ{In4t"Pvd6w߁t5/6("wBݷe j-^"H"Uv4D,Ę,~Rq76~7ƌ? X5:bz7,VB$B }r8ETHVf0]7I:A+ۋtTf-i|`d|C.I` <Xփ<2s+bɴD<lPVI}HxQZ6JݼpC{ҷ4gHMʨUyup`*[>?iUn<~ԼqK;g%[PY`!NC&ZIMч>['rn [w@5TN©TB'ހ@NQV3bAe27}zE3vM]aR.iH>mSFM&CWjY1ʲl`]DjH6jwjSBFC}ydE݉v$UOL. Օ+Q yI8\Uz"㒡ք!etzlǖO9s[\5} -krݶ5ʦxjlMTQSu8vX;䀺%yIʉBn@Ɨw5M'> #g0!qa&t=viH]xے*X`8qV[dEQz06[1.KxIc<KCgh Ҡzet4G^o-zFx9+LQ/lEB&k`txg2h&ST0c%ߢ&ԯX C`-&Qiぁ*k@v#)Ֆ @e!Uğ;'ȃ,wL ^ŕ۷oLid zaH,u\]J,hȜTXC\2-;d66/eshޡ{,q)w"ݟGӰcs ޞդOrm hFϺ-m4vkR(\n>N3h+p`}?`/CmRMٶͮۮsneaꨐ,$w%uir{TXn?5~wr3w&*O_p:ޏ%P%_Oln4սNIVсXQE$$&c5&4yrK7-?Q~3WPĊ5)q}ZY[ARxS{YғB{`]vP,` Xw%i`'KF{X [d)zDb6-ego{ٲkZ)_f_ I2c"$&ECC#)2b H]ֲdA uG[̶ XRr6֞_II@rʞ>v}EjƚTԹ G$Q16IΠzƹ _~jMs8%C>ñ]Z1r~ U/OyPҿV\ P6]4kr'k::Y /û+ +|3Anݞqtf:{7:[Qo*e kw@]UeC|dˑkߣbVUTmrttZw7qǁӇᠤ;Rٍs[V${Rm {Γ4i:c !K;tmqW$w/ nqƞ؜?>es&VOL_{%.~#PjAH0{ ^I$5#dTl2 l/g:A?]nxXt/2cԵq i Q%t]rqGۂ<z(Fz}JI(u{-TDQWg']o1.B /ª0g8K !q-񂘱Í{J[D9MaxD̘/\U̕?^:Da1Y?'߸CQR Ʈ8wW[(/a#ESY_#Wn{"$ݕ*ADF?ޕql_c7:ז}4̜f6Ab$od+ J'AH  ҅꼎HEe"^Yf7$`#wwUg;㍹iUs LΥ`s4/Ԡq|~2͕ Y,'?7dPߏL0ZYj)˃rdYS%J%/E>o/~|> ~zz0:/X%Wi̱&ihhhh$=W"U9߫d]G[i 5$\^ Ï 3)#L {88PŜݍF!").śBӨprJtOS7ZI%o7DR݂y v|ҽh+iqg.Rl0.l|E&G䥸X:z¢R&"=1It[wYZVVxӷQ̙x'U}uC3;8Yqϋ1 w~o'+2\] r% L[Z "ZD - Un%4444c +bHqr .ca ar{c P5jWe\WwjL ^HLs^E_yI{тOR&7z)oI4v%->A$Z,HKI'z^̟TPS>],|,'ٴՂ sHeIT铠TO/w2qU$A|[(,Ȕ|ݐI' yt$.5at1s]<ENFT1:gXIPM πA<E_[)qO)ߏxK}Zd+7m@A&=\dUnT4moi+Vai[9hӴyj'_)좋' Xj5yM*=3pn8vHxat>af ֝^YtnuPTy*R(xY!XWJm{ړZD/m:٣_|e.;F)(_,5$.cMXE @ELs8(8; VHVL) 5-l^:cRD=qMwCR?/z9gG9oޤrSWJbAA@b (V21A ۔,|٭Ԏai+v9Y)*)*)Cep #;zF Rn U&D @NVRQ/@]> rǜEr~d5)k:cܩg~DŽLsla3Y=[usN᳸ *ȘX]ةL(|UABBo+FG 6KEF*ori]Shzxw݉z25xiՅ»@"Z» wC:&݈ˏa5ޯ^ 'Gry"m:},q:#νlR DjPA0уm fjtxnd`F4uQYn}yjy7>sx&ւ=wͻeΏHȊX4CJ%Ŋ\R+l,7J08} `=v[vN؎O=%=ܵ uXJ5:΋LTɒ]  "&Ta_!iyؐId!S]ift :{wBW P!4 [vY놤RkG`ڕr!cN"1TQQaY 544ɊpRV^C߉4m}T3zy ֋na|hI~ ;pB?LyԂ*l2oj :i JԝKDL&pnpqpOл|qj]"a6M .&+W-qWe_Zc G eYqcB D+HENwWh߾}SNUYb&Wݻw+}]$2CTmi]2) SBT>=}upKvPxENu'59)ӖρٳзHL’/4$OGm!(Yg4)k$G[C.q0krwHڈ$[NG'nݥAp}?y~`K4KcWO"޷Uf8U ՞sOՋA>ӛCS!y`px}pv j -HlhprAkOax9Z|?fbJ u|_w7*囕5\mzHs>^Fr:@;Ad ³*8$7u9<=JVCBNFαCo?2"K x*/4>ݕ$I42BCCAUpt)F&M8NkժU{U>yԩS Z7o^L,P f5T)cƓ`I` Q V ]AHEA}}D9'] {wWk{0'Gyy }'pIN*e؀Qu^&AmO<~e%/FSVe"uUqNByY2RsuJx-+qts "uIH{ƓlܴKC#:bbbTl޼FI+WLtnbhƍ{ݹs+Ȕ)uܙ)cL'/JNJmvOR"%;T`^# B@=6;4e% ԈnK Hm4B@Btx/Ȗ} ~>{;TgL8 ۨ+%N3#~d PlY?^{5{n&Ǐ7-$;v}29[nݸqVK^P 8OQF,ڰaYc:t &I.]bI@@J* d9(ܻA:9ARxH{t{O i ,vaV6B@1\Abb"ҜѤkK2mփ਄Ǟ{OC:WHjYHt?t蘘h݄M,SB|ȄJJhxrNzw^&.֐СC,zWYB#9sD $-Gj<yûFGG'z#ݼyU~a MA Mţ'AU3NZz 9;y.s$13ƁרfŇO>wSY߬li!3v_qR~Y"#^ x<`԰[$I=c4аTk I }zK+-_?P-P@d{V}):H 6]y>}  { /"T fH$Jc L>Ԋ׮]o%oxw[;4q)S.믿ݞ `#i<+&zzR/U }!y_A< T%[Z-{揠} )PRN@p$cIcXTE)H1`ih$ wܬav`` }'L@`$ TP@PBKc5 O: ;HP aÆQlA%%^_8!1}t')EF *R "jժq^nR &U0ms虡 O']T WêyokPAb~6#%" Q;$X.F2G9`?.>>Mj$J 6PlRHrl$g ש*DjA,8$rV> ]>.Pු$k8CpLȐ'J7XL1\70z{ K>~8Cz|ӬFN_}z>Ȟru;SR>7[2=+G(yeWI CA(31@lRK$s~jy[$G[Lf!D+[VJ.͟ lH1XC3MvIyvuu+/*8߄[F99zx5z( 1EۭgݷL8zv aaY¢c4xzm)7^nwUavZڰFG`AZRyHmٲUfT`=5%WP@jMIj"INMv}N޺Ѹh>z%W쬑ѴR(;yaDTcQK&6[ӏF^y7ngL(=A6gՎa:!Xakؑ6;i„&`orn^#)v㇂\7٫,AE̚+7APȬ4y~rws*_OBϝ`%4=°yǞT'oX,x@^ͥ>}a`2DK,HԂ\zH/m_[>]֊LAi dihh $5kJQ;V4YHܒ~8\qќzNT҅}QNu. ݠpEJh֡9 3$; 9i['kHؿ˻ѦM6HnCay`|{*զJzyw"СC{k<{%*&$pEtO$qTڼpq/KP.}jRU/-?HK$@ܾsj%A0/Җw7<3UHGJ mU!WֶXd=ٳ9/v~@|'~K@^A}}g `)8j(ֵ؂Ga`"ѐ*hJ\#wnlwܻCCR3V|=L6lE~/;W.QX^ (OZu~l= 9:b7hVL.S7 gn.FvR)6 s%KЅ 1KN%;$!Lh֬: H qRx5½ q4K 1q7kY@xзzp$7x  Gp>OƳ%X*ɊS.)r$;wڋц&_mtU]=/0 9z@˯ QЀ?ҿQX?~(V% 2Al]C1P&4~_}<'>-ۉ7h餡tjԭm_ZlDYK7]ݩhOK,hլLٲSQѹC^o)}j3TE\x ;7{&Ҵ-=Ԝs\Nˤۨ?<:逞EhһaŊnF .'''Zz5{LigxAxCUVѻq޽˞ j(7pϞ=Cz8p-UVk׎;G*r@@A%XH Sզ ֧d9!G(AGwo{'җ[0 Z3 u`Xa=הzt9f BGvno Whݜ nЉt`&:LގvoXf"}+ӽ[LoOOC z_A{ӝWՋ4iHrڭҚ7ss⚒Ә>4lZ27mOn y'jйT Ø!8LL퀧 H0M(۰T. )P>:uq ϙ3gX2}vv9|}gLPpru֬d ׀h@UT " ȝ-@9HPx6<[(Qc)BXxqطI#T*x,kovwbbqfI͢8?J 1sg mQ6}j1ç(" IDATIuX|e\@** j)K-וWRɋ9/OSqsnP|>Lnd?H;[N0Ls*k09H<%>L|!TM4DM1w.ƄJwaiޡa7mcCu8qMd$gΜ4 @A a8҂c`͐:FzRza=T >n XjA )K/_8HXZ|]Ti+b6 yxihcԧ!RVoQ($X17؛%X'e,&#Ao]RQ}g3J64cpg0w2^F6ci$.VDt O;ڭQ$L>vX>ym]<^mUܣ $svJ$w6&&gcGF:6 *R0! `e&J_R@Lz$@vFM$60 *[I#rHBBB8wR:\X jș3grcPR-08իWg#u-ꫯX@믛Fրj3-4oİfX& A摷hPBJ!AIؽ}|K'W-ǨAlgp ў X=cِfcQ6p`ڸpL ѶJӮuK*Z޴zY3{5>mN\5ԪϧlOjhʖEDnS:h`M&J-A#YnTp$CH F7' m&EBɃ&W F 8{@J$y쮤d L_j߾=?~<>|vɿ BkҔ)S<0A}׬V7ܹs%/Æ c!TrٖG4k,w ҕǩEh;-Άl5ܟQP6lP,Bwܠ=M6PvmՃz5}'/wXt!=FΠo8d<샺Ei\l%w;&G':ڛԷj>:aCY`**TճLc}&'{0ve^Ӓ7e]yBG]&w=JirT7ؠ z=j%ҋ +˗2@ݺuԩSfiȑ$WN O b'OfԠAڶmK֬YC 6d ɱC;RJfΑ$1@nݺҴD;.TW!ƍիV vҷM%{qBW9KIx^%XHi fwLfQ+ygMl=?-6K]~o?x D7K`^l%I#$6w> /?|^K4tV*Z C~~/5ٚ ņ :n߼jJTFrMH;K+6̟Lu oSwâ}B]znZ?G̀Lη|?\}x# )uصΙdy߱E>ad/XZkD%gPҴ@K.I E܀XL}cbby e_VOm8s+,N>y.Œe:mT;Ƹ|F TH[ L;&lXjҮ]Wz$ $鐘 {Y>\|S!W*U =Ahr`gZGu&_*8$bh!yT4>ck"LOaf 3[}CFwn\cUjQB&1%)K\#R=w{Iip*".uV +VmY.<Ѯuc8r$^$~bƔ)74.7IߠO4O'[Ҏcg+㢱ɫDmOi SiTmŞ+d 3ʑ' Ec6|3juݏP9t!7g9DseQZIޱ^{O qwqۗ#]-[^mB|bQbC ~@_ךT40Nm]/h@X7 "e=51$Y2\+<;+?)S1c yR6YK"]y`FvPI6oٿXAk3%8JUR,M,x]9qL a2EJʍ۰j m ϗ`DR%OpMȔ50aCj'8g/;\hkUm?H!A(H~_,=vsRlgi psݒDK0N\%E \DxڭX,qCRʉ5+=Hϒ92VQ2Re;NDOBYe mKE Ts>y$-۳Iԡ-@fRd + >Y}yCCI6E"} dP ~wIIJwET*z$Z'td:tЃ EhWIYFjN{X`i<ӕɽFd-&kSu5٘$'è@rѽ`xH?6mȜ#AÑn6Tf$G_/nJ}-U+y']ήCbp^=\).6IȘ5ȍRGҦuGUtћJB Bh@E"Ez.Hi"]:ARDW0*Uҋ !gvfweSI&7߾};Ϝι,%Z w;*_;a)% gu\ev/ܾe&_YȨ$˓56@6DC nA<0208ᪧȐӐV9zny&0%v?u,   w ȕ,IlRPK!-k&zj֝˾eRjabzXMKY>1W)C}a& q׌9,KUX9C$jlb-+Eg#5:?:KIDiBi>IH|_=l^v(5/]Y@NM9A2飠8gtxj6CJ̕sKJ*Aj-Vzxp^,̵(1_!oh!tf{U23 k1VOI}DK&REt⽠S1* bpJUwaKIC2q!&p\/jܳRɀm̪BQ8E~dpZIؐ)aFpKZr`o!NKhu4}']Q#En"Y!!cw$K[q׮]&2 1X@0}ΥO4}pasT?MH$ے 7Xݒ2cUX# }:PlO]Gdِ)e|^8|=2f/ _SaS~T+cX"%+VD{0#,1ͼ黡OhVl5*1:V * -iL W,_:jLGGRhCرʞ7?ic5=Ճ.̲?c-@}͍ `=Ҵ^Mz ڙh棬CGUy:R07c=Xjb؂MjT*Az@HҬ o]bõ~Pd H[vNBY8H+F"X$,GNi)J B7^x1#H4cuuJ{ L<Q+#<~]9fbfx0C|S,&!I]CH`}Bbi5C(Hj>#XE RŚL^| ɤ1 @ND,p.G4.Ecʟ% Fh .\~POp O% aI +@VrN(u'|Nbb \a`Y6Nj!ߊbIV#SOJKDҾKtȮ  :FNr"61.,v ub$,OG|\ZwW3-}W8%܂BT5qÏK/`Hs,sO(+ź'XA!"J2iW!Vv9~Fkkï"V"V`% W \bVi0^8'KɅ#z&:Wf<sTc6p bb|L17wZ0;Y =bĠ$AҔO0L[nrt%1dٍ#X4%Qfv#koµU \ [k=0!`'Ml$D21gEMaOu.ٙEh8VGاS .x2†XвI')Xt⽠,.TN}(y׺ yB!, h!W#J' -Oa)bd츀czlU+($Ld$l 1[AuX+"A/BM Q%C]ƵI/r۸8&>B9U[^*ļJT}lHAשZ#w>FƂnߤYRc1 X܋lȽX)7fԖEETp6K!S&z*P4iO=໷L 4XͲW$sJmx\k @tOt8R1Tׂ`dUL6Maڬ 7MrC_p#|W䝊PQyrBjqX8|3#Ng8r@KDw/GHi`4qrqsN{Z-;ӑ_72#ϖm'Ҋ\ג˳el/~#DŕRdG5,I_1XϠ ܽJ\o~[ JbE6r BnQěݘTt5B>K%MA!5q>F aMn{ %d fFvWPPH"E#t7yDd~\sq6@Tb>+-:?eA!k7ںpݼO.Mv"g8=!H;Y3;N%J}SPH-Y\«dKeaR1Ёb+(((6+{{V+K.*F M \+)ܡGgb5=sG\u1db [ yFf(RvFke5V3`/$ʨ&1X ~);jx3LUlO*'r/ݠ_Jn ޗ!SrO9o q73<(uӃ"<'Mi 8 $POOYtTAA!H/A/ }e<ݏS>b(t/rL=Ep{?3w$o}sV-D }(}Sz?|R} ^FAAA!W@PzbNdJeaU2 !Hxˌ伾)>tpi/+!Uʇ|2yx)d-t3<'|}x I OUȤn`SPP Hr#!#g" r_sKk8>}ۭ"'IIOyG%JkwGy (;Vgf}H =ݩzϋtE+Ǟfx*_p B 4*((X <9dӣ*2>4rd+#([Mk%uH/$*.ooKA%XkrڔxQC:[qًgԳC/ _0s.++QF.)%7ϟ>S1E~~ٱ}<*nUH$Z7#9un8ˑ?$B7 wZ1Y"[Ud_.4KDY׿GѤf*((FE[9\,tdݓAv2)B <#^[ IDATbt^wdhy |,:02Ŋ kuf!I R+EFE0ute院##Y"RiƷA%ԎEMǝԬ)G2%^'_NwӊVp&\D,X `Ş&H=L+~ &p1}k+-7JIښc]hIhm^8<<ЯycRX{ϡs'2+KnВ}Fn oNӪi#Cى5nO&LNڴzXO$=e=Fs|D6RCՋƻrPFݼB:9hY,f_ilḑ+4GT$\V7UkoZhOZ?N)I"XҺdp#YGUPPי?K~omyEJíЗL41.5s$ϴJ%%]MR;&)XmIttzZ3c4Eicq;_!j7ț_-Ns!lX)nxF1WL^lD.K[HAN]BI{/\#e>mJS#dto>4*~І (O/s)@ajQovkgȕӝ-QD?]szCoݸݿ{V % Jj唎\rYμ8Jdx ʂ$Jz 4Yc#Yy*zKGǓj#YZ-77w8|2[>9viↃhpCP){AFX9oQHX h\sLΌ-8&%߽|.Oڍ% $c bCg?8kjg3~b 2l,d!xV>Jawxaqf2uJAAATI`yhV~H  k!L]>Kho V}}[{{*U.yU-_1s ھzkHHO.ԬV7 \]FLO9%c2R܃o_M^~B5[uMMUV.w Iyc};4 Wqw`I9}[߉,dVJYmR:6ʯb-z:$3~JXo% ? XQdss [0Jy0/zc# N0nu 9rYz2N#Rp%>e-su7[&vy}z/9^(uxjZ<7}#Igra~ r#n" yK^ZBN3er%$VRPPP4A2aU!0D dH`Em2joD 5Q؄@XV Xd ~T\u%Y:O}63rJJ> ,˴@\lAe[1RAEht`t ?L2 ֑,b( t\x,jR9RCKp vyUQ;Z -2Xe! _(rpOlV 2G   2u h7`k. zJg5!4lBxyOZI\]+PlvEҘd]` D _qBK+Kd&",\9V&!8 Dr<^R3??"oeV=\´ؾ80/"`ƻjC3!gTAAATc2͊zpN H)N$ݿ;2,tdȠy%Ŝ"N͉L:C "-^BAl$AssLYxܜH)J> di8@)>Z-M!e{u ;f2!S2V2BGaC uA9+-RD)E +j_D_2U / e#S@8f֍x#ɺuzhe>?X0[0PZ9,Wz . j!ÿ3]5yy=D=Ө[q@&pGe]dX:}w P;7\ 1Hz1iv֡adj7`<҅mubdƐߖg"rΦpq`ΧLidxBV!L@EShKBIҧ?/ Y prADW^$z2Y37Ge"XVKЈD nAN@'@3 O $%dAjjU"rvKdK7¢?0# uk}7wRFİmUTJm|_}\4QKwPFF}{oYK4vT:z&nn^NF~]>l=|;i7chﷴ2(r%4b;W/0KW*BO^I?JgŊ@.O}BiXƉV$ ^ehYcmRhhhim࢚ #,f͝DX;ٸAy:vncܽ9f"bdrs "YJbExyN%2 #= cWK I20 Υ3˘o3- qR˾r@._L9{e=yVMaLy"@M&cwn^eir};9]ϗKɊϸ쩮<ѕ2BȮmf'BVAM.DH= 9/[^ իw({Ϟ=k?dE2Cvr,YWL'X>JMPбB#[j\AFWN(+Ǐ f'2у! nlɉe>"YVj:ɤVU: MxQ@]3s?Ւlw&dqWb]vl!f 1S+Tߧh X zO/y'fek4&Gs'N a^wm;; |Due#Yƾ@iE[(QJ"f|kH)b,XA#2JwY{v.@BرcK.Uݸq#i$KGJ jn<Nd:VAH{76 V2`\N.xS"2gK߾}խ[WNNNdkk{s}%R-DU,zA{>@#NJ&7C8_ ;rw$rBľq#X #C ~ bSH9)JD)qsTF&1ww2E.N~5E]GH4܈bFa|O%4-*`gq9rza≲H;9\y9 8~23bĝ/K^zwbd﷨nj¿vYAZP+edJzMd /ڟ"R[X/e'NL)o޼TjDmN2eڵk3ٛI*,H ڄʂXѼ+̉_I.>kt#,4;C h c@?'oeG6d vu$/%^O 0*~{5Hu< U=ցC_t5p;Y3WF:.K.DGݧZ 4aH,C ]]>I;{N+707 [w-d8QUzDL2ʳs/GߟƏO/\ԫW/Ss{1U~(22LB֭cժU,X:t(լY֮]Kͣ͛gKLk2RF`Yʖ?paJW{@ hXN %xB/q3`# n|?^w-,c.Yq: HG&V/u*Fw+If PO>SNl_qiz/ns\d+zonpp.L.|\jX P$<;/^'Om2bl2Zz5͙3:uDYd1#X~~~F{Eј1clHastus$S\m&ݳbZ+IgrEP+?y*;vv\pLA^ۙKnBSH%4ђU Ƞq\r^Bjx'ǟy/FHQ]{5LZ8"Jf:!N&jd+Q\Ύ_5)V^C:.b6E@AzNP+WB,l, e{k[ W4* 2oYf4|pfcvEGfw҅lBTdIƍ=e"U`ee-IH輌o|ɒwz>HisHj|xRcHg b*,<^@hxD)\)F ӫ+CBk%%Yle5i0ĉ#Cu#p!V+ciHhb3@ ڵkl=4TR11* I!a\d d\Bt $ K"S](#jD0#;n)ۧ#FJ: "ZROyEGgNL@#i|I9Y:{X1qg3;RNdi=cFɫB[.1yEDA: CaF;wfn2eʘ, IYJܹsٌA(^"+@,(C](CaYv˂uȮ>'CL UQx6[.eoT~A$fc^GL:m25tf>F/>ù JzX<1 Iq~ IDATI"Yd &>-B(\!D2cvF-w1J1cӾJF,\ Sp*BVo@`NF&`SlhhpUnU`qitOdxO-Lґ7F>XWx-}2i>Y=k,#)y yRAX2S~;)$4 Ν<Ȓ23HZ8WcN߭2Ο8Dbv87=-9_t]={0׮ڱzh bgn 8IP Z?ۛgvm4nTvcqޟV|=>/z!E c9]>n{jLO6'ny7܏ ں` p^jQ Xh[BM:c-rv+gh3+]@[5oo$BVYI,@TErFSq"mzNYɔ֑+^~Q9XQNe~C(Kt$Kܐq:eɞJGwvcaŤ;_!Xyà۴mtʞ3΂ۊk`T1"jB7:C?+WϪtf;u 51|D.CJc?wmsȎe§MjЩ/]yHlKƹ5gN 4؁}S#(w"4gF"QT 4oK*^&*Q,ˆo.?_D;*;h,#C{س4iK-h/Y20^6EEANU42F'Pv3A^YAAY2Bc)_FP*tny0;Gf 1ȘwOg#t3$m{J҃7p7Bsd &?IܩltjvF&o>JO.C/(sf1*X,={bk׺eK‘=٧k\m7Z2/UߔƮMe*GJy7nXHfu2h@.Y~y3$rVt^U#fGndvS{"fuB޾7ȶi0fھd&#V5GNv=@R_?Jgk~ђ9kv^;5mļmiǧpFֿYD|"Xda@=vܚLPy+7 4oW1UH jUv$C[]g88evepmUѳTq{^0u:;SEi$pٱ 7?MY\ЙgJY:F%3Nۯ}*l<&@%]D9 pC? -o2In͈Kַ}mcV)gl܅,ܨw=hFH+Fj%MDa$?yf6[ig*Uľ?r]rC7NrB Aԃڵk+Srqd Z=CZ#5cH % k#Y$U[:I"Wnͭ\.rԑ+XɳEb`_CR]V3S NrZk$\1F;K#4 ͣlef v-ĬFg${oBßբ?hׇiD:֢=?/>,?J3FR\ȾټmM~[VP#I*Y.ߪ\\4XW&Xvv{+YJm*\Vixvwp&S8TS.{":w/%-t{~Ol%k4K )ƍ\ZA,7':D Nk,WEɕ 'WBp4̧x PYy]lNuUXB.'Z )yòڄ q!PӍIj'Qm%];# @fܲ"we3Vb F~P6^}vh։6͞LZ̈p>U !r^Դ`yU>EaW<{OT;FUn!si3`s oR6XVҏhP=j`~ٱ͘(?mnmkީjՅ} IJ&ܣ@J\"D{#ǂ >,J-PTkcHziG ȓ<˯N:i&F>@F}R߃|iӆ uШ[/_k' B׶m[>x ޾mlի3xYbqp<ɓiq^EERHZ',oJoi[ea؆](;JK A%eHF-ȕ~;[{dȥJ1E%Nz?Jp%Gݐh2m<*yGLR\VWEbqAOgqYOdպTYy 8qw|%enLX@Z(Xɢ87n ɛ7ޔ U\?ȕL`Ǝ޽{\rLd ":5jԈZn̈́CBӧZjtY"X=9B@@oLc p;tP&Q饠B `a4ϑpD^@6)ōdZ6%r%$*2ĊWQ/Fq 3CP=Y%@ in Kky`H!īR WHM0ZN[@ Osµ%#=8<  .HCZN)w,uB(in> |Zbn޼Ɉ7H,9( ; j͖wFѣބױcGݻ7# e2A.ܹs[ LpFDD$xnbSPK!eF /k_/+-";P =3\ R"W1 4TwYlB%t Ƅ0[Jq|8 z>d'} G_ů4-YPdD8kޫZҔhݳ+ݺu+ի̙32f V)KČ-[2ܾ}F:t( ة #ӬIXHŕ`VO|n:N/#o"DM s;k-KJm)(Ć[7lSKټXbfIJ}7'LB{]|,YBb&85 1Pk׮5#4q$? 0ZW^#UX-l8P~!ԗ'[IJ'5Hs(E|}ѧNG.;~lwȠ\y)!PNd2tھz6FodE?VW*ymO?utt*--\i`- p $n>XMu CS˖-cY: []BA]""e2܊6G`:+T`7^N{u +߸!1!r EHʟdީdv  <$Cy?ND~'=K,}UrY ZLYRѶǪeG BUᣥODF#R:'ٸ%̙x4%LX0(Xmlj.5H1@? D^ !`}jG씼c&qNH.:lO4X?F |y'Сgǎ[rMUX7@ 2լ`OBBBv!#^ONEw*iu :)%֕^=%4mbt,}γPr =d1|"-\7*dMQr #{kVjeVzAy^Y+M$ 0Rl$B&3qM&@>/3z(cJy9q 4zí7nFXk q3RMF4r"ӡ)$*:ѕSW߆[n0co5d"S饐K61ؐ)eeGY.K9!0~.vB V]ohfH+Ϡq}y|-+R:t]cF&rOWilwPvd`=HX Mqhkoc\8#}pŶxfֿx7NƬp?hщ~4e͖7|psގ2eT/~L4?iۂp,- i4b3ݩ6]~)gHq PT˪~IWj9za/^:cuY2&%äKd>IU{i`)(~$!zK"x9눎D* Qoݢ8 YDll%d2;s.,obeq:3+0`J,S i *_*S,j KEӶbb` Q[K B~>]>EJ.; Br(C! T3[ Һ29ZU$kx), $e*bɒK\A>#_`e/lY}< aˢiIcgpYD:{pǁmX'R*urAwٲP2eGLnj(Ca.TI;N޹|-ԨO6ևA>PouwB|X(YDLdM溇d)ltE2`5!Cࡥk69y\id)M<. $*(8D]Z$ jBEqV/>aÕpXgݶ_|5n)QP|؝Ar2\Ȗ?5#Ox.@Эgεh4zvf:w;^1W[W͘c]c8ONqg87ƪ3KV%$3v+ VDĄK3(ဘ+H7ҭÉW&GH+nJwk&m6͚rB'`Ɓwh._`/̹x7ɴkwzW}kCWg5t.A+ yUBc oбUmҞ_^<~H]dNnƒH#"i@#hxg(j^(QĔyḌh^$}d-e눢Ӭ)( VmD㆙'s"%C̏pJьԀ0S|t+XvIޅmT$U0 gʟ5Br/H=&̧yTu7c|R՜#AA/{g>ɣo76UI_EHRWʂF5"@V:AJ C^BȔ&$!np-:N{j+KzqplյLRs$'&K!uAhC<nvxD $G/;faɳ~0"X `vcCb+STt7k#):rmdH}9O (M.IlmֆB"2Dp.Q@=o^齳>CK @T6KȖ:)V=w77"l=eHxnhZ1qZrj v-yNb˗u'@~l OWnwl=F/& ٪ {B9=@{B亗'lX{gmRhhh鐐50o\3@Ԇ~fwhL \ΐoSD$y?y-ɓ4)ĊXjٙcvTmh]u1db{&v^  qrq)dc^~/dd>d.IDl_r=wޭ3|p{ L\ EaÆooiޭM Rx+$ /}lL^f횅r@.z:z*{~u*ڨk2߭syަtD(/aTJL\푣k$wv\cۡaO6nXzdΜl9{v% Q%KZjg޹sg֠R[4VWmF;!\-:5\ʚrfŻF)Fr= פhթ=xkwi&f}$&+d es|1gל 鮲>VTBرcK.Uݸq"VGpuuے p;yIk d툹R2jyX{:Losb%Rȩ1VTгQHY8dŒP! KF$6(4"zRؕSDz{~ڵqÇQ Yƍ{0zh =oH5+xD$*:u LNiSWϞfB)qzəlm1ByLV,2O{a &`8+L\R)q> ɹMtXԀX-=5kϤfcy>bEX #u4]NG˦XU7oG̕›?C(`ծZL|ʊVx5ג_O& 4_Q*^:[~|6< JDg1ueFJ@0= IDATj:mԮEBCoe5|!%N +jsH=p.TW$[1|%ޛϸL,o[M?oo|i =VHv a/}>{ުamU@{0w\L?~gN+΁BUnv8壮g25i3ҵg(Ku,7OC殣+aT>pDO~ӖJT*v.thVCPrԺhg si,[ڍu`ڣ:3_R٩j.X-JWώ q)f;TD M|KWzM\5w©)I~r ϳ51OnnT]/Dvp|1L:^v>U(cY0{(+IXnickh ekp&jz-8%l7K>Ǟ'gFˏس ֪ѧ*ik^[iVN`]?ǛޡNѺ9(S:s9zt\|z/hIպ 9#èۘo7 i2N|Щ{2gN[Ns>މ/H%LN(_Z|:<B䦛#B,i>+ &=FZ;c ws+ih:jTXi*Yҳe^Z1Y޾~6>,>{_۹њiÌT6xDqT+q:t(5mڔ?~L~~~Ӟ=ЃJ*E+V͛ b0ڵC|my}Ϟ=)88߿?ծ]۸=ƍtA3vŊc2qDljO2uikܲ/g"+?AM kX B!r~+G~{qMfWFwb6ʩH> oowfڷv1sx7ҏmTn:^,k :-yɛ='Ao`jع}:e~lAo 0|p-KUkZL'/b a3^CmpusO&Χf=Pzlۉjת<䉱^Tى.qݟӘ)s:cK9rȠvOXN#:cڤ-k:3cpss7CNXQIm?g|\ߺu>L^Bs{=fFp_uI<Gw@2ϏG0b`uGQWmߡ7B(Ia#ډ_c{1;2bZBIȔ(^)4۷/9rH |U޽EԾ}{ b-mRҥ~t90jԨPXuٰaCe˖ }w ^vwߥI&1ݻe˖THkx+XdH8g621GSm{ɫB&b>}X.g @RN,uѐNlWF< N~zۻjlӝ2& Z<+Z$%# ׳XEʵp7ŭJ,`dI9殩X)ekn[N`ڃ?Ȟֈ٦&1֜-'L۟aN9O"S8*cl!Gtl{C+Xz;װgDVq:o;sYNX{ _%SΎ֥x 0XWKu;Y>Dsiuqa]&UŋaÆ1J"'''Fj4'O>q&#U#O?eDҥKtRѣ5nܘ"S^e˖e V,RW^VZzC~/ L<4h` rufݼfsu?0r<7,cV_A [KOh lݔhTmΰυSY\/O5}}ÒVyG` e 4ob}ޱjg׬\Zĉ=YLJ+L%:k3nNWF,F:b.Uaˆ>70ADl 3I/ң{Ǵ:\mc #:pp?dpcJ}H to_ޫ}~FTЫ4sag5G.3o$2*עao&7w nhسs%"~뗽m+f¥XMNH&Ҟ WK"L/(44PF,Wq;a-0C[n9s4Gi/j ֲ@+Q8Y\p)^xyX[* o0iP{ f%kѹ\:Mt%*d˘w?4t;.3^?Cv$o}W HG #>t,g{3 b}`qѣnykgO'EJ4q W5c^U PPݓ~a;/;LAo>܃.#I%>l.~Q2 jQ2gAYpwnhf^R(v1qj&,^͂ۊvcc䉻.&MפJ\x2{$Qy^aHpݙ 3X'ԧ,w˱[2Y9wt_.9FÖH 3X@;0syW!Wy7pKM8ނU"%ݒ+WW_}EM4lٲQfiW~4x`,,C<zl*TY`˙U ) uN6jap*Vb͟?rΝ_d҉)g7+Cnt1څKP6oaՈ \m\Fk7bGԂ?ZkȖ8VMoJa~ a h.0)!]˨%c8FX[ `'$pXk*ដ 8lVL?+YA_{_sK1bVJ`!_[\W\O3wxbw\k[|WCQr_;am:Ȧqfk ɧcFX'HXΜ9z Z ISNeqM>>>kʴuVFX~_@.\ (ڶm A Bfb" pUh +www*S ;&."<uhc@zh ,K$WV !S3 }F6 V)P}x+%U"'t,u<⺾Iz,]~M,Iab+> !). ?bEb=1XBآc+7bo{  w;q@8ݙ73߾y^Z)\M"Ɯm}l_D"h [jB̹YJ:FJ/ް]vv ~B{e|кukjР/s7o΄ k!%$H$"7ke߆18U "r%I+h?SoМHl)ŧ3޴U'[33:mFQ˜,im_!UK1 eFZK" FbLy]Kp嘤`̀DlŐ0*鞒:* lf7`/L;%$HFXawZp)$$$HYxį㑉XV %1q+Z6vCk%KH$"dGyAWhb=uK{bC =/|sF]P/ܷ`q'm;$Mء &!?s> 5hǧ.&ҿ50S \&[ 42*!=IN9z(SWBB^H1&h8bL0YEFB+A uA@8k=7P&h|ٸ-g`/ d%mY[V[99d.5-ϖVK#ueBSakvߐ@6#D`o+@w U+B+iJDy$|b%:+Ç+"򇟫އ FZbׯ_MڵkMDLj`Q8D'm8E ao~ҐrW&hXΜ<@Yxom-ơn9ڱ3qmkPj ȼǬhxɲw 3G[NѾkhgkTnʼ8[\u,Rjwp/ n;A'CErzvD66u*m'p\@8Ӫ:Y[[Ҵ9h(# >-M=x^2xG8m z/}!~~G|O㷜f S{(8Ohk[[{ヶE?A=0y'GZٽ[aLJ5)Gø3ۈeB"d Ǻx*U}ᙠͺD{99//UJ?[ޘi@dX]$xYܰR^#d`G9{3߆'RAfEe= &ϞM1zo}}&֍ө""e*廩L8d*=}yno0Ȝ='k\n;IKN>bOC.iMGʟӀ9Tq&242Bx6vq{J~~kavTK%||_E3\i0#D+uxߍy8\>?Xjd~ )5_CٵJ23Zȑ+$}fܵsJީ$'\%5j Sׇzʆ*{O%W6ȓZ0V?_S"ܼy3?_+Wdr-ȑLFgaj'AE\Ax^?<۳gOZf qiv˗{ {T1h%^8sRxv`ѢE@ihP;w'=@… 3yAY'N0iv\B9o>&f_}5lPUBT 8m W|.Q!]zԋ /2D캌Y,Trt.5ewmzm{,҂()&G9 n*Ÿ".&6߹hՄaA4CXpg%&R,_ '~-ْW '4 `rFݡIUR䊟+"Eh>H/5BߜMLTdE:A iBEdL= RM$%N(@HYSԒ`|-zCQ^Ν#wICe4zh (RL6J*Ś.]pexEBBАmڴ]{%r N t W F ѡC$QxdA1bk&LZ%,q=}5&A b Q.]ABpusttd+/_؉@тAk$Xb/H Y6"s~`ˁ=}hi܌2+]5WvoNGESFD)'qhnw&&K' 37c_['s{"w':h▿-^{&F;gf 9~r~ŒdZc.ڲ`* JOˊ.%+mdǿXcBQe'?dK3SB7be0JXdhW#TFQ˂Aù>HK,a >eo'CЌr&J۬5suue"sBЋG~ז@oc!ؒ4QRtnCm 'vnT&Gl0~WyXVYd8hi۾?mY5jK ՟r`nC{JGHm (@Xc pZEx'*wA$S"Z eEKa王4n75FLҧя7z?O3޾Ov>{GJ|PאyD",s2 ,l̍]8"|GI A0@@BBB8As-4= /&4&M4ո]Uka.:n سǤGvvlݺuxb.؅aa IDAT!3pHNOܡϿiIxP\yPLQ>}F:o8H-U tB%+pҥkgr_PΔށ|?n^8ܜSjcaa)W>g^v!7lHb4$"* lC4KkeysElzwhzIOe生WC6:;(s¨ \D&{AT&rn*d(_k]*]+mFě o2J+uC[>V&4DiA$l? ;O0A/KǷFli",򉠿VR' 5S ~Vgǭb5&i/PVݨPk>ߒl2oEzN]'Omw+1#wU1y&j$hGSpYV]ä?Ef5C"hONSN 49،@XĎC,-X >3g , nذ/_Z&;A²!lPf 8 b%NÒbX$ DL4p3fԨLJ#FzeT,5z~L>)}UVFӧaI2s̉>of͚q#>"Bŝ/?N.(d?e).fݴzp \1&m;1а|94cM-\L|/ ͖- I& ut:SSbK0 ~\%'Lh7,$'#.2<7,Ćc}<y UO L)~\/,֑ĸ"זHfm[&Qfʕw9GJޏ=bRq[K@Z@p<[lQر#,׍95Z =RAc[$,aw~=U>}XB-vK H !?5-֯_ڵ~.@Ȱ<`E Qý0H#vb u vkXNL,(򁇇Tcjy!5I aPd߮߭T1}Fm{ެUɑ);}e$m^6aQ·SvDB""i͇a2yo"Q VSw_@Mxo<ݸp2E`(~! ֞t1dMik?Z؝+ϫIvRř\PhiLm3f̘"Z,,A-H WƶT ~ߴyi]2(c`yI .?$cTA P*Kf%@RMY^ k z_Ͷň/?K !=Ǟ>~t7h^Rvq 73,-+IY~x:v!Acn(?Dύ_ -bj`ᙒms `1yՏY[[Wܸqc,hp@ X2;SDS]Xrkb8:*W;w` { S;/1飁E' %eFk8ۏ5Ga}0p2(@Py@MY\JWq1C:+sL,? = YGχ<n6zz_8R|̒)Y~(m.vѴq 'Ch7snjN㨏Ϧ9sV>}cA>hA'qJBR!l>iӦzy=9 'C ͘ 'Nk2яg'̢*ZXPy~2tܜl((mR>e#!Z5&Ex[ TknUbdwLG*;:FSmR?5ʕ+נׯ_IV6"txc3uEIZ1fL p^38\eU VF̒ w$l!o޲#,F2531^ f/ԁ vڐ)<8!k6#KBH>oz7ž_@Q܅.s8I3fS VuHqT"QhL 11& 해'Ң VLoSM ,o('L笠xrJ֒\X[S9'{Cعѥe&~`qr>6ϛR]:͏v2i>͌Q?L.gF~IoqDZq[V*4Xe[t iG`A~7 8!~OJeA\nJ6pϐX@Ґ Dpͷ=] r ˂m6S?)ٓ>♂PoQg=.nR ,2ElVw^D6? sq4Rx%@"˷2DC"IiD1:(X* VeB˹pָi8Wu!Z4 ? z0˃X=)_b6&:ALd pFAV5NE16S :AłA;l@vKqT"FLni&Xm#-!Ջ@Q?h1ko{rY#M<2&2ܜqJbĮw\Ie.RPr>3MP=4p N9"3~ Yųmmz,$^vr WɏwUАw&;8jѲ4"W`}sV>Lc/ V8ALh&T=8Lј_1qiu="1s@N;ԣ4nZ1i zJ]ldI/^/Ů9P+@pr(V[РOJ" AF]^{ _!^sK|?翛2/E՛u~,4X=X#0W+Rg҂~:ޭlHr-Z]WXyOpO=>OU?1ٛjsrF/fb}ѤFk?qT"Ve<&%]xv3u0I!A5I TLe|7k G}kXТ=0w+q;Z1uZL"#wh>BQ#?]>'y۳F߿nEtj=p2wO> W|p:2qov6N}^AM;Lh75UmԖ nL 6N)SȠgϦq֘=d-`='67*dc67ԬC\}Q=8 ŭru#wa2e*.m r;ЬGUyMͣ*uhZ.XB*^R2E݊\s+ֶ)fj׊}+r ,+A~܇A}DT߅{i5Ǚ`km YimSR8*4G"Z)=$|+dXK d,L=qs'u7Io-w`|ײy慿Yp:j0߾!qkƟtrfZ5aKU_r%&o 2fJH}3^UE ,;KAhaBCL⫦ kB}r&r@ӹ2sK]_’2`c)mzzt,vP7mh#+_\g,Ccc~@x;Ta)QN|zB3`Y]4O $UV5txi:*~֪K1ˊoPG3d{rU~Ml\[.r8-ԕԍ֪F K?7lV u~æ(Msƚ\|KLwNc{"h49RV/&ۼtv΍aUXjfFF "ei˪9T]w&U6}jTJl4iqغ& '}6vWX+_!:,.AmtI٧%= |ڞa}AVoE0L];mKv[u,YF5:[!Ch=4P+UcڵbܾjA!/Ъ߱z`m@0|] 7}x>t +Qq )d0Eq8Ox׾7\De?MϩO޽SȎ2g!WeR{+#\D]QMeȒÞgΞ6hCv+/_(q.uUy`WvEY w |K/PӞ#9_쒐ʰ_MW fW+ih%S~:f>g/@+ju0s&mKe fLڔl *Y+gfs)}md55<ɲde~ݱUkѾMm׮-Yqm1'ʜ#*J[xP~}YkPZ P{)U\L} Y A ybW3?qTj].7"aEMJ3%J M; K_o/]>P0mޙl2eߓxLE`THD{w[Ԗ}1YzUr_D@_cB"(i@gL*Z ښTmmZH}x#v:~()%$,̥$>6^xW !2W $$R9KBBBBBBBB, I$$$$$$$$$H[O,8RD0]!g|Xp׆BgcdNrBOUg.R{̡oN_C {R]dwKHHH%c3G8f`x.`4> 82E([z=NB %&]~B:"Po6ia2ԁp6~jA8qJ7%"& Yi(^\zSYC>"\TR~JU.0$$$Rra_~'c{SLy1o \]QHf؆[D>W A'R+ ƒY?ѩ[(#ui.O@+' doޤ0ڳLwz$*[.FE= CY5?Z޷o YrPQ3yAgAu[mBs9޻n1u5?9ud߅j{0j7d;"%Зz@;ԥg|fn,6"cZ*u;h:r00AdoZJ~#Q@C뽨q!;qBz\^9d?0 {=Tk6@'F'lK-w8$&sC^#EkcLʱ114?BI!%$]_޵Yo8Sz"28ڽD{_9}>POLxvodg О諶=-ƥ=VA Q 7ol/ʝ%Bޞ=0Vru?gs\Pl9hr7>By ,u~y?RBBB,$1fwp48ެ(֬hٯS`z< {s۹W 4M;c]Xim+Mi7b&OPiK8PYG}94Dm,d%uBMGk㐠&X6ɸwNc,Lm}TB-rlklYK" l{mkxcߺ% |%-v<GeӄB/R IDAT0uP-LNδs$=0-[՝-h*w5a& MZ Eyn}sQ٠1S^S15>݀ݹ6s1M;Kb6R%b9~Z^?1*/ Oؠ P`1Pƍ5[mSha MG*Жc\1֝}4=0{451cq: vj$$$$H.%ZDQyyePeg:w`'*ƌ؅)ڸLjXFhc)  a;Ĺwda.l7崶CХh ٣[Wag$ QuWekէ2տQR/\%ޞTISc+B~!3 ue v//$LڸZ)/"T}o*,9rІQK3 {vٳ +ljHYI$=ZPLvm@h`1]#^i[(Gk%<LA)Ax- `5_G}J4paǑVgkROj*}j/رKob1Tƥ}h ҃wblxQ"%?hJY{mL +q.g|܄C{!my8 2E]eAw/5֣F~>*`I$li_wU+ļJ &WrJDq1Yn]CMzIr\ xNoB{>,=296\cj&Wvo%6}6Xe&e8ԳqC\#]M)"9{Fj3dq(5q )`j΋],-ߚS*_ =WN`o#m: YGχ?vOxoPdZ`f.hU%k ekMM6?6zfO"GqyްgnaAy ~ ~EPX/P]Jq I$g¤k}PB"r% ʒxal؅~<nNޡăN>E_r88} p*;B<>8{E~"t 9ݛ(WUJq I$ # }Kk+ˌVfJIܣ@VІFf~W'z"@DB.jѷ AfnGK_J^k'4Xa`IH$DJtJD?.)c`3uj*,)(RqWB"(s57=/)Fd ?h՘*qTs5=P׷!%$$^%LePRf%eWR%eSq+x[*h<ܻsuA+汣)!Z3~ЗtZǠ5zo"%5eSS@)]B (ߤ$$$d@QIYTrU%X8N=Y[)ҼL -XݕtG=j"ȕ$X`^f+vjɕH0(Mdd+)w7"YZ#{$HDX)Oi&jPMz)4otcAw>C[Vq=> Ώx|›Lq*F!@B'^H\dsNZݾ8vtj~./&]D$јknhizEKYv7$Xihiɖ \) 3FӪ)C¡)Y_hb: ?1;&cct<>غxݿv~L\:S=!xؗ8;W鏍YƵI/:XӢj,MP.]:ɓ9HB^j/e0S: HLPP2!Z5^{& dw*&/ZTo֑GLq = n[笜8I6x2嬜0vMN|{ ׾~IuBA;hIM~.z,b@ {+d 8{Bsrtv:\]+TG>7X{ vC(us*i4w(,!!KɊLruҒtHsܧٻy,1bBNZ,jv&%A˃m^8o`lLVK&Mgr@WT3&2X/-ĭru(w؇\>e4w;Z1}73rw@MEq G[gDҿpRGᴷw$KH, H0.+!yIZxY]Vq s̟$eWiVV:->JkR~Og)I -^?}]D/kS*X,^:/afӆУ[WT7j7OX C!]8ukHUV_m1\IR%!!5XɊg;B_MLll~s6Вc~oMijt|?/4;HZvџB-חI^i>CFfW 4osݐ}voOj7b-9pO&B&.RCwlҀ>: kᠶTTeZp!j;yvۄEl; wd[9 Oa&!!!! DK'if4;/V#m.4__1t|@A.@` ,ۗfn^M 7}unbF58&|헟޿cAW xd@|]@]є߰}~8A̬ ق\ sl.dR읰4WnĿyG#f+Ou֖<{6sn[MU6+_!,]aЎ>l<RV]٭,-مv595Zv;Ӝ~mhFf|ZS@9DJHHH$R1ֽ/2hm(WЗҥc Jc絨P{)}MKʖ+/Z򻕦ה+3)XK@!&RjdsH ʔ%;zUCK%Jaa!Sf*]k9>JgU;lpNz9cԠ`" 333F63*ݜˁLlҞr`Jޣ|F| O|nS^TS!Yr\ {CrfyNݑ Ľpp"Qp JoCMyw̽{\D/SNSF; ͈\Q%*[>uA6|Ꞓ;j1'ʜ#(D0oa7zATJmdNܨPJdnnA:=b Izb[j)_u"%UMwl:~!/O~(^[>תC`D@ N=id"o8{_S>ya@5ke:zb³GR?JY1٧Ao_!^[%c}<y :x~P|I7 irP"Fd`5u  eL~?(=gSy Or@yi.Nփ&&J~x~֞tfD"I$$ҘB@"a}春yŁVrөD|լc">4i,\I0DPh^N)Dڀ B6e)Xʎ>Yd%MDZl= YGχ<n6zz_Wj6XiR%JL4fplY{FDz+ _Mݛ {iv*qTUH Th![)< I$>,E/Zvx^Žh~y.D,댟?mr;<峛AkgnDŽ >H7`IH TB"6됵E5˛&%$=3Uwv"4sڀтk0h`VJDE(#*C`hh%i.!0e+ًRɮ*B W?lV+ I$>!t/L+ #Ym?+jmZJ%I$$$+ ]6 Lf긫MVBB,O AҠ]BÑ55T0`ZzB- I$$$$$d,9KHH%!4x?:exDpd'{W/p]u/wBdS}Q>Q^B뭽q^XٷJ+`,KB"twzyp_դ={o]<&i55;6ߠg1;LL1=),$B~!. @P c| b2^ZƥѾ'f2ٽQȫ)-5$KL1,3tHć]B"A4ŀ<}LTJmu{2_떐㕗T~l6t!=KĒS|j&&!)@ܼB-B/_sA5g.c  ?i1.>*@=)w~Y*d0JuJUVݏ?^Y!W,9(QmvvΗ/_F!SSz@.5Yg$RA{n W#S}:=yal濙#&݇1B];%~oE얀ȷo /slqZpva[d VǺM2^9a 8{&?N3cbVqy\'WO, o^"[Z[4sΨIriQF!8ٔt,ɒ;\Hueto9wVdiAmm,5}(S>*Ye^RߛT (ULe2o]2nsNn_c UX1s,US*!Aÿ"3KKʙd~vWZc d"68,mBR^;ܢ-UvoN.f.cg< m}ۑ^S^|:ϑ1ݺpl"}ZRKbj>Z-ywa~E`ut z>o q͕ħy᰽Aݭe:7`jXHH3[.ț,UM)dî-XC2ejSCz$Ʃ*Of;*V_bLʈߝU8eaM+S:Tr:SA{:}/Z]KW)kg?S٪R^arUr(PކG5kҥ8O|׶er_P"6[n'Z1Qy"36ԤPʙ'I1J~Q>MaO:Ya 5vsVT'GHHȸٳgޮ];%J~ժUk׮Q:ut~6mh˖-ԼyB^3g7n zKߑD&Q)U 88//$D*y٭,']9un[MKN>XRVOJIc|5Ӏ$f)5Ou v&Q݁q6% L\e8 -=v'ȣJ65''DPIDATUWjWcǒB( FqX?;u fLC axTsjߔ$+K1"{o̯Q eJ]9hl<7 ;kѳG>T~k[Dzѽi`m^2g%VFB""iA. 1/*H.\uי,uؑwM6zMs% 3f ~}2d#ּߠAƍHC ԩSϏ"##i޽TfM?>ON:Eaaa|y{{Ӌ/dɒ4qD*Qx1j/wYʑ#ԵkW&a'e̘o.#SL)-z8iJhX_SH3%H$ӡ73f}KYE֜R*i)1u>ibG! Y.D|vVz\'Cҋ$Wtޝ*VȄܹs| m7oCmۖzeɴqF&KEG4zh7o 6 H۷/Ol8k,:}4-% R_k֬)Sr(r}JAAAcPBXi^i݋ȗI$;׆ܹ96|X>\dkM߽4aXT3ĥEv$lٲŚ͛7PÇԴiS^"IJ`\%3gҥKiǎsN^]r%kڷo Z*h"r%ȵ.`AQJ,D{j̵V/ބWq/ߢb;@u?6K/Cfvy,LC37`EǏΪF4J 9Xف ZuRxx\Zz5)SmF_mEoa)rѢE\, &v䇲P,v^PN2$XIIugiA,fm$$]ޚ8r[:vv slJ[vRg"-[Rhh(/ݝ>(_'''&k3g+V9!4Rz;찴ՕԇKXrIeIoݺ3QKKDIT\}ǽ թd&ɕDCa_8VD$ll}klfwhDݤ&%-V^wH ː;wDw,j"!͗s}kԨ P91"0$l{ἒ\IH|kPcک}J%3EOiS {L Y*Upnj&WIפ$bB@p#l$$$> nv(2]>24"NNbAI[Ip/>PI[ߒJ.K`+jHB,a. %$>Rv5n7ObWKIxMIÔ-vڰ($J, c!IH%B ֕l$9/%vBRLI(iGBB!5X)ܻw4+`JA!S] )S{ euudm`P\xLݛ~]PIѺ%JZ'G% `I8J v5WNK^=uظ4Ğ_ѽ6= T|VMBSv.MC~FMghvN{{O>:Q %]LݳgJI<|_OWlE+ĮC I$$dQm¡-+ :_>}I!^-+-5Ը0Z ƴ*M.wq\+CZYPNh{ :{A8ohNXw 4]~ĽY\' rIA:MGYhZkn0`EXpaq+ҥK4|p>1%BT'S~cEr@ڹb6;9qL ׶&m hGnQ= jKujr٣ ;slmlh4v~2Q2_RqsY%;;t.Ii욃>ꁲj@cV)Sjq{ vCĂ,89m6ݤk*燾 _~M;m>ӷ_X9Υ3LeD ~&nNAGwOҀ9YzsY*77ؖ_9*7h3$vv&>а)k ײ"'?R>q'(_YK'GvyueM寜8f :fy5)w 3GЮ%MfNFzE H ^)XNG&aU4QF@yS8 W%J0hE1TcO"hp[Vt1ew*_<'Ox9Ht9Ok-2j׮C԰aC:ut Dc R<׆6G HnSZdڴ||_:0re o]{PZ$u=pI Dc/m2٧j]IKL|>jɕ1ҥ*un5`ޞfBFvm'a < "ek~Z ZRXSr~'kÌLQw4>5QxO p4dlL;ߛ',ޯWNĚ#-kb&WSw\NԿVok~IYh–SdL6#U52dz3l6n1&Kīuq\竊lg@l3lXDVSeXHoS{>yLA]r~o_gbLa uMc{ǭ)v"o}-oe"5pPZ56 A( =0mr9YdaOΝ#CU!x^G޵@Eq៧<1DIEED9DS4hGm}hLchjc4PmUr| ]߹˰AEҭ܏s2wܙ޷bb}sH$)'''F٘4cAq^1"8~xKBiholm}u(-@ƍ%HkK2HVIzB(=2L~A!יT%Tnݗ iqvf"W? %*.#p~AsX2Gjv(l6+9ľaNe{XQ[;7-Ԭ|A|'QF@?|kPp@u@NO\[|QH/-e:җ(7:ULq\Iw.lufcl5dKܳy{^]H*^%%%, &?>u u]q3/S?n#`ۿ M?K)?x@ 0 o=i>ɺLn[k+ yqrvip; nF"RZtͤhmۏ'Po,ذaթs[QHMdb?fd!NIԲ5Ǡo @ s pBtbvL\ BՖ-[L5($$N)H˂vvIH%!Ѥlo7)XV<`9EO BW ^.UCPk/0>Z02%)dp.w9=u6A6*{{I Im[Qީ,]e &P AҒK_yj9^FH aMS|;%UMvoE ާӖ!czEE?BctRNNZKR΁|,/iY˔<:2?~;swFE0.In̅σ=ޔ34nh5BOBk0,6>Ϛ/ kԈ &B5d SIRto^!4car2ztNQJyZH|:5Y%6bu(GL])T&mAt<Νk D?4V\ &rF%Ņ[gJnnp8+\`yy]xEO%/|rpvE)kM|ıBP&!pzWaʹilO97H1)zD{P'_j΀5Ξb#Ҍom >4ݏuk +Mꒇ}bUM*V&˅焹^$X5z ګ몴,88plll[ŭ AGaP֭[9Y I,D^,h' rN6عMB}zXx>Csԥ/{~(WO־CY1 ɬ0X *Zuf?ӿқ+FJO` AWb}*v98..U#k %)OOOV0 z2]K( PR:7JyQc NX%C0Ћ2/ ll3yd?k@uce T$]ݰL;z641<\dS &W.-ٮ6Rhn@bZYnPE"3 re@|r`myq,YHE׮]YwKaŦ(AUDDčgYm) D= }íY_ zu{ʃrugFB^ m=eݤN+K궭9$iLӀYYž"ތws ʕ+ᩩvPlHofNtdT4P?Y~J% qa^O)Zyj$$d5W鯕J_tV%-4`[jfɑm͒`iÇ*½捻WTTT+@¸+ TRu]%MP?%hV!a1 T?uVۙ%Y$;aA^!P,q1Kc&y7)Bf~JC( śVŻW Cb8рP響4o>1fSkn+I$,H qC:j/n<ZyK4P? ;$ǿKI޾E_v!'o-VB0a9uZ+S߼꧁Bbx1lHOI$YWL+'*B%z uJ/y?GvC^~IENDB`batik-1.9.orig/documentation-sources/resources/images/svgapplication.png0000644000175000017500000016611513063003367026313 0ustar mans0954mans0954PNG  IHDR3sRGBgAMA a cHRMz&u0`:pQ<IDATx^] Q%39<~3*YDLQQrθ 9眳(HTߙ;5azݙu ݧO:7TgGA Kxk!Ы%? Y@ͯ0deA@^"@ B'|x"V6gyڞ+^N{ӟ/y %x3^R^,u拥2~,ؚ;Gm z¹j;fNiS^t]Fel ߬boU/zKmUⷫ].}[ul[ؚ׼{5zvk_:WV1N[ӯuۙ׷Q mκónl=9ni/ln[?965Slc3l܉ ־hpjvOKtɽ.Ue}y_^W]a{˕~uCjcWc{kZlaqjo77<ۍO}^7c{[h{c{[v ok&?w`{'lw]ؚbWvhoym{_67ާAioo ~ۃ!ΐw>{{ñ#G[V=jc='?=> v??ko}O2dNxg56ئ㔦6W/M֬3u6/oۛ_R[YouVom=漃훹b99o[ZwjkBl-[#%mi>j2[ֶ XnvW~mЪOhSlCV6dgCcumC'lmbھImc7u[q[}5֯~[ƶiۻO}zLco&fʮئ4l{zamw3}~M^7u{=. &L/>GUԫWQ9A&B)ϓ@_%^wu]|HVԫWQ^^A|P4IOL *1zen]~qk~6f"ޫx⽊&JyVDJuo \?-q܍C[%n?6|Ы$% +.fwH#'^fxG:2MQ9y zWWWW>SN|jm&nucחwGg^jvtb[iߵEbogk-S7e"Y%Yu<5jп'1z}غt Wp]ADx‹s}"9^ܝ}0J9pW{W{u潦^a N^DgG7Ug0@%[ۡi Sl****sUe^on؁.Zu 'q\3[ jЫsҹֆ>zzzz!+x+^ Kuz%źf&f_֮'ER+ERk3ʩ+F?7ř>έQze#jSҭ#+zJƲC[@X򺄶$%- myWd+ S~jgYt,I̒ĬlM̊[哘󷉅xρ,XW)X)MNQ,-A8ELL:VUUU5 JtA(~ߊz~UJWlb-]!VH;mi-vm Ee# px򧂀 {^e -f 򥂀 A [Jo~[ *_*@ai!c@C zݺtڄ^oT7 @buoiz@z-B:A z=pp YD(*_Go ΒO&GlX傀 .A^|, ?^e @"&1Ւ }ݣk,rA@H^rHAv? ׇ|x2A G!&gzM诼>LUcB ~$@ %2:~>o3Ƈ]{L^o4 9 5-W㯈(M~o̼=&tB9j @PW㯈+M5` kf9#A G!پ?j &1`zQQFH?[~ 1BIooIrF@B z]ӫ'Ĥ&W?>) ~$@6 129M[c'^o4 9 u7]g'ݣkr0@!Y' ,d{zM,g$(_V8K>^s@u7]O h3r e;izQQFH?׉K&~YHQ$@?/ږNkr0@!lK)g$9sXDB$)<^yLX#. z]39bA@G I!A@8^ n6l^@B@5G]=g}ɱc[7Ɲ7k֌>swWtI;v;ZX"QpAǎ<_D}3d޽WOx۸M% /^ׯ}CVAm)G ʗdD 6xLJ}rzM.ٿ7pz FѦMWC֟p{S !r>7|Ʃ`xE>H;ӫm .Hvq$Fsf!:lSlzxBڕ^u33>G 69^yxϟ\$-LՃ$>`dI OPo~@oVH3ի06G@5gѭ[}^? kc?psuFBL Bw B 3%~H/['f l\zŗ յk-[!0"}Ч +cPqh&@aÆ8ςj|RG \BL5GN:לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XA zM)"9 לt5XyfdwC!zͮ3dȐFAkgkY{wJ1<n;vrπ_Y%|H%{ꇑߜy fׅ^>f͚ٵהӄY ,;[~sʇM<l.Zzg=-[vر`Ǘ.]ڐZΡ^xz뭷8Ky?|W|iӦ֭c ;餓F5 HM? | ?r̝;_m۶O#tE 3>I0Gu]{Y8YuqQ rsȑ ^~q{]ncKz׮]O?2t p$}Z5mѢEk^t)^{ҥ h<]vK} sYgY _s=p>쳀ڮ];|/7TX/n|I@z֭'?7rOqϗ/ڴiB0h_$qq\s _J>r.N{4iS LCf}_-i8CYyc׿ cc+MT@z=[DDO➯+2hq8`'VAP/6ln5oׅށK8d}.IӫBOW2xW~&fof޽ҫҫ|"ga\wE_B70ty]x^W97t܁k_UWzb%- ;MPAԫ l&Bߩ?ބX&3g|o馪UƥWտٕ͸ga0lٲ%. aƕ"2Wd};zJ0@+7{~-'8_~N?t6@%mpKqh۶m\ʕ w} v s㼌?A 4H_?ecRzHv8`1q*{wR6plOqB~U])*RoPA£r~UW {k2(F B߿;ѦM\3LQ!t+SW΢O| 7]?P&*tH} 'TYT Tƍq4򜽑a~~Aek,1Yxy>m慪+n0`.|3c+:AsҮ)m}5NGGy5z)|FqF<H_wiw"|i(`s;3]Dk目3FY:9˫T?Ċ4r퍤C~K $pxO> צbǠ"K?r& *|a.\> Ϝp"q4灡 P˳r^DAOw'ps(⡄6}Ao?4Q ҝP/+XEl(hW͚5#uM.$f.N }'w;?axubܵ7~R෮'`W'V16s=}/(_96n-9}yO~[q? oxEByi<mK#:Z;$ yþ䙵z5nw"'_ |Z#3+!Y^ٰaZ5CYwϢ?2?CίKէAGsfs{G r?hpgkEB<_灁(n%GU^A)gu!uU0[utq[&pyu' H?HB 3zA0ڣM׏#2̵5n7)]W'4r6u^8bƽOwq!ospA8Nzu=0Vxbs^D~Gנ.uJ~mpF (63:BЫw"z#* 9?GheoH:tqW㟈'P NOٿ>Hu~V8%]}\i9D-'u -rm6`|a.\ؗ3.8շ`\B8q%AFD7gQJ'x"3qVJ-w'[-._;'); `&2ɭ[目s++lć s~ڜ!2 ^z%+~ZTzK'Iy,G&b_~8 ؅ WĿsNLWD w>Q~j&:h]O5%DwJk^OV}Iʿ!峳# ȡ5%˒fdK R? @E@5^9,A@# OY|)o2|)tcik'#Pk2԰aCHzAxzY<<>4KC ?AW>OD@5]5%~,Q~H_ŸIķD瑖GL?:$ M>zYW˫k/cήH] ou< ]A]?N=%ذʿ[菁^zQF= I:tI]a*o"|4B9R5ʿW1vMm{z91t1\k?-}:=lX߭Kc{$W'>M0  )ȵFi}@B9R+5j?9N-zt5([' VyIMc7=6B8/nU_TQ'AF ҟ(XBaܹ쀄^sw%8>Xơ{+h?߮6։tWkP4KN6һD:Av4qy e>Wu)^\{[5<g H^5aps2'5WqT7KÇ6V%2㣃 -ye>SBnwn: wR( zsM\{\!5@}&οrz3$Qi=lX߭K zb3տ> Fjok9*Ǎw@B93Ym)^ڏvE&C=ҫAEyx;{Yg)]lX߭K z=sq~$ ad03u]p9c9n Mna9!H4I9B)iu9[X=,Qה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= ה_9A@HO^Y @zM%D@5= J녬C֏!o!!kXFq!51dMYB֌5+d YC$d- Y[+NVVVVVll9ZSZ[Z{lkݹ Y.666^mmt;-w[[ﵶakcZ;X;_v6vizCkϬ}}_Zv~n?Y[Y iks4믙9֡֡e߫Z7XXG[Gv[GYGi;dYGuزVGr/X;}{##;ߦf&[^c{uhuhuhuhuhupupupuplY_XͰn9s D m XVx1vy@*zٗkui~ھF_Y:뵯p{[{?Wq'ޏ=Y{WkwKkw k{֮w]o[޲va|Uk+j`xI/X;We3yBO qk}jml[cmS ͷYo6bmYM7X6]kmF эWY6^am\ X.7_u֝c𳬵h_{=Xkj[`Muu/fէ{dUyf)c,m} ;3w,z ĩ&W % (B5Vd@k+gn`ՙ2^Cq- ^ z-=++Ě-WJ}dzU/8^`-=^r-¹Y^[$zX~DQjwDz z济OB w ggU36.3vq fn3^Հײ;D8ma^)U)p5l;fQ],4 WR,b ֋[ g@Ok-]= ^p,Y^[]F= {VW{]\ӳدF{#=+p{V6/Y>;3wzEqK۸xz,=Mu6!D\%^a!Wj^UQ,t!z[?H L`x@kƫ[\K+n-]bbgW 5BL^87+`@.- {V&_Y ٯm E6)++:m7x b܄еעFY\ge\+tr+$$ ?l$@ŸaAR|,ͫ ^)%#{YzKgՖkWhKWgW,XuWWosB=+ٯ ٯFWnyۯq d{Xz,΀kה)Yo1^&q- =^^YY敻hSMڽ-]1st\QLجeD Drj ;F\i!cQ[ʜz7+ZY5ngB䁀[YoNݵĺkݳ~ýB%OL6sR)6.FW85AWgkdyՀYi܇ I>y\I} GhE3,d(`bZ&ҭGƫi~ܐ;fQW-}͂ 5NzJ}5:x\:+s-^ |@n\x_~ t~@IO6uq2^ zh,^aͫJ5܊Щ^cZDiStWjK݇B+YX#mTd,u "]]N[WZƵ([Yb8hKhk6n1, 㕛e\<vmn6'vTkv/k˷r}-%X%Nl=UoB/zAk\ ,^_xjnk8=KB^3r ( $Jr]&cZz5Al-l ^Z[f;mgCBmhQ^V m9^tmU8Wwa΄22 xL4q/$ל֦)YFƫ<W1:D kiԇPһhc+ze0zE,55v `Jc)bl8V7a%22ۺn meUvT{0Zd9!uz%g 6v6$ SnyW׸^_r[gnr<- .wqì_+i^=-P}^:x-{5nVq0X9[(ǺP~Mzs`'2^.,jaxu_;Ƶ@kq!`,I0%"60vڴ +XMҢ:.Ұ ;%%ǀyiTA`V%bD\UOK 3gXXHk :W+p6$b \ Ыǚ.ի-J}ZۑŊ^&2Nzt b n%95gB6^օuh^]6EU袭'":e|r~m M3n$iQê/Q22ꔪXJU2<g j9v9lxnxR3Z^y)Cb0Xo6fQ`VL^m74tҫת0L^}^:x- 0yhenyE VBc,i؈,Eg}6FDkߪq{:3A-/g@izME | V+6W*my|{ZzY{uݱnyfy%+Z[eT=$Z}rq,=3deUqAJ:H+lbq-8,lrW(CH pYYDʢ5`"nM(z.Y<ۯE KIZ˰Qn|(C^YP}hc Xh=XRZWUő#]]=b_/5Z^I:@L0^uouGփqЊܨڂիzۖWJ}M47+4saZgM7vɪVkL?벏4'Z xŵhn |!fX++lѫ3ɃYNpEt(eX4X7ymŲKJ6³aތ0"SژRU bu]"]VQg@x3`xh2i1I׽2T_gE.Cr0v2쎌&T@y̳LL bNbu ܺU xWjV%*3Ϭƫ0ZEu:^5εr8znEX&\Y`YY@<]dϘ1׳O+d-b RZw+[LA;&LB}r~RIXǥ+ōS `x}-,_H_PKz^Y156bY-Ju޸T:wA<࿧T(`㑼W'"*^#`@$6܂c\E3Æs wφIy`[LW̪T/@6+Sr;WWjf s]ݥ+蕹+urAPZ3,E= xRWZPHjzC U[A2-{իp˽څweoǧ{扱 Ы/k蕛U"ku5KjEz<vMihZ\\ zB3m pmnIzŷí^%[D(25lt{K{7UR@|#=sOLګܻ{4ד_mP|)]h/*U,_@Cy_{y51ǍaVlXѳj6TfUXieF,=[HEujWۼv,*)_͞R6Qf坛F5N+ݽyxK(vJW`ʔ.~Rɢ{1v{*Vc[*ۗ㬽/|yz _ 9^^V6{/pSm'^" Xy=2u8V(zU.S椼';c{T!_ݐQ^n׫!{gAШ_;άgB/$ffykq́[zo\'m\_ i갔J5D-^os  M-\vtw}]yGXyp&/SEU]|Htׁ6#ٯb<h4>eJYʗr "])c\_+ 5xH \[TUI:E (n 5=sl;n@wzC=pִCf(^.;4j;()}˔.f*/i7^{w]n=Wʙ.r+ f,XB kkN,s+ӫ{]U(g`z W8赦6tE8U}rU9ZN}P6Z~EwGw+xx_0k ؔ+V(0e L YH<6ʊY^%[zE,Цs6zҫwB_1L?mzW(=Kj!`6Ώ|v)% ]9[W Ybeet}ALZ6Xih/WOn-`k4[s˕-x"E R؉ ( OJ T>^GXvJzU:.ڽS+΀-VмƦ Dk lz{i++%9WJ̊+ ORKu#{֪P@zЪ^0, z4D{才/RB"y=(zt灸9>j쒊ڭki~Y WE+"QzEM5+b{~..뽷LtzF,ڱDv+E ?`|@j#J SlzEbX^(QNB;~0RNL TfU]ʢ |@ӭd􊦮xPi+tzϒknkq8 5@tUlbezU9zS9^YGvS*̬,x6TkE,j x)C[Fը(\{{ͤ9J@L]:k^}D1(V*2S_.+#s7C3ESd$ vj~RFix WĵȊIzu) J%[k$uфOPdPd4eؽMX)Y>6.nz6ݢ5 C1l^HXUe뜧k`kwg2,r 26c܏-*HlXD @>mL>zB\G=g٧[ZK7,iSN.GMd4[_C75ځzv3+U0ZX[qiG܅ jRiuNE#,(FȬ+ zvYzɖNpX:km=oO*:ЂQg"5_+/*fWŸGק-qԏ~>[;F_!9ȯU+^55zl8;KH±)W{^'B;o5++&YS@kaX^ o; zΙ& B+,5]{i^6V\; p^.eMwo͸0`ϬWk¡am%\"°krc)1HyL SUmv;:b^s7VY2cRw^2<]vnr+۽y(c3ǭ|,^m#Zp^ڽ+r8Yml3ƿ}F݊n>σ^kZTkO\Vǵ^ڮΥ >A#Ǚ:Ab[gڥ-ֻ'CK:kUN9{Vk/-=vep)zѧ"s骊H:9ܬʗ@8%'y e60ݰЂ8y4@wzEVpzubbc֋j+jnȩ*RȒ0vilLkX0PM`K+qaBMŲPGHEҰ3wEIYmu5Tc/na=NbeE+6ЭQǛGAN>5Z>[YrkLdXn+܄(֢rCht́4zeFPl@xw,^+g}x6OԝUb-c׆>U[Y^`zڪpkISЩ=YgrvM}TL7vD׳'5ZG׬,פhM m\\0pGRw/~.5!^X;,uE[6@s8UvX(1,J a2a=QܦW v&f#8n=^)g +(aV$m LIPL*m`79}hӚ^ &|3ﱶdp;m!(6kI7z]Yb#plZZuX@ ,8e bsl욢;Ϗ6YYzҫKMJL`GU}˵=]wP'bx+Y7+2A7˰_(,9Cj؄ ðcҶl$Ei4pX3׀$ _9Kʢ[p+˭\W.]6.`"m^)Y6@zk ^)+80`~OǛmF/U6vz,9zꢩWpk]rfQT֬f'PҘEb{9!zEQ&VjqWҫE'+FKTEFvUGA(8kcӆzŠTwFWUY^nڝ kd,[dja(R1c]YֳdSc5#ި1tЗ`FWrzSj`8=j gyYqс0\eЦ_tg@_0QV^?[9W\KOYYz/ֹ_1eu^5ʑ1\)Z` -ϼWЖp6Y`bÛۢښV-=ިv`FkgbV&V4W,뗕/^4ņA yִѼkOsAU巆5*~?M0"Z0@+k3jq^tE2B$ ЗOCkU>l^Kyx Yv^i j\VUV٬wOmF%=Mʼ凿Tc- ʂrO~7MuzEmW@_ 662?x4(5j#^۬ޮ vu|QwKg[V]k J!^ 8s(y@uj1Y?@>-=O Vc؃2vX"YgYҒ5WwT@`vXyj逧Ϛճ_v68EkܚPDKOU-r ;az4^r8q,5v;̖cJ@@cimm 5n;mcVeŭOwʪS{ΔVƿ]m}Ѫ55 I}1MuV ^Yz+)@B‹pj`Dh8P^X%ƽ]kFjր7Q1MMώ^1 Ӧ`h)C^`@N_ۇW.P*)\>llA؄LXaUS&ٌ1l YJ5x V K\:{'|tY mx/G"VvZYz:=H8+jF 0}闈3Z=制qՌW<)z+ur.պ 4sZ*m@W:C1k~&uMj ~_\ߍ I^V9K:W+pmH}U u0 5kl_>9y^򨜟­S_X*[R9/ZS*`􊤼+kZ{퐪[Նo8}{mꋺX!!VWc=%a8j~aFC{g~%)Ha})OK8Eep*ʭ᥶:^S9(% jBR@^FY׊MkYYn.@YhWm"z^ڠWĵn~(+P^-xb^Ղǖx'/Y:7j ak{U5xd^@-PG;Rzu_bK_n8pКΡ! u:N3CBOBϜzPBCͳ/W;uSZ 1TE4xR볖}wj1En+ 8y[z햗?qlK$a9[Vedqcd (0+m-ή\ '{j/nj+-߿͋ c?=Lq-c#nD(K[eVUQuu1ĭ,]͜>02^c Lz|{-oRovJWk쇴6`lm{ 9X 7mUׂX#"z i7ZȦW6Rpl^Dj`V3zE֟ ~%+VZjMh͹U88# W,͗FJcϫ욊Ĭh+R|GV0j  z ԬlC7B!xX==T cJ(L~؝g`w9(;*Wߺ*#5ӹGKh/WUk-a$ٯ*= +5Znn*`LȄLX.b$1+;D^A$.P[&nU ^ ^1dH jCrbw܁A/ZcoyFמ4ê*3zI(#[ý[UwWmmgNzpJke az5z`uq-m~ZYH18ioa|ڿ}|~6R6k+uOuxm*H?O3+\Fu.2΀^.kzU=TMZ F@Gmզ}-^.v"XxA8 `S[Uu 1+r; k[7vҊ0RSOCV6 u B| uڇBX&@ /NFCB[YmœsF.>sFQkSgtᕗ0+jzӫGnV8y RH}2ۯ|I d5B2Zd:6ê%$^IbM` A#R@ ))4ɟ߱dxZ][|}ۂޯn~N~ݖY}O^4{?wIEmN[ [0`'c9†^ g -oy劦劾`hP `0&RQ ;A/֡PP5e6+43W9S:T3Ӯa>֛ G~^iXRLX ի^ab09IHzE֦%&|PeӐHnׅ~RNQ<^8? "5+ R`{ւ桗+b2A}B!4FFA 6~ dɾ|b9JRρ#+g_wZcު3=\]}ެ\(^o`>_RֈSOf_nm~:R~v(`lʀ `Bha%ٌѝ> fҷ*] U mܼ ڽl^xO#7[G>S;>n;>dX}={F~_X֪YβCڧ5 kւz /nP#[%pqkd혠VKVƐ'#McV(X?frٔ= 1,y(ECπg i1o)yܣPtl䧋vV6Oq#|b|ɾ٘WzZU~\SΚrAD2ڲ JՂv,HLRO]-YfAr= .#tlahm(n탋e Ve!Ći.hUU[btØן֩ e}9;^Zy5Tw0ԨRc,e-uF݌Vu7gN yx匉-mR0r^( E@gZ[xFՓ"^dj _ؤƆ쬟5L@|X)a}Z]!xt`@ % /x 3v矹ϐ09nym-Wbsq-;)b%AR_WH]/h7P,eBX}y!Ohk/\ XƞXTWv f-j1 FC=0Oaԛ~ ֩3F\eM ;#"n}QʐY}}X^ kW'R,(֏^5tv)`/rb߿ڶj~-qO gͧ bw]lvȝz2 LG:_Kxcbm?F~zz(ŘAH%:r/~guǙmł^UGk._i{X׀5E9mx20@D-]ٯ? pQ!`9Iح^`}]1$1f|O+L s 9;j_50Ъ7ε?[}qYbC ` )2)niQk-; Du+ebh%aʴ(וJ z}e4zU:ƈ P<cbppcl4t+T76x#Ri.t.;~Ջv~s}xЖS:48ۘpoY?SC+WHXC Ő.x"[Y#ZπMag`b# ( 8/vRC ) @ͰumUTw₍oߪշ^]j_={ V(e=y2((%&"HA[PuJ怓^6@RLH$z -]7c!Ot!bq"dAтƩĩHo10~kBz)t+Fw8,(Vj'mU(~#@̂I0B"b)-&qMC9OVp֚OuzRMGÅe_ :,_A_\lb2Y dK l*gHgX>J f`7qFOЭĭx.<)^R2Hv@u: /cZ?Oru.KWOc&Y+U܊A79n E;)8HJw {fν[k6t&hcMJa NT $@ 02yP Y@ % HyLa\̴Lr=>[E4iG6f-O=P\ ĄE Q:qelJ"+ի^ brL/0rk/9ʇfS7V#pj`Upv8MĽBF*c:k툻T ܊B VBy x=3WտqZŒ!S!l 1@+ $H$F)6R<) K3-\&D <\гn{󪁗?y DR TRQ#< HHMMjWWw$^+џZҽ̢etpO҃jp uj$8aulIt#⏡FDnb B{w@k1M Kp 2~wIW<t={3G7;@V(usv-!k}qqꀧa[ KXk&iE@dº2,8Vg0:i\瞷e&~+ni,W VPh )[)1,? H1/`O5v]`/}OTC܊;@n5ʡ)dmb[%(˙-j +]?$zckOxK ?(N{2[mHٿuB|haNEvGŏnEaW vkأwV<011&C!@3ɖVWW,怓^6yzEbKlP|Wt)$\t<6:5tQ_S%~.{;+,"p"츫1KŸmz 3#D`XҰ4a,H^=!IUY Tu T98."p+F'n}Xg~_ K] 혞La\v b\Q քðN+6FfcU, )('ҿlHk-uY3+#aWPƛU*PU`6D ݭAJ ?xZ@!.&\qkg/IG^iA-;˙0`cGl~Zyspi!@p+RX@A %/MX|v0ˬ//Uy]_f=C )PPx>ROאHAbi4mAl9WJz%s+kZ[zKPzн/M~־EA[1p {"1S?pÃf<)My $; "[R@XpmJB ii P,W+:l>ml['^>+e,:JU4z8d YGd=|iW4%Oh imv6wxqQ,vdX" d>ܩ)+U4sX cБP`v̋@4ԁx Xnk^ew\.'_/n kG =UwpCK pì~Mnݶ hjh1+ce yl޷C|&#h"Mr]lKemi;UO)cH(! 4"/5v*W镳½w-nA+(WWW ءx \Izf=?V A OdO .q(L&,s9$ԬҕYp  nfpA\\/iط{jZ4.Ñy~Znŧ^<҂[F G(S pkʗ2Q!CE?8^gZu\W=:|4K*̜jUfkw7|5󹢭 E!ֆWg,Y;grBJWZtJ,-_}I'/*vҼ k{'`xU#aK }  DJ (Ы)[. TOb,˦}YvwFamߞ/F[CFcsŵHZL|j <V޷@"vո5:eɵTB%x}bj߬ nnz⩉[frhaM;!*n,` X<"qw'DCʦŮԂZz|!`:\D_(gͬDfI0 owePf: @:u>X̋'?z5J IBBC CA лnZ W5 _79UPԂײg9%6L^ #0[p |u=ܚ!t\Խ%|S!A0zڋSF✁]BE~W/%/y qW~ 5/GzF)d S8SP ?HQ`ȣwc^@7A(MLmkra&ھ?O,tՉ1"++cکZQ6;!msëSBqu soZ[U5ӫD^5Nbu` B=Uyj4ĩa; ;JG6~ڵj'Cz`➇`#`,F3W2 - v#21RʠTNKCXڧ̒e\R-VON~ec1+zPq@dq4pDмo5t+TՙWM时6~lSû֟u)-Qv'c?O#I)yr )0dH34!'An .षO?ݚ`8@%CK-K,_!epF33}zl]D3ΐb 6k+&+V]/oM߽k@'\R}FkkȜl<^brtS28Cˀ\,;qc,Qnی"szV8vȞi(uB F=^v)^R Tno{bPW<߯lk|=ι~M /{ޫF1L:J~SnyһFO|R:ngG '+&S y \'bk͔HʼyQ+qpٯk` :1<= >C.8aR+qjq̶<]×v_ޣJ,3@M`!@NcCtcAbF_1k+p¼ V\M}N{k߯lMܶWU=sw1%Rq1lT* ؼwK`XR )c߂WN1' Z5\4?WmU#NZ1r`o{"R 3nq ,DR<5w2vP^,bHK_:xΛg< Y 玬 LW``z+9,TUO R\] Na\g?HݮڌBmabv/_tٞ1]>tϢw_rx́ZX`tH4  uR@:gT嗻7l8z5ҟX4Nx.? A?P+6χi֦)-KNZ2ޭoBAoM9cc!A য+ßB'{Ұm#ϯsƏozyOvގk^`CzӲg<{_&~B* :-_Xs6.>}qNx(5OhSJ>:}V׋׫ѫS{<кN.;ۺP>nF^ 0p1 i:bw-65zjtFVs]#ZѨQFժ{.H-*XPPvŰ[)]3%>Ϧ}z5^8_^|zsnU@TM]FbWw YoB5Fkէջ}djxs;dϻw5gr>V ZK0=_۷3{+a.lpvB۵y~_,蕸<{03`)돽/C:jU ՟X9}Dj,AGqZtةVX7ļw,qɼC:q5FWXu1O!jr .庒 Rm2{n0>˦m5W;v nѣ#VuU!q{NƤ s `RX@ uB:ՆtlF+~zfV5†D"CVDpx.X8(1U8B6[5$lH*4alӵK'HLy@x gL5?<W ֡ˮog O ?r0 h0oӖB(rUnLzl[B?XVֿH۾VW:{Vj%dQ#Xjbk߶dtjs&5^:Qک0K'HWjs/kפߕ|_6{jQ7,sL~+KCs-lǍG=c<|lĪ(nxԲ( --7z}.@a]p:$k m?օ(.&.h".CO iws  q k3꩓/-[ew# Y<N GԎσ\M/1,č~j$]qjo@m+GZq2EYXbIG:gH4vpab f_tJ\?*{ ysqk|h+R$\!p%.h>uLM#]SNT̋kO܊O?i,?9@F6&>3/YU qbWf-gԝ z2L 0^v*D`[VťN^8{R?{SacHvK 3mMH)0Ԙ 0zX_ךP)3C "Zh̀w)GWRRY4'C:};*9VLFbS־΍.\7WJ<WFldb\r GV/z}ob@vn8 Zxc@zA_(]$fͻ A@9!A%ʬ餕JE)9E"ל^;1 g K`nyxtCz*ːM\¯Z"1 n%[-u<O62Z-˷GMËgF r(rHS@W`6FncH`Op(6&bŐ0EHҕb@h-&O#^(cM;Y \\ܽ`h |:udMÊP̭D$]Ig..;yy8g^|ҕýBR1{v2܊1Q>Z8dv~%! RN8 TqeIWK9 ol}?0 ,G IV9i*)XѬ4k8^3̏"0,0t?6b[{鲪RZR H< |W zݕiiM= 5\V;@vJ~oV5J`xvh^]mX|ndL7hlR9. / 0\":Qg>h1+"]BgA`:Nw{Ym{mTquuq1Hmaa1v!K141@i`/ m\teRڝ U>F&\|i1Vpi?׵vblkzs'2BEӧ/}]ҰwvM+M*Qf~ѓԮ;.ݔV7!YʐmӠ6%XZ7A F)1΂üikh[{; )AtϘB *b?:̉[R2R?u?zte>-Aָi#JuHY¿ 8t4Vn<;<͂.#B Br9+Uri2~CCՄ0H5)YjJT[.rBeB+BW7mNHO<>5Uť !8#ȧʇ1q96;OcT9 $HHּy+Bò,z+J (q 4#I$ #^i |G-Ȥ p zZ }-U 9 ,qelY뤅ˮdx-ҒZuU%`mvt֭}mK !r[`.Ԕ FWmV[pHR0,"HRbbHgl3V4cEֶN^ H zbXH*kGcx&z< EVI^p6ٿ Ѳ1 T}G[H~h;!K)?)M) T4PR֭d +.|#O>r7Y}+*ēC @Q6JL(0}-}y+RwOv]fjT޿=^aNM+]0K^`pYy>C܎!u pj41M^!IJ'JROlL8d0QA F= #+6aMC;t+q+ZgA*v(7k]5FV#@vaKWsҎe 'Id1ШU~֎/G+uz7CqaXn]hkX,76{g7+BH|"H)j@?0ɠ:kڽm RHzhR3)SpI2k\ҵ̱Iy:2آW{_1:d{q_jmJ0oi9 :  J )+[qup_c6@̖9_\u۬g0İ)[ Y(=41߂Xt~G'j\FuXa[6n5`@́ QzUo{7WR+BG&1VHoD8ީggv ,~lGbe^ӏ^i-, i/bX]& 6'+pt\J#c} oPuE c% ȭq2ܪu^;3fsBJqW=쑏I65n%zt5DRfXLhAz8#e|WlG=64gHv^:0*+++kqGWzV+\8P?qp |O eJWxZG95; ~ ǵC[iKVLAĸ؅ob7&V11ҭĭD4j;81Ͼ)XjQn5"ȣ 1,]`(,4F0L\pVQr^GGѹ*c7 &|p_,1m(,R />*ak{GwW A<ZDH@UDl@ n%sXXs^Ϸi.je0{BMZD}!=4*߬6u/yw}-SeC~ưh%OXũ[crrU-@վvoҘ a\C  HPĀLRp+ <DH^7Z_0 )-0(=2.Ϝ}WdJJ Tq P|!ӫ00x-גJ"qisVNPߠWzc8OA{0#2{n?0Nm?]}].Mia'씈BX3#!c $K?ŏyXʄ-(K&,4Ѱ6|XhX݊ѼS>x)>;&|=<{tH@D~9Tֲַ>RBˡfEC`9JґcCza%*X^gZ`ݙGV1?>ckq-^CA6aD-^'^ewEԟ7qێ w[&7Fe (rj]4|qF |ъX Gp4t+qkO8\0hu-Zۚujx"#`0yC}kY~ׅ'SesmZ?imz?u/?y;"@MXsyi*acXpK쏏_ R Rz\~֠uX%Buk`rbpH<[M)T4chVNExތ/9h!Y˭ሖAzF7e{J(D P5J)<X+pz\~P79뿕tnt"ժ %54=E-QxƻWPZ㉥a0̯3:ڟv]%8bW^0^j+6^^ WB[^AHԁ  EVŕJG=l#Br͙oB%[4צ7FzbX"쐱xc¥$ İƯ+, ~+nŭ \PFȋVaP_kk;Zq5Tx+).3(.$mx9>/tې60cOԞzŃ?n׊׏M;z)wBQ# $ \ c6;xVcCrCct5APדcHzϳ֟opkFM+k8+gFʪfí֖b[ﳶ>0\=e?oM$`׏bX>|OwjYTE&lp-vyX d5yRG @g Ňq)&{(RT{(4!Q6dvwϚv5Z 玪fMjhͽ1[P+?||k0 loV9_MlIVT\W{򡤫 'dNjۦ_뺥ǃ(1tw F)(X fKnKW; tܺjkcckU+٧+QxBRËTiaTcfg-Ƶ_gmZ$C@3[Qam᪵L[cځsgy|W {:G)C|qꆑש.%]HW52!5­PQz%n%J qfukRݟ['cqAMj֚5=RWZր nW$@wIVOC^5)?,. u9iG8ýӋ5I'ԣcBk;?P몡W EjׅF<Z#7赀M'b5JEW,8P?!{C"`#=S=M UEɟWN/EτܦWjrط/9Xk| HgTc@y]epeFVM?WdUŠI]>~|˘NhW<_2%7H{'F-(ҕ6ܟPy!l:0!5Vۯ0,|?@fc\İMk֞ޡk@|&u6_ s!$a]5eX/bCH؎ɳLjurL5++fUSFyWv}׽۝{s4͚^9G^oOcj-\qK[H׭AklH>% ĸrHװj33`qY]݌j|5ެƄƿWcVZB@5XA^5W6ײ3t.TЩطO]Emˎx:;_>uJJ^hkvsѥFu ?^(㞁D0zگ@KBE`O Yުa\-޾.^%C_WwWcC[Q8`8Vnu\pJW^8A-HU5eڣ߬짪{:K1o<ʠkoT- a@o56^\<4^ CT^cze ~׫-Xv_BZۺܤO5(hUK}uW_lyگY-? -g Ar>}ݣ:mZwc[2f(1o_xl+zY7 ZZRCÍսe1٨%]sn&E>NZXU@*o?o'o]m,|W;K7[#}T?Lsk$k,Ɣii~5%Ɓ3Z՚ж1/|`^Tl5B;ǫBUkkIĭr Hw\.<7w+ܲ%H r!YC-U۴euNjvN[TOnuD1 \.A+W#s•Z/6sMj[uZ*(Q0UM^&)Yk D8)@MeGUAUuUH V9촁wevM9PzJ`[ǵ_Y@K X3 ֶ8>vlcv!\ !/~`S:Ȋu1[D30:V]kҥLԸJZ9oFLj1;ܹD#5Qn}$Fc> TJVgM\n|꨷j"HQͅy!4zqbS\Ziحz:b\Ԛ ފ6^1Ԙ%OM}7gtK_}ҳ[?@_9p%n6qE`6ad7sԛ[G]j/ w64l@gXjҼ(ɲ]@$KbY'r4p4/kF׺1+UJUXFn |sKcJY@H6G !7`yskknUYk="ZNzr]x4ώY3oZk"H!`G^؊r]΀0Nx굼\:+ތx#5IC6욢N fAG>ZNy:Z5`ZYj`ŖD5\A˭ASvpO𗮪'Ktec++.FI}*{Bq-=% 7Ͻ3^ƫkAxM0mӫpX<+?.vxC/k]S|w5ynqng\_XœTpt`i$`""<- s=)4.&^9E2W &YCڒ֤ZF0ffЪT|ej8z R6kXj紪(1|}5[m[&aE2m xF d@r]W! =yv' jOM38%j,(8θE7@[TҤ7*i_BK>KzCk/.dnfFӳb˷bOHF(tX3Hb fRpO؃k?it k~fXZf2$Y;M"ǀ66gu b D W7m(|TN0X|bmjֿ7(g:VX1eaŭZl!]΀j!qA"5pe.@ meWt@*p2g/uk9a#5{|,R^Ŧxk[zqۯ1YN @$ ` %i9,-]]a.fXw0|΃a)ư&[eI=Y"YZ@b6g e76oxU/Jjf!zqkWuuuk嬂吮R^jk0b33WJz;Ƶ"cW8w-vg2zn7vnTk4VFg'ۼUpqm5*T1.UȕԮUgX· I$"Yr "<ֳN 'OI >eq&\2SFbV-I@kXpk]& 8{U1Mb&zջz/g gg-Qx r6h6Qw5-kc#E]||//K@k4*`]Mp;DZ a4,/ϰCT@bY:a&8U_|CUkǪYZ㫨iNf$p{l۟1j_Ӗ}[2ŭXSFZ΀!]KU39յ^nӝ6~BzE3H0Jc1)pm+WFӳ\=rfhX#I"~ۆ $°TtD:lē W"cʳ,i٥% \*2UYz.W+b5BX:E0]zrkT}1g %캺5r/%n@H 53\%nJ35Qҥ+ZٴWK-ʫ st~ /0:P_:F2ЛimyZLXr[K$Ұb)ҥx1T2HVw \y%n 0j,]w9:)S2A> ltn'έ+dzߠk]^t6^.gja#A-pd9[ 1^ǵN`1u}Ի~vL,Wc)=%@_W1J 1 XkE@ Ɛ a\- ]^ L*dnl-!ҮANs;yS?RVn*Xb:,Z#Wf+`ᬀXAm\W|,cY-{p>nm\j kVrR齆hX薗..}YZJbi&Ұ jWR]@$K-fŵv(l{@lv-c/{yLfFӃUc b5vZcE٪6겜,W0U^P r/jZ+DW%#]ᏙX=k,T\ediD&Y}r_}ҳ(pfh9y4"-育$eҲ6\5#ccC^Xd1zVZmc 7:]ۘdG*R@.i56ALVξ2[U2ͭ&]&z-I`F˭9{)Aj&qpq ^mn3 ĭNBrx"BAWgzQ@_ߐ\,`9*`ݪ b2` sE (UаzŁ[Ji8H?C0I]9&ϲe`[ݴ5:JѪ>@Uu+aqZSƊu+ܚ)=2WV,jU* az93vW[5$qkC[Wn ]@ -XЊ2FoN ȄbY seaq;#mK d.N]z%N:ے[Nt_QuoR4?V#WXhGUC &Xr|5p8+Ӷk5tup>v,#5@Wׂ,j5ZUnYnk_-#tghi6l$I+"p5a3[+ŕaWE0ϒee@Z=,fcBTSPe`'VvZYrfnIbV^0UkB:ֿk*X|,Tj jWd3l5(+ZPzԇV}~ޯ^Q_M\dQ᧕5IK_Bmnv""\HɰK8w~hÈu&RK ଎,|c)6ËXW,z\ԋ(Dx n3,+c"Z6d %gVZm JKԈ2*.W+7b5:X}eǁqk-FQ[Qzi鮫[,|,VC2zn|X| `eh9, Xp,FFȄbY sq"ac/ bFAlRALdyd =bG':-:IӇCcD1*)?Re8հY;,Z9ClՓ:'j`Vnge#JW\WɀW鮉 @U[r }/kg@or`}^ǥF-ӢbD+a)%5j^ r-dË0zͨ%օs#\U X? U6(lej@buNSĭxV}Έ' h=ʴxM-Gkרth?<3\p3d5Gx8u_Y4?:.kĸx"^E&Hay Daيu3 ̐W$ J uJZVۺqɘ.cROuU}j@ zz +ǠYfxYxN'Y˽ua@Oٞtͪ>@h 8'l5x~II}h ' 0< W6 iM`-X6 Y:Kk#"Yr \y`E˪V7]~vA:jB5bj*P2I촲h+l d''O a%d@{dQJStWcm@gHɲJOWW^z\B3 Jjc)0a03c݇.ҰA@kƺɪ.Z@b֕gYTADؘ9:*nEYNjجN+Vξ2"I6)n $x@©7@y-TVilƲZ>鮉 @Z$g攲:,p,gܟp+!V X`QEh6Q/62 $˞ݢ;,%apw.f@C\O̧ʾU !,j X:"ή5(z:O=סoKVqkl2V "[ KUFPKw`aӥp6!.LҰ:):Y= d3'`c(KIZ,-E`zjEa\^ězkhΖM*н&Y A5,[\ p| "й>ӨSDsR`V W+XIjnzk޿5sꟆ h ъ/]zқ cj3lBh;MoJ13 "lQ_'f5\-#O2a)e$P2l` 70+ciaDW`aFlg =i7/Fy#GJkU bq٪'`ZWŭ*ܚ9[ ^s-X3uե.]YA-x)ս:ҳ ?7r pŔ8ب:mc\lYdpnrHaX?,50tXaKi[z˛dM[V̳2nѲ5ؖyР iԟOBՋU@6Xa!,gg1[qի| H^f J a OPxg k|jIry?@RW(1rAHi ʰɰzK悔nX$K^YK0X:Vb^F;ũ U9)\Y p%V#NSU,c56˳4ˇ[3ef-@}]|,9a@ZFKܜdvKpsB^e?'f5:mu\lp3-*̈́  ej0lVxae^}@ kw*P,+Yddmg]V%ZM Us{j JWD^nSWlf۟[a8=ׄY $^u#^u 2]H/94E5-@'T}^ `Ÿ-"V sE a [2ս/%[6.ϲuNmܨ˘a!"P':TOqLVuFH#hN+3^f^8.cЭpk@L8+Lm#Хƭz㑮Ɗz>VBA-πQM9۾Ht^sYhBO,uxwĨ>F1ɲE`i!@7a&tHEStHޗú5rc}Hb_N1kY=0VLi?&獚pTuV V Yj촲h7Zͫ [=Ұܚ,׀?屠V''e, HڲNY 1[?@ .`% 8V2ǸŸ"B"֍aÉAVaXOyLɒc@jIlZ:l fL:|ԨPe_՟U) p%V `)Z] -eƎn=KA*–O+fcW*]' էR+xkA ?':\,`ǶQ#),FnD KrQ&DðܗN .cch;/uY7H5V9[c1նÖ1S*箲VCn@)Z+٪'`܊,.[ Z+$̣ 4ojZz_Wh鹮^W>Q<%yt$ *`IZZQ <-2a0'p2a9[:p kdniu$Kb=KSjƆaZt%MMTD:dUU;+ pY XQ,b"?[*;^8+ [XZxXʤk^q@> r-1`>}`Mko K΄-͊UF#mKzzd/ 9ց:87̌L_ +}U/VuUb5lV \ҹL=[} Uuj X ~3 A:dJWkv D5M"PʆW W -^ŀX0,,Bk.in~ۆ K(ũZq5l/A 4 "Lɒcь.ݥeUk-"Ө?ߦԘ+ G  M[΅^rkƃru]f\s]HWwC "h#G}xˁz-ZPiR&, EW/7]˵a] -5&YCڒ֓j 7/VebYt+@#Vfr5+e,bԼV4, ?s -nqJWPbjWzc[du D" XЫ./,.1.Wbf5?rfXbYxW8@/!H HVbгlT11>3OI#^jX|T* MתԇŋUq/AWpQ,V/^0Ks+/C*j15Z+=&]}*|Zg %}tBω֟PoWp93 4*d@O,E@yZ Ka.Z[O$ 15]zB*E]dzX#7V)Y. e5|\ F1-W9Y2;DES;)5a+\JNj촲h WC@d܊k`y@[rk];cŭ#Ht Ԛnjk9ahZ"1\#Ы{"p5a9̕9`Xw 0ɲ,ٲ<ֳNI4yPmХ{߬{ UU j`8+ z.V֭zuOr[[Uf"[ xD˫ÀkkR@݁k^S ق@5\KA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖs$" DeW zMW[Uk] @nB@57]m9WA@H"BI[v% t\A &lٕ &^sՖsFPhQ(-*醙^!$A [ٮk< (]׏|5j8&dŃE5B{A@5ԯڣ~q W0{FBׅBlj^so (zuCXi[Qb+Pp/ݾYUF vy睋tn9PPɔW~a ]/^sr9ŊUu:eu5` wXׇDa$/ W k|r7dBuz&mp+ٸq_ uVO@М˭akXr@.G$w"@Ək.`r@E\ ]YUbƤ^)T5%9sA@p PC\3ЇdT%GnJvS(-Q2A@"j>>ľ BbBأ2A "+4(Zf3,R˷\^s3o (6o^/TU- RW` KP[c-L'Pڭ>/׀@A /^y/ĸP V͗jf OD]Ppb+>[C(X`k3 4 nZ8O@5?:w*TqgϨO4Bi8hA8(TЙ#$brfނy}v$zWA\ LAJ_3ȐD@nw$zB\ F^ϙt OzMk/#ي ϰ-DƅH>  r€+ɞq{]FV P] '3#C+~  QAЖ@.BN'zeڻˇ?H5 9UA@@W}j*LBVr~F5s_  W" d B| B2A@^VRA@<~!  мy+Bw,xHVA@G Jx%? YRO~A@{lIENDB`batik-1.9.orig/documentation-sources/resources/images/group-logo.jpg0000644000175000017500000001210013063003374025334 0ustar mans0954mans0954JFIFHHC      """"""""""C  ! !!! !!!!!!!!"""""""""""""""3= !1"#2AQaqB3Rr4$5Cbc.!1AQ"a23RBq ?*>#)9ߩQSsU2m=O2b_WrTf#R~N*M#I3y5]Kwj"5MO*3jۃ&CRt ˲r-Cs7^5~33(Qr88' qGC-:MUt%J%)I)jSwdsyٗwI^e B}1ܢS'MHj$KtE]Y6[ TTK;AucS+g!Um~ߓy(J\ ]NaϐT%:26u$hۢmp`0 2Ym~\ZZ:beo]f\k+l\lYS0r_ 6I#vߋR'Kn~x6t<]sn+Jks5w%[qZhbr4ȆS$RWN-RPǃׄ PSq`pA` ~nK͍Uhm벡'y-S&#)`U<іM2ko`yYrꎊyMԞ̕3]yePlju> 6.Y."[)xeOk_3!ƻ; omtcsBȴJ5Eʒc79 \-bY-.3΄^eIH*-)X.A_JyZȏK/hm |k_LQ:j0qzPb=_Y+}|uux!gMkkqY(`mVo#6y)aI#yL.VNJG'Rm~Mt6zYEY2+~LK&w_"1P@v}A S}IS-  06$4HmBM0zVew1JǠɘ 8.+."hqWI\We Uŗ鎋U*hj}UND5Ea`dDx~GZ$0_ 9|ܩqEvT́8DD""]pFCg:Hgl*5@d*S",y(CR E踪piQ CoOT.E1ܷVIZ6HDМQUG-\Bvec"]..? ?MFMp)<|A$k=(*S`®1.v~aԉdbŎewaק_db>Js/6k.A˴f)I҉8DUAQ6DZݳrx4 @M]ZJވ?_q㡨M6 jDDD/zzo/L;#a(SJnk2_%cjGz\gRx&~F>5Yוw7%z쒒":DQ7,i4S:*Z7SYJBwQCllq# ~ SmqZP7O~2EwtEu[ȏ l~n:?#񲛴9uFɱ FD}*u3C-}վ詎ǀfQRoK%AuY-vUY]QQW:MٗpLrEtLrp8*v.M ;)ebpd<9Ou7~bV =厹 I*S"(xliTu/f|WԣtqUAEK)|hU.aUP glI];/vʾܳ⣉K&~yMz{CIui4G(>*3keSiUHϲZQaHh.`^{zMM{e^!P%㍺֖ܻkw0u6PEzHY煙o9ѩf";iu8#rX0DD ;*o/4&By/$jtߚ#nDTfi&@h(+no}'(%p.PsQ?1щ1S@ACFwM\6UW<ĵh^z-v:RVՍ"B5[N5tuZYBBR8,0DcLwÞ)qT 7Qx]H( eQ `5BvPTvTmﰯLF$Tho !U˨D ُ$v[' SR[1_7F>[ŠO~{`@ Eu[4S;іrat#堛tq_y48 lS:3٧6Ves %Ǐ̄ȺWe[* GieFZ4.3yl$Zx~IiHΊj2ȪDW4["E>ЮeaЩXST_oKĴRTꘚԙSz[ȶ\I\tھG)0Sn-*t(Dėt֓%qR@{o|vn8*G([,)KLrJ*<*ϒΒU4c} tjT0oa,GYE8Ӧ .n /u{O~~$֙mu/VMx j}K1 L~TmTj7m!6}ߖKu=q#qS~@lz;纩]>1&E9qP^5lU4n"&NV *!DBkl {ĂOtObӻ*7 L)y$˦ B8ҶޡKuV: >:16 V^z``8X>V0 `0p batik-1.9.orig/documentation-sources/resources/images/svgviewerZoomin.png0000644000175000017500000013733513063003374026505 0ustar mans0954mans0954PNG  IHDRW pHYs  tIME-H IDATxw|e߳5 !$$:"M xg ݂]P~`rށTDPQP@) .- !u2;nz_ }yg3ߧJ,@ @  @ T ڊ2ͨ@$LhN4 wT'6 UxOBHpzM!L@!rH Sˈ$IȲ\F,= ڭK@'nT *,Q@ v]܊zt.)D @ E@t}Y]܅u⧕UpIw[z0Ts9^i$wP\!oHK:4繤C} U7RҤ9m)r{\DٯeRdqkSz=:tv!%ȥ%/"Axzz=vݹTG ?P& $X1\g"z}jk'ZG-P_DtkT<˜.7*Bi0Ntױ1AsNzJJ^ |ݜU%>2{.N䅠ϧRTTDqq1%%%X,V+6 ͆,bnny٤A]bm^\Bw#\z1'?szbsR>nљWLx8ċs|>]湥1)5ƒ$p]o VfGyoϏ]μzrƭeur g'YSiw=sB_X0'~C<`0}Hg-l 8 q~mWIw{ F#vY-Xt"RTTAIHewîe٦|OϤhtv!y|"_s=W(k:$ A ~܃=xIo;rD4_sfx+YukK[ɥSұH+ʱ:$Z}+=Mo2a))qTjo*aq2?mƒ$-#_yx56$gB4+],~/zi^xmBn9].>1?|962dAӻoHřz5}/̰p thNe/}J<տ롇Xz[ekw'u;M9F cLJG<͓ 3Q3k&@:ӷU3qǓI"waMtOL 3W2v<?-.쯘0gm(mb8>O"ZO,PP7[~.s+lkɰR6fqg.i}Z)e¸ZEa Օc#me?hu6au/l1Gqnr t*F~2`:o:g;)(m-ES;~n'1[n˓lN  l早J|SƷ%ze-#s~sm˘y#9c>q'6)CYx}9t1ïcá¡5Xq y=O 2 X@ Kb;SշuT@}E=~n+#I FЦu SkWFXD[ngq=wxZEHpx{4@Җ=ġsпD#Ȩ<߿.z÷n69f9>.;hݢr9^NƏ\LQYq}w^79-Kt$ˣw0nx4DVKVkq Zvohf |qoigakUoIG5k^#cG0YotN&/չ%aIqT ˦ HH'ì/r;Ѿg#'8q49y_i#q޸k;hˌ7%xna}eS)m8wcv&3vJ fs[]V@,PwV7v^;|0OۯpA-Noe -.{#/9+Nau +S z)|)5jyد}|[B@Utٰfy㟵:}3CӦMEj!=QgOڴ5mT#^: kmB@5ā=)p}qЉ,@X q@@@ eǁn߾ݯL)o8p`@i30<);'j#UU~ɻHCUܟ̳AY۶ms9VYexi4hPi㙇37aI TO be6,UJP⯪ i@BBBS/ M#>/@k|[l)sS^QPOKqAAA9{MC ?X;,Z]F9 &݂qAztQBlC78UmÙ5y2z[*mجઊaTJ+*68ݡڄ$IL0 I`̘qt:$IP_oڵtV&1|Hr .偌cݎ\j0}ޭmUXY Ъ㚱`:ŷF:lSxxVdk"MuQ}ĪʰN>M-xꩧۈ?qc!2oOԡ'ntdee!IFFNUB@*|M#8u*-bhӜ}lo=E @Qziw򇤤F捸%af=Ygs1Ę1/֢b'wD&:ed"&Ȳ_3[ӻw$I\uUOp 0"~ڴ7kkUHHcS *~S=- =ۄdqnJ *-OĆe__>4vy-ccԩ(4B@}/|-Zj%t&ܩq1"LCl׻{22\1C{"}gnztZT-ӆcv|0۸|>ƍDF\ʻH- "UC|iеe8V;ː^qfۑnH~~>aa@2m6,ILCx=KN2:h"F eիؿo/6 ݆``@An(ZOHٕlÏɤwbil-?.`jV\U2{o)<(ZIXv =Pjzla,#>!~pSTTŋMUyyyQXX΢ %22Xo. ޔ9o+:*%:ƆjjbXvq-z<ꔳd6bVD`9~ {syAHAd4jԈO.Aenj="nLpp ꈸ12T!((DDDmڴnS\\e^` (( ThBף1=_3tM"dLOW(xE@PWTr8~8zY]ծޗe-[APP۷XjիWS B@ڽ{wb6;kj*ۋffwˀy(Q ! $Iٳ㯾jtZZZ*| 'L$!~(%6Lz}bil-?.`jV\U2{o)<(@Pה_4`0$osʦ}i*t]f^*䏴/`>YdM@na@g#:,71!Xmv_d,.}޽{s2<+W[ȽTȱ#0EApSѽe)~zSghټv 9v7Q{;aA$8Kfa0^׎&f (,6C)C9~<}eo^}J[e&K"&!҆!;$ӧO#Ifein*z '4CAi0K ѯ=6?eƤO+bkxsm$Qda.c8u {2ߏ,|ˣjIP[<ֺXi xZRfޖ8S V;T-IOBӆ ]\YY_qOLLS6Ώ[R7tˮç"bрI's|!,XZȾ٤la2mVx@>&;KAYQ>ߊ?h"CVUM;! >ݾcU9iє_}(eIt>!I,s*3BbujhTc+IlH~lFfr{BϞj5=뎐jj+k@qWMZ&GԊme\ 蠁";;+f ]X/a˄l6J.E"ktfu&R#Y+e$bs}IDjd6߃Ĵ]>yxY?}myaj7w¥- 1-ї4 $Y3,Ȳnо;/W81{deeXu2&ݛ+8f=wdž K1%yyyI/\ӫz K!77srr"y4aڥ+-[dݏa_s7f{0ϗ-e__Iшd"(( BBB !44Թll6c00 zt:]?1HTLmֈ_w 璞K -\pyre [9CoDD4c֌9:tcǏV`X4p0wܖHWǚkɄyJoV~uHZQI {;ۡwh@n+fDyg,uFw^lݩtБFr.&2%%% 6p>]Y;v_a{"B%L@՛xŭ_sĮ2GSһc ZD6l6RPd!y6٬LlRQ."??TTy]?H A~}Яv;b(((\6,Y;&pmg-F׻]7T z'jJinܸ1ST{,qbn;:&$$ؠrEQF":κ2D&!,2Aؼ; ~"L! b=1a$1`ʊFP#2X [ ճXz ZB@롈Nv- ,s A}Эxl6FS(u,4fTDTϘ8Zn]N9˫/-nt}d5|]|; AOAAs+,,bJJJX,XVl66ͧى'f-OY[CXn6-ڼpu5GbwcN~:=szbsR>'<3tqK[1$p7=̝|=sKbRkxIId]ꑱJe -𵟓Ht3c6n-+cd88&ȚJƂ)??my~`΢[.Ԛٯ j2x66[@vOhtPc҉HRwոB@箩Q}&]˲M?b4!Ih{BD{Qstۥ'❭II+ {[zwxCi~K~WΈ/2Sە~u_%dJÎ]\&e5rQS=5 Ϊ[eJE<ջʔjs!PS4/=Eo2a))qTj|U:F9,-).d~ۦӹ9|7HZF#oj5}WY _:/:ڄzis\}j3c~rl$i+eȂLw߶3Lkl!^Йa#М8 i^<:x qZCO30v~2rH@Ϗqx'yzj1[\R+oǘ1^of#᧶qfSkW0L{@o| ǜWmy꓇xmz*a˧0ʹgR8ԦI0U.M,#ӊi4XEdw{{#33=U݃-ȴѷ(dųb|=_^cye;i=D,#ïd_kTr]S*w>UA)FeȊ^j/\! ɓ6tr!mue1 E;gwQ}rg? S˘oMw޸,wm+y<~ HӅ+;I=Oyvl 1pt˴sL~g]\kf~]?3dC@ʆ%sݣٴ$h&iFFȄ5twC3ZH퇞acJ _&F*p$GvP3:мI,mO*6 K8tTNY+DvaZ]mUZӗ*\1gg|s4mR3ꄣm8Ƿnɳ0ڕ5+va;ښ9[xK2 ))0K$ hٶ< }\"MNWebݾٍ3F0qvЖoK9a tlLcYF w'Сެ_2:~[, dݱvG'Yxʁ \@m6VLu[_h=: egse[i*gxL4 4'{ۍ{ㆳzpn{s>I 93AgO9ŮZJ"á2JV 72W Tsܙ،~bboH{o!&=,T>ljc@{1|ı}0j{Cb|}oܠDtz~iMî$竤MlSZ4h$I$GNei KmrZ +Vpޛ{Oɗoeyyj&V:m;[ڒԊVOgr<>RUڪ'ň ]ҡjLh4зkKOGz[,6} _!SI:NB'tz$tǮ$tb2ZP:L& "$$ĹLpp0fɄhtmQ@(8ӱlG<{Ϫ/_6|rb>B"eߒ\sG"CcTwnޕ`Sñ\l6l$INJ=3⦬)j7m8k(,,… 撗W@xDtt:ygz{==."j\el6L0vXOC gNe#' ېo}ANNN&99p{ -mx/yJ~e!kww;LjS,))aҥa*JZ`f3|$#矻ғhj777ߌ$I[\?Em^^gƍ1ÇyfC qVϜd4'A>/n=o?Ƅ KC"x`|5V{+V@eds/:%Y+ǭnѣ9r$ }j[wK~)֤bu~N#IWvjj0wi5g… ]ʧ:$$BCCβh66:=tKwu_^35F2<~8ǎsOeO֚\t)'Ov >剒byB +#FuoҤ ~3݊ᡵʵƉ;Qv^WzvӦM~_x// ՙJ♑#G/3ÐVxs׎nOt'UJ(X]zbex;T-\[_ NXf5̃]*hQf=OOնxjNmOZuijßxT>| (**r;'%TP@5`%Kaa!… .RδK|U[DӝUp:$I 5jNŋl6s[S'%PPAHf?jTS>;TDWi%I",, LNNeV tEP@P֧i(55<<݉Z4UٺkT/ah4 ŋ]S|B? Q+T ,PA->9x EEE{S=ːvR,OkBV2bFFFRPP@~~nGa۝%r !B@0fg7y!O֧z~X_g:-OV{TꈷvOE8=YuU<pz(N8AQQ3XJ-??Y`QMQQSDF3vXU:/2D]dj^P˼Lѧ4tmq,a]խ^utj… \t:>xu:hܸإrO ,{S+w@u IP5X±cǸtRYgv!wյ ,Ð7 TLty #,,!.:pY RRwZR:)K*6P`מlV2ϗ\ٹz`}.ZTNӧOM<6*x-"+{h¯phѢǏwi-KuUbWv{㋒9r[N-c <&NR9fmr͛;J%f͚Edd$gϞhvv6r!~.FÁׅ c;fUv&ؖصLtQg9v2M6{Ъ8EgY ъ[FXNB~gë(g!!oBP@@QWQGqWTg:82* ( (,"=$$$dK/7ܛ܄$l}R]U:NS̜忑SPƍmPn؉rj 8"amTVV9eS?F' F[=y?a~}؜De\W_澉4%7/y [%Pbm 2*S EE'ر#]\b7b>SgSe\#} DQhqNe`V{Xw&N:iO YgpU‚GNUdddd$)@T-<Ձ>J$UBZ#[C|89Xn%͛D 29%|3ҭ9R?7;$кM6J0xML|H yEV,O%7gϯ=tOިϾr[6N>Fl T8VP3cA&{N-'NKn I25U (yh|5?$9ށOT+ Sť@!>\֋"" &sb͛).֤Fy8EסqPU9ќ7o?NǔouLAQf̘ANNNj\Ꚗ~b4 $sN.袀5kXf _{uʕ+Q/V_B͢y4oĮ_߯~fwQZzqY%{@$|'vy7W"5)k#i% "*kͭCEsp-rs[b'jTtS,{alX VzUzހeY&"""lCEQLu'JH@$2&bXQ PQX\" hOא*һ㡠ذ;pΘ1cXv-ysY**%aڱ9DE8Y~G5@5K]cǎ( oe^[Kz{ʪWrŽzHIIA.G`&h Jׯ_Obb"<m۶w iBSvM6-|猻eLpI5XI<*p6hnˍ݈pV‡;x}D"1!pڭ0#>6Ϸe[)8DZ,vdEF%([TJAũv0Y/"UԷF>C\96w'ڟ61<=n/IQ$C}jNj*pYJjF/JƎY/{Iʈ IJJepWp)~Cxd+'Lb[ $%&i`$Seܭw<Ձ|\\FT۳ϱ)))[nwQg#)sNZlI˖-o۶-W:8$Y-22QK111l<⢻WfwvYJi[cmHhVIDgo-ƒ(2P7)e5d,{ 6s߉S 2ՋW(`Ági046VV8MDTM[5ndggt{L[?oxDPDIy98q^أ^$}G e@J z fEQzU+)KДًVv2l }l9yo)D_:eTE֦Yߞ}Ⓟ/O#R6 tΝ1l6sֺ̩fi3T@7(*dT|F!;_7xpXy&F1j'(y s xr|@Ă* TzERd rap k{uTTTTYvO$ZV_].YͯժߘGK=xW8pP>y+ۑe^v~1Waa!111$&jΐ J%:‚E%f1.n˶%|x;vƍ *ˈrGiI1R2SRe∔Fy2WY*[շm+S[Tqڭx|2{;X:?טo|G0HG,;}!`Z9-V6U@IA)ȂE\.W؝(:tJ=)SD([owЉϿXo;Ty '1G<ޒ| YIZZ7bcbO\_ѭ'_*Z̀-[o$&}Ne/_2մjaYN"/ NGW <ƾ=xsw^eYK}H/_حܮ.ƍǣ>ʏ?RTG~EEE$4zȊ˾UH:5_9-"V~'N"*a( ć!M,'WIܯquv{d>X^wX?>h]Oy_a+N 6]@Q@$I,xQ|dY&22>7guȴs]U,/_N^?>K|| Ҍ]yҧ:4+T\8'>I&oFk$j/G@!lE-aO~+X~6KZFӥ]3XN.Ik%EQ'rOg)..[P$OzC+Z[t:kdtj3Ujjj嬪-((7iAYYYꥧ`ZFGZDWY>|rkvQx^222fL?טpD4 _{,PhFUp:vX+#0ANضk?2_dtӏK>}ֽITUյ>dաn ӆDQDA!:: J[$F>? g֬YpW_e,[s2~*F8p 8q~)V~+h(*ڰ4)f[P{.5e"=.hORK] 2E>gn~enc9ڰ GAAA m6͛7g߾}U)TL 3_%I] ?KOfӌjJKKevqՕ9Ȓ&M| yzjZ*C8H& ,j\=8q~Ν;ת-%&,1뷣D6eXH6_I& lڴΝ/ IBl(UJe,Tڐ5Y+bW_}_dD9cٳ={j;5k97pv.>>9spu?1cƐHf&l  qGMƪUPTE={[TT)))wͻG5{HYYY6r(0;q.ض/;HjrkFqD8d|DifeQOvJJJ4|sS\d}ƒ/>@ʰSUÆJR=N'qT5,syIz/GzXV$'OvzXVs_/׿%$o)Qu P(F8((pAs;w mǣkkģcS dvΗvKJ~vv|]XWv(KOADD>/l-[pPQQrӨ4TWrz\.%~=w9o"K_}MYYY̹~ eX$#GArrrX&/jEs|G>ݺ\z`>HF|yS)Erl ;K0.cih+ܤ$tUgzAn7]t z~ܸq3dz)<ȳ>EQ[۳gOƌŋ:u*׿4oŸqK/( *s',^ \ډW \4dT#\Ӂ Z8aG* E QH#ZgjmW{ZV͠fp8bpq骛:z*ַ34*2ȲLiiiZVTTT+=TIZCh m#>Mokوc}Wեj](2PÓ|#***lU|l\, MЦMZj,|[\{Z3En(Rz4bXU Y 0qkSU%%%n***4b!**_ڠO<ŋlAnff&7n$::?X\0rHK/İa9r$෺]jfbĉDGwa*HO;<Fz[OYh(uRcuLSQD|>_@DU ΍R-sNZUMW/MNVɩ&bqښ~W1ԩCIz<=R0t1,VS'OZ- ~9>/P}JFZ(@:IHHM6Rm6_~C۷ogĈӼys?$YUԇi۶-_~%ݻwgԩvؑW_}g}>;Nᐕ RUde|x¶P;ڄj0yK#x<~g a< oߞ[bqJ?h5ScǏ۠HZnMvv/mۖ.]t:q\O]:sRhM$^UcAz={h9d,XPIGuS.]0rH-[FVV᷑1P}eK5 |w;ui#Pum>boH<3gs-zxn7a哚M-}~3j ˊ|@+g̘1,\#iϞ=ZLZlɲe~=5ax?w O+6ʫ!~w@ɰG.M>rCikY.klDx 0qfADYVu2cZՑQ[V%%%a[vZl\Gxyz۬3Xӧ[n%11 T!w}I&vk2dǏO>aٲetޝӫW/yrrrwutBp$3W*1qHzSUQ׮]ٹs'ǎ PIը<$ΌĪ_UVVSu.{۶m=F"UM#W?ggl c„ ny 1sms=u]֭[IIi˸qp6N#Љ@E_8p:Wb$`iLվĩUɮ6,6mN#IylP t~zFիi۶-seT9sTq xGXjUt>oO4k$$$pI4zU6ر#'N`׮]YpFFFrp\DDDhkjե< F0QsN/9粋vDDDhu֣:mULW)իXl\s >(zPԣwݛeˠys۬` bп, k׮E,EvX[O%2111uͣu֟`$3@UIrѢE\wu,_ DQn>)k5x=0tgH1B۟k^,#Vʠ*VYbtֹVb߾}ٱ$_NIyVݿY6VՆ`aX `)ցDeJEFQddY"YAzwBM ,+͇ja^6mv,P{~]G{ .?X#Q ##΅!Cֶ&~ʕ+Q/j&No'l4EN=w9tcWTITuoT㚪S jxQq:7Kҷb`53""H"##@|7E:t([ne„ ^Hf'SXjsi>IjK[wfc׮]/QU r4IuB΅HR@=O@xCEEE\TԖ9::+WҳgOnʍ7 [m uMqqq6vJNX,U:sՙNOƥG"8K$P|ddd|r>3mwRp}Rg^謑b[eg)ItҁkF\J&qN7--C|wx|>l6to~.$Z:ԫs7siKYJ@d gc;:lX6,|i4şO/:t(V[naѢE$zm[Ss~Eݫy_uw2"#?,r ؘhE#\sZiǖHNN'vSm6Ukb,ZGlkYjM}+" A"Xptp\\8]8ZmXm: *s?.v(ï[ .]ܟ"гTUѱcGV^͐!C˭׬ǁI-TdEQHMM5 ,BYjX^^ aÅj]v8xuWrj3z @$Ƅ 6ЮMԢq b׮]5J={4 @hn'OѴiZ?X,"ǎH4Է'rs.O`!邅3ҝ};T]ii)$ѼyZkXHIIQPP YDôڒ99Ck.2#4#>ȲɓXVDm۶%..cǎU CI Ij%I5qYN&SUו@ wO?'حooTF5kfYJz7$IziѢEK @||<唕x|U:i$(JPCܭڑ(TTTT!E~0"5U&[m&A`(Y-tڥ6%餰#ٲw}Miwʕ>#Fk{huV֭[딦z1VIj"r@lȢ"L%vDEE(ڷ*+qƍZPjÆ"Ӛt'`?>:u^My饗ߣ( }WCgm$P ~}ӢE rrr9tEK`Ћѩl 1.lu8zԤ3]O$뒾6IH6-e\AA:U"T((*DQtF0 I?Se]P7ou96CdzCrrr{F8Cbn%#~lT>d+v0Nx=?JF 4TB.Gޡ5$$Cu_lB>}شifHt%( _}W^y%,p 70vXzzGevu馛EEM"42HGwїӶmBjÕé`uRS~zۺu+ ]v̟?΃Ç~Eo hn˖-cȑZ~dƍh8DuڙPeX6m >aZnNXIl>[dD[4X6H1hDR|}D,lqr*dU9]ui7عpQS7P !V5/p@5W\ ||FAԩX,у>ϟ̙3Yf N "GQ{6lë}ݛ-[ЫW/zŖ-[P^zժ쫻N혫Ky'))-[e~{/^̜9sNkOEE>,_xg2e *sa=ZwIjg, JéKS5joLQa>((˱22w$BGuLǽ9dto`Jps:u{z(ݛ}i&222oAiRe5jdgg_s7kFf Nn֭,M6!2Nۍ(FE$ij]ZPF :E5vnZ~=4ɰSNx<\.w}w O_Ze.' 0a„Tvmȳ1EϠ'PS{bժpXvؙCk7m`s6͛X'âH\r j;;uԉ\myN^ƈ"FiH~5Jzuxugddн{wgϞb Tő#G((( h*qU>j+!TT&8tP>i_z'Ќh֬"NKt3JHBӊ$IxK#ZKNj֑ܾBg3NwjYf 8p8</1Q65 /Q.{$͆λ: a ںu+z$͛7kjX4tP3u:ZpΜ9߿Fccc5rxꩧ|?ٳgz5iW_դڙ3gjVNJqF$IbРAlذASվ+*^3d9sI=i4sL."JJJcӦMcԩR~*g6~"֕{7$FP/AڵkZd [x%*EQXb,?^RZw֮}sͦriaߢBkaeJ(:|_{-͟ctO0hZ+Wd\~8l4-?‰R+^ 'OrGaMt4}g0)v7`лvjx< fѴiS5kFbb"f70<J+PITE$IU3Jt$b6z mmR3ڷN%.69N 2^bf吝OֱZ"I2a+oc٫hHznTݚzWp+ݷ֍gBVuq`„QI*qqW%p`@j,ԾDg4ozK[j8Jj:L^/2O>$o w~'ʕ+&X4a>Hh j(RPh#ڪ,N"l6/2>`Xλ͞i^]vzbl8$L$^M  ƌfcܸq̞=<Dze˘8q"L>ɓ'#C a׷lْ}i.'Іj&L0a^x@x?~<3gHh97rH6oތfCLrWzu1MrرNgĩ~?͋ 67Z-TuJcjFKPf03Լ7VW* Xr%W_}5 |WdddTfŊl߾2xRRRkzzޠי0q"XG0MU[328kCz2 FQF,SφQPmxڪU+~gLѣ9~vNEl6cǎeҥпi}O?V?rj׌IE_F! L=4lj-ẃVGF##Xཧ9p UG6㳘ihx;w.,tRvsM7qUWLGO>IBB,s3uTNVpUWi]wEAA?8?<d۶moɒ%~픕ϻ jqPD'.=T%1H42ƔBñ Fjj:V2<}(/MkzcOy~mh ԬgwhwδyT5pTH͏ u,Jb>1}?. Edd$DEEipcT}9L0Q'1J_ĂIpC`D.U %9^06ƁI&Lh025Jꈵpȳ!: T7`8iOJ0M4 NסSFV_Wo!IŚ8'TO5mH"}m8Ng FᐥI&juDDDr̯9GF uǍy4""J8O?,JcUW^Mjj*ZbݺuL0 0o<{jU˖-#55+ϨQp\WZE6mHKKcÆ ?+VТE RSSYbE@C F^_| gK &`xMu[mQ5i|`nB9@e,M\?KZZaogРA{,YD#P/"עRSRRѣzt҅ٳgӤI:ۇ |ivܙwyY0a{˫Y(t҅CФL+\g5BIZt鐴CII5bM?Va 33ݻ`q\̘1#FhU_(E7x`ۧK=xvT6cb FC2[sBsT`6!$њ/5\yQh۶-?h_|EMƤIcC;v,{/ ,+۳n:vMB^׶m[֭[Ǻuh۶mІlGVZ?_sLY3j+P(/Ao8{pNHz/Bf+Լrwp-ЬY3|Af͚px-^nZҝ5kcǎb[o=z!Ν5\tZ!:4Lr1C}?g4mوgϞ̚5^үmy679WU R$DQzŭEI’>MinRMg&7oo6bzoxxᇹHOO_ba?p3jto={СCٶm}W^aذa\veDGGSPPs=ǚ5k~`jΝ;/b KڴiCii)/wu˗/6ھLƌç~ȑ#e 2vXv]2X ^eh =դr4 nJ9P>C&L@TT_~9Ç'))&MTQ^_|1@Z9r$'O$Mc{pB}M]v2{),,dڴi\xo駟f&))ɓ'ט رZnk;#?#/^ oy;v,&MbС,ˬ]I&1}tƌCXr%۷.::jӯsm8e"ׯ9XshWOPivKy&9nذ,6mć~Hvv6}*ڵkƍINN&77}rС; Ss8p8c^D&˗od~gN~.Byzѣy>|xXZ5X`Q9sf+ wݬYQٲe | ;wDZk}h8e2yd<ȵ^Kǎ8p !КH4~mFǏjZȌ37o{ 87m4xx9y$>)A]%P9MXzIHH'|͛cϓ̙3hN}aZ5XnÆ #77&Mmذӭ[7e]F׮]@)=Ú5k&..͛7kf%ՋչP5h0ٙ?0Ql6?8CRRRhӦMO?믿>U˹Ytiݲ:Ѣ`阸)o۸S|emwwY}M۴\?6 n~rFFF׵kիWٕ+Wlb1f1lbo)1bogllժU>([bڦ1 b:Ç?̂؊+{wco۳g a!!!^>cAAAŋ.ۭV+ d'N'sNt1{GX`` ggȑ#.xwXnnǜ~ӟJ'%%'{0W_}Şx "|09WVV;vjw^~vAѣG٧~٩S_;f٘ngQ666&s$Mf1') b xdºy>t >PN b.AAA (AAA (AAAAJA$AAJA$AAJA (AAA (AAA (AA$AAJA$AAJA$AAA (1hooǚ5k`bpt Css3|I!< 222P(${ <܌r l߰ajkk %ZtO>NùsT*cHZ-YYYx'ٌ;w"??HJJn % łG}~ M!H@ p8`7njZqj8v؄GFFnjox K(J\`shh4Hmmmjdc`2P(PRR_W>q߁$''cʕ0LhnnFKK  $ALL f3zzz'N<ϣxBRTJ03+kgՀsghQ}Y ի@IDAT !p%K,˗}}B"Qe1 1Q[Z^fA8nGNN5$֯_x'>,, ZHNNFcc#`2L\P(EAAviqd2a͚5ضm%1z=ӱ|rzPbyfrc"wRD{{TUƽ70%4HKB6CH,8A$Ӆ``(/^@q^ì,deefy^Z siiiPThooH555!)) & AUUd===@wáC2eppy[l:J,pLP0@ZZW\;& G«zvG.Çva,JHhk0)Bb,xY{쑼\K,%KP:㴳qغu+^ۉvX Faa**vY(((@FFYvv6RD]r%V+6mڄ ,hkkCRRNoяR"<\)Ri VqM,T#ya,BH:r҈A Gؾ}}jW_`˙L&cGڮ3,## vY|ASc'2v̔qUVV;vjw^~vAѣG٧~٩S_;f٘ngQ666&<lƣ> s/<\Rǹxؽ{7T*a6yy")I2u+{ug6~\tu 1cS\\qތs֭L&CYY>WT.)8Nl]NBǏȑ#l^/R> t/;6aVHLLIJeˠj}Iol!`2 YS\Af,#}zIIHH̙3 S?OKKc\qq?'_\pqo^ݻcmڴ`eee.mGFF$/'))iܱk._3(**]pEEE1W_lUtd2e,++rP'5ěqEE]ߞ-x*cOO)P(q@i3<-† 044x:th\hWVȵZKf٤; þ}@d$1skUBA}).FѠ6Mʼ:z׎M&||6b1wp j"Sqq1v~w]ijnf\.|93s ?nN';?dJJYY|dAh'1vedddjbʕjϧ.p7xohh`2`c6,,؞=#l9 (F]8ϜaLF:6€Xtt3%%%Baޤ$! Ɯ$RЈ{aa"ŜDx<'NH ue3gW]]dד<%UV^rҡܬ, - ᒀ. ),,vO`Iq͕ڈwۻ̜6##NýxqFGZfXaac1BrO.^J6߽-ʕ+,,,i4\I2p"OxgJc%%%~߿vu,$;hA6 N~k.%JvJJz)^ǎKX"k*ya쪰pf!??/`Xݎ]vaӦMKMMEgg'z{{Ģ]؞6ׇ+Wp //O8ɁdNwp*4'n#11}}}ECCu807J*Be0O.7chU>/@T=^ $&&n %7]XJӗ|73"z3/V"-Mgz=MxyP)%sˮ** m s@or] i233''Xp}u眦F|9AJ(JDFFnK"YQQ"lذ---x !>瑞NsB1Ϟ]}2|:l~cW?pR\hy>v &mW*wv2e "]U`D'==EDĉO\ 5鑪4%%%]]]hhhFA}}=x BPx\[йӋ/Vݍp{^4vk=Nnlc3Qi &,,  ñcǐ3:9jp8etuu!//IIICee%_ T裏*'gFF7"11Q0Ppej!"%fKR*xōғ|L ,쾒^PRf·EEEy^ W}qqt s'Pj6!"%fH }}͝S&hľ*ab5׏˔tBnn$<agcc#233xGo_TBVc N\'O6qylooG~~p&Gnn+S,t䢼<҈.y.VR. _t#+![PPT[ll,p9Ө_=ƍ-"#MOT.2v}͹sBكBĂ'<<&S+NϓxIaۋ=Q(x x-x%υHvdF - Ci/"0C@bEO>,!)%8_ [P ((H@nE;'^/+¿1P  % P  % P  %   H@   H@   P  % P  % P t:ݴڏrwq~_!W߇B@pp0j5}u.RZ'xo9oq>v;vw8os>9gxGlh"u]P(8Ρdغu ֭s=]g9cGee%z=<@%K(AAH@ KL:t,2/ӭCUeȮrLOm?M~c9[yz.#MKKL&cp⡇r_¥ѣGd,]Gu9nbb*L:8=ⱉkWb-[ 88o /;'q_^;k֬qmt<A(y)Wiuwߕ:o喙ؾ/^SO=%ͿSx뭷pw"33_}?.]>hhhZ-:WVqʠ&~x衇0Ŀ<q]Sʭ@I@I@g  ((׮]`@rr29.$݀0fOW^{I4om˶y*kqgϞŪU044>qqqoO]MtOGJ!\b v6UZư}vTTT`Æ q22"ݍ?ϸSTFww7T**:Av5|AtwwO?vO׏]V!Vaq8Rؼy3.\999"ԸX]hR߽w^?抿"00I8::EIJI|S_B痻W*,$~l/OqFGG%ۉ,yAg䁊/w1L$$,D,!((1M``$%b!//w1uz;6 <>C?1PL *zAAA(܉PP?3gAtQmPP<%J|@Pw >GGG,IJ|PO\m;~|y}89?::* 荲oI@ ꭿ4*z:Q?ysVL *Yùx- ce.( 簮P4!P 擀:DTH@8E8==m9OYyN$$A䅺ϙVda- <0w&$A,қ}B^:66&a^FIJ|@= C {;6SNBVozZF+?,b[`IENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerOpenPage.png0000644000175000017500000006246013063003364026723 0ustar mans0954mans0954PNG  IHDR,֟ pHYs  tIME1$͒_ptEXtCommentCreated with The GIMPd%n IDATx]wE{f6wDA P@τS'xx3⩧&%(&`ea40=iwv{=ՕիW5lƵ@ a{.]Z͙z{ SCjSevfUٙL=<)S|? Ak7B-P>!Y˗]"-F$5qwg<+YuhS>ZuE^2z0l{z-.mV8]κtC]s-X s9/U_=ɮOf_9d'?tr6.Z0M]7P?8 0pg׶(_+?W;{H*w3+>bֲ*M؃=`; _k wO}bg֐ޛ=}wz ?AӛmTP/HqUz .OMfÓU_YM4mw<vfݷx|1xjV[<>= ͽm%~ ӟzl=WٌAI1)Uep`/]\63}}m? 3|Q7i~Ek`S͜?zä`ç}}`g 3िw__v|p??k_~v xV{68k^o|1tڶ 6wƟy7oTw`33உaQC>H&u6Sv{Ճ6yCp9~3r؂5<~spfN|M̄qS{îOfW4݃?xgʈk>7$84 aۯqsqH};vܵP7-+.@ޙ<8`gF5-.[xI=[}} KAb;r@A̗g dU݄Kڿse׹gn /aDWX!V0vRX=M_s, \8tM͢iΏOn Ekz`[[R\9#`ywK| w}KvWṣ';sNm }u=9C> Mzӫ}0pL vgj}2%gj׶;&;gOݖpr'\5i҃7+7RaS0x޸umF<Ҟ'g9d&'N{!W:Ubۭ9ga}(?qKY~)USY0z|"87C_P⧥;4ea3Cގh,Ze']7wdwm}m~'T/_%']Ѳ9}m&{&A]-o~ڧy U*+%7׿{ݴ壱f䖣C苏\ gF `OYV?弋F;w$ VZ+Q.SӖa[6ޫxʾqXx?ɋW d`XOΟ|m=׃i!=9kZoހT_^n|'<~h8l\F-((XtiTbJlf[ȑ9X7vfO~a7yu`}fo|[u:4Ь'"j Ѿ@b= 2y;_fn^Yyf5`M) ; %*F\._#1vyL0& BBR!>MIf1M4&.T@S$#&M T!"d`>DPmP { N D@H?wɏ"B䃘0~ڵk׮5D%Zt.v HFe"vKH5!!jX 3Sk֬ED8pA5k8`# qrrIF&p@YK`B9+@2-8p%rPM}sbfS@!&nu<<\U dZʈjժ[8AHdРAFjVj.y6\*QAKL@ \;؛}5ŅU⾕:6؟{Uv JẇZ c pՀ8*IF j'MFch@ǔW\)\rȐ!+W6kK1k !Cr V5@~8ڋܽ7;cŊ7|Ŋw!C,f8f׸J/R9FUFBWe+9V!? Bm@|څ ,5.;@N vj@RYY ]x5IWy;vH5Ik _]w ߘQ=N Jo3C)Rz5M+))~ d3uȁ>5bٽ/)S:\Mt䞑ٸQ`*rp1ߛ=ȝ(FN1VWWةU& լkx$ WVV)> M6hYR7-ZȉE|@L]۬i5EQE9߀3GWO-d=W1S[59pOJu/-1"TO}}rrrv閼TVV"QUV?};&MxuHm^ӵk+6??????l+YW|M`ڤ^Fq!8Jp·~k CkWe hG^߲e^dQѮʘ<7-:}.DĻ;''g 80K8gEc.4$---##kg&M0,;v~k߾}]#w(l 5-=hc#pzdD9fݷ߸;ls~OZ?ˎt?_-7ߞ,'RRR9ZÆbH\0ԩSi "1ΥK3F<1׼ysH?f`cYYY͚5|(,,,))@ҽu۷>GPA+wWXX"3rcdk#Y In++ ڟ|߯voӱcu휎wQ'շY3;_}x~ML7ON:uʔ)~*nj4L2u$U'pš5222׬Y(!Z aΝ;mR/YGQ=^?U]ye^V^Uбɚm7o?ܷOMn5yF]cA-Z0b۷/*;hΝǎ]ˋ뭬4 Rc`_x̄/IΈ*=yT Ml GUs,9V3-9d⢢]1,ٽ{7">{ )"$mŋN;u^^cSz Z}ߩS5r䔕6iҤA1H9ږ7]z 4hPRR5b9rHS4Ǔ z"{&eU:T8 z@@D&ZzY|Pjhd$[.$S=Ke )H ss^Z^2E@EEErG#-\uѶ#{}~ SN?y?_ǍoiִY=ͫ'\k_ۻ g8XM?}xQ@۶PйS//;DM]!(>E`ȓG6lذq"82:B{;uۏԡ ?[pIF!v!YK &ݺu/**jyaε JS|J[ۗwСSNU=OFG{[}^yF뼦η^}Gt۝/<}]NFs-{KGD^e5mq/~ђp}y2U^^NFեKGΝON`!Y㣼z0^oNNx<4u QlMJKKԾ22\Rs{\}Q$Ƙiiiiڵje&ZuiԨ(%%%F5jbŽzSy%&B"۔6\tkEo7/z?ܽ[W_{Ɖ7Q)wz9(Y 5kУ*@q/ݧi<##C*ፃǏ7k֬AqN]eB5],|"ȑ#YYYr˯x󍷸܃Xc)"p5 9[d@߾}?>_t-֭޵gTG%ʂoC=vyatO_yPeJYءCz<%!]Uȑ#;wj#G]NcG) (& 4h׮]j=\1j#*Ѽydff_ZZi8RӴǏ z<WZZYkG  0W^񆛛4i9I-;#7a=Ȣ FI:wҩC 7ޙ hР~ /JQmg_D?͘JfHOO|M6m׮缢 rWU񤧧bJm'cL |>Zsn̬(b;2!|@]H rOBT$s2qLȝP5_@@oX㛯Å13UgJQeٽ 7WUjo;͞B$w@ joI*Ae[V±5H@ ^;Eu- rUZ@^?<& JtCqz;ȝ@ ^r3OIK}9_l6]΁6$!۷S0;}I ׯ_o9"}TC[\`9rZjۓñf~7Th"Ǐ11A_$BdNB6\6_o䎸j0^!fU%\/q)8^!iG>k/X>iPȬ܂dmTsbx[dU|,Y%Ǭ䎈\Ӹ&ih5aga-g]c rʢHF e.H^1$"Y&䯮#Ir6BkL"gax6f{=\sbQGVؓh Kڬ94qvykZyʚ$ PAoA=au V {4Bbp7[my$9_s,#];4-4a]=amB' dz x}ëٓd%rFH;hoA6&rٟ?)pPm-(9ډ;ǵzq mk8A,c Y86Bb=Rh#m/5Ij=<8cjd~2`"M-+^h%kDdzگQmRUʹ{VO'I|jpUda5K9c )BPqw\ھ (+-@`NH_ͺ:wudr 9V!"1L~C yfNmQ/xccHg(ڹ jozU`b;c !C8G%QSp9V!"yc3 [V'jro5_2Zv]DB܅-S=7fMs@eeeeez^H@ v(>ѽ'uZ}#w@^6#7@or'm,_152Ģ]P}޼#e5>_]Or𽥿\0mv@ jnS۳saNj4)hݮygj闅^Q ,X@ ƍ+Y}cOݛ40Jtlx䩭){/?rKU1F<{O[I-[]?tidwm:'?৉K ne}%BK'KxQ" 88R<C͇LYibz\*¥b|uTB`A* U_j.sNԆ`Hr (D;eD*Vc4'>r/T%q]}fQھ蛟o[imyY]DZ}ƹ'rKl,@Ki>9en{h i:|[-|OȔ69h;,ԏeH.;$vm*wLrG׹8DWGrG w ( Cr7]"bI;ڔsh!\5tSms8c#8(%rBrGrZIutң٧ L(U]Wӳ}n31ZM}i]pdew pבY+H^Uh.Bvs<+ǑSױHF#BRUђO%w|]?tVOuql:PyYy)#s깛KR=wDrs7+3_* .n0{yvSˮ;緿* Z-ET2]Zux֢C-Y)0nGޚ'wd 49fmv?ME~(8\SQR cɛ#czQ #څ; .CxCmGͿRտfi]N.xť凊6i1G 7bV^}g- WK.nҷFΑkư bw`©xk:!V-vMe3?.8ﯟܮYiY0{68Z?V8rܿ@vKڞM[0uCci깣M4y+uYJtswpp7NJU4Jڶ*'H.<=de'slh=wYT¤x7C<.% ܥց2w_j=2G*un, 6M[[ۃ~P5"sYGq-1Kf[wwsw ๛6tnWrsw%iuk 1_9-Mb#KʝP51/L=k;i ˊ*ݲ|%!;MgIJeKBPW(RBVh(W;whR;":IdCB{;$sRsGjqFchDsWE{ݰ͗%5=w{1a2|>cI.j}Oij`qEE,TUUEЯ(s\^-1ۨ[&(//]UUUU9@1N-WHsQ 9Z7ly ?P'1_#GqS,{Qx<_53{춌Gm c#6C,6=@ =\l m.^: Ւ QA~7>VyIyy wk}TU5too2.[& d5׸5 u#f|\>hw՟-6@35zGÇ@QmJ_}Ǭgf~mFLsk&Sܛ;I/zo[yu͟wO^{Nߡaˮg'd>t^oXpE0e+rWiӶ9w/_tg@ H0dTIGзpc<1jкQ4p.!cya=:`dQڶ`i=9D3H!?YϞpΘ >ϼ;j8}֗c]qGv1Z `0u\=pW]6ṱ9PhLM6dyB@ $I܍-Ý Kuq3]fL9nNP5y_?:G }`7di@z6\kn$dƮ嗏yѾцO5h'zyx$vf*D;CaO F <+W!D{f[8dBB1bDDqִ&,zz.EǐT"ɽVt@ܿ~@Hq@^v#xPs[RVq !%YN3ݽ ON uD@N "w@ ȝ@ D@N "w@ ȝ@ DPIjEq(W*ӱȨc P.D~~~~~~ݠ ku "x Ξ@$eX-#J]_^js7 2hiΡJXeL0B[eBe8 .qCpqJFid1iv{r{w[8J͛2$nw$p4;@ʽ]\ /F&TSIܫ%t"PyUɫ2 y;AFր1 x%P*|7uw_˜$ٷ@ ؖkݦuqaK$DDD_ym;SB<(ڹ >x<^󥧧gffffffee4xTUU1VN ;@ ȝ@ D@ r';@ ȝ@ D@ r'Btn;XMMF g#~n5@pg̡F2qLJ;D@ 7_7>W7fr'«^"wun ":z/PWq&M]\+{U]#wP9n)w"wPANN "{܉ B?@K B#w-:r6x%dԌDva `|$ ?l|\d 1- \՟*hъk\0(Z,:Z.q L)wPg=.j]q`˪ȝ@ $-[f'`g\zp%5q,fR03@3\D;*cpq̙L;fi: lSvD6VAp7_75+o̬KX{&;U#R'>R ]DB-#Qw7l`5! r0j!%;ܿI#9;Pk89Q;ȝ@޺Y+-C=DBʐ~GA$ QB{sW4E` <8^jmZC䒼c#mB}è3F&pq5W/^ZPp yGD*VMx@{gvC$Ι3gΜ92'C3)sFKV ,Ye$"N p#q '" C wGi~t+wcHrO>g(H1ƕ{ ^ǎb$*ν^|bm\5w2/=g=8e s,:Ƭ- ;s8{FX#a{0q`đ#;1SyDe(zxBުI NyBH5q~.K\LNhD$?0 ǨޞXP8XN82rtG"4{[A&Q=/*|s^zգG5@ ˁn.1zYK ;-C^W{Ē~l)ȁ"\/I;"_ ƴν!K*5DK7=1ٟMtys Q(w}oj٫ђK-Ln.݄]h.0/3)fɊ^n:f>eEaip$,l4FW3hI|>A肝}>_d[PcY`vDs88hXrM+/x+5s r'r`҉:=%Լfd2Nꘛhx7O YS6 CL'UDvyjZ䈦aj ڶ;Բ'vlUs,,TbD}bśH52LrXD?&: -w8̝ Z,lsFp|EIOOw܅xzoхOrgb[fW3¼*㠈^5fS!^hz,e֘jkݒ{fPh3ibSp 9bH*!1Ȕ*( ~fmBFK'Arׅ+ y:Re ø$.wgAF^\Ihvo0̬nBAILjp)AX$Ĺ 1Olё .9$I\f{/,L2;D-4e=1_ʠ=Q9VN>_H2'n 7cjȐr4[V#*daSto͘pvڬ3#p$!o_a_?5nj〠Vh:kd_uc6ӎYntMf  ٧ILO :YCvߤeffg W%3332]vf|> #K΂C!Jc<Qe!p1U~7Yx%*8 SXN6.&c-,g4,l: Zjv;@a *L1 h,3d7dH`<9FڜG „DQ`LFfjG&J BW 4F4MNڛ<м36 }>_fffFNF wvnqޅ~7q=wvGDfw 1 ΂ne,F&˭ce'2|,f0nƌ gv0(AC ׊Hpa!g>@,$Ykl9<ȳ\unZAse% t#+q 2Ѹ#GFnۜkii4̀K6FGCNv* lGuS6ߑ7uff4* >OQ,7./4UUu@te)20ݙR Pr9ѺUvU6W2[ffgef+(XsYw; 7 HBn1X#*G|Z) RܺcȨ(L)(( 0(JQB˽C rFtbEa %mfca,A(cht9M ߟs.9r3G.&@C""?HKA322@naDE]P|f*5Z]׼라ޑ!H:UH~NAi@|ː?7\XZ963Iz=91FnkL5`i.- 7VVձAD^`Ȕ!LezTPU(*ӻALM3O" k9"  %&6&Q5.&KGۂQkj5?i4 kFE ^^Cb6[# favUD.7<˒$i#X,IsG2ziiiRHXZZZdnx[ \6#^ 0 TCpXH 1:`j6A/ c`,9c&wfvt+C+PâZur5=2UۉJ4 24 3{+Eh7Q7aO*P<)0T*/dc@&%V[4C\nlu¹nlߠGQ3=bcXt3 r.( QV71@i1}#Hg fY@j@QU GxUeT/S=<^U(BȫU -2 9r-אsMR֜EJd EP# !\4 G 4E h(Ӽi!ktR4vg`ey-d1c9OB0 ѼSi[Pi*G7#WMU9 G 챗L%n,/P 2X"žwBVW-sUQG++׌hAG^  nLn# icw'> CvggY-Ș^5\Ɛ) ? TT/xP}ayz0j,6ŀXXi(p GD59E# ,h-*-38Ak:skhkD߯_ iZ@.ӄ1{2VbU[oI^-{YAMx5) L)sSB8HJy6, }z wssڋi )fMta;/ X{4,G6jʪUT\ v q"Uw!Os`F[ҁazkm H~фwV]M%D}'UuC믛HZ|YVיM!bZt=ȒS~D|:w;Mu` 3@$Geoe=2$SA(yfER6oL:2䆩Z*b|B*&ڌ&ڥ LĘW~oO$ʝQf<Ť$7%/=b$489T d "4$]8zPCS)erFª/|{_{#? />>r]QE>ul &%Ud( aVffC]d~mߠ,O+:Ag6v NƏ/2JF/H|#AxH<8g0p `K}<:uƤO~ 2/4) R #]h2cXi78ng:^qZjkK)֪\Qnsqs{@Ͳ,޾W)5$уy2˷7(]gxIENDB`batik-1.9.orig/documentation-sources/resources/images/batik.png0000644000175000017500000005434613063003364024361 0ustar mans0954mans0954PNG  IHDR` cHRMz&u0`:pQ<gAMA|QsRGBbKGD pHYs+ IDATx]|UE?C ^("evWUwu]u[+6^ wμ{#yIp 2wO3s0gR ↲ۆ-rLwo^ar7'POBLHH0Du ȂlKy灟HG!"Jz(^@oD@_yp@!"_K{0g]4/C!"_t;b7`sd{"r3sL_Wرc#~%M$ϘDCM 2/g!Ҥɓ؏F0j(ajj$TZ(xʂc07`ǖ.]xGz.^Et<=Y9H!H$xaTTT@°a@Vc%" H`~R0J#"H'q%nDR)d~$oLL?''#%<`EǑz+bIJ߀Cx9i(Ă0HR8e9933FI L_!GAcR쩯@*o^( 阑;b2lX,jHPo:Ou zz@/!p<! kb>gYGDzw-[l3s}ұ8>v aHFǡ`E^-CMɅV]?HN  P"{a4\:6<S"_y{񏾍;H'V  ִ|˓]h' sLǞ z{HdA;bYPQRRRlyyyR&U#P}7/۞-</%#0ai0or"ĽO\4bĥOl~˟O3f#f w>,*T$ ^$&12[(HM:&@S@,$rT*˅" |mapB} h  l T~Һ|>Z̷cn 7\!LtKv KЏE::!8wF@M [L"Jv6Ν;703B4Z']8@U$r<*dڑpQjSQׄ?w[Jʇ/Lu\\ LKKs%$$>a(0_yJFjW`~a3;42}J ħ(wbe7>|+5 &oCaP*0mA*$0| k݌ z&?2mhI.#lFcKX"_t5>hK8Jh77q${Qˏ>7n.W&%+ h  _=/ȁAi!s v R7$98;CLAb)78{%Cvb吒ҩIvˌҰ%xX2 4y7Y NAQPm肂1H2t|_ AW@KK _@ |d 4II"c*w&صFiZI,$C`0آGBfcO@ȄBu /3mH3Nj"P$CD ,c<[o lFpY{Q; Hj 8Gގ~Z# $?x%e 9*He"߾ :[+ r`T(k޼yfϞxIllh"N$" &P|>FLHXۄLypf^-9O$i)1 2~T`E s56|oOUy]r]ZLJx0Mn( /λ Cpº&~H= $W;CC#I w?^o?}iAl,$_{m L~e9!Bt ,U{ L.7DAL th>laD gp`ݻ[)Pw[CAYQe/SaxgT DD KCJ ]ă&4MTCU, rt(&9pGN6;0m|FQ mpdS1yb bQ\#0CCT>zkM\"5S>J]SwL!9}a:|v ,{g' rl?bN P0 ]Ԑ(ҹ~64\A.$xhw`IۙT~|>?܁`3Ɇ )%+ 1]iQ\qE0w-}yx'B{6G/zkd@%P<>߄*̟`vBkFuT&g@hB̧c~3'~UDU{P/m4-%E悖z#8n"31  zk =Rz2|!Wo xgH(Dϧ(JyxICfY;`xEF$,*Pguγ UBnQhb&5 vwZa۪fZ)8^OD@>}#4@x 6N$BVK|OapϋWmf=ˡW2쁟 ר8sqMK:!NУDn:V_eI4 `~0 Ua5fvH&jz=ύ6^g:o~jBbݬM/vWwy|p$Fd=5_Է?|6ݛo@d=8e^̻t:9375k$:2Zx[U{$Ȟؐ$iqw*aenT[ǃ "y{˓߽Ws`̌cSalcUn޾]V][,CIG@p}9@o%=\|b"^"H]^|}v(4߾ӆ9l,F_~ֿ Ib'$Yy.io k0:B\76a}TMD$po??ew_ۻaX,v!i0wHp< AMիP/..6M@8Z Kɡ08šչxtru 9E1n3@1<V*Ng#X NOnm%}L6/JdUPŞkޒ1L®`+Ko vis{ ̥wuN;>z _{7Ag+L"h֬Y-['UfCI:&CT"99sX,\v %O߼K)<H$T}BYYi T:ܻc o<>`XJtB&{kQI^#K``@ε= A"rP׭bIh]yL62>!;?>Y ^5g@xt啮b@x.WmjzƟ8y^ІB(L.;xh3Kmf>d?:9%[sg= ˳v?ܽ `ĄT?~Y%g@1 S"GUqna1wP_ְnοb"`g6ڵf9a9!8AX,yx:m ͽ7fS#id-@g/FU!m=n$ᥗꁏTUrKbX7x܎O[Va

o}qo=BN; -EW/  dz z{?޵ 3W,״y^(4͘W?i|5=Bm 褯? ԥH݋t֊o@^rP(nqmY :;FØ%nna6l߱ 6,a *+h?I}om UCbeR9deBzF:Dk Kbd6vBy^05յ/2"Zz̸`?Urs4F8sA>ܶv- SyiKç=8dk/px~X6[x] 9@ {.[-yIt$өHYß EV=]VjXxy W# %)Sb#@M9PW_i"ny~|rx "aO_3 @*Bff*. l޼ ڽs2"BˁvѸǘ'gDC| \y6H*Esl3[ ^}n m`D?lA[>BӂfQ'Odu\!8AK/D'P(.#_$ OmH2XlLfT[Zڃ%uMڵg̽XPw tz볼hU4+o#Fd?_~l-l_[bN?\PG)w(.*A F ?G=Nx/ygasQÑo.koXEvߚX{_ {[}H o j5 d@yF0\KRQŮ'k‹w_Zk~q]^飵Nt@tIۅ{w߭`#y"OɃ Ww2 ,oX^ k9f͝}^!̡>E$g9=^w[;ÝkCGZlY5qhplwQsg@!i J V^ZcKp259*U^R} 3vbop\T]'8NZN_Sg=.W?=?=rx%uǚ 3CvӳF! kݜIn1ciOIP( p6-MKعsTG# *.G +btFh5q4Zac'J6;mVoZ 4ט ɊLNvb׻]^VS!}Kn]no;p3"H} xewQw To>5%6` mלVz"]aj8Ե@u.u{{%ؑnNk>V$!M+8fy'PN]ഹnshifz?#xR=SG80z+ Qyq@)@Sm|[Pd8$ +˴\+z=iPdPtuQق^GcZzndžZw6IHhm*0ڂjq I@N<ШN@kAJ_ !` , % 6$u IDATU(l= 6 qJ2.pn|v~V!Ča~bH8$@"ѩ>I^ mRTZ@RakJΣ.&e2 TԮIL K4?h0 :L9 rQSeNt:XVft,|?SGz^\v{\ K+y*4뉕ò4 JE=#N I:";eky=>~./M:јZAuV4Xd:Mz["3>=V0w(R47ֆ$Pu*~!_ L'0'?`4=UKT*{\C O"^~ւ([CC^L,x-7o[l -$/-M?ǴtiX"?tNk[3섖:#ܴ䷍9hIjޖt-&BZ%vuj#4 --_U6P!"Irn_0`X((Lv։GOs.oGiZ`=uFk?&5[Q9=L 1%X8Y#k @4+1}xKWg׷tzz/==#Lgc"n?kF|~!3G+.~[Y{U7j Xyq˳ l̼n KH׹.v^BJooFI$Xa"zlv\޳ 8a@&++'q{orrX"z~>:`))W4bҞCbJ'eA ,P׶5cT D¿Cp7wEDOrI4D= ￲v7!7lpn_&tA)B\TvvvasRGo:v>:odžðC)"(2,>@mpoI$@ Nnzh>(~X8$EϦ"{z؋>zFvSo])1eY SJho.SCd'g-62@}C>\.eN}^o IVMT o>}c (:m+D) /ijd6`H#b= JTw4I~5 yI і~GLzoӘ*6lCV~~^)L/D $trvO ׫pW~U𝮅A$F|Dx/pHvۇ4cL( KSPfsG$ :=v4 ri4vl;J|Bĉ<IBS*j d&@"{&Av8ȤQm͆HO>@ [Z6^>گDpv?T7lYS ,CQGd0-]wuii5QC { )H5[aݫ?k 8i%2hO-sAyZb ?DHr`n޾˵~֋.O%o $)Prn{Er%;ص.%U\_4yhEpdM1^?ٯ_;o& %C w3gJwYIE& l7P  Q*VTؾ }K/2-f!m "EEEfhˢB) e9=%5C0$ Bh߭[wUTk/׻r4c{vŒ+B+صF{#m/bl2yV!@ԲF(4|Oqv]V sqʌ"xU_JѠʁ0r\̻p, =pD6U]w/Ҵy/ vB~̈ (SvlX\yl6:k#b\sT|~JGg`;~Z4ri}~]5ءuGٞɾod; uvlC5-8kHZRv&2/h(-L0zR;nrx@隱>y_'W_}UWWGz/ +`uC'jU\4C0HWW^-DOѼqqq-G~$Q5kƴAnQ"\v,f 6(lhhhƼɐ N,{Pá{_ZaK!Bs2Hnp{TJðȞ 3D'0M>bŵηN0BNOU+OI5(y0N~lk:V qIj csz>juyr$@fg3:QD;̖c級rÁv/ 9K,3PfC>4n"r-I,ͼdD"Qk) @??a0XM+rħx4%i'^ϩ$+98Wl66\\Lc@z:YY]Pձ.r^bhE|ɗ'3 sϽ=vM;zzоOT-ܝidZK%}&릇fuk1ݫղݫlJ.\>3m5)8̮^z y2{]|([;9SͶ$xM炫OoAi+!I6rQi# ƍ|'cnѨQgSih޳jE6{3G d_^ 20劊 <+Glͫ ȚjNUCxP5%f6ADuv*ln?||PG+`~ \Ös:D-TSScIIIٛ:7xhT:Z&˭4XJۆfml7)QSqnvNwxذac3smA0ښmZ B>{&AE3H?w&D1iK|{Pkja(Q 6Q:Ot4˲7 jX~h4oGjJ-g1c nMNNlxipH",1h2gr QQ?'2Ԙ:-::zzm{_p]{6 8ׅHV$>x [++ GK=q;_;t9A}?t: frz`rճ㝎 F5Y VOvB+g^0f 2uwށGp䙾0&@IKCT*@еkڝiiiҳ.>TUބ*lؑ V7JV=~;#o:}()]BOr97#8F$ d7t<00pP!&2H`;%,}21& 5X2{X|;T5-Xu`r3hL?.AAmmm/iRAlTiVVg~z =hb<ʕOYn+mw_B!=fJ>]tKma/vWB2uWʗ^zo7 ̨~SRr@"QM?uȵygH[8ow|~3l1X*t >$1'!;PWW׆TJU6)λl*e0ցVp<2wc(۷>҄#?R>11qxjFœXXLvI-fmv$.D'}|?.hw_RRQsN Z l> ڻ.`G0a[l=3;?YyY@{,{/ h_zaB /poi "زeK.,m:EgjNrIki3l|o Νk5N$ ꏐp Th:͛ozg4qy[9Ї0y,I[ratSIXkQ$ K|=>_@€mb% AV>N'PpGGGP; ,ZtĈVFh !R0՟޽{_>p^qX[bSL:?֬C0j)`6%KRj $ŠMainnM74rLҘOwg-tY_݃?G+ւRd ]ΉԽȅ40ǂ"~ͽZј'f7v2i(Dhǐ$FpvD }B.ނ_GVՎ? ݿ| iiih$(M";ڊ./ҵ`B>ڍϧS544PړG,4 |>4%?p*H  tꫯǏg㈻wn;3!1Љ(蜂)6We\6b"^ɘ1!_>'8-2-g!.Szz=&&@p ,#nKILl ia3 h˘ۆv8Zs vkO?{KDǹ%&H𣏾V(f'2@-怏?Ji?ޱcw` ~dM &p`r꿄;Y=BTz<LVma@lHopE3% UaNeh}r܍ͅGDO9F2MxI'^[6 eEv>z>rr* @yOHÇdGc>^3}D\[Qb{>a{/ /mLteeQ{#7?Do*0Ҝ.D !pZZ$so>oXA?~f}Y0TdX ~Bݤ0 };ܴL6 @/EL!aRrr~8 uq^}! E}P$?,U~ B~5Gj>~my$9>tgimm?(@o *A_ĴD@ b;P=s8?m ^Zo΢,P~vuaS67o;D~ L揍V՞q 55s*6|pBBrʈ=L" hR,K`#V%̀luR0^#R1VF<$Μu&Jq+;X>=l6~jO$gU=wT'ެMx̓YLWDybrJ 8t5 !udEriSc6!RʲL *!EjGJb %60x rDQ `]Keȅr6 ȎX5yMPа _0BʤyT=Y槨@Ȅـ0agzLLKKNFߧG (8f1tNfih.2)nx<êtYin<߉u!7H|N" *#^vQ CσCA0khWUۄ& /M&5"' k@&L<>p0i,_rۉ4,jP!\<9Tab.6c~$ݨbt@4q,ϥAi#TиcOIէ蘔A3T(,1h#ZSd)i!MhNu+# "Di"HSV Q`Tv=}OYfH_hͷK ](Xd>2@QiFAGIѩ3F!Jh7"2xAoUcu5SHÎZҪ+6W %#})*D62I8.2ĸ/`0X!P?!U 4i|)%->:FE ~~A5 պxH+ٚ?.$__<옻k䖑$"BR͵"-dɳ`]`ns)Cکb&E>$IPY$RPF)v+WjV|&s@We%qwy8|Pȇ4` Pxv\jJ'ڵ!G)Ikذa 0%IDAT4xwNG Co9Mx|鶲7_~J-wj*I='T>j|N߽knMeo2އGmݡ{\/ ЊsuIvmo@F2D?_{jߍw+Qҹƛ&KC0/D -fӱu z!̎0a`AՃZ1ÁwAg u/b&ixp9pX(q;V(_c_õ3y[ZI /J<_>Aɔ X&;*59 -Y| 'oZoLd9(Rk3ؿ֪EZA_%ه?#_bL=aZ1*Fݲ#rs,?1ˇޛКr (*v{Rk+[s?#DkҌ.#غ`|Ձό޾^Hyks5~)6u}eU;̽r4+@ NF `:-F!g]V1$I[Iq ICPsv\f\$pNOSiůN.KAU-I2hL/PA,ܠ3ۿS8 %'6AY#vwT9#32~ǥDAE|dH5t6Zm-_WWhoo#MێDB0 dU7N7+$Qo+eJyG5l\Y]Inrg*-ߗMғ@>vjڶf?C:gDC%?1}6eB~d&7R&sj]̜D4!e/2 ty:J[M7]Q]:VL1~$c/^g#bkn Y^3%>1ӣEJN12d~kRIR[Х*n%[9G 6,y;?6M~Ye5yd4#qCӤߥFWAVU6{5trą&4IдMTDjՖ6$9Jfa{y=s&JAlQ <+]N'+kjyyy~$gFFN#ZĈ&5))IpѭaF9R|ؼEZw;4N ϡlřgvcNِ`)uD*n G珯ò[e b.?t&JJ,H͏ &~_%^ۘ:qL5ڵy`} |SfO]L>Ri9_@x|ͫsbyH\)-B\+$Oqq=99:W0\..}jV4f*=;8zv)'oO$PG ?!` $%lbE3sJ`Ĭt?)[܎1Ȇ`Sa}3,]ʛpn.D08 TM5u WI`X~4ſ{SxєEj2,zl4I&ZOnқߚ]_kxK= 4^߀`9R݇&O}xS 2𖸵!YvtPUX(y\yjfOLAZ.ܱ}4(:vTC 55>9:=8z$J h_fv" [VmX5]fo Cw[b8n3Wkހ/r~K!A˗˞{vBH1xcdHlσk: R1}j%Cl>ty` FkMgdB0_ WJ+2oLF;w pvoakvtUv~ov"G7y.?,nP^wϼ@@uw鴶XAf@S]d{3}n)ΩYahyB`{yf>Ñ9"y@x$c~o6d1@QCgcv sO:ڌ Ҏx'|v.D]+т&Sa3&O<,Mvo<2dxBY -F bR`hAŰzH%A(L[峻 v5 snx/g N_jVK,t&,ĉW\qU|6IfyݼuO-&xoclOLFfCW]JRX8AReӰU]2ډ2c]Y~ę&d4+'ezѼxeXq oibPЪFEXgU56,aNbpBJLˊqLc_muSK 7gT OHDʯ,=>ibD6Nϖv2QqnA H O5el_[ jv:/7PvFPn_TKO˄of  o/-_|ۗ^OP} &(oη;GgpU_#_Z 7wmITrvF3g3oE(h Z.7dU&M}j2*[C4ߋ 1dxiϨnQG|Sի4I,XWVVTV+ci swYs})>|4:1M4GH =]c\<4 Yhf ß#!e/QtB8蹯۟ʌ˃i׎ӯrz ($ {isPw::Mf߹eYmC'z7~3:{$΍U1zUM)%%E>vXaH~ƺIviSb8g/Ar !\)$m \zAsCI>[fYo7v<>\4ҕ#]t9^.zIY؆bt:4Ռ|t+ؼ&amxmgWWW^׉w# (hz,눖Jld%e92>/t)/k4 }BXӵ9 T#z %'W;W {W4Dv*wz3R/`$d%ݺĩ]fdqA&Heٙݙ7BJ}_{7rc(/Ed<[? ӳ1S'  >'J"37`2q-l̮!pQ%1RJW>R(7{ejt:=BՇEusMguS[OnY\ެG BUO9 X So5LA%Kl6b8fhS2H}KQd2FQƀ  _\^NxD+RY_E +`XHpR ЄChPQߋC=0:<>;mW;V-y(%1~vQ ( *^)'弦KUe* P.N! s㉯Be"Qp-5\+0TIgc_ 7*ʔDHlBt˦ޜ~,P6J)j_=g-%zo n &XPf=t2RJSXȔw[M|SxmerVL EsބC-l t%ØxJ@l&:6S;r?ڧ]ynZ୤ǡIENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerMultipleFiles.png0000644000175000017500000015233613063003364030005 0ustar mans0954mans0954PNG  IHDRDWd pHYs  tIME&Ɗ IDATx]y=3{²+‚(r QXQx3%QM+^!LDL$xq(*DY`9{k{f{fzfgsX{yz^UI6T@ R[fܹtRldž@ T=6B l @d)dl@͌KLZ$Ha=#8?!9)-m"!Z*-d'DTYv XriNZH7as"*nDlRs֛-eYd|yqX9u a IE]~͇@ L'Icϔ+F0@lNFD IÊG7n\\^ƍ#ȅ?2Q;қ_h~dŃ.7\7F J1ug^fx]omSx[Tz٩FT73;÷Wnl᮸{w{?\kzdb֓`'Ss9G!Yςb""Ͱ[4-Y4CשEeW73!!ogMtF~mwvVˮ}`ho?恑k:׿]kJ~;ߜ}o<15~%c>6^1TɣO[RMgzA>4܇~?*F *N5o8ߜS/eC ڠVLdfQ^]L (:U(:]kcLɯ,׿2o:k ,8nV,['^7XjO_P~-~нgO>coG?~-} ۇ/2tO̘k6~x? 0ep\2~btIf!m Z֢Yd6wҹ+]i3[eyYՏO-'ʻIcMšȻGW6wV@]a3w?fz/?j!p،;Vq`o\U/q$ٸ|/1m?Ưf=܇Z`e[vT\<;Y |{@cL2YXd!eߙ7mwv}̢0Y"71uY94,|0 7Gv7n\J'"LT3<0 @dҳ?=d@ D٧oyDJ,m2esu@;pp)";2CQ@R_!!"E Sf@ $3@ "'&~s[y6Zh ]o$(n'E-@*#ʺUwp"!mP5`p~TE_b_`ϛ3cƌYbq Wmo[lٲKbn,#5]jEz$u+fVX!y!]fފ /p\.yN%, -uv^H׫" @ '3@ )g@ P3C DFف>OA.'_2l㷝@ I3{3Q"p @ ѣ.h"F Gf.7#@ 1[ .9[54駟[omyTim1GfvL/Q<Æ Hcaf7Cy6"3BH]]כW),,gu摚ꅋ?0b?h`l_̎"j) Y^^~ )˧D"HS$_^eO)rKEۨ1Hf&#ZBTS{:@SS5Z~~h)L0^xxW_۵kYu{̺cJ&PYfx16k֬CA%K(weYwӱ>EzY޽cǎ$*N)mhhضm[Ϟ=<fhLfhKϢOV5.^M6ZJ0Y "'K7MuɆ}7ҙzmO\ҩ$´6vH3̙3: A4a>KXXcIƏ?KΝ;C VB$]v:u|Yg۵kW]]]vTU4D犢k׮~g֙53ٵkW2E15N61%ZNN\2+`qx1- 9sN']{fݻrmϿ,K΋Dƕҙ3gqbD|H;9sfiiiiz;kW]LeCyJi1vy@ *s-`0h@;w4"? vGhfojx(ѫ(덫W$fL&O ٣ Ux~n𑫿>ϟY'^)L{qRǵݸӆ~S N_ټys}Kw!jck{G8tKL ~NzAf^ M$Σ %%%Oik.ը 'x!۷o^<wU___PP l-@nݐE̘PӷO Hh>?/L| hNN8,l"{nO/UdP cĈFKr>D.;m؋x>a2snf}ڊd&>#qm$M4Ew7\v,MzPJ$IÇԔx<y@HΝ.rtbdRʨ=zlb:trTVxsKMwO*+d=Oi5999Y8%oAA!g2BUL;r2:Y*M?E aQL+#x=>< PJ(M+1 h`0B@c5.n{9W #Sc ةS՗r5|n {Mx$əS__ϭ|P^ɽ{b8XblsM3ou*km{Ka9w~?uG෿ Ǘ{ܸ37O `"gLyޒxiQb7F !MMMdO8DY].b >\Mɬo~UyYskHz)eF)t]=52 I޼u꫃yמѽCANWGiAe?+,Š\z=gҕjr&_N]rE-p҉->8`¯ފAC2Cd {,2 @%O[2弳#7%K;矙cRcxev&S$CuAdE >)ܨgW:1: a ;fc̗#?)Uь ةS$OD 49Ŏ&UeܡB@  yH i׮ȗپ2óm 7:ð!Hvjb (eAS4(^]`СoO>oP\5woٳ,'zB*i0E:$9kwhC) DJ?[z9_~ɑ#+RDfwю7,\i XAAܜ@ @ С1(k\U ijU>$QJE)++|5q>$x+`:ub>|{|h&93d0Y(f!!!ݺu>osO옏^*ps R7Pgi@)=;|>gV__0xe_NNNNNw^?q) ֻ>t,h~.]WZٯ_m |r~?^-XGzp[tҕRR3PSN|z,&1cb|ߓfn%%%$UWW悾ψx|>_ ޽;ԉd&tu*d,G3'[ B_|Ocw>ޭ??dDرh'c%hþ{w͛;fpQˌg55na# =bD  EEE.H0ʢeZ^^XEsL?w3Y~~> 2$3D6:eYt\@ xA!I(뮽>#F :744466666u׽ ۟;xHyywƼ{{ޗ6;gKw>+z㭹/ ]ݪfiii߾֬]W Op%I.]4Mc`:|@z^!YV9|/9y|r޽kI# 9Ͽ]ɉ@nn+..ѣ4 LQǓ)'`KIlI̮('2sȲי%3qSzvGd#)%C 2dH2=eRZ/@vnCak 9"8LFJ IDAT7aXDNɨ {TimYjxYSĬDyc$j*eKbpg}*d֭[_fTimD[Ъ3JY+yb:$ɊNqlɃsWԌކ@ Uwc%IBb4)[Ѵ.#NZYZ fI|Yk.2YvqUlt71V+..Ɵ /6Tc#A2=>l#scJi&=VMlqY Hjfj]&A;ra1hg8"R]P5?޶Lf㻛wy4=CPm_돈`~M چ8("!<%+dc V3^a%LA2kd Nd$m`F٢M-sj;$ElŐIGG{aFNF-5[-za-)kQ3=n:̽ŌtvҌ ٙc*bxE"aJ(!D#hJ w&i0EeתϘ\41$@C1ܤfOY/lMHic mbL䕬!3%B5B5J + Bt  `Lw`b&VpH;"_mugEpFN1ݍQ0LV#;$iĦZ:L`M簻]P8.^i=PBeF ѨX_d5ިB$% 'C}u a,9!E3O\wA%Iiw;!3,X.Fς8+YEfipNd(,^cW }"i&ڰuҠЈ(-XbdamPX7E]0o6J֐cf#g4FecHT2lMьlݥEJ?WXV)1vOrdm5.(MK^2Z\lmwk([-b^1IO5>b̝d%"d EjcF4J`w?CV(pNy7R2lT\9ƛTK4O\ohNN2>r[ >+iӆ'| wzS`qyy>z-lי.3yGSb,/3=hͱa٧/sTd$kXޤ+.O&?sy -[tR|2F(3I 5 dΊeW%.4gzm$#E5jVB;n 6@cVmm̂?CTUSUMS !H|9ǃ@ Y&3$=/a"6 8!1AfgdOFAX鲅b; A15Gb DX6GFb2C L~PMՏ߸ȡQ mD^0o 0iҤ;2vlx//7c<$zNa?Ƨ|s&E$ ,xװ2.{[UPr|G~]{^oK 6H0.Z +B*q+Tdqp vՌ w Yh\Nf˾+ɲF#]uV3O=~}.R!-A"l„ /^-9Fذ>n=S &dfDq-]ĸ`'W 0`{~}LS@4򳉃rʨ] sN]O| T7l?H(`f:l-hŬC̜!8ўr[ur) KT\(=cDdk Lg"2]3I朾;Mst/Z~GXCblmfr2<\OG=%&jrDk{o$IkR٦iqwMujGxo<ڦy8QVLVYo{h`4:1$}S`\lv1BhZZ2,QS2er,GDd#M /sF#`͇}ztjAxHizjB! ߥ_=usEqؾm3gqŻD.&q 59bԹs'M,[lҥ(L2ֻ̨kMr'Vu--{BNeE%pMGkz@+p>np`S28a46{Zdv֩O?ed6]>om+[G_IYzb6aŵ,1,#[=2uE\G+viqz qhf)]i~'g,~ {?!2Cfѥ$b:TZwaoCfCưރ$3D0Y‹^RV\.Eh&u&GAH7" Z˳ Ӧd o@L؃  |Է1s6TS!dl آtcjJ,@r`zzdt>Kb&S2;+^ ܞ<LE"d))dDd]p4n%$ j+ԉ 7a9'jn1AD'3ӎV bMvo_1œB}I Vɻ)'sf&GAcLb:,Er2}1/'$|t4FLk|u5\. V 5G6oqZp ]qA9Sjq)jLVid;zbpGR* 9 NjTJ&i hql56:,c9QW1>m,GDkeY$˅-3I4 h~ ` @Th:=2Drr1l b$nC[Úm"uFE1qUb&`f4ܚ)ͩ.۽9y994ܺH@@5g#@#@@Y]0"g?@C8ED-Zh 5Zj> ٕ' '(p̉ҰDt2>I=n|^jH)P5dZ# AJb]|YTqEK<}*|-$YbNƯl5@aX,c 9(0 Hh1" dA+2;h%:D*Xxex=1 $ZH ~!`Zͮ U{e "gB1g`r53Mh@YeΪ\myN&Հ@@`|HP (d0*hЂ5ZZ߷wՀ!S iǣGfƠ1 - DOQ`!?@0#Q }G!ڲ;, 56*2Z g^]yʼnϵf$H0757PA R"}@HM`ֲQ H64]J  ưZF4 Sׯ9s'X8=OX&؁.Bۢ&\x> a 05Cft,;44Y@>bVuE7$LV]7+UNq!@I9LtLB փVZ=P?F`ՅHA ;[Ґ-28۸tߠJ"/6t!UXF-^h~TσW};_Ɍ: c(-BR#)a +gLEs!@n2vDO3,g ,Gr> Ѱ1{ X΂dk FPLF@4`)Kf'H@=Vhz? T;Pڲ`&tHIdԲ&If/s6 4VOh {CGT5ro,) p ENz>õ&&F5@>dZ &d\QϴcvqM@:.&jA}K "k% E.S#vdId1kК«}ea]T:^Gj7 =pK#odޣ MR:c()S`K9 $]3 v Tl@LN$[΄)3kh3}U1)R曖@"˭dG!&-Tɨ]B4t 2m"ΖI uM=2C ˿+1.91I$ Qd FRȯ\.@/nqPX#6Y@[rf&>K +꫑ owQ[J\G9/c0 B 6i YƨY 1=`dzf)zk ZY0S<(+ ) ) ) @#ie|H1XGjV8F}UY[po^d2%rSvw-' 1g8 P41R0Yk`6@5thH0m-!dkDkf[uhw{q۶E|zaͰ_ Ӝ#H"ݔAV@LAR:~f,{}v+JJ|fH7ӚB|,6yݺRwc IR|E6%:{YUZɚZ[ IDATC F~}ˏ&bdrGWzMdF)ݸqceXYWZ:r$I6mя~)`/ 9d6mC]:V_අOp0,n 0$Ҹ [*qM`2Ы |KVjEj0~t T^ݹY-S,F-ҳE4.;c@U !@C}t7T@OI1HH? B @7ISV5v&#-EY1"4nݺɲ,IC$IifN}3=3:YKFON`d.Ln xA94@ ]羰ô4|&TgR"Bf̃AwWl痟 mE1&)՚\rG'ѻA52N)Ù{'Ʌ ߬q>c!ϰ6iv=E4"mH51VZZکS_rf*I0}Nu P nF%oXEc9@)TɽfѾ7SF_+F]>r\.` r#'< 3.(]W9}8+f , $IڲeK׮]/_>a„ju2Ji+W <СC*'3 >R]"ǂQU:KfN3E_KN/QA#٣o _iʿ\])u( 1d`c NHwU3~@t-,pL' N9= /rɄx@Ow Q"?~XKհ>  PT"y-[w 2 6am0puR d&r]}E @4Y(%!xrt YIjHuEWeW󿺤12P dH/7/@/ 0d_:٠Fln|PbL1RooҘɱD~Y1Ɣ M?ڶWt><ˑ!F.$Z3)9>' y23لcRу 3~6tRFe;Cb(Lp[EkbѢE$zΔ3M04|!=`ni 5 z?!g,ZI/ZPxΌ¥b0Z~~ȁfF%$䑀CBZZ1@ LnLR)=Bz Dl } g=jQWKgr)ܒd uƋb!Z[$xd,ᢍѹ=⯫O ! i–D^F C;p\a.EMkC ]B8d`2̗ d!x E[' - |lg!e %R/g0m8iiyXNf^a]tՉKb_d&E4f4[7穧tҊa |cRg2 d.nyӽ0 H&`2$> @/H /|d}9>J;[40K_YhP_.w~̯@ę/(!CX -c r &6@P*G)ӈ!@,P6c|ihHя-ω'SD՟dRJ)َq38-26m0xW_|Oxxޝ{@ و[fܹpBĿU0`p|'"!&23VF,j>""7ِCCle@P 3اX!3O3`$>Ci.ݥ&|a "G& 6S[25eBvfg&6Q"YmAɮ ͮ+u}d㛆oZʺmvq: CQ"."Pow)3!D"L((R?Zt4LQbi ־T|Däaq5nܸKK &nTTtx<b(EHbC 6qo[Xd2MLFz.C'gdGxAc?~o[:!8dD[6T]cca]x<^E̺U{5%R"uvX9Eq# kҝs8c@ , g 8q&ۣd:60.o,Mp@XJU 8~O%5{n!D–~bhlS8d dxoe%}֐z,g ,'3ɆO $"(Gñ';1%vӋO?4?vPi=ğF?'p]oJ??XȊg^6\7__)_^#ldAg1Hф@ ̰.rEM4J%gl{M02qD;%]IN-* 1. _7|;ٛ~`ҴF~߭wvT6Xz;~F+־Ywst~W?mncU*DVku'؂`Hj"[3g/^liwdeb@QשV|3sGUcǔYu=_Pn/]'^wFXcp/v_)/ "`eE2x2Ιv4YeyYՏO$Od3{w3}_*+n Lf̙93M 뢦i̙'㴾kM0!^>@̙>{}~Q<;ŭkTЫ@[W;g26@Ig]?__H,Rdo0 3=>R-D3c̉Bfe2h[^;ޗ̺f)B?|t?xkk~ѿfҌCzGϸ)Μ-Vc?QO@d 9P&qwVi,FL`{ƈid`]6=jTuٷ[$93~e%omο}$t{WwzκS;n@S HT 瞙hfD .#.=,JC2n3Gfe0]h%Fd㖹偑)CbC/O} @~at@ n"RnOfB-~.A:}ɞѠgZXaݥיOgut@ƍKidכ5$cZU- @#OhϲRĔ0@d}6@d8@2ĀhHD L#REf߿,w0Fo 2 @ ٣Gm'l{ȨsoZd@ dG42~B D|d]*@ Hf@2άn%nM6#F8Զb>ڵJW .jJ5 Hfi֮]kDצHVbkV Ije[񄳶fg%?w[/LmWMMZ*ڭ,+Ra&CnXib\pf͚5kp œ6S#5C1y",tJJ ;!Uöc1XY C{BFؿH 'ۧ|n7 ec$`io/fٲUjf[qǓN'3vV7ԟ8q~@vlWǎS__?s2K(e5:pԟ)"EFBDeYO63'dKN/Iq㻝9())޲Myf!ױs,))׷ cGQ޽ޱc^z!% 'ZqLdڵ$1 >$;Ri=QޞwVrۑC5~\Oœ=;p=Jxڲ!t狟麡yvJccCzkǎŅ2޽kοLGv TqxH,'g+,[0 K7'j|Gk/?22255=111KݣJe o{{KhR\OLnGmħ_eT?6^M{jϟw믏z׃Lyԫ F:_P(ѯ}k^ZιgE`Tڹsg__iفKwaXUVo3|]&'' !L?B(vܹtRY[V̓:9;͛7HD= y晻'_(>r|ٲk?03Kb{ OݽtsRRq/߻'-PJ6YZ#Rݻw4|X,ܹsɒ%ޅf{w#}ʾ.۲X* .u׏=c3zO[!w=r}Ѩ֬9%C+۷O[믿ƞ;>яp v e>ͯu?o,VcB!OMMvuuߑ]ժ\4M!Ď;zfYֲeR}V4FDdYFڙ#Vd>`dNwPx']:1ΔTcL 5Ƕolc׭_zϞ\9'wڊvd{tw'.>W/}y֩ÖɅ٤uݝ;wDZm1} URy'x"p#;v,]Բf7cm[zg!"gęX6{䀸Md~0#Y&R,=Ri7S#|}`mr cDtU{;d1+8tÇsi !! /EK… 5ߟlݹsԔ_ɴFz !]g}ѳe7oV\9ooPxSH")4B0~`˗%gvSO\2oy=.Xɛ5k;lWh]C\\ᖶ\.?쳹\0 羚9G#Cuݾ=8Kx駗.]gϬ w-k;b≩ [0wBRf3;{̿޵RJi/x … wO4^ 7022r~۷O_s{zzy#̼J)yZݳgOOOO cNt{)]ˡC<"."z;w.clttT˪R*rx(>.or_uѯ$z6$N]bVCpeOw`+g߸ra5/\z`8TDyB3ڷo_.ci%cU*=mۙ#? j4B.Xg20"g$'V8cŜIJ1m IDATfDo?ՏZSjgv>/~_sK^3-mMNmv۞=3YݻW)o9;{f;y?mg0c6h7]y I61+mۺ#m׮]aꛄ~([N i흘 >Çm !Ll?,gI {G._rig}і2ƈƋ7S_XL-檵\C{ǾC׽zPעKY+$Osn:tP(h䏏΄^%ڟ }9?KM2m>NMrն".T­T*%$F$Rvpvc=?[{<~x]ri_]ot2o`^~yc[֧FDWnJ7߽'''>lfٲ:96":iܶVZfgm;Шc#P(hIkgza& R9s̝;W/狘Jܿ[oRfr]!sW~}U>g:ϗ3~1F5q G'+ŲܭR Rߨ%LOO !N[xwISuNHu9BÎ㤍%JvϞ=}9{OnTbP>= ~'vI) 663;O>Y)~o}Mw[s%K >;qۃߵ[Y]A+ُ~>Jz>۶o>'Lj}{"tëW~ /[攛wRꤓN g8w"xie |e6X,IXlof(f@(SG~_pبp=#{lCF ebPwww\ 6,DxWl#i>ohmSŻo<|N;sɧ_􊫾m/0("WD:& o0\7zү-y˒Rup.JGy<{9?o',ۓYTC=~i>uu\<%#w\o{W\\ᕯx+_߿lي^u7իO=F\3 P(LLLxT[ d6wM.>2p'wArfbN|>759q橋7M_5yzg+Jemr-+ןʳXCDaȜeTɏC_yυ pƒNMMr9!~n͚sۉ\;Ls^*z{{geLW~_Xrdi= s/۶m=Եszdk7Qs%Df2z'׾|GYJRW<{dC#goSb-oOvNm'*?S3SJmsC }ccϹx&+ɗX_y;݁500`h>m6k2sOoX, ̙3G+t֬\{3Iq-eɊo?kO]~7_\o_OVhs83"fY$=o^Uq\"eꪃkxqBʖ_G/ylz5ټv2)Bݻw~+W&bs/V&1dꌍUnٖyBBO5guWg| !tܹsUʼ8UV=-9ghٞղ+u)E"RA gȜ3:}c=' X+}9ob}t{?+%PH){zz 8pm۶mFrԘLdZ2(R488ur˳>gx##rD*EJ#]sŋ?|mN]ӟuքz}}td4Or5(gWmQX&q`4):~6:y1YV5 wDJ鳘TvB Y*dޓR4===o޼6O9YZ2/`vZ-˕JE/)ˇ^Otf o',rփLbcJk)" u}]}Pk}цs=T=-xw|脅=C}y䗶>*v]Olc~'߸mۺmۖe鎫@ڒap 9Z\׭T*:RmNEIϒީx@Q)RIEŪBRII',,Yg5==v[뮵ԧ?qݵoIXp.[R֮]{1"UYOެ:6Fl|6::~i\nam^β5> ?<~)݁9359Y,(NDmޗ #q^] hʱJA ,8x`WWW\v]qbüjzz۠imŮ.8H*ܹccc x[eH+糺#䞝?u 1eT=uq_>=K7F~ɽ90el5+m{bz1!,ax0/^\%!L,Rʁι wy-ωz{_覭w{KV.Vw^OOg?k|}w~ӟOk9Z f~bFJy]/}kCK]L)U4&KЉa;l33 T?u]E;ϕeR$$")ܹJ)%TڧjZFUH>ea ԉt3KF͛7O)OݚUU]47gGp)%rGGG?:zGM[`T:ceJs]ŦzX%#ԋ=ӗMBц:B1Fȑuʷo{ /\nٿS011Q*,IX4MghmB}$^Iعmʕ+xɕOkrr׽__'߾FJ)~].ӱ⡡nG|i>k^GwЙyJF-{mU'=#/J09[,z7K_\.OMM u0EB)5<<˖-k?::00 5zQd]]]qͨ|2F)l&XRSiX1;/-rgYb=aFq8*˫Ų^ypϯ~cQjN*9J 7]нbANO8`6!+-˚%7Z׶./xA$+H+{Ct# 韼35IGNm?s/t9Rijjjzzzzzzx{_LOlظlٲwgo{ .Kxw]t_{2_ |kjCCCk֜_*kW)O 4F$kgi3iFD+t* ַ5{eE#~4{zz А93wܱwdw-!Ygnz^~oxcwwO;IWCfk%eɹ ?r<11; &''rTr9Y:-.zR =OS]m|\.[eY7=NY%k@cŨ][@.P꟝M9A溮a>ދmYཁ]hY~6Җ0e,ssIkV>^[8s~+_RJ]y;k#.[zvҫf (900|r)\>M-wd{бHc^&wxk%E0c5.wwWV_1]h~yS}CGl48FBoܸqƍ-JKu^]Iϕ!T:dD.]p@GE;~t>У G?#[>,D(YXۏ}8J(/^^8fTTd,;Tܐ{%8J(z,\:d,.7+YKIsCbP[k(|oa'fUGCcj3% -&UFT(ݝמqgy~\J-Y[ݛOG3K,cɕ,$ſ1kR\9{/Tnq fDtalYeKvFWBb,0~i=d`HD)c^Bd,oQbR%̓~د^~6n܈Nci¨*Yܐx=lݺuzf?"Bx Ù2cȢ,ScBg{9ӣfpY EJL3ιRjÆ DdY;y`iOsWΟy$-NƲ)Y ~{o;|ODSXd/Xr\nlĮ}xםVF6oLD[nݼy,mfǕǸ31O-d-e/ql:wѢE###gq3{oX=l5{S7O\7w\<{0 d p쉙8LU-&LfR)Y?;F^~iO=82lmb)\.t?t5#HIzjswfo^m^ *8첋.W Ofҝ^aaz%M<1<3j ΛM,.]8LӶ̮`^CCs7]C+֭[pkE(~ ,L\=nvGjlÿQ$d).1|.V;G?gtxjgwT jÚ/mM <qfD|_%gbiY*.NT%_k=-._ߏ-ѳ7ӶYOZV. 7 ;ܿwny:Gh)E~x?Y`0;3U7ySbELթ^C|ɜeN( ~_~sm ( ͖rY"%:؁cǧ==fnAv,Rty0$pżz45f^dl,Tɒ<}.zf_>1Q%T1񶗟699y#OR bCs46o-Ժd^зQRIۘZiX2뀒)ҜpqcϮ=a>-_xN'n}Z1]aJ1"iʲzB`F`3ǝ3Ka e,!#"H)%%I%]r98\.͙3mP8RBeY7bvV vi%#E<8>n4ṙaڍQT1l@_DM.4N\LE:l[m~򣛏ugԭ8 K+c\"%r*\K9E^?yo ;Y)^IH9 kHi%3LHkL BqE$/J)%I\م7q"3(fr flٲgs-f5,Qh\JWY/ڰ"ϓ!a-[XorfmiXQs|+5Gtզ'bu13A(rtL2F|}%% \wtS͖Rdrfe&HF}Ja3剙B3H-f*RjHtTR$k-nŘϖI4lbFd,"EDRRvˮ/SzL 4bHLgޢRR)!Rb|VdZ\4,J4,RR/SBdR|^bm1 H(05N$"Ng m3]XK"H7VJb!e-H+fJ8yװx7ְڼeJS( @Zgd΢2Ah&= !)तWJ7M 1ZTQGeD$&HJ⒔$%I"^3g!|L5jN)RRRfuo"rI4 %0J6t:yJ'H% }'(Ec&)_Ռ @j1"0$)p%IƑ7nZ$% dufab&`4QTmNN6II, E$H3)14vČ;kQJ̙Ps9#) ACIIAR b 5[dMT6E@T:YsR"HHb4H-f-MSLzq[3Id}j)IAvfa,}&H\JZVyud$%IA3R@j1k5h:RD.rR4$%$.EBdAv-QHRI%u9U2̚99 P2jq RTq!ea$\.I$fEYFM@RA!jp5 IDATg QFLH+fq2ѯ)5-$鉙K%a7y;AӉ ;SXLMJ$Lr1g@Z1k!oi `#c㓥ys JsF#è9 @,40A&&Fovpz__ n$&z6c6%dQ*lQekxLGOyFxq!JC%%י aFYL)PH#Ja~C S%!sHDAӔd4E0b!]r*9q^@mYKBj 3edhto*#b11Ђ>aX){]FƈӒ/*9rrVȩԢHZu)`9 0K1c'KA!-iu$\484M!ǰ5 kI&DcȾgz(EJ1b`TDf 3 z/ Io=Fxlƺ)Ff[KߑtTɭRLpf2Y0L|1\HD)b59#+q"嚘A3H)f!ҮQL cceζ\GTZrJTvfa&,2^TqR)I!pʮֳJ*E4bFQū(.cB7Ȩ63l>yt[NETJn%*LR;3ϨL[fz=CSJɩEy E۩a-2A5,T\ ſu[NEVK2햧 3"GJY:Q32NIJT[NY8evNbWc#$y"ƘbS133>}aWR*)pSHZnPs`z\YJIJ" @j1k!]!EMQӊ#Θə'O/nU** hS#sOSĵ4U:Md4iw~a}JsH)fDz-1Ÿb f؏~uCSE;hۙE(4n9#jڙzip}W?vC0ѫ70t{1"LĄ$YdB>%@;H)fa^a :Ӆg$ .%٦Hڙpъm!"_l0Ϝ)cL)NT$Mf+.LtbBN^,td'N$$g3YnE,W-QڦfW3c[ip >,tY|_ZLMcD' @bef#D#Z&28I RPJ.`{c$Ib8#@;hי RK?aSL}4bnȥ0BƘRJgpf/4plNY<ƸW5Ӧ'҉Y% 60QP2lftz^qh#ș%QbagQI@%f]Z([OW2EZVŖJ;6w' @Z1Kd)尳)3m:HJ^[zLbTWr hX3F13( bztZYfYgJϚW*`- @Ō­RagI3A f2쩄seAj>Y\*' JV*[8 0e2:D(YQ%6o$f ƍZ7*Sٌcc#FO߫K3K6_MoߟWIѵh)iČ1>4e&e>ey"{/DhF€! xxC!c\fT' B3 p̐ QG 3+Yb ?N҉Yf% HbbB@Vg,yG!fD@6g֠d ;CI Y\6# @g֨d:BC -W3YN2- ;J֑b!kt 3K>ʐVPP4YJߘؐb2:U,.q҅U@iXyl͙+YLG+:孠 %I\HZ -2F2,}bND,d fJ,#Kh1`P @F1Kd :R,b֖.odP@v1ˢdIBcbPɢ#:bB\ @&1됒%$ - *YbHHZ dJ:q1e'YxH ]fYZˑ uPɒtEgBV=t5f3Bdtf~ Sd!Jv 3눒I;̐ 5'뀒+VtCb=2:g֞w : 3K12:Vɒ$.+wf3u7"MH;d=?13YpVYV`G@ e8#+YN2O#% æG5Όk)x3Y8`0.%S#E 3d&,JXf%cJ#R?\vNB HNX:~% m|ӊ@;H+fEUAyɈddLJmeo5yʡ^|O+O6Y[,29Z @j1Hħ9Bx]d|ƥ1RoQb."$gu UB%k|#)FJ)"k^WV2 3LMlCB<_PXm8RBO b lQ+LaL>H`"R_b]" "aFĬUGhR!יk\q+ @j1KVB6N1F򋛺8q%]$}̨ZC"~p%]TVv<S2TfZ̚*ddQ TLRJmYym vE&}nPVW2"bz`olucuF 3 NII:I2.Sl)E3Md.Z @Z1 t͸褏$CHd|Y IzSyFb<~U D k(R䢁ԶԌ @J1iVD&Z,љ}$06H]sԑ1RL)Kda$$q7%d21ذR(A+ A s@gSNqUd EB+34b0^-mY#c6fXi+H(RDAR*ӵ$5~ 3 ey2g5Vycu‘I"7I 2aFh1t H>b3O*E)$ڈi+kLAd3-JD$L  ed:HS\!8g.Q79'^_DYĬQeR;Է_0 kEB'qiҾ-k#ƈ3b{o=TNŭ:ҭ rFg 5 XB'MCqWGUשՊ[Sj\A9[18fglOG%c+:~T1g&S,3Q \YlՒ9c`*H*딝J-WqqeƋQ\X[ƚj\1ƙs2n<fuWTJב4 3 02ѐ*Œ313-u\ב 2*~MFqbD3Y-3yN=w @bVPϹpf6Yy]ىvX%b *'R1E\*Is4 @:1ky9,| c"F ]QIRL\I btZlsB7Z%FsF)WB;(f7QgׯP+bLnԝzpfFcХ1"E鿔NQMH$f):K`z5Ή1E1)NTm)ޙatղAqb6fQҕ!Y]8Cj>6Ytìp2θ$b b iӬ7tgC:# bFi?'Ƽ1d_Rڡ9b/QYpah"lYTƄY"Q2%dؼT4'K!mZ2wHuR1K宒 LJ0Lf%+wf&eFtx:(fnY@+G3kׇωj0bQڴu6(f) 75GD̠7EՕM،3W@%N4bƛ'yc n3LB:$bFIT̫!yMZX_ k *Pj^!Z 3Lb Y`B+*YhGCT 9:ds=b xWm! @gWdQ$,. fIZLnX[@(Zsu/QH^̒+YGB183 3K!oŒ,ݣe'FL茘y(Jɢd'$clFYG,UG|/EXS}%3fZXxN)Yˡf>3,%K[]1 Z#d @j1Qv,aGHAdpf1C:d%L %f1fhE_H+)¾S d @:gU E+VYOPDy-Wyb8(A"~*%kze!h& @vgFD F ؐ jL):kQ͓!@1OńQK(g]qkL4r7ĉY:Ɨjuu^Q̶lقfZjOd6J=R4нl9μMt3*/Ohͯ6$I*R^qɲf^M?򑏠nÞĞE8@GўG3k*2\w1ĨH*RD9c3.0$m}{qtII@p:3JP14}(rHY@ɘWMH)|GU3aږ !Nb/46#ɐ2jįs?tF_BRH(g9QeUԐWIw6 (vf3iŌbGX|Gha)E| 1 9N͛h֭?5 [z#CZϫ!-oa֭-)-1S/|ܟov>#$,`*D1V1*.;6o\b8 Eu{:ɭO?YO/ (vT%("eug6е!)0jdT ђf ioA]؁;J>7<[H~6%QWATqs0ޕ&nj3 ē+Y0OD\Y4j,oZ(&}|4۩^5Kb mu7434l eU|bj[9%y)|?QTj$16e0HcӠ$igYeFiccBS9(K߾wt;:}0t4" D3=*Zz:FH MhXRO]\:oE͍i[F=Jc,9.CGs̪ 2O1[뤽gQ>Mg!jY|7JF.dU3cY3F/;ӳA1Ѱ' 8p$9?Z^a_9'DguάiI@_j* XTȲfDKwuG GIJۖϷ>M N[Щ" >x*WbשXQ7z򑏠iZؓؓ(1q|&а~}/7MӲ,۶|>> g&H]}6#'ͱjQDR: @-V1$#%03=hZ׵zao5Vzvޕ X󟁅̢DeyF2VuE4#f1S @g; e 0RcaRfŔjLh1Jv 7:$$~ 8nŬAbk02Q-aa̤kgu5gGx6II@pd`u?d,-F"h98L?R 1dI;r,ʨ-N]ɝ_83='fЇp@+fO6 Ͷ,2T}RtSLMJ$D-L>џQƘzfز34Ş;wfldBD[,V'&*ccӥj8U׽wz쎩ݶMlddd80pZrL8= n43>R'aVTRICQ*RIuIQ5)B #oS&$ nmψ뻚l#%3߿'r}-6#HI ǥAdÜus},l6j^xs-CHwq\V[*R-e*UjPBܮ*mך9*ؔˑmEKlkzv K$% IBY^3 8su>q*TT"UXtEYRI$rImsRŵ&W;s6YF-y/ YjC 6ۻ~O=Ե^1aC#8b֬XQQK<45];$L\g&7 4 4,˰,öM)bށ;vSgdiYT9OƚyuV)RH]`B0H)1V5ič5+>#Mox54n`8|[z 4nS5b ^rv yj4'#轛f1ڱ!Ґ:$Aaiieeemi$4k֦JgK^8k{րI]"2 DFJݦFk8ze%c?L3N1H7>CQt *niڔ0L|o4◴ 3vĖqF)N>A793 fs9,Ӷ\,RJZշ~&ؖed9?Mfޅt{)=(HJM\JѨYW2c$4M2yԮ,fQ!71WUM)RD\g#սr+je~%w~Cp4pWSu!dJ1")TBcJ9GV2llo"ۤ9sMʘ`C[G-ذCm"H.`X:'f~gM1 eR}R}#הO!ZXyGM2-斮3ϙ>v$YK[֜O><[ƈ݅ g39JY4w]Ry\v\W*EsN;|qKɲ,rɀ!ӻ3-ς]_Y*Iɉ7|P{i֬eDQ*1s)l8E2porq /Ma+DJ#S :1ý"& R3R*!{/im̦]VZh[6:[5C@/~gCaFaM\b$}wڍv#[P/ nîf!jtZ$Ӷm-`m693]Q:E%4ow9kmQ&&K8#;pg4\Xun؅ܝtb O^W"%ɭ*MJn ,k&*I- Ę˹P)ŅRJ"UpӌeeiPΪ XΦ|mYΘ`E:vNI(gYyۮ>&OJ7[BJikBD8ϱiYj4G\2v[bV>s69sg͙5׳O- }(UFpNGGx r3 c1d-p4\"_ !tgiʎ_j$__Ml\U3CK|Nhj{b` AK-DBR*!trTV dY3ѷN'FDd!ם@Gw(n`ޔ0R5Զ<.cyY{'=!Ǥ!iROZr1)0"QD B  HG/bM'i`nbc9I55qc9{]^f3\sx+Vq4 {uin%CP@&;kCZoM)?( ,r, !b́ix1AYce9{uZosN)(e d"$tL?+Jf뒙U3k b(Hf )#W {n椰>J?-)IHIŔQ{)2iZ/ֹu ﳢPRu;瀷޺y>!(E,mFǘp¦U)a 1i eB?|{H0RlBe[ MITb#H g~ ?o[w.\r_G?oiA$B1VRup3{e1%?[`rEEOO  Y'8t/lnWϖ~k1#:RbT"C`= S+o)%%B®gdJY)57S%9H}_(_2$XZB-0`2zh)*b,(`tPd4miueZ-)/RHE,sR'~+A.ׂ+r織r^p2 S2`3e}RJhO/~^DMI<֡&Byy^"6Bx)x|'޶Wƭ[6P=HGH5c`0FZ$FBy݄9بK5] 3/t(ܓIGTca)_VeRݵ&J_[CL:F4M%2v#R6eHY*%(5"3 K"3JeYoi!UǍ dfҺ&2^Bֱc,Ђ&_VMgxpĀ|̣@7ͧ_c]V :Ȗ0 :M{)Ze/wO.$. UX\TDf)ߟ5QΘZa-ZcQBnsڜ`R"˨82h$[8ܙwBVC7{/17|K_E1pPQ$dK#NFOcx )k2-2hp~d^`z$Qb/1`O &3`,<%PR: Td'R(% KYؠ< Fq.߂y/EQR7ݱƒV4=`ȏ '̻.Uz/LXKK-{ 8)Rz:%LS"JT\I]:bk4u]{c\Yu-Jkoo5YZE{z. q\,Rϑ);#԰ԋ11?%=^' NQ Ԇsp_7~%$JQ|ss”MkEӈqѷ+ ˢL[,Ƞ:z?w`uoC&e!;Է$Ḍ$I׶uYV>c],+"|!DQ762PZ5:s.0(xҌղS>H;S~ϽOʓs94ίVdL Ix@f^kt$ecC~bjfJd?uͪjRUnRvb#&Ch^ye5up3yTo U\:`fAJL:bک:$|-(d잆@Lӱhmok4 ߢYMIQIݑE r,^ fߝu>DX\;%MnRKt 8!3!:]$GrZECf&p٨C67) (kx鏾XY\xcZX.ssI}(N:eDf^drQ7r]17QiP(Kvfw;a;bu*0Y7UTy..["IQ74sF:P8Q~cN;sx1]Ѥۮk:f~f-ڔ%J5Jk c|ȧN UG~8%z:Fq;źxC.)iV)J3Q5J1iTxBx D zΨVA| &nޠ ~O9=fL?u>dAdi~sIE @JXM# c`橹fmHINa'2ߝ8:#Qrxn4-1nqz*[T턵ӴڗΗ/Roٲ$ p3dԨSr7N(,`\;_Sz)%q@o3silUy$وVV/Kr/|>}vuoE^E~v*1 kpWr4[pMA+09Mn$5,mtA!sN/t4k;?kx z JVJ3ⳣ4tLC1Ln8> ux|/mZ^Zr1G&"e[j'!uU VUl{zOOf髻,K*FYjaZbò$^.[9~TI;j{k)z]kQWwnh|;6xZ§gj&h\Ӹuv;94ׅIҝ gq<&M{|-kOM)(A}Df*Wa{bM#%4"e8e*^q @J-H=xHD >я[bZS{o(,s8cTUR,i/y. !Rԕ ~ w"-isNԾnqzNTV4kslY:\1!*n6;ܫS8+\ &S4t.@1 ֡ȱ_]TFkRT?L^.eC)A{j)K)I;{u4 eIfln͝;f EL?p/([/jE2 t1ces$*N= ijGe+!V1c1Io6o.c%HцeEܿ![U62~&|ނWRX T\غU X)># ,"d 4egX" Lf }4xtDit4T H3|/~m4BJQ>)>sMc֛<4h ii7L4(KHݮfc[KNOSIq _XdX Mw7ΘlY[p4ё\+l771z:(T>6tQȕWtRX&[\er$=an'`LevA:5(3 \]7 ˒{ӱ#)yLvd\ 2-֭NTÄTY,gUޙc cJj-L* UUvvʈB|zKjQJoI1\ה0eil6vev;ݺv!XN_nк^b­5N!^McRgLKO]ޫ &'ACOk|){G) n;saNEfA^a2RgXv1)Ǐ˛gъت2nqX]Q s9,@Ƃ+5m) UWFfwc Գ0_~GR MuU<5IDATsWFk2ՄR*DV~)HJ]uS]ڕ%UYvxqQJw֡H^d[kZ,c'ŁNfx e%[p-쿦#w^)W;Rg_0>m?NFS[&3 juiUvNtej,g_?jR\_ 2̎3H,$dη>ߨ}jw(֢,e<Y&"ќ7ZKM]q[Yu$}U1d@o>_:= Kp+f0`":KUj=%[$3`\Oڞ24A+drgbX%=cuxL.[*0*o:6)51=`ncS g7TvMӽ@9d~ZCkH:Р;)Lvd\Ljr>̿_OR< 'BJT*\f)RKfmn$T!i\KSRUMABR߬^EvNVƭ>5nQqٛ1]a<gM_u~ˤhe^~GAiJedT4ܮXe 򔊖aLwroH1t:1 ;QQpƅ/JF]#p=,ȸFiď::I$~c->ݏyI[ h)Q״6BhM , %E;?5d;TMu!1) K4v quI6P'M F"X-DBEqs, zCg_VyxY=*vmvUJkdj"ՍĎ:ϾNORsv-ŒZ՛c9MvN λҹ]9M) L ( 1Nt qp [.Ɛya5L'7o~ľ&XҔmR]H靣gc؉ڒL$k!WwIXa0:6QdJܘJLv%28\4 pPJ0Z!ĩVbQ*T &a: 5PIH -eI"j5q-Dtp4sA~aOJ`W`뱵88uxRQv_>D)+ iIB'UpYq-l{+9S~c\1n)_-&Ƅ"ib*^\.*J6.ۀ,1Y}ȩǓ8v%ܶ8I1&[Ri;AZw:Xu 㺤2Y =@(@KwR1߭̚HʓWYXv[N(vuze>oR܆8Q!ǎ%HJ4%ի]4Ʊ:s4 PZ!0pO"4q޺sp` ]‡q / lگ9oGvP.63,(b"ͅIB>,TւR3W9oB F: :4OUgӧ kJwOxX-2Xd-Dcxm=Sf_PܮC𷖡a3kq"~ w&cFzcx%V*D*N  clua5 ODvfʻűˁs-8'Tx:Xs^ F  ӌ5^L^7A+U7kԦyMeae\`߮hpelUa-v9YZVdX^3TXBYe1Spِ] vx`rztgYF9ċBua@ݙ-(H Efig]@x MGTք<XcP!1VGoH謧Ve2b<uYO69ӍYhj=]1Cm1􍀒4>> Z TxўV(Jif)JƇ[PƁ .ɜ?)>) ; 2dqWߙ([R_ZFɓP &3%:\{k/ N[| F~88t,=A h,D|kbQЏM C*90ٌ)߯uWN^:.M`I߉p`7 [ɨIP#·6kthl`Z$&{d\4+:'C6IX 13}ocXf`m,z@'s-}i{fPth֎j'b9zԧsCOu -8D)7!碻%$~؅NCƮwm'}dG 9SzGSpu ڥz ,b)k5s06@c.̌6^k$Yte  1Y9ᮧ'NAHtqc/8"smj2uF 9K;Q"6Z64]X)(i-ȸ2|nXJx $Spb̷nRJz3wB;_YMԆ L>='[hVXp2.dP {u:LTH$vgS<{nςV۷ :vYqd6r$π#Oby1ߝDiQtCmgc/2lJ2-;C֣*<ٿ&~LwTOദPcsMX؂g਍g 䵝՝-A7?t,8a$;Sy'g:Wd ^WCfCμoB ӷ{ UG@SK>xB~̣H>l?ۜyVJق҂kf|/Ց|] J_H `2c0 Ɍ`0ýgcG?g=}2r}}ku. `\vd68G*{GzpZd0dcs sNAM"!P q#n4p=L6'Tk`0BfHY3&уub0sC=a'v ~|p3Zfc0 ZDf5 j| ;7|``L=jG/7_@8Cd6zJ嶉5o~`0ed`0 `0Lf `LbX3{+ɿ q5dw{J_4p`0Dd~/`0c2ۿ+| q_Cx*0  d`0 `0Lf `2c0 Ɍ`0 &3`0 d`0 `0Lf `01 Ɍ`0 &3`0 `2c0 `0Lf `01 d`0 &3`0 `2c0 Ɍ`0Lf `01 d`0 `0 `2c0 Ɍ`0 &3`01 d`0 `0Lf `2c0 Ɍ`0 &3`0 d`0 `0Lf `01 Ɍ`0 &3`0 `2c0 `0Lf `01 d`0 &3`0 `2c0 Ɍ`07%^~IENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerLocationBar.png0000644000175000017500000034644213063003371027425 0ustar mans0954mans0954PNG  IHDRQb pHYs  tIME;)IG IDATx}w|3[teInr;`mƴo%&y&@oHB %!%$oބ$? RЍql եݝ1^?2fg|;ym`eYfِٷgϷeYfP؏cOvo=,̲!2zYfeCmeޕ&/?~ccq;Ndlz#c/$n*f`8ˉ|c__̍t&p7IOZi&;]%[Ǫ<)Wv#fCm*_TYfeiZ]w D0ް.g9zYfɲ[n]Z28 =*%`NXص2,;)^z3j_vUDLu$,K-¶+oȪmYfYZ6c΂x? l)=UCz@)/3ORE+ח6~?[-掯.:qȆ}r;k\~Sj7\yp-u+=eK_3?9+F0 `=I Ɨ^8sW_5Ƿ@n0;։W~ǪYvc4EmA]|]UފOദi7o}*bN{SE[+;o\s[|V-AØeshcƵ%P_ת8Z2z|- |bͼ=g/EUj`6Yy;ieAFl1ݰ xGrW~D_gދ~{g{kӘ~^-lXgW/V P}=_PU=GKm59v?G޻K *J¬>ط:5/y{}ۇ6)WAل 8n \lgK,IPzú֭hqLVkzaAV 0?M7tqasϹ>w=WGiujÌG3n_]R/m~ѪYٽo M[I?ئ$uʨv7$MuSZ^W;w P}gqG) ۰ o/w誥֛ѻκkK׍W7}[ny抢/-n^@?}l_[uev^f,"@ZfgSkޏM=N0O`a!0bȭCὟq)E Aqs䟣yKyO=PĐkGe/YCp3Vlo֯_nݺҳE=I 28;]6' v\v>L+<ݗ>Yf٩f*}6G%b9fº\ls2qY;tb}L2,˥wyC>ҀZ~Z2,Yf52ϒj3#YfeŅfE̲!5bذZk\,̲\XoZ,̲!fZfe Y[feY2,̂Z,2҃Z-XWm6ܺ̍k) fs0[fy,[Nns*e[t̞Ɵt…t֭ .\`;=~+~\&'k6s{;YM\u;Й}]7Ofy]sJٹLobeY¢E7olD+iuX7o޼xJl4E6oޜ'ݙAO6^> EI⫢7Kim{ǞmMINt !bbeC. jf`d>ԖdsNTw149 `eɡ6 ܸH6mڔ7\#ӜuiӦ%Knoڴ)S{,=K,Ǐ犼?R/8Z6Z>͒%K,Yv\)ƍY{۸qc]|東ژTMzU;M;M37{Z7-d>%1>-leIL̥UyҥK.e_S~ի&Oؙedpܞ"`eYZ2'ʹi˖-۰a2,̎).H[o9lsMO1<8rOmذ/29 b_e}V;fD,2rbuGZk2,l(̊WkeY6fZ,2 j-2N},2ZfeYPkeYfYzPkȴܾB#̲ӑ>cpmo~GFjHiF̠g@jc !{oǘ(Ms[G~m,iO V;ϞʵiA@( (RaixՍp x5BW~ ڽCS5 drԩSjGlq&;Q$)+C7,'O v=c5MSUUQ aaЙa)-u;'ͷYP{%&)IL?|/iAmƆ17'Kl$$Qܤ>1 1%x&PEL_MMGiii_~ $@kǏqY!QrLdpܺ\ӽ.K0<*)):m. Bh:CSSS{{+p„ Cj#$Ba?.h ̀*6-Wњ;ܰXwGoPHC*g+\ğ$b |G-B *$ ),,1}F"Ϻ/}yƽ̬yn HD|P[ʥ/[4r_vynYwL$Y']x۷n{췏~_-).AQAbV3kdNq2<$hҌ6cFnZ#***Feځȭuvv"nwqqf˸}vS1MEv|t69E000sp],:u cIZZY9{i_cW/-+Z@qHf/w+_~V5Ͽ?s]-GQhtQ^Y~oBQFsTjK*-///P{oק=W[}%m95gWO,ddaܒ̙Q#Jp8; Nر#Μ5H@$BklT<0sF.W*7f{sױ`VM[TVlʱe#n톨C0SB-C[6ܘ!NjZ˚f&=[u݀?W]u .P k#<i]]]%%%v]lD5c̱Udl 6M.U^v9dQ@nSF\.Wpu$y봅5?|c $is2mmmwk*)hWWWQQQp\(" B !s̘1ڢ¢K?9xh[ [n r_enicgAgl6[QQQ^^^?e &x̥8ZӦv O< pş(F&"_ϻmiifN[kk+!1/^ %Cv͙gEﺢ!4klԾsX9i.qfQ0',!nPm|>x"z{{YI:'W5Ysk7]wB(*%&/;PE[N\N f.Ttc7z?yڝ-zۜ.E#Z80|7WQ\T-<'of=֧ _8>4??}>D.@(b&O5PS3)9Z+-,t:)fyҞM/6=}}}xU%g.KU5M<϶FO1BG0BoL*v矊!tTU BHz!PVqX0Ƣ(7 =n j:d U^^(J4^W UeN0WeNjc*delul{ʔ)?nkϭ(ro_o}w}rb8go[<6)c:twɏ~cSQ1iҤ[1uj+z2yܲxPLe$K>lS4-@ 0~uP;[SՖM5.m:6'*Z@$@>$i}}}v}رi9$8r*ɲ+B?zޮ.BP rgI)L8D} = l \vXwEӜN'7b#Hgggss3K`:#*7O`CA"D @c1E1W?`jۥbB$qN38 U G6ֽw%۶m [YvLCd㽃`~sY_0N<3뭭mmmmooPDX49YɲAp{=rXQ$ tVzvNWMkoҕq>oƇX9ڌܜiӦbhϗ(===eLtu4t&<Lvbބ q>MӨ]PPϱfd1gjjj>6rb^iuKo$bziB@ 0k/:*M:ぁ֎NFqEl~OT4ηmf B! 6ArN,#l6r0?#zOLo~;g}.@+WL'dsEg+1+ׯ_w9T[zל?M#4 D}sgͪ;g\$3&??6PbKj)w(D/]dtl"pXM Co|wmAFy'?QԈA|<(abs4 ;N㴫!l# bǓp1)ߔt6CDB\CnoiqǔX(P=vwL J&"6I.qϟ\TYhw?j5:POB}A/=%MjnpʊIk7yCM0."P;6]&@E7,Y$QFuvv\P(DG/iY4dU p\9D"===+>iW)-}Q9Z, JgM(wۥXEQHWO[ijh M 1EoUh;s߰P88iBUΟ5lFMVd]EQBȨQk*F"Paa!o'}v=tyX3&2l(+bPii˯rtߎ z~ڿIp#/Δ{ћ6mmu8˜(Iε־ /ySH$R\\Leٜ,!{l9-{ҒPgg'X(!몪ϒպӧ>J/UEf̊bSJUUxϱv5ҴP뇇NRO)KbUaӦYc]^M(Ht՗ޱs6$`eFģ2P(Dϧe p>ShRnw8eDv84'A(..^xk$RfKKWmX v4V4u;lzÇ:t_ƛ***p8 hYPgec**C俻nM[~.靏[#DT9j=/Žv?,,Dί:'trR<]="Jl(j ؑyg/,%H ^oiiife^QQQnKز \.K=qĊ偀}$I*++;vl^^ip8?'j$"3#}ut J&*{%5|:4FȌ(d;sOo{%Qf(Ϗq 񗁡 iZSEUwRJ pؼ cbn.익`M[á_KgOI]ٛ/ s=ϻkF7n\ Qc}Bȼ=k^8@W/51&BX%vYv{DK#uey³ K'&=}\A6".x/B-|y7T/**bQQQ Lwxe`lSVZFy78iӦ~ ,zDQL</iܳ0aDEQ^{U_*VVT_;{HҦh-Ypq(r B` nΈgB|xS(쨪jecqF;R4BKXQIuW;~ڨ kƏr1qRdԆ筺m]>cd)35OvO$Ir:eG TV7w BЖ-[.\8z\Y3>pB'O4i%簋We/O?E/䖎  +-;hرA'Qt@a{`Rlp˅2iyS=X)W߲eKyy `l<*S^u8oh`ŕʪIRKhc=.17giߚmmm/i͛ (aX\5V40[PI`p9H}TeNeYUUITUۢ(Hi۷oEq̸'I&ѱ .8~X,K"\.Wqqqf\lKKK8f%{5F40Tt faλ Hkd< 吝z;+ԋ[:CWU۷ٳgЂ TUU]{[n=ptg3̲jJJJ2 ---LqGoP+xe1Sl<>"JD ~Pd#G\(GzS$ epBQ:D7^f1,$@mQQfN.b\@Wl,xqU׊6[adSTfsAmRx mr-KL,))Iz383 ?/GtBˆZ:͡%I8qb1ڵk~V62Y\X6K'h2~2n'D"zwu%F͗)H3FruxZI&466Y| gi m-"sHqX.̊ٳӛ6`Ϯ;i34555B0!a+ @Q! HB !! B""0+A#$ QB1t0 5Ğ/)y Z"B&ahX{m_2jpIRՀL0Z4MHŋ--}cpHde(DIDYDA$ A5dȶ|irTرcM]bN!8Fߥ: MeY(nvEQV cj>p8Bt2藖`'7Z:NOcwAc@cS#2NEM/ iV#ORTXmo8޴2HqfxF׼Z>nYYT_ܤc|СCJOk~~>]'bY2c8 ,Oxl$[MWEgI ttK瞱llEV[ˌ6TP|~Q2[YY9YuFձZds:fYzrmܹ۷o:)Y t %.2c$1u:*dI-rV+҆H$2jԨ Y~}CY0eippPKQy"7l#Z66)}}}4<2wqȳZ~t?;j'2A]P1lJ!<-lT#飺`o *s^>")ueB :hC-!@EQiZ݂:8k2`YiȬ)c =v/:_suDdH-Y 7B>,lznV\fts@B'GiԶon!!XmETV}t GT^*>iP[Zv;Ķ&]Xr:dX0#>2) B 4&%qmB s;w._aH\,˩,5 \0ވYb jCT8UUܞ ý]"h"h3&%ۖ=M^XBaPmA73/fomS d_)Yp1Yx;/q N(.31A6^Bm$P]]] tMicD~BXR%HvÖY `J0! Qmsx <ʐ$jgm6Dqߦ {0]f O "uXizڐ"m"n_o7ݙDƝCMK'զ@ÇUm-WW- yf>e"MI`@@dO{ʲ-}`aLWK4= CLd<Ӂ2'SG`0x:}?t e%bW]ʻ~ Ժmh7}>nqg>ml.У.. / ʲ Z1.3V`(VJȕʉ4Aw HvSRڳpF5릋8Ba;_)MM)n2&eÓbb^Yj===MMMcuzv[fjs16àjXѰQ ci $̚Tb @ӹy@ GEqָ`puL' 4 " R5ifT6]lr8$t:egU>'hNOfcPv~PyHwe"cG{\6Y}u]B" dSl8Z;v.828Ϭa8,$/DSjPA,Q^ybnS7/,6>[WW700/!CdM[X6XmIaN ѹ 6\T/YfY > qmXZfm:yZ(rm.rbbå˷Y6& hts(&[m^U1xkgeImv6{f6lK+%B֊8]V>5ZkrΙV3~l_7^MSi ZBb|i괲L1WdQ$I%QDZ$ ؈U.7^9iPJȏSUVtf 49|8O&̝F c^,gt5rf,Se-˖ZfYzN\.W*S{{]zzz(*»PP eq9LײƲڷzk { Ȇ ,`1c̞=;] |}>[MiPn-Q62WKfZ6vu׵4g剏x< ,!)ltL]6-,.onnVeٔ*t~N7` tn-˭= ʞ=WRi$Gc~O(Fo$ݙV$WSm=&q21|P:>Z8|wu[~ @Pp)Hb/ rih`8cl(Q݃" nxIS 2f| 8RiBMZ4!I*X|/1#=x}>xWT X9"+}:I`K0V 4! _\FDOd!_-Kt(ah3Y`#&;TPP|?cܸk׾-[B(bYܶA-2tr%hlJ0[V_]-ݪߟng$>Yjf/XN2_%7 y*<|#b@m_ EC>%h܄6 Liٹ3^ A6B;k3/UJo5mZ/^ |?Tg}Y[1JVGfE3>k_vH[@(; 6+rECIM5#V z TX8+KpҺw~^40YCRɀbt?gOb똩_!BՕ*,WC[.0 'GZ&w{O]x%(݅_B+Tl_rɞ_ `&JmHQkҚX%ha &Zm/41瞋$Q4 (Mv69*Io]Q[lժ. &)Jݛowf qVgE"3>{Ja.A @os L~UUɴiw@GcK&$MۮdKn`J[y9C ^?o?r,%ztz dU"ljY2(ysAG~n]F嶴c!gVt8My x7#ws?pV0Pc%ZR.#Jjo&6tߟGg?G?#&mZaq,!xPF)*$ėPcSnw…Y,w;R n7%q91O x>;(} f;[#Vm$0b3C@!$|$Nh]Q$I9sʾ}.35>XѣFр^Z^40*h ę'8KpH5\ &No>'nKq_Y#mm$h |6̮ןMZ^9HHl55%7T|j4fq_ӣ0 L3 L*NLQL`J0.R7/h`ӦѣI,/~[]~ֺv-Za$䤭 I/JGM 匵߹㎦;5% FgSO@6kEV V:kj;wY81)Dq~_TYcP_6'гKK6WvmNvod ;q"buPW?b kdu Db6vZ`ҟ #jb ի=˖R ȄPє)3׻׿V~)ji3P-D-jiIIr3Đ;!Ύ$9jj(k?5 IDATUCM۷C!40n %pC'Bj+!j'ELlp̿}{O~2rp &O^ߵ]{m+m߮8&+B$$^25eJ.(@dA VUrhM@*9s t9$H r qr]O Ae\Q@@U!.hUBH.*n$I9Ygߺ5&en'wRM<ݖ 'sJҟ9"и&EOrR兑D@ \UֺyDø3/bA~+zL+ i]B5Y!=Sȴg dz`"{3- fۊ-:uA6߲iǏ?~dZ\ϲ5':Wf)f~ 1a`3SIVG*(~ӓOv;宻*/D$ jNsmO?}WzzaJa&Dײ5x-2LJh#AL~-&8 mXsڂl|Ӈ^}G Kfu/rq`*¡d-sA/Nw{(Tь17-;ؘ8P HPi|6VK ?#U<ѽz{LvO@s 1yRC,[ bU]bͰ}*, ƙt -ʴ :92'͖ pO@{I({ !VO\44otޟ?~B _}5CT/?YF5-'1v7 bmwuO04gʗtțXM촞.5jP@P1,f|:GLcҾ~.`ҕWz&Xv*V@g;?yCj'ڞ$6D c"D,"$:! F @$1йU4[/n7oֿAXTMUXTUSUB5 D#hZ !c.ci*F5 6{Ȱ^YZ] '&o„`MŚUU4MUgE&ُJ08M0. kB >N *8]%C&Po*dZﻯڛn*8Qbe#HD =G4nܴm[Ν]rpCUˮ$(Q$%Ie"ID$,,YF2H$$, EPDDPЯ'Cg t `c- b @ h0B?)~PÀ"&=ỏڦ"S$U>0@ } ݗ͖^ -(A*A"3XIø琢mVW`BtA`Buu{>t5Kz*+m.5TQc{YSqcϱc>SUwGEIEQDQ$$Y X$aY$I$$MTQbQQnUx/Ӯ%S &re/[C APàA BbNzέ+1!*`e'FK.RAs\M9BPA-0!p8ɴ#M{X[fƞ}o}睖[L)=̲3(93U\lsEYBrJ0{zQ4 EevXU(EL9i*"kBHUU\,;r f L!f ) D|mm}uumww>< hw,^DbBo~:[m($I$$2$, IX5I’%I$I4QĢ 4"[]lq-13OY2@*hj haPà@ рWQ(&sD^s"#VLT5VP/ 5 ke"w(2Z DNEbCʠrIZ>.NFcGw٘,h;~4ܡVuGbQ1*Ԡ\/9@([ŀU hAЂ@4TȰТJ6y-ƅZѪJ̚TڵG׮=10-I7hQӦ?zhK6pkkO}}hog=Y05Ʊ+9k*|hw"=Nh̡i\C Zp0h! h Zqsx7f2<*-̸(% ]]ښ`^ycGMꜼi\)1p e: z cG]9|{`?,p JҟTJ\R/AV4ZP Ҧگ_+IvY$ dY$I$K I(j# AP@h@D lz*H0CqA==E.&j0~P| W,νȍa Q[K!!n$z0 5P+DB9v0k#C@0H GNMjԕG/S.̚rh=2@!UIlWtI_!Np_ظ\!H *`Nrr;_Kbca6NJ>iDqH5sYH,IX@IE@4QTA!"!TdD "Bh 'f#c!v"gx-ĎE3LE<袀)6ZHcKOCKiRKI椭6rB(E 6l)Z=`N '8LBEb^$_\2;vpf3st+D'Ϝ ^FD+n0Gby[!D ;Uͫ[}c_>o `zђ$l f`|-`w5ْ(ʒE,("A"A!Bh h@0|%E@3FzHbkPAB[8+j~Z!EۡIN c0w-* XS 9#F227mOa0Kzpab]UL[I;bT"ӹ"FFo"aT4h*BhRq"0W(JS3JyhűmM[$bY4өMG̒mX8C9Xj@!g8t]ۏ8v1o$ AeAE D!$Bt-,@tx̴ URԥHP#NդQ/ JDp  ⃈PA8<n @B85m5+q 4B;,Z-{)*h" Dhq2$\SjW8MF'hG`$q>`d]/Zy!B6!?O78(b% -FEە(Fk# o#[[x‑'F:).p)x߾-ywEQEIDADQD ! Q"lD,n ` 5mP½yo`5Z4?D@8$RD;̦-Փ.#h'ݨWi@~ ˉ*ؕF:sG!@@ZgMLO06Ksp:?-S Zc 9 ,\bZZ`PCA!>B*ߍ-rۤ6,6錏'FC.ў e|{{>' H(Ȣ(!p hIP[hd тqmPgn0{Sk'6tB(~Pq,XaX7>xأ0@-ri,脴0@K- jql(mfbnP #^I"!j1`35\O5qU>Uݗ$AETp&cD}f0KbF7U㛘MLbq'j"DE #( 2 5s^c}jNUWU_s۷!DV)!r@ )!%Cuc:yb9QYGj2}a w!Fن5_O7#"E5A>Lis8>7 euR&?PL,t> a^,98x%i !R^JQ>ʖs(G=eD.ZX\T<%JJs}""ɂ}&Uˇt+v|Y~}p}\mRݠ&2!~+ O?Ru#Pe'(\3Ґv5rC;>E#N|oIh >6mm 9@ ${kt϶ INNO *%$Rӏ72SCeѦFWԋŤ~$Hk|iiB\p̣$x28; ֪Pl:'k͊(>`hR[]Ev94BfzHP}G54)g%b &EGއ`QCp#j&ӒyH嫋RVW(tg^^S"Ch"Vњ+)ȅ/sD.yk47''>3#S Tڏo9DYʠr&$'? c>OH#1QAX *;JC%۪iwiO?3V).MV+Ɣ_B\[gk,bF~V2 OP0$!<,U0k}l'4BYkdXL"*+M:0 aFbQ)a?+=RnPҊӖK"dFѫƒLm/lcO>-QT"U; jCMq`CRnPL>DA+ Gp7.Kr Mh=[~,R 4i$!$' ݲ*{XJp@?um,)NB>xGFO$ :!iz :zU; NXl`;`9M!Uȥ&IJTQgjȃr&.|5?) Brx8?s6n!,[0Nt]G$\>w{?vãqmEHKXKQ ?N!K4)5}FUyExvU dZby?>_~e} 2dj:?V3"HM8p+C@|Ml0Br"o*7WnUN;(:q;B<~1TSTe0à+?XZ 26=щmR~vjYa!NEHrqu7TqtGXrF#yNѕ¦00}HaK Tts;rq]?~,/?shhe5T }#F#m_xV]hXyQ%Ik9a`k*P gg<ޗ%ޤjE_PAIӂ<1 g~W? #Q n*&9ÄiހSP/cs 9֯nuD{=IE-0g~4 l%ki޶0{F5XdŁH6A h& D~B`zAhϪ1zgV۷:OjfW{P؊hh@\KPapzxErq;?`?){>xP fu2rȝ1ɶ%xN(w1R5m"@ųCټ)xϤp\J{}T%&Pݼw.Iκo XPϻ߇?}Kc`[N6N*| ~AEKmJfG خjʏ~ܱ%orT[ĕF7 i^IZGC-؉nDjj^]X%+o ( d$ UjS 6XǞ~2J~6AvTme;Yij8#+6Ү#͵G}{CO8pJJurKH)(JrhH4$J)ߦl;EIM#&$>ɀ`H2BNH !Ir$#Idd{=!xH HKD6j"EV샷/^oM٘EC’;?R[LbCnʃ Uy6Qz[J ~!cN,j؃<}&B(>mTڤFԢ57KAfYU 7,[mlJ&-A)3p/~?pG.O;EvB4(yӏ?W^ǥ#B=ix{6ftC _tWa c `~RB>\:0sݷ;n]Ŕd|9wn&#C@XHiqnWsrQٔZ*GB00??Yy]?5,k7l)=޳{>X)"q8 b՗ooƁ9Q[gW _"غmO:ju\BgP]p+cĠze )3#QOm,ava\UsUj-(#Nܻ>;#!il2մC"b;ZH鷾j^[90`sxr%q5PDEce6 'ўKw%Lo}ovʌO{ zs Q/Y7^Ż^O՜L_J`RȅoO<l`shұ]ju ہJ ]A*Aǟ~f D={0 27wE=MF2tϾS"<PED9(b[Eܖ2d겴SkpE{D+ߋS 1Yrv3YL7~[rϏ3K?K?'vՙxa縣jtӖ܏'wYgcߒ ugtP eoeY z)W`a {SP&Tj;kHdyS.jçGt%xE"1Wx0i{;_w<x݅LBѱv`8!Mt]QS L&\-faFcD6("Ҁg檹NoVXO݉ۉ[O}{b[4:uַ͛w]s]3Z|t7%5m4IѤu<ȿ/>⧞98*7\ɏ1yٿ1g2FQ=='y#mt60@еw''sEfg;%rML@GS6R|IĜ8WlwgmH)C}~8W([v!|1)QK ]x7μ?4Mxk֤i0򯱃gǾ8|3Ȱsx fg̹ ђ e+CQç"7|?IWU" w! cѾ{8渣z72нjҥ\݃㫦âPz3,wK߬"6=hxm16-v#W#xkdEQ(2{ͫ䵗]tmM FZ5.e)i#_KBpsv7]=77"7 !m0NC%Hy&ǵӞE/X+-7/`$<-cN^w7Ccf\$rH! !D lhfxoo56uW-[quY=av{{8v?!tUP}|.˨*dV .TQxT=s~ǚe\GAзXtB*=GQGj~S^~tH+]*&"2~/*ҍn'"(J:9.Jtlz\/fQ}ш *A/+mW/| n_TBJ\7qy~Ju4;rZ  c?# ÌܷһAN:@z#pU9u.}@4Vl>UUsNiAb(`EI"][thZqbAXPd^ x]|㚏ze-*L+G<[wޮg۞OtZk("R:E,Z6™1yf"+ 1YK!V؂-FF ŷQPzݫP9ԛ.=8L哦5]:x[P XvHg>g^u]{ϣ{EGGbbϗC&H,i[,h7ktydpE6 7*jƻ9[ZnFD{KsoV*X́tޔ+rŜd }y&q=ͷ^{0m\,<'zϽ)PDcdmgKF/(Ң$xI.}O`TxB^Nexo6)[4]׸bMTemJu#NOE0=fbfDj?3~B%2b6\όgt9(]76kU1Lc)P뛣Fj>Ln:ڎe@]vEͣIFk#ß?\Ђt@]R'~<Vxܹzm<)3# [6 =PM n{A6#ݦ˕( $!ƍFDRmuUv"բ݄!>mY㏍ZS轢^Ѵiy7Xܩ+.oV|+7|&I62aS? `05 yq_@R|%>~X+mjzv;w};攇FnI4# x?ns&5?1_*z"x6YM BquZJaCp33ݣG.2"P#$~w$_ZO[Gb!wkѬh\V-`4a qJ#RBۯ rMwskP1ĶSVtK~tpT Ҧ 6 b<:Ϧ͸xrQGP&T}hi"~Z;1{G+@pZ|Yj#OWC'5~g %"%S.T2hR+vk[ }<`Yr9]m'Gqg l? 6ͣ_E6z2g>Ozx;U&gѕz,lfZrL4ц >`m?m3KluM҅f8*Z[0Ye'- :7##S^ŝwيw?lLhDq}5݈Py{ _#r-܋AYm^*'?ŦLfV :t`>{vB<[yYH^ j2ܞQ^!`KBM:ۜ܂_G~i ,'[uy.QW;JkHKc(flY eҀ&iHnTM!Mݕ&K[z\Zf\KT fݰWZ[As~N-O1Btt*@N|qs.dB(/?%{X16 D:2j[|FpSt4څsm]2D'ۨO,FX豥<D #QC Z5gN/\ b.EՄzR֥6# qpߙg`Wv FuSg<6.R~alMa"J\00mFyBw5pA6ĆQyN'!8̋ a2.R n{R2ߞZ> 롕1[v/ܓBdQl+) |6Hz?Awy[5;Ѡ!p|kqGkI. wH53.968,2?%X8pP>w8QTBϕiZwg4,sSI+iۤ"Y?QH}6u#q.#6c6l~X䑕Gq qSCٰ-mQ b(,G5hPVΑ]3 6) ~`ʣ~QfyXZ|b[}j$M9-6}+$ZQ *ZNLsAjGfkP[O{agҰI)P6oJCݧ /¸7C@^W,/Y%S2`M(iR2c1X 7ӿ-j7ApVM ,L@ߡ]800k 370U!H?UU]P r(@vyH`BCmlպ=(SQHZQ#7斛̎`7:9Y3NJK|S徕'̑2)W,)*TriDClh:U_6W\hneBjG.shVgV9i#yq.fOagSPۄ`G%P HAu6UJIK[^;֗eQ[Tsf3,gb.1}k 2ݡzN=+D 7]G-2\DW%5x&B-Qmz?B*R#Q{K2m^ cydλvD ,w](: eMj(( ݁@o@m\|?A2UlbT}Sm 4BcG}C70hݨ} %fe|D"rdeNCw5OV)ϊߢS(dԁ[Ɨ5Ac*erH5Ѵ28#[^j(j+b**{>&+{aNtg~vb.n^!/wU4*ajj.&t&FK!K*I}aaуMTwT1Ż b{+,UB*ٕWswz1u0B<oįM$!>vi2Q6Y2ٻ> |+Q."5JwȄbS;5P_`-dWEID rDAKxCNz7})Z.;l0KyXEx̩q'G2J"?)atr^qDө65]G骛xh);LD 6m 5|ӟ;VĵKME,FyKrsh 3(fjV]w6r}PU^5Rf'A~s_6啁>O]Or9l1?yq,/xu-FłaW~n|FS\ 60B3??a?W'@R*+"rkq3'6˼ maă6vx7Fŀ4]م 1iT\ve)L T >.4 l@m"DP'=J˼Is̑ =[ޗ=C/**i=3?k^*ro SVj+7 2~ VrF͸o1mvwBȄe E'Τ G>D/lهa3هd?}P_|~m ml7 ]t{cq5*|  1'IGhf̸>`[F^5">F//]=^N82qe^Fp jKV̮KcۻkoL FݱYyqA|׿&jCreG}}Ө▗2g\r8q(e0CAhta߼~,A.#]6P/c]Sk`fDptԌ[̗y@l&p32qWRѽ`8Q 0sTgIHd!oBbj }>MA%};3/gNg,|O_!픗,ĭCf v|y¨8EiH;痍|c+}wU>h|H(+rXpi}s1.zݕTt"`X'ږenbxye{8b3I1[ʧU|ER _}S-FjH#I4ʶ.32@/=mAQH򦷧|W!Iz!ՕQo_ @.D} IDATfvC!d^氾z.* =2 P[8;;p7sih=Uy'|ܧǹ |{Aa>aL\Usg3!2ktDS Ja_ "^1o]ax6h[lq3`v5Ж<]w?A,8Tm7*BڍhbE-C4?SːE76-=[ȷ`zZμ曪NVbV=+[1QX=>KK~Y⧥>>I mmJC #uY˫YǤ *:>sp8)HXm+ȚQ{w[p Ev4Rۨ҉dѠNiry) {[B Ӄق#?Uޜtm?-: f˩a| h~a `e|xd/s^}*zVi'4B@T9t*bfw.3>$~:[TtZU&hπ~݄ƮQTMq"sk];{ޏ*X],SW@/_^sÿ^=P?m tdMG{j&`2҄yηpt2jl#s!nlgAR6a"f:` lo5v|7nQP@ ']xj-1l߹ϿaL6F<ܴL 0n;mufۜ:(vLvu%@nu?ѿpx0 ܁ 9H67@ΉIpIى 8ccE !Yۃ*ų^e?j; v#H/6[/}>cبH 0Y&tհ}nQSѴpawSѽ$,` bBwR0z-G/L `v?dHAw4T%&XP'X{ ʫS ~C_˶a0[0=l~f߸eݚ4.JNB㲬,K/|iP3uѐW"H ܋BG'%,RCCqu3 3 ܎,>SvMhG͖ABƋ&Vv[ru $wt5?@ )pՅmS] (6<ؔ{:*ܖw!)L=~(mo$٭myv ޫvGpfZ^;krM\pOO mHֳAy94,ݫ•C2/=q.{Am& ьN)2p!Xyi/EKaPE? ^Ă'm0IX{F~6S-h3` v8^cz^<_ 6K_̺M޶efjy`[S&app)E "{gg{9m2^rZYwal¸5@ØaD.)3E{U0>~k׼4t$ Ϫ.8IRxL (f)Ш" 7Ѽ3K ځuY޾+6İv$w }ckgi2GzJOQ ]gZe2)O<1"}lj8&X iΕ`xP|^qe!#W;+>sn \_N;.'l9VWP?&wF-n O$cܭ-Y 6KԯI~S[Ҳ $h]C.~팟=Lڠ q$7꺧'u^arT.>6:0ّg!>(E!A[Bޖ[/};)xŽ @ @]|Ɖ@,=uPRZM~ 8 +?^38xp%u؃q|ƒ#8\tShTI^WVQK2,ۉZh`re.`S i\۪hV\ʐ&A7 ~kGv̯ z ՄtUmVaXfKsUU޽} (xHVN"U;Eш$ oPEGue/l^Gx5JCSTjUgS[įKlqtv'g~?cD*F}q `? .o.l"-H\ui'9Vʪj0Ck?ce"AT4&>=ll~Wlbl`[:w 3 YɡZi:?q?q߬/b'L}OKo;Y]"4QKDf+CpJS"D2QT=OTtM{5I ڦd&Mm~Kn!.b@ֽ-Fu}?鴣}y̑k ջr /\9dc1|[ՏTDfsO {5(n#CN+1r1m\VnwKo iY1pT\I(t?T+ $dT#scx%ۗ_7#:;Q= ?ݣ߼=ȣTd:[k߸.f]%#WyhĸBZ7]/r_|HZY9+IhbUyfiF {@Q1v`c/5RtLծ i)TU3:@ʿ~%rejbH}C5-ɘO]:N#8k5)rR\Mj9ToKJ? rz-[.9jet!f:Mk9+޶J`E4imumXsG}Ь+68:hZ$Sz_ {iDpv(&HlXa˫ q7 E!jժqR˷W{?DfO!_`\?ՎYYM~ XLhV?ʛCFGŞ& |p 9t2\#p2a~WCu$ʁ۽V FUI ;u+Ha- |´u5 GpK zDf5`+WTyd5yg#>^hfNzh5k.pKCuWMa\#w !gXd5+]'!RW)^寋g=[|7KVy_V~; vJ^ƽԱ]5k"uY04$~\~ 󔟳ͱ'iZ1*0\#Fpwlja\ȥGnꃦ*L"&qjqk܃N%Jc "c0j`';Aq-XY#Fp.#&ƍiKTq:틲fd֗FpFp6 z&>32DSi!̬YLjrj5`a<7_Xڱc_O@fMmS)5k Ea.Z-6o[ڧ6mfV>Mj3KnFp`t}c\KjSױTɬKmߙfsk]D5N}?=I6iKT& vq˔&s}o5<\t2 l}tZj#s6S,Yc񄜯)wBM:)\#['gQ˃ l}-WB48Ae$фFp]Cmxڜַ1qH=[H{2߿FpE=W;>[ijG&2\q*S$)m362[#Fp*lE 4`4kc\& +cާnُSK=_#55kf[',m1ݰ13P-Rt*%Dk-۹ǸA҂i'DfdVdh5`k0lDdUҖe.H5k.s77 O[f:Nq:5/N\ڧ6k]ەŦdgdĴOX׌S&~NPƴHmdO] @"`eQ($"^j;_=.N@@俏yڠ`w  ܀6(6٠{#nAcvgj'< \U湜3-:Nۧ6J6Fй-gY ,VD"?k$1is/;בW_ nclT6*w "0@c{~E +Ã5k혰tף^X{4x@`gD{f66m LU1=3S1 iƶ9Ϣ4FP2D`Y` V gN 3CXXDB"mK"Yawٽ0X92eReM<6gsS(a2:XAP$$8K,?z3cV:| „\dSk2/.ЊH &w"U ٠XWҝ)` f$Ƅďy,H8 ky q64ЊɡD QP \NqTwr˸ 3B$:EB `+3>6!G bjP0yje5 ʟe+mNAOR3p"F&$pZc/<\J4u4uN+|hѲ#W$tO"H3ar yjɆf,`Tv6&H IQ9{ 66h̰ShLG ШVt]ͽ+Sdє(D$PRC`ΞXm\P.BR2X:#ﱹ8lmlw ~3z W+҇r"!)RP~6fAqcz2^엍 ;&F~_ƒN:S AT.A0וY؈Idjt(%ẒT sԼ<爧Eas_zɐ 9ڴgrjo]2 % sh u6{C#"g?&NH6=lv!-X~ulCDkXh(Fy#k TI&3d0.~aEIA@B*&$ IDATA 2 rLȡFC)(maQ-{jyXRޮM&cZ3dbLDpzS*c+9SO99lǻW{}/xډ:vt(-D.U$x=O_~ҳE?e@=]җCМt` |u(q=~0/ fm(QT(t(l XWrVzaW}kxI t7[ 6"c|H$>}1s<#.V$DkCM57'2ެ1 #ϐ0I7id=kf¹|- 0EJ+$JX(=593NAY.oCT̿q|X KPBBi.FLʜ ^ƒ;'EJeh)ʱmkb$~Vq$0`a`yv紗?%# zͣq=l`-(c++(=JOܟ,(qƣO򝗿'{-FJ4%EJQ$ Au? (Je#(+ayO lMm`9VCiZ+"`"7OP@iʼn"$4,D O!pdeXkgHH0w]&Y3d΅s0 FÊ&D-mвXɆt|8g㛝+ևJ66gb3f#Msֹ;9Qh1phWjmB V| '#wHUp (  IwX= `A?`έN_4"M44QxۉQטrj7w\7"aruLB8}٪ `QAyԇ?&u-ұ[I4[VYy%p$0@Pt9';#cV>-gP8z\9r.@i+[Q<ݽ_ѹ:D#+'."+y ?{Z}PIM L0W<)|Ujg?oLRD2#-D S"A*4l:e,ae SdCg= z1ܶí<6ٶq~Y,+p&CEmBf!j؞F 2@[ΘNWUa'7^gsd+Z"Oa39وXO6,ܰdX -EA:tPU`X+2X&g k׾g-??U;zȺ$N]n@YBW"TR0 H!I59AD1 [+䰟>/fޔ)u5u `v쭈*w`}θyg{֋76|{k29:]$F.xH8Z"8OLN mX2r+]kɒhr:0ߎ~>~t ij9" M1tN؃|[ ٦_Hd_D4][ |{6xCw}l+6G$heKmc0 rf#*0,ad"t0P3ʤo&;le^?{_Ï Tv *8X VD֓.XqL&@ 5l>oH_>4Qaℜe@QPDbE2M*L n""_qU#;YԦiD.UxS8f\)rޖq~ؾi6Jf$OX1V Yٳ~? W%r p>at=kSCq~kU"'&EP EW&lNR0C'5ftr_L.2ww_(ފ诮IzwmH6Z2O7^G)`_076:%(Qo<mc@4u ?5%J\.e bJ&9rLfl$X3I;" NZ"Fh}rHZ;Qk&Ʃߕc[ yUHn%g1EJs8?OeȐ =uQv3qX#b"D @M?T?Sy kL;,]6 KF<;\:UŝEl#-֤ls؃0C0+ac ȷ,P pۃ?{euVWo[272v ,l600,'dILba`eĄ f0-?ecK/=-ɀ,[[>wQ~݇i}mu9kWWo~k9Ⱥ^q$ ݴ ۸t3dz5v])O"G-_ϓ}(} G؁w"! 3: kw69$OKkvXD] Wpj2]/oIE< 0eY-c C^5t69pRj?J6T($10s.pp+K"Iw>^;Њ>8z~셏WB5-t7)8|T'L<ݿx6ĤxR!HN@qE@Sak%T󫾴1plXJ5z^-BlBBqي1ns(̠RgdqM(ϓ5Zn!49ݎI)JsjXJ*dV0=vь`ªxOjXw>s~a唶پ?؄ 1" %  U+$D*Uf tKhQ;4L$j:2GIAtW}&AOo?P{9mRlRTuhJ{]r#&e{R晋-@@l!Ȝ<ȑ*Weg=_z`CuŖC؎#GIZ8&/IAZv񲳵hՊHL{78w hh0C[C@3ɶ!lClUb˱UR%B7"+V_ efT#2GITksk>)[O܌CDAlzvlvw8 A,~D@>> dMdkin OjފƯU.]eZLEput cLX9$rM\K(Cm|aS/^.7-f89p#DH9G˫oD*BP6A$q6x1~]Dٖ,BllrlX ~Du)Wڥ3U2[}SrusZ#?"&΃T'vΥ$u] :Ժ `6΢=oHK1Bau$"w^ߘAt^;8[躆m'L`.$Ɔc$.ma!ZIG$IG#0W7I8zǖ+:R&!AՃWuq$ȱ0BbtdPNU?TQD.:kϗA5bggܜyp#pyކ$Adp(? FYyH-}c),m9_h"?_ p'J,^Rݟ9n)p;%.ocHH/6yk!~ܼ򳐇v$6[QsXsǩdVYQ U27u5˸n7lO.TskܿHu瞓~YOX>L`238 a\G t8gWGV""9Bʡ }g'x$Y#i?Cu:lMa"hD[?B*5*d٨*CWYg<س*Ϫc"QLJf0b:)m*Үm-uHPRZ]yQ|HPH^:g:D$F #8$ cپKf]Al^C?qpmx&$ i:ԼIT^z)K\DD5rScۆ--ׁCE~ϟteARߌ(ZjXCn DMy 8:yљ`fzD)}R ݼ-n 9|;udά'6 4܌C;l:݁W/>|0٨ιoz҅>oBӄRǼj=EbƵ:ayd/x}z F7o;(XBo~PoDɅ2,6)6Gʡ[эQ"(ZO蜮#@;՞ }ڴ٤rSj8-s`6]!5]TYvLQju{ (cJw#oCx,ICtCށ#A%:SKWrԱ׏FYG]d$nN$o֧Ox C@◼?']/&aTQIgOnnX9S_eMpbg-<-!:T{"XH塮PVՔET#"$#IQUq k<ː$:ϸ4{q& !8kQ&jsp=@pA{P/lTn#%X"&:%P,Ap#v@/;=) ې==pBN# i7ɗzm11BEf 5Dh\KfJ=&M}+|u5&A_i.PJ`vӓL .[ֹrGĴ8Yz?%Κ>B z"=8OզH׏W'7D퍰1u+znu^-ܳҔ;jJEՏ56ALGpD/Z9q$ 9I"#Ȟ'?\"):2>efFUc1p4!kY("^$@";@J QPZrZ`edSk8: S;ZdAn:{V4Qѱ6G 9]6!"KLS|\ FŎЗ;PQ&{ɾ$Pb,vlQX9Gh=un#j"qqo$EDiVn=2΃ C HmOKi+'![~gajX{3PƽSoײRZN #Vt!03&DY<9T&eΌC ێZŦf)qbp#k|FnP6ZC4 g?Qe-|ÜH7)ܒ˳ݷpbSV1FYs+!:b; Yc#ڬGP  %Ͱʢ2r(V@{ (=Z[BEݥQA 4T;uy.Ptɭ'?̋^?^5Ea8pP_$>c6KvGӝ'FBGO}Pne mtI-,fqoN79~+S F,'tg³"#Ft" @^wV %mTAsp"JȪ-n,dȴ}5E/~a]rm4)D:hʑfcp@8ZX-*[vnZ= i3dė{$\ hѥ8AB{@ x%t׿ zD-{n[֬ΉN~7)1IӺY0p1wF"Df[iu&LM^XEO urZwL"b5*A`ݹ,l0°67#N@\ sPKF+gJ9叺lnho3|J$G x39J L D"0s){g3Uf0:0Ty YgmrbQvX\-_@[uԙ)!z]Mi}N7FH^/;J]:ҳ-\u`Wuڗ'DpI";5W)KvwN4Kh͛:ɏ}w|1E[vYvi%pU^ g-?.bjc¤gѭk29xA7X(UEߙ ;%ճ4mˢދ9/ #F[lU 3td-;ZYބ X@S-K%&kP`|&8_EM[놻^] kbͩl'D D#I+p7iP:PWꇬ3#!8~wJl;:evKK/1gM㬺INi?Sw-zzA1USP7bh|g*Av/ixjQ!a7MS0Rmpkbn?fc Dt9dS&Q>CȫnSqJw.Mļ6}fa7Dq$>IrX䕳yd|! "lxJt|b {Tٓ1()KW^<xcZ6Fǫ!B=boh?zAyBPcQ_{.4gsHsFr}z@qv9p;;첄 \W KG~-xrTVY,eu*#]H#GA9r\dps-hsݪ+6Yȉ&'sOgcι b$y٫bvi.=4fnyPbXZ!ͯ~[s}=7՗v bosOKId|HXzr}H [K|sij~z!4g K;HZ/vMCpyeDpm:&CvlmC`ͤT9$G~Ñ) yxtᎩʿCdmbt`о%<s>+7HJ [R68 jU<`][EK9pzG19!:~#SXޅW$ɖ,y;K 9YU@h"z9hLI+MϰS\ 2d4CJ^զִߢH{/3 u䴠rZdfg1kkiX\׵%4≓G_xL:h l! 0ٱZ I $“/x`%jNdeQ4ڔ[1S138&( ilk/\Yf %g< BdtM'V!~6V^!m)c2tuk;$͟t{=u 9(ma Yzb2rEɹq0_(^ܯzroqɽZkKJ40 C0'uUKn2@еlpVz\q@J)mkjn'7NwO b)ގ~tقFgʏO }-:wkV*/Ҳȼ8JGBtŒ*>ts}UqA BFI=3-CvdHigs gwP SCno3mIT#flGXm:܈.Jbd%1@2ahMm@ۦ~ioG2u kV߾ܜb{Wgjgڝh#:uJof' g͚HSwݰn؃)}QZwڛ!vg\LyJ瞫%A`Z/8{"˅N5k鏻5M%Lݨ쾂цzjM7,Ǘ>u"%G%1$6ñy6q8MF=l{w)*Cˢ@NxkjɣP^ ! 8/?wsV\ͻK=4ǔO4Bs:0'FbqRpLH;ѕpz՜vm`ldew=4,0V=(gטC%b;{8g~uc`=W|?mA6&IǾ+>yE m4!'N"p-_Tpu5G4Oq;sߧܲEYM]~Ycy]-x ?A"(0bw:h W{OG=Jfzho呐I:Cx”k3> ;fɱ0L]Rz# kH``SR}_.xU*0"@zfpci?^/%$ G;M[7A'}ˌc"MS,-AXƋ߼?DXA89m_H#8Z]AȄW ߔq,%s;ƶ69mje~RBgrnuY ViOkҳ96JNy'jTQ>A7_:ڄc~xUm:oM&bӈbh/|66nߧ>Js6fe)9mnvߖ12Fmԝp~@XUME~4~ (8Hb>c/]f>fޅ;ӃB n0?tc ¾k)q,Vg{_606c-v>0<*dO b+E6\NfPd=Ι!fhS⃳9| nf. BtNo)&螅ԡF >)$Bˡh[7ۜ<:~+v',\MQ4[D$ҝcWMbeinb]޹&f[Яn6(k>yk0id=>ٳ rp\te;fM9avU2t-5lGُgȌۓwLA۷Z\`:@ } _܇;)PjKpe?=W|Ey@j9E˺z[Ўcmʾ/*(׏JHm\Vt!=/sG;NvMg9Vy0oTʛ$@l945{_Nۆ{p7vδemA:\7;$Kf,deͣ9Z+?:~<DfX1)|S)N56^~ lbb_yc. Ig>kMKێS5Ki%JƟe5l+V&"}@zC,`^_}?R!2h:fj5*&b'5S-H^lR?;bgi1r!(N'MeΌ~)=}Dpmvx;H;sM%"zǫ7/r%)EM 9}IޱQ%謭ys(8~l'٩DU^(l Bcv;5m\V~v[:YYiM-xIznW\#k'DJ:6HnJY-k旨2=1ظLΖ8KSqus)Z.roM)Yr#&:C3߳Y:twK OϯDZQ$%U~#ZCa"a9pw$r2]2 vj'َ8TJg;&f u߹{z-tZ~wi; IDATѼU  !8wC_NV.SiTo"Rg܉ɤwb<% kUJV՗o^![3a|^{1\"mbj1z"+5`pbm$1ljɼƒG20{{8$ E `%w?9ҡ!Q8&iɥ2pzoqv_ܕa>=?~ql6y8{_FrǖR`| Tm@a&6Щ.VYyiMk &u6vel0y8۱lԷ_  +Lj`^&Ci~Ae3^TVQhmcDX U Fb]}sG 8@9DzSz6 Du,MZN!̠kX3'Qth4qT!.5@^0VtrsoJrH( 1$IARиjÍL91WfHY4-V4Զކf,vhcvj)ϴZMQXybDer}BpZ%GۍHkAQHmI9d'(#$~"| SԏγN\#W6oT+)KRprjpk"XDzfzB#F& Cp]\e8Jgsb|~w7; RnD)Pq s'?B%ps˴n$Ge3m?fqh)]ץI8j\a=UsS.Ȕ! Y_∐$=tg>z>'$f.NX-e4I=[7a[#n[ט`N8{ 8,g@l:c1-ň͘a' iCoOԎg ø*mu*BaŘ?G$@=S2Mȏȏ\iM$T=uS%*#BVB7:IP'k#m#>{⾍۰rT99yy<϶Ӳ tEudO0PTHxuxSʁP+Q,XFqV߾*svyflF Wҹ-G.ؤ8!e RW'L2Ev6Ҕ\ggK:]I[h$66ͻ a(0.8"?bry"OC_0E V9⅘")ppYW[ǚU5=7[Ll8bc!)Er+CFp73;Bn^?Dz2-e ]wYvuqV D$$%h66E<4g) CނS39l ٮbAьu&gݴv+ PPt{8L LGO,?&/*t#rɓsH,ڒC̲*9$IeVR˩Bψj?5K[12AD"pC/ؑ™+IX* nxu[(VIrRwqJœm7:|sd?GJ‡V6R Z!8(.%wwn޻ 3$/,oO~u闞VВBH*r!y$&cDmgN <($6r!n˭Sg]EB=371$Du#^Jv3ޛ$Ia" p8@9ߎ. 4Cp {(a'4(gj1!@GXZ` /iO| H 46ßu~R+KfˑW*j둳QцǑ3Anˤ׀$VH^UʬUt;/@ԆX<"7c^O}f/Tt|72ϗy\3Rw4ՕGR{ƿ5jFi¤::ILM:HdIl[% =%Us&d"ۉN!bIXK>=LG`&@BȞL&>Z_ͣi\$hu)Ѵh[[ %–i&i>c+5)Vy99[ f56 ofZ>&J9qQT4[(8" 1B"8MKO`@\vDaSD;v(C2DhH'Qok \{uo71#lZd@ e8ƯWOz?zV4g{T]*ަLw7S݌DTTjP"0'.k?PS\{>;MuD!V`\8ODvӿ.$$N(gy9O9Ps<$9`ĦigsLSY`O!nF.6_, wyS^Z;9.v%QRL_l>{z$r&yQ#f⬙ _{LuXU/9>9I:*fq]P S  GO4)P POP.>,B LH;֕Ւv" z:Mrĥ;݉g_f{ Ţ-!xT4ퟶv|}E߈e&LJzs's]1pwjO+o Z $ Z "CfTȡ8'1 3o^j,kݼjg% SK^'$AD%I(!;)Nø]; -?b@vs"a"$&G\3y9O]F{B,r(΍Lw/>{{|`MYOՖ[Wߝ%Fw {0>HzQJD"",ɉ&DsI hffDp…ݞG&vi FWB+BpL!]UKpY,MO2]쉛_.J6G (#vQ'pÝR96x9'O_P=<~Fuαd'퉺>Mmn y2wt# zD 'Gভ3[o#(8Z+:b"8Bu겘DA?n7TXlE`ZG HzZ\gW==0=K=(Cp.7?]7@B @"!"!vQّT$m*aH\66/o,AEXƌ>O2)[#+{]] )G֐ vbK">5_/g&* MJOGP5骾=#+!Myz#v/Jh&'!!Aw N% I|JYbkbL_FZf^.v^*[8kBk\z-x|kPt(L`k29]$_F۶_Q'u+ ^CоI-({tȸDڤ$IdIIB +!@ sRi SjG$ o;hApyR׌.8Cdݾ9̫0 fɁH ̋'ÕPB2hVA!h٬"Hbr.,Dx@+aֆvQEfqq,IL$ʙ6(pTe%􌦰/%!2SUt$/aژye b9ƧRZv`(LNѬ>TAm)`[J .Dx 8Xf W؛F~ zY :%ADG:IVixI/QY0k#`V3\i+Gy0^ i UѡC}Ly% M{l]^tJQsY7XrF̜™2wGH5IGg;D$E "#T&K,JRG~d taЯvs?~Ƨ)CC9!fT? pApvqYr. ; YP̍mA ..VhRtu/A)-t"LHn땯٩8(N&b۪/XV\;O#:emty\ct3f"AL; 353 avK^K ו-EW$QJY!Ĩ,2T՚1!/>bhٷA]Y=X0e~r.'NeI.'[Kqy"Xlnq2!}=*a$Bd0j97󿥻 !kޖ%9,San=ؤ>BuMV3Zwb~7B'TDbM|u@qVtўe(ńf``WN@OOJ]}NYz^4>E(]A W|~\3}>z-\Ct+^A\ ]\ˁ'~} .| -%) <8^ ,] sGw uќс=+^A 7paѹڧ`_wQ:LA̯^G0_A W|\-v 0^Z^"K"K.!ˣuΠ3U͖ ز3hkA; 3H\!)y\[/7:I "= {vzscAQ0n +?G%BDƀJy'#0y43"22@ Qʿk33|FPo3pyK L< lD`FZZM}AvqmNDZ `f@1Cc|@W>,zW|<$=Y/®._?:19r(X2@!0AAL )=b[Io+? xV[1X 6:,y: b\3@p3hf~[OGprMUg<:OcRvU/i]\DC *X.6Icbl'V xD%ѩe0M*u#WTAbKQUS՜$j"DԠ&P5@ jj0ỵlj cFPJh>ˮIs@۫6UQ""YTT$ PQff罪b@f?z pR̖F>A_LE4gOEs1Q fx`7MJ]5' CZQ?g(KJ#0\/95uٝAvA &9W(hL=Av|!",v#%XcA`η_ƿC2݀Сϐ2 ,*Iey{I4oѷS"6(#r}j.JXH ǯ[H< z}FNH"B ! $e4sJ*$H[1[#2Axq3G/0;0?+,Ќ,* ?,dyIO~󣙍G63 (ܓ|İ`^-C8l,v<BR-p~ۢ!Bep7ɟ\N^ +f@("Yar% Ơd$y 4XdžJ+:̬f9!.-TxB̈ D)R6a/q[P #X{xo} `"30U@$)%4IIO>45 +I_f_^ar!g Ar/vyH*bfgu&(k@sR~&`ګ6AdmV[:Ջ1IK>i/sS [,/D`~kД\W% [@MQh@۸!Sw?qםjOlt' .lmmߺs:󟛟 Ff23 T:S&ϵ-tSz$evOB?q?b=56 /TN53hvHgfT`P"ڨWmM3# z ܝ5z]UI]:IRI4gmlCU-ȘLU&Ai˽_'d3X/)P\bjUwĴɜPLNԫI~LgpMava&9;l1zܠ?gOo}c,{o`b3e?ˉ}(>ԋ0:>v#{?E 4@Жh;qU`diם>+RRf+ 9xmYy e#܃f0#XF;[U^vRtN=Ȍ@L Zfn6:g0D䓄@ɉԡ ('UI IʦsI}PdĆ`U^\3=Fz_it.V'*hT+_uK#xnb@ $dc333Ķۮ{ͯx=s/_3#Xdr")RKI :FGه'>y fh[4nk-60JgZg4f^2/l z;LƄ@&L)BQb/}\,55AVEȈ VX AלM&._DFbI=蛉-)V:3uSQJКB7CI- $wPT3AG+OhM`%Eܐ_ZT&9h/{/~J;Qgv10F]A XD>}l&$r$MBsYλhT}VXKbY,e]fkv 8j%9BG?Gסocn{趇n+u45fh+esBmM5zaV)L^w{ ~Y:v mrir0ԁ\¡'irr~i?O}'C') ,{j(}qGY.A#e^҂[hAV)I@H('9rYIT(㽳/~#zNOIT?!b2 9AD3?ok)2O D/&m`b&Ø''S$XVS5 }vGLH$`0G7GףFV_Nў݅fņޏ !tzx Ř.fK|IIGBi&f ;{෮O .tB"Ilհ߷cZDGrcPP)Q1d}wTAOOm>^%G(#25PhkO^{ 7^),\Z;؈`В>5㺻jrtmܡw0G-ְ}!/BzNseh6~3e'b@Èk˜c= e#8bAܝ>g ieVaJaM?gil:UN]N^ӠM:%\Aڂ:""jrB78ZvtUaJԵ7ξw~GckՌ.'!i Ivf }MԒscoA@aЀFM}zQܸq~{bwfUALd nAD(cLDz3Ϝ4}-4:@#sőI"e3QMxkaAվ487ma5t۩AoͲY%#L!a@MY<ԸB8[)e@;$xxUXB628;fӬ4 Ylra*ByK4JLh>tIڸR?eŁ$m ?̾&Q5mq!Nl&p ~5Re]v8K4 %RnS"\I M$T_٣KyNvI۹ߪ7N @YAIJ_x5°ݹTּK2 `nw~GS >$ K4G'ʩQryS;G21+gd:)br׃S~'Mj&e"DM.ūq( BaJ c TT8Ika9xm8'7]/l{eET^W՝'EU+B{Y퐇^R/i.)&B fz(1rFn5L(0=gp I/:6pE 3i8v8'IAc&IrVQ^R6.'Φt0ͰvD=jeb7Y`G^~zpK8+9!  HdeA642}LC DCKM8H7ɪZ3U":7n.# jQlKVW/D}37GKnpkĔs \Y2?R&"B 37#qá4{Mx[&չ7S=vm<^R)G`v.NTƠ *qf1 2q$Y8NdqPZ <ҐZ/\mel@UCS/ɓ %gm:ͽߋ(d.O#.ziC(㻢&P&ٗNsQ1/Kӥ>rzf)m[6)2@1P[Zj# "5Bs9"tn[PV ",6LfDrT^|sP+OeH^[$rA^Ņgi0_D4r<-vP/wѫ˾?7L"lY6ۘLrnΆ.[|T- Il|>e؄p \$G 04'5a;wyNRRL}?xcHUTŻax!@sgi8ʑ^_(m13֔4+fVFh U^HI"Cf~fm&Ҭق=@D(01{!xpC'IEM7<_iC6R؈=%D})Qkwc۹塗{' Ae[퍳cCha"[7:&dJk2[Be{kN}ySciaclEΧ.].{Rtۿ:[[r 6CxJK=!%b"5$JWL\g@ ?4q,S4һ8xdj?8YE=PD/`{n0|+ua &*hWMݫ-ƿ-zr>͊U_|4e'Xkw7178E嵮(>xa /,9'IMRF:n&f 5oņMgB=Žq6CI/yA UK }#qvQyZ/:n^/x P֜5ERĮU{>xQgHe&^gt9uw;lW+c3&Q(InjUq1)ΑCX'Ύb/ IDATS/;׿qdoqVr}e{|[|;ua{+w󜶤xY&S0YCq֫ZhJ&K:Avg{:b i!o?q}iWɱQXXB_+<y*PTnG^fDRENsirCl!n8, mp˷O?(-ŻpU>Vd(f(i}eSt& ˈ~|q6V GrU%YrV|o 2t=vcDzc!Q6RԖveN̮~׾k2ċ{z->s< zhW's o2\WursD'!;6TX)J|[6giDE=Gesp$ )YC7-z\yNkgyUA?t"~J&pCk"Bpי#&*ՖTjPUqqO}DhV`l:HNɴ9?R gyrJJ)4ц͆7ܺS N-a k+ns[Eï3cXELUCcr?ayJeO̽,ܻ??)oZ4Mwep:cC脍*mSy/}乚"nx2 (cG/}?{nTj"a \-q3ӿC8PlDU5FgcSIn58kBSjf D#eO\5痜Ȓ#qVA'.-TeC.k9;>2[~[n,s ST 1Ol]K9mM7(+RyuW& mCpiWDjaJ5^aqJ`pSxm$7TwTEM%̹Xɘgf>B*u#5L1,Ry፶Y(zRŶ;f.NW{ڸ_Gڧݹ9cuQo:ܰӼrr0څMS.۩rd(-Kɴ Gь"SZx׿o_rU|pӷk<?'F82myֆ͖O4iV$Ԅbl'zڋPR($RA !P_]3Z)} TL'&v3+zG{jY5 %/ްluX1?m< >'K1*̶?H{&%"E Ը̎iث?%[9,r 9PFKykG 1qD0]1N`da<դ9[ չ[b \If6vsvR\n8{I\@X]졇r'7;]dn^i@[?$2 ;I^wi=W) Ϫ.h1cfjY~79؃n??'?;|)6Ehy͆7Z9mcuw\uTq ǻ": {=UR~_苍9P`M6&FLʠU\}ƍt&gKѲXbWQ@~:$z uz0{LIo ?O㡭A]̉U֚\\O g ff jMM־4m !"D4.9$2"(;l`:"pn56lqaIr˼vDnSR{]sAP{pٲ=TVqAzvYY]WݘrLb2U ,ö>Ĺ`=6~$glGrVBo};?&Qh'궾jv\oBurzl9XG1ntb)1b ʏk:5.kђb܄X%lYV&nClB|[^G#@lK'Īkbq+ϩxLNtvk*-SS, ër^_de #0MbXRLCЄ&";hIQ|wMeB^ȉ7r[jj2=1/]:ujWJCG/ik-^q!,ejQQQ\~iRwl&lDEnB9< `0 b oN, EZ#;WPL|I~A|GKuL{q`=1O3ܰ(ۈx)܆a!&RjClBs_رywV/+O. H}NpEGe/އB,WB5RFѯL9~p^ް 3R'bdeX#B n#c9v+w |ж2֜D˛u/3LrdKu]e^z~=3moN-FK_[4.PLArF~{kuDNn(D-h{Hl!Y{y˄7"l*zgDm:F[[@$*52<0>ݥG' 18XTt>67L*Rtm[#Bbn8jp M׼{o; wڗ+i0n/lNDZD`?Xznw \N+FKgf`-'4Y`R \2Q %E ^A=]_7kxք1Bq3[EvAK ʖUЁ4 snFw!Z\`V2T;yE0<|@7+ǔ 7}=񎶉1D3FUT$JJɖD4bρ4!o=QL2Bf'jCc`j9bwݏ0E#$KZ,v^ 5hP_'n{.̒"P9"t[ņc8hU&n9b?˳q,͸)Mq IL|cJ;/%L \g"˒e_S./wIa/͘{ 0## MOꝪ^x+81¯8TE/9-_vt*e2Xk#Ү*n^/*,K4'BT3U.g6Zh¦^=mm]P6*1Y :hee;̀NH=;W5 ~rV" 8&m86i.EW|kꒅEqo}n~:h%-R~![WII)7Y2{rPGrCpgN{90W%f PLPWXסf{&.^ f_V$5a#@pGQM?; f"/)֣Rߎ6} 񲕕R=#H' Gky#l6MuW}b&M]oW=< {ƍͪ4Ivg.o~8d2]SW}-.Dv#WY(Ǚ6}p@|+*&%epq#mmlfmcӆ׿}/|W2 gsSP'>G`0:Wz/[hܹ0~bAp)[, LDž=¡RŅbaX#(Uo\c NǂaZ٨<)_=-MS5Q WYC/M Ɵ8=x A*Yp=Q>]9mL^D26s{c_X RͥIYm5yCpn|DgiMeQ!a/H `l!p<3gYYV#Iɣgaw B Plnx 嗿U +H. vw4NQ!g;m5< <*'+c\vvԝʸ.\T[CLpil^ǤwCV!G\Hׇ*[,Y{U̐IN2m>5Ś*Qmr=@x"Bp "C&Q@X}dicϋ1%Wi"Z?8Ȯ'<f]l٭k6YKaP+?+Ԏ,k'$)$"dRm;%@An{պK+\s^_ ⾳^zw (fjiYTZ9zW7RjϚB@<Mdu5CЂ'V߬ bٸj{_T ƼPw:V^,L㑍Ōu;N MTN{| [Xg k|4=7ؘL_'ia˨"hG^6X_=.a.[v)v2D02&"_%ͨNv:1q0 T#g_Gܐ=RG#-{#/aMXT6]4[vgc6X5 `FQ8(|C6R F!P!~;v>Ѐ,妨 !unS7rNVaˀƆ[yy$%ju{2>>%Yf6NЗ~7qm{>Enna,j?JkV;Y,<(tVd\3NJTȲe'=T2I aAa)}sf :#_+L`Q$60)psSi%4g,:-vpj:ʋ}Sm;|}wHnC4h2.Iō.,5ZF_?G# ny" O={}fݴdhn)5DiJ :j.eJN.&Dpn|.\XXYO,5]*䡣 wx {<@X鏹: y\3 *֑Tb2YSZ.@[9gS<f2-"U%u(# : f}J!1V u\xau{M];+ι,]0zkJԮC[]V5|/fӵL!P=ﻺT|渤/8}jǹd Z^ƾhn41̺ bOmVk>@u5]Y A,q7Î8Ktc뒯LWϸZu@{<W:]į)[gb@ PcLe' 8eˋ8K4lMTCq8򭣱d$S.M{ w9yHR MFQQ*'L'hŖ{3 f>XCx󷕉 ".0H6R4y*r hg< w9uy$u98Y nL+ sٸئ)+@|v^|M-d;Œvz7 tV ڎ ڽJ<>eKRFi63g<njs3'@QI?{WRmQ$i]9FVc3$AA>>$k$/b'>YnI%κyPK"^O6"CKc;sfG.־V)0.={*qLeeώC؛6GC1"rh)D⫿LZ?AMl,=LtBz9x Ns?LSZ?_ܲ [M5 Gcw@p1^52Ʉ('~ilsǍ@u$Mi49q<#w9 IN`egzJ+liQZZ_Y%sTdNvKSB"Cp)EFG{wLX0Z{>\+Ԯ`Tbl)?eIǡqޢk ksbab˱!_n+X?R83|U IDAT[aU V\} ǐ39 ]0sV?;^w+_zިaZ % ,lsDTb+^45c@piz0ӉWWϤ~;n:V3xɰxm,dB[elK@[_o=.ĆA{u^Γ{(˲y7}Ϲ?}a{htMkFKHO/A« _M A&MMuו#m\P߾ OA1cc죯gV6 =mрo'O5mbYYdks5GZp]|>,_W[`Ԏ8{\.:guQ2ƣ7DMfCNb8~`'+x' /{Nj5A 6y%jVȏIuϤH)cO+]5ס!@BR-``.E$'QY'#b /9*F휖CHN Tu!Vx(ti3ԞX\Х^hD}NWOTɱnTaÅ@ppV;fw)0"S>r WK`mH1JrE`a ɋ5'~% SXL?+nj- ^a|^ٙfQ$U)=ݘL\ln󰲗̢h^?z) g4XB௞7^>Y( ԮZ!awҖ.충%Ӷ2]6\YÍJ/"0X)>a^kfٹdB!+uD {OgP)΄տlD"/"u&ѐ׿ѽɏSy=LcvM—~ŗ]g\ +Wwp -27Mr&M9m*/j wpfL.5a!1`!" Z\Z4}҆jRك*kytr!"& lׯR'AG `ucb_>k}1 .W {b'UB+S5OҵtPC&YsoJU7{WczOQ[c$CyF#vFZ}VH?q\D? Vծe @߈qϔD -|7點V fK X`гG$݋cX4dq휹>mvO[ĭD%K:YC3mIS/fjMˮ{0.7Ôv<! m2P*jK,<`1Œ`k7#"yf*;hp+,tJ*u0U:WbC,ݪ|0qrAKv6VL',l5uf>jk7;Bk/,2Dp:q.%  !ؓᵦ^jIv<$܆x],VL'rH&4 4eSOrҔ3WrSRXLn YKML% n?= wn|q!x !Z҉ h X~·~J(w1tR]Xr:)mžK{T!C{AE5EgBfX"Y>ڒHzQ! Wj\!taDc5?U%ǒV6hh"1*R3ow3iS$u#%Y]1066%T&tNrr 7n4ζƒ_ag)5BՕזrQV7ף.X[&|D,!¥;NHw~UϾ&6\㩦9.b, W.|=u5%72_akbpzG0Jh+[𠩤n\xnfPR92ύ@ZXK $'f \o{;+S k01hv_s)γ QhMmu!E݂Ξyj5.WSCSB5j ԕzvj7l)Ϲrºp!YMi=j5Ύrh'ÑQX12@ܳ];#ǍBH,bxaRJFyט{!gp=Ӧ*]=sfVDK?'ӵ- ƐE wvNqU&𩝥%&n ;]{`",N.G^TNAtK!03ݽ? z'xT Ğ3v#yCHlutm+: o_B?&04iSMٸMjsM9Mn3 G׻w"3EfF9GѪv VAFpMBH aX=懯kyaxcZ2(zY ޾:#$fɒ݂ܛ?G9m ふMsKSG3()sh3p M} ?jC}3W. CEZ. BmtʪBW_(Db2=@O0&Ұ/LLT aK+Dո01󭯰 \AUBOa6zL'lRtM\)7SnE] ?UifNY)m(-a2 \ 'Dtߞ\03K"wt/aQ1jvw3_7SnJ _OqWlu޲S #Fg,}xkiѳv8$L+WiE2LbA D܈@jZ߾Bb s9ũgx&s6 33ΐ!kR!L >tcJ=J7]a:v͸~=;[OB>)ΦBuOf݌vri7v (q:i}pB/E$!JаYO>vg7(iQ'Ѐ={'ܰio*ꁩA{rErpqJ֦BQvatSB̈ZҀʭWqqxZwK7-bJ9-]bApS²e} B-x?/Y~j }McW &Z2bġ3`K\0ՍV(ms\2kӦTgcWN\=u7MqU&ENv4f0{ӬRaVˤ5 9ΒtS0dd{U&ܰ};> LT!k15cֆV]֩Hz>\7XUcP{W{ykjv%7YkA$Fq"Apn<Jk5@c) ~旞b= }el&3Dq&7 c4`"+i@i"mUWB]BxWzRϦԳM9qSiCwSQF;+na +^3Ỹb쉭b"9Y:!"1Bҽ FOVUYD)Z"^X5:a=S ^?gx masbrCUt,=l~B"Hksڻ]WŮakNuW3Ds[F Ьyam?n . 2 h>WԍdO5SCfWp6N!’-lMcDK֡v F\E>WMr⪩znZx!6.0{9̩N) GZJ 2C8im3!2}gw^x*NE\l9"*6h{*.jԔ6G<8[952Gff'k C UM?F_X1\Ծ0APz?]m W1ѓUlU}0,X*KZ&_F"S*LD w7ofVd09l\Ji- :xqRR\^<j_cKK"CHӇ ͻ ` &#ƢDŰOעݺ_~9 {wNtY+j5R|Jf.?;CN9f8kOŀ{JɄ쨴(o4BrX ɅCYKT&7óZ<Ͼ' ^"@ ,$"~YIȣ%GA2H(M! Sɭlk;;5}]f65[k>D?hnav sjǜٱw̙œӅ+h'8Mv7w;'`E΄@F55o1,3A6;5ox(79Q 0`TxCJ3 Uׄ ;Q I+hS(- A;<wǴ7HN.vH岬0>BQ0^g2T`"S#@GBHX$?\h֎8ppu )MAޕAK{崣2sfdN#sfǜ.h,is X갉+]) l^>$DB` zW>U~\Y#UK''Y|#^HBLeqNDk zeLr>{qJ?CᄀŹfnRY'V\navĺD1eQ/n%Ë\-_w墅-8&H7ݕ};_rU@h:4漑6Qf ]KK+7MO2Ox='vSގ9URɴߍyHSF?18D7++W^pHus~7LS(ő^ p.0$eI R݂v3YEisCom:[e(L=]\{ b64KBۘQ`/B*VCu}OH78Ga|4D@дΫ/&N$>I2 >~6ݦ̞g[|xj1ȰM^lS#s0r(QzmLzw-ؙ:=1՞=b, z-^&qbB$ "{FEF;f/Y-q[hwX֊g:XX% cf)g9w:=6)x" >n8ef(ٰ;evhcH3ȠP `0zB[gV}Ϻ'k/i*V wFv7ȶ1"򭟂}_WWB;2:؋aE#KEojJ+ ^ H?0֞!#(XPN*OϟRY܎H6-wd{xepYx퍰1>|?[)v,b{dr+h7vYbD4(.7<>HqtP{5" A`"9gɱx8w ˜Qn<%0[lgЁ`a@uH4 !1굧}<Ǒ Ymn03dT .v;4I4Dp!Ģ 1$(7[V潵#,Mwy2s. <+megdstR<:m>Ӄq3a]JpE)9K#mgf7rI{g)QYg/mXNU_O|" EIȀp,NYXWs,k ԄM0*, tn| Gb"22va,I"\9ڗ 4|Z3ǵ*Iemr#g=8T$;t@D3Ђ5RUi.˰4RwD Q;*sWFpX홚Z"- 1#zN 1iEѡcXNFr&qC+|wZ]\` "Ǹza}Ն"sAD;'DpDRH*VYK X pMGsxqֶ5x/^$(M}4+Rjb,tFv,fI`!ήu.x: uGCB*$:.(V-2bQmCmLdf"Eei-k$L2=,2Q f-^vHOl`1(hܖ &0 % Z+I8j<7ڰXgy2j40n,L-Hf4 N],2*4"ǷEagoRnhƸmH\=8@#(t%LiCV-g%J%:ib%^JiE KH$'V y`bKssLSlG0Ō``>~`ez&i$/„ֈeqs+5,CД%͉PPH֐%ITQ\ fq7$& HXߺR ΃.ptM7co;Z=0:8V"8+,ziƄbKP{az\tnL l\ݜ s'wIPtT=kXZ W dp/ e[(n Cl[B:NׄW׬x 1q"*ίMqti/מ p~-,:mqd]Ep Zyz."ThE@9{Iܙ>2RlswKV$D[7D;Aw^.i^z [.2fY-'u# 3d Hk );F8 :й&T;(c&(U:Si4<(qZ{Ņ 8)&p[wQ{kN_ Z+J"!iK2BE0-b< /,7;#sO`71`3B~E&v d'C ~;m290 qm3x@>},O{-狠赮o`qt@7z)UԖ']<Ƈ0"Ep xYTÞ,!ǐP|,h4@n"x# ;9[t<9WEpAZaخqWEp ~ڏt>o펰mNJ- = V|˾A˧ 뵅-[^@ e} x@ob#^Џ2tZ F0e3Ep ࠬ<\q/H=}շ/os +@E7y-5]\Uh;k/x=o6y8MA=n"xav.!{ɠ0h+Jcy- M1e߇\Fd\ !հ n"EH H gW\jz~GZhH8n"xv1H -+X\a8ZW3A;50o-[/(!z (VmhzߐEp &\e-+ H =4Ka>-[/,aIEzB{50`j-[^@d(X^PMx{ݍG-[/,r¸_rD Np0Gn"x! WKXM \ߦ#螏U-[/(>W𫉡!j}Ez>Z^&R=F-[//U+CBbS5y0[nx܌\K H6NaEÍ,W3n"x܀]pːACen"E"8ZbE/.z-amױwHr+&ڴ˹Epa\&,C.ғ8nx W1}[np 0^m/+3k{d2_-[/ ڣx1`"=H"` no^e/-[/CCmeK0^K`9tAw0tWܜ'a@9D8Gpg NOcO "n:x!жj4:7"qL=D^jVγy2 !"Q GT#/JD=+E4C0|w}m tt_^oFx|,`(Xd\{*M}zrʒ( =@es X1^[lN~5+NF~(~,e  B  4Hєz1H{'ISMW }r:ATʼn3",wB+QP{ 9ZQܩG@m j5FɬtRn$$\ɿCj,Fĺ+@7#`8{^{;v^ijw""^D5o0Lӄ` H. s(  ( X{궧|=3w;f{v^_"GADDWD< @XXPk.!AE o6a y;޻Ƴ", #Uo. 3-X#ߎ>D  G@93q[&CÓٹHX v3U_(l !ʰ{FPW|O•W?`fh**͠a6i9Ky6Wxl "`"`k"&VBŷ~ GSPP\xއW"ރPG2urYU8k2hJCΠ~sǺ,ǟw_6 Pgnپn9i|Uq]sYcZBb1 ?oD0a;c9=f3_UCK;8}U  #p!8 >-}JJ#,\H%\Uq]̗0 sYII`M<A/;3I[0ވ(7Rim9氚@kωcBh[҉Gk\"l$Bо8E՗%Q8L_{W_R(meY۶O?K5d1!5~=K [_E&[l&^gbHleTNl&u-ދߔlc>s=}I 8 cc(, )]6U@EJi4κLg%& gV \Mc>b x.Av&Kh`73kӷ\u 9x;;ex?<>9w>Hy'wV<#C@{RCϞ|brԛn-dֆOM'|)\XvfJ-x"A Sl"{*g?e|Z&)LhY Se˲y6!FPP"Gp s@?4&5 rPRW^I*Mf3{Ye3-mWƨf938@X;*IbG7_" ,+>{\HZj + :=>sI`^ l;CП},!yAk(K&^_~ӏAe!jN)%fn#/s\<=ݟ6U1K[/}^v_C7(hũdc_R|Gᩁ<րg`a4,^9ᣪ[ӝhjEB3׵*{Ng|[=7 93aFz!sz&6\{_"t9-(ɏiHHs57rŵ_/yٿ|ıQ{E1GbEyΗ_E_zx7= xk05o<>Dfk*džDT쮿?!CNyZoSAQ3֡2 |y[s*C` 46&߈Atv8}:|n*Xu$i3O&~<锫Jc٨lGϠPsV)߭{ Jùpr\p]s譬 3iIxM<38ţxx is7W|鿁oœ ~H`_JgM bn{-|?yYHnZ؂115`:*$Dc+jNA@ k3YyunJu]f`=Q_Wr<ݵ̂5-0 pRhc0kq$JKW_e L9 4\orWt~>J%JK!g0,jݩv[Gii4*VиoKbϜq29ޑci +vo:r"SOw4:PʩBZYs4[O=;~;Rmƙϐ[`,[ Z{,ߨ'Џ h>Ibhpvw](+0ɆŬv~zb X.oq5Hv~R,t2f^8C%kdrq>_ђۿ@ٽ~5Mqa5J ,֊sn{{].P$:[u4':*U!IS J@Ӵvn$c|{'ImȠq3\K9 W_T[BjHqv2ɤ}y6{;!^ZuhaDX$/r7:!E?O2cmG /ۙ=P4s|hZz^XJ 9A Oa]pm&s>\U夦@ӄB1,D#s3_7akC{:=QzA=nXs01~7}CQj<Qz|~Hqojx%a_8(@J5Jq,ÏSNtL&͹sng3qV{}}p#}vU¤$. O,~ޔZ( @ D6 Q j& 4WӔV*Ty۱9Hrծۇf989{纉ݑBj{tم^st;݃Xb72iAo~ru/OwVTaH|A$_Û,Ǎ>˔!Œn3Ѩ!}fa;)-!"Ӏ<˜)5z}}&>(y7~ܐXzWlYLd<5񘫊SwOJ!`Zk%L%1`g#bCbi@ %u.] AwldEG9(f: qi^EgK (m=3(Cp|&L<Ɨ+ 0bREnyꇤ$W:]݀S\V5s"M#"ٽ謹W7O\ :LI[ b9r2qC~?m#i:3εK= n ɼ;#:b4!cZ `>_,x cfD:qRX=GPٿWSRѽ!+XIY24U.Ƽ(j v$ >omQ$Hqv:Td5U[/iv`Wl ؆\S_]ZAaO_fa8粖UΦ{1[d:uөk7Xh4گy9:otgp`w@1GlJGn_ʟlck y)zuO皳huSUӬvA%"t4%bꎾXKƤyۦRu8d}pZ F[ 7b;^~K%j=؅MƐPqTn)F+/)m{`Eວ?kѧv^-m4 ܟsl]K]ii4jMPU}0^.8 JlGR薡DX~|fNCmU$9x@p7t7'` ,EIoρ7Hw)[JLRa840P-r0Ԧ VO!o| Su WB~E=C6%bpNAϑ5p~}W@>J$rZ0dZKr+ Ht'6ܶTs}eυ3g/S jչ1R5efMasY'$&.!iݞ>gH$lh.ߥBm[*{44a]U'.KUԦ P묷r{{١xsXs%t0 %$܉!N&ALXUH"ed-Fr y}7|ƔUOզ@oS__>SG}i"ܬx9ĉ=%.Pш5pVpHf#]WLi4PM&Ͳx:,ŭ6$l{=|p&Nz/^VCmu~gjgϵA" RlN[x e='B F5ZkF#sR*VgVc'HQb.KvOPN?ǫ*[AunX$闁zTq#Z%V_t=&!cb֚, 1c(%쟟_7S _%6]cߕsznpkd{Q.}9VXbiE]|Yf=GO[tLpUU36㱶+y6өLx6 i` ⬵Z[!(3<mht쑰`(e_ixVOXF[ե0y~lƪ-,@DuYF 3V^ΨW_xεF,x/<"z 2 3 jed$@ n %,;_t{P^;RXU/:}UE ̷>dw.J| bgc]U@vJ ݙa!U"""mt1t;7ma_ltA&.:'j#u^t %PkQ,tgu~@ʲmu㬆Z LzT)Αlrqe-s:&{7_(%ɤ+a:}7 ЀeXa!#37&)@uc0j Qc̻;ك{i=`aHe C0Uu;v Ż.flqWvd38WW]7uRZpmC]3ԩvvFVva̵Gp]iBO=47~:)O)g3=7Z:UcP=eSͬ 'fR00G'4;![]8`x!"{dDCpy_/ҀP yDᐤ;$_Q5CeϿ) g@w?|K'~0mvh, ݉#Ay:Hz/%=q\Z̗%*(+jU&$B ]\~SAgM 4>usG% W"ו2rqQr(rȳ 4m6Ep qX2 $,)̙Es{Jbdjt{BS͚$8'ŏt|ؕ-g./ADI 3:чg㷜}Cge6*` Pv3;4еZدcwv͋vVgh<<<o84gDۿe$֧V>ͺe )m{eQeEsP2030503P( *18%ww)Q%C:Q4M]kcXK`w:)@TvFSNV!A G%EΥ2G >!Rw锪dwvi2ϮR%_yBm<:ΐjF~ō~"Hi5m3lI6ԅO͢-<\(3(,Nc7Mcڴ 3duLmI44ERͳjGE.g˼uY4^Ͽ-::5pѽrw{7^w2{M ޷}c{8Go-Ƞ(ң"0-X-|R?tOA돩 0UuTT:T&qH5Δe HPSɷO8Y[pL]ҖƲ1i{Sc: y?쥆,G9!lB-T) 'Dv5]tM8_9v[@mD:ah;Qn, 70ۚ#,2qC|-0N*tCC_=X4 C6NdIvjȞшz<~{wfoi jȫ1A`х@pw(0 ^qϿ)/CJ $zHR95 O:}e;4h2~ƳzừB]*P$n)Q{hYyuO(R*06 t)=dy/)xIrNgĹh͟!X~.0xg0:8 ߒvAVrz3`:^k4TYuY ^ .jA;tcbhOyp~Co? M?u;̰. sHu/=O? [ +te?}nKK.>͆<(3yn+}M),믟^ 1Xe}b;pVĚ4A̴jM|B#؍! 8,3/Mil>sfN Րe#S!Pd"5Ck;nujH6k-3{r^{#9]vd3ni'Qok𸪤0{^|AW L`%\ˍ~G_ow;E X"0Z#wI ЁFǁ`/l{scdž(r#66F漎#6.$pBȿZS$IaH͗$52fY*Alڙ`6!YV%m@vܲzx cY a[C!;jNixvfur"BU ד יUlnI`8ʸjjig0hHT'λ'<e/5w)z@iDX0I$InwoW"Ny3* >(^>OI`XG8?UF?,/"#VlG4b t# X"8`aصe-Sz x]1GZ6n ³'di6Mww}NSRY*cMe*2*֔ZpVGJipFI+0"IdeuJRCI?R^4RJ8[Áx:k%1z3n+$xZh 7' qGmA/JRӁ@qu_m{Guߊ؜e8 |uk[e㓋2/h/_j?ϓcJ17'+օ Z EL۾{}<_o 5g3#ЁǢi6hr߶,Gx3&` ],ެٸeu0>@O[S`ĵ}w\0$c 2c#hB뿰R5=i`$iVld)R\q%iG$ Y!`cF0^v A\!`"A YOj#?JcsgM&:xTk(|wU$O.1VadzEA݋{bZtڍѹ#"ogx xVnvQLX<"֦L%m#=5lۉ$# r^G nݗ74J-`!Y@nOs= l`e\k'Τg\}Cv5m.G(EزƸZ&v.CzF*^!J"aͷ61pz/>'$?\暎4j@ΗO[|75S(-{fHbYbwt& *F#b}ɷMti~Љ~JE=:q+lj#W\[^;xMX14 Y{J;pAqF_  HZYk<].1(=0CJAWܚnҟv7cYEi4EW-KIne[5u؍U)HWv<ԺL AE2DuEn .ӼW0jè^UBZw ٶպR0okAـUVbު~m=DMTo%->-%"q}gd{yAV(  oߢr,BUB9%  M)_ߺ7S }A&Fc 6zkim4b鴭UU.NC}B^-m~ VjdO'j }# IDATNpo]ƹ%݂ –e) )EȽ ]mEQc9a#@ev!\B jC <^iDgÛK+̥z7>év:8H z7qV?9lK+MШm5>gRFg#)76g?=m mT<+(܂<JWA N0n0kK眩ĸOWR@RT*γU@ 8SFTOS Z̳GKLMk2x@\.rI iIcl ݶ[`# $o31,X%(<{Ջ*c[m2gc͒]!6IB4__]= AR`6QD9Т&ٵ$#EU^?Ե6N^e^\D#+~7 PrdML Q'wӤr{20r I1Pfk2x֗`g%8+VZ5 |FCf&yj3nVs&y^p*#ÅZ"]Mym` ::He4>qԴ $t٭GUז:QR%URJaTh-e )wgRB}YD q;L1`FEuYV'IMI-wUs򦔰T3S/#Q_&UsMI62n *h#r G ?z]_CBؔdO!Cڍ Qk[o%a+sbAkR*'Uk^pvγq]̷7b6hTC0MB+UK2i#hUmi`-v 3(h+<2ݷ3V%pA<Hd '_"0byxڢpYoEngԦۂpQ/\#cE:VD^I# µA&4~Ϟc`c;rFu(%m`2Vɨe".-Z YrEpDF;!ȶG`+ |:;qsm.|/zvjXoITM(1Nf_*mcAIPm]*ufnE7ĸi.*w@a)D6 ۧV7>b)L3^%_/}bFm|.v#vF2$L:e70o!oT>:H2QbC?oCb VNj EO3m`oub ~Y~jw7kl,f3-)0y)[n}( [!lY* ~p5 ՁNUH|zGOi]G>J8C%C~Y3`)_Ľ/ǫ -kЙjI|.D*RIyW> 1򚤵_)05kve=iF300?nQvq*%l\>{8'-Anv.ɕ>˜9By+/XXSs+H& H~ o@U58^rM@P1/eP`2nhǞH:r898oIzN'ދ{^ jbqsH(wa;/CӋ"$[ =Xs[]z:kFqr>vO~d=Bg}ADsBkMBT u7{..?*Ӵ֗CV`TPv, ,A9W/?{vеɏyΤ~+"õ"Z:`e_lpgZ_ x t%܇U=u K>Zz){m,tu}kY';0N9^! #Qw6ybhgSQUshSٹ%2I{6$Y*cT=q^A\;g"-g:8,f>˥].mqIb ۓ^EpG@hJ{)PI8Y~Cpݢqo*X:}))@A݆=V;o+Xbasʳ|NҴ. {T݄k8@Wj뫑UP犇e!yr:/xEK2<7dЃVC;g=Hbc-'m;ZD3\Ӯgk6 V.d6,0<-wMt蝓I56j8ղ %Yr4! ,F'Āpr>7eyp`bAoTR-_M2Bšu'[ϐL&u7i+H6o{7jCIa]!JFϲj0%FjO1=;@ۓ{7~90hgo`qƨ`Um?\R+,("U eL2M*, <8|^ի98M*0a/v6 Uԧ]o| B'U5(na,Lwk+k,eH]9ch&fU1ZK쮢0%EέIM! yVFkbI,h, kr"dL ̇;^-s-:0#xTaP' ɔQE 7?RUKG爤i|tG-.&QsR'uTr.H*")h Yfҳ9KsK2ƿOA Ij5J,]O9Cu=wAsb;1b/C$yPBJQ.MeiʒTJR.۔&8ϲuWe\V4wKovV=wyvoǿ<Ŗ7&!am-iVX_[6'U4)Ն \Q8cZb"Ml=2; Ik*[wFRMUUy\Glk#E0y!N=R09{"xp7 ]*C:XkG @(Ϫ2y.I"TM&*υzl̺EӍ*]j*dMj&rI.bqAGsɣ,jTP0wO(C$ar<|U#}[~{C7R;Q`)LE lEzFRPʭrg 1f#Zٌ6#?ĽKkU/. yTJG,-'4ijZ*%;*D[f#00\jd۪2A,kIv$RWpq:ų_vqnv}Ib 59s^+<|uj-K6 9v&gL5ʳ` jso7Ijtյf`;eJI,,syުa ԓ Z nZUv=;ҙ;VJw[Wks_p<"["d4I"BJI/Ϙޯ?j˒DN=xOnT) G\f+]:׳{;8pʶ3L}I9^ Rm:u@:)bg%ލ} 4ぇݢRؙx,pcj37Z]Y"H>pXWQO4y*+Z>+I^:T=n-}{<#A9CY8`n?]ƀRZ)E$j)BTj['5^v6E+f ȯIؙ`g.܎oM'A> fnnViְGpkg%y0Ms=1{+.4-=kHBI3 T϶~6: ۥJ6])IP̮ IBkjґ36y4# muwb\ ,>wew[1P1%(RhMg@n<,uuפ${plx^ :TPZӒ tAdq"ۙ:u0;P.R9TSNJBcXBJP tݬdLC`g 18.vg5DUγC#G蝣?n¬I7MpqB@b!E|SoyEʔH~vH~܋٥cWe)qU}m9aapp`1wXD^(a_jxM%)sj !%qR26>=W6 X̟}_MG䠢 1bEIACE?YV{8@WΎ6F*h QUHTeBIK> mq9Zf~^I&#Jm6بуv:QE1 ctSb0o[4}bx1%rAĽ'\ G>zߢX#x:G^v[u:? c-FzQ1~1cA}rOn@u{ޏo(hP[EŸxGp?Fp51Tg'؇`#~Î֬% k?qDn1'@8tD7G:a,Yg޹zn#x"xUGi#{?X3 1cWAN%|au1cl5xujbX{1 }_9#tM|s#xV#؏xxk\ɦK.Od\׸N6x{;>#xҥKht7ɫO~z|LDz'9>-9>qk\S5qv\׸Ƶi``W^_z ?sȳ5VEiũg5lכam|V׸nT{.>d/nzR5+3SMg׸F}o z\5xib,is5]65qkPUۙU[iCj5o ]q뺬jz 7N/70Yp\㺡=1om?p\㺹qk\טj5qkL׸uӯ6VX$'9NO}KCø'9>@׸5Sjgv|׸urK¸5qFK-SIENDB`batik-1.9.orig/documentation-sources/resources/images/jarDependImg.source.svg0000644000175000017500000003010013063003364027110 0ustar mans0954mans0954 pdf-transcoder.jar (Apache FOP) js.jar (Mozilla Rhino) xerces.jar (Apache Xerces) xml-apis.jar(org.w3c) batik-extension.jar (batik.extensions) batik-swing.jar (batik.swing) batik-transcoder.jar (batik.transcoder) batik-bridge.jar (batik.bridge) batik-util.jar (batik.util, batik.i18n) batik-gui-util.jar (batik.util.gui) batik-ext.jar (org.w3c.dom.svg) batik-dom.jar (batik.dom) batik-gvt.jar (batik.gvt) batik-parser.jar (batik.parser) batik-awt-util.jar (batik.ext) batik-xml.jar (batik.xml) batik-css.jar (batik.css) batik-svg-dom.jar (batik.dom.svg) batik-script.jar (batik.script) batik-svggen.jar (batik.svggen) batik-ttf2svg.jar (batik.apps.ttf2svg) batik-slideshow.jar (batik.apps.slideshow) batik-squiggle.jar(batik.apps.svgbrowser) batik-squiggle-ext.jar (batik.apps.svgbrowser) batik-rasterizer.jar (batik.apps.rasterizer) batik-rasterizer-ext.jar (batik.apps.rasterizer) batik-svgpp.jar (batik.apps.svgpp) batik-1.9.orig/documentation-sources/resources/images/logo.gif0000644000175000017500000000734713063003374024210 0ustar mans0954mans0954GIF89agWxxxhlhx|x```888PPP`d`XXX 000بX\XPTPppp@@@ $ |xlhxx(,(lhhhh \X8<8040 @D@((( HLHpp00\XTPpp``\XptpHHH<8興谰@@hltp,(ؘ`dരhhXXhhhl𨈈40x|hlذؐhhptx|tp<8hhx|xxPP8800܈HHpp4000XXpppp|x$ TP88蜘hhD@((XXXX00D@|xHHxxАtpXXhhlhpp lhନxxج!Created with The GIMP,gWH*\P$JHł'8p" PDHrcN Aƍ!L\Ƞ͟@6xAу |EB"0„ .ŐW"~@!E |phy+Q M0ɢBً2$>|@ mHF)%,+~3 AC '`b5j00%&$ņ$4 B냧lĮ*YV `Gaɗ"`PP~3 +l{A/UBQZm| pW+RaL|~q` / dpA9z2UMT _ @IFho8W4@c ' d `vd 1 Cl:@A$%xP y@ xP;< A<!Ą'Bsi`tG" CB@K0QGJr52BUJPhr?$Id K )J1r&$h@J$ )(GDBB:23t0;a9x@6G  mf\oI 6{|YAzA><:?($8N` bD#p)I q @r̔@ p1LZ.0h77]g !Q\s\MM-'A 2˥A01d pC;%"ʥB;D0}fl U JKM*)I"VE`N sIB*Pj?r3ep!O,p0;eTA(Lq@##2*ƅ g#+# AHHbR Dxs7ÕV0XN%,]&RwytO!h.!@E\ `AZHL,'t_@IA> $X0LB;l+@a`O#Z 0]ll N4(x - ,@ #_L l\_P:`p&@'Er uo 0 @@Fd*VhNp<`P4OV/~qC0`0h` * ~]v  @[ @j#@T-h B IF |`@zx{u0vA&xRkb&9'nnWXuBטl@*XiW((@!F'g͞\Z">R` ЅfG&0 =)P Ŗց?lwU@ ~ \h&t >29dwЂO{ >@Я;W,mcr0ϼ3s`~| ` ,XBB@- )0әfOa, `B 6r2A<Z$< K}äϾ}!E-`dHuEX0 \D}m=p[@ĬxsnP" HgS($|@{eqh5N%kf}"#<" HӷVBN'rAyV n'fS?q  ;z%}Vp7h6WP7q 8 -W{gjV3K`h _)_nisnąu {Y{OP"$ ;xo=iYc}ľ>}ѐ16ne+%4&8ו߃\]<u<ؾwu;siY6VX;9~~nߏm۵n8?.CB^6V?&?sBih>h:Խexl҂ϕ4Y~5^C*V}RhۡƸi4PmXS{BqׅrzRu|T^7vSi_2cT=RuyJ qKԿ[)oH{@NlB4rIJsr[.}:H]0(/K0_5L?0o Ӣw]됼IA.JHS#^SǑMD` QD71*ۡeT]jg8\VbL$2 惠A1Gc"2('։ }PmyMh %gηm< ;|_hGcBI9OdD1LHI'Ȓ.Z?bu\׃q;/&ӂOi.s[zJ 8?wm2;uFG@_SL]бx@)l^g V&nc+Kƥ2UFc:CΠI~lh{_9V\.v7B yv`E{}n`*P& F {1!kbWƲ@[0I p{ [N֝u1"ƲdEMr@9&+|MD&&T쓐_237$# ;' Y3LB$amQ}uehGzgfi@:= pа4ō4OAޮ=vm6C:sC(;aG P2շm`3 `R0[ay~^5l-ҧtj4wҠQcmK^g~,WCafضZO7z.m\s4qZUkzM Vkuk4wG´oj\քkZt:tAڽ?Ssk2  tHkm Gze'|06 ġO{D^z3!BK7*aiC kꩆ%X?ULj,@:15d1%lyIƞ@'X@P|Gyd{TP9v-<3Peٳk;!7t'ת[.jaG֙-MR-MIa3-P&E5}=6ng3g&[ .@&0maleܡ{?[c.I#G—69'ҮiX (urUtA]ӀLuoM]y۶iaξtVJ$Ӄm!E':] ǘhn._T<|-w%,\v}жd6<]zm0`Th\TM  }>6ki s,L8hXd+Z0)ܢ[Gtܭ-۷mߟ( ,u8klsfM_Cә;3:p:X?U;ٵoSN' 0;uo6=c>] zӤ ңhY s&sVoq @5 /3p;mXoSε- EYv00ty{0͖`1q_&σ]_۶ø5 ][ukL<fncZ,ӎ q%McV3VS&C \h84pӛޜ.Eqp\j9<Zeiζ I[S$MY4R?r[9Q qM\xhUM\N~T7ltbY2ͶFw3*a_g 1ɋtc}h6tU ]ywPM:i{pf8Yգ5ԝ[8:ɠxUkT0! 5~p=AN$ĖwD?VM&`jk=x|^&1S!OÐpMؽ`{=5SOvz۔m@>'ytd+[]ܣ:ϻMV\fmse #wm[݋lVgޡmg4sNwT]K\  tlPm5 ِ *9B>fh)},6p7Lqid``b]lsLK۩v?q )zJH>'.`ӱó\ѵZ{ԪwKteJFV{ e}YۆD633<E5koFr1|Co-gxփ[p}!5ia+җ: uDGw\=1͕h`ڳ#sX gW:kk8z ;bԇ{aJ<1 ;q {hbzlchZBS7'g  b2`zz3z6>Zu~z2)XQ Cwkvuuls7H1 *5 \WyP3TC9Ȗutz_hz{i޽TSؓO?H۶y6?fZ/1tvǨ'ʠm8zjh8{^5ʽe_ΔJvVyA~6M ʾl|71R|t5 qWUfװ39,u։AK.+ ^6Yx}]/wM>lt9"j{GN4u* ƛ!i'G 2%Y 81~yNh)ORwNA>Z.H;Yk9ĖM4oWw(}[K%apMKwѹn_xm!n?xsBFSi2+ ̳sww׶j JPg 3n^ʮl{ɖK3'^@Fr0}]Xu`g^)>ԩM[˱:71t1В3MBM[aBcA٪_SlVD8xp급Xބ<XejD,853GYZG0KYҒwQ v"h .jĺ팉7?"p)au.]m6/wWri=KxKf*)r?"-^jU.֠][2@[ۺ$9| 5:q)9^3y؏Fe {3BT@a˷LP1-'Nbڤ8Ϫa{g{ٿ4"E^ԙU{mӫۡV ;uLpUK^&^SK0dtZns>34p}Y]Vٷ]kfŤΚo^-]:Z})ru ^~Gѫf7ʷaM0;xjEu^͵;QKҜr/E~EKݬިv󂿩k|aܺwhףwzκ"ҴBLRtڴrjB]v%sK6^'Hfbբgjg&PZr?i_[Cqcv';X.b=\Fw!/Y 0Lv` ݙ_&Bzaş]M7J=Us^IgTtkωR&yol.:Y(Yun=+>D+G[=b,tmz^//rĪ}uڤ@UN9% Rjɪލ(zSÆ^iii[ܢXvI5z}h9`ӢsGTvA#~ IA[*/_:nܲ`c32j8ciV$ؤ@m-h6`N7 J=܎4S׶tմئ㙬9-$k>3qSwx{[#ԽOkv.Fn}źۡytki꼽njCպmYv`zkӆuM!Хt7+4Mdź%K&3?j +ZM1s,7pHFΙT+JںpV_|5l=̜{sǯwhg6$%$233xo9b${a4)"v1pJD*EtF $5[U܈y;&fe񤮚fXupUs4͐7vJ6FV2VM$=ZѾI5˵vݛfwvӼ[ӔAku4?zw%j0oIu~桢s- {۵@QڶWȻ-&mgv%4@m TMFUo|w}'쨆RPzpc+;굉ëXb[v1r!2۵ 6va*;M0^@q:/ .KQqxЦayx__ަ1áU9bz[߯Z lWS)؟ۦZíe]Nмu;֡uήu[͗s< op%)ڀ$Gvqޚ&}1hﻙxrox/%?G- nڅyxͱl͚r[$&%RO>RP+"ɸ}90vd }17L"6H6P'g+!ns)jلGljv6M\pbVpgj5 nӕYZO4͙e;tjުVNm3wtt"+..Dzwk]X^!JӤh"8* yW\ ntZ;/S_{76j>Ny-sf`'dnnٍI[..] Z2 ]˜74.i9xH}65#9j+~5) ɮ݋LO}cs4;3j۾Җul7Vt\q]rZ5p=kۤ9lݥ}[ҽ͚o?[>mn-DVF]tn%~L"+Ҧ2H2jti ai %D{ZxʵV7,3_~;-3M.캽w`ڳ[z cёNʘ6/7F"n9\ykl_GW`ġÃ؋<-LYʼn x2oy%eo@N}5O O=9`f *ʹ=b9eK: r2Qjuw3z24]pu iҋRs0bӖjv݊IBzAaHnFGwk2Pnbݔj1cFnIֵt9%RJ0y41*I:$"&HhD6TBY }=!lsk}Jkt~"S]Z}7:4{b6 N>Z} 4qs$l sm^_įn=|=)hYC:N4`)C[ywE߃Fw!]g?gWgO4bܢzeV \V5=aj:4Xb l.dXB2#`tNH\ gZ/Ps#(?r3}mcKBqӅXe܎Ferпb!\ {Mr4ivq}&mBlש;mQ]pp-z-+ݺѻ ;C.-ܦKʾ]>.[އˆ#QnU *m@3Wn]Xvn=lۦQKEj>Dmږ@fm'JĩN\Z[v=vsC$sŦшw;rՉ5m=7q1ay+߷x/Zy?|pZnU (ʈ;G[f_P.d /N"< }7yZ1~Nu[vh*oHLr&8lQDOj`cYA7ظ6 .3v'ѶTϴbĢӴ?4O ރ5א# @ITLh:j>J9K̥rF\ $qH:w $Fչzn3;P4r2[%,WWn͵U!S'2נ\-osKm]ק0뙫B6q3э-+"xVxu⥕gppQTy#kn16jâ϶( I&ZIa'Ps5i㸾ix%\lװ0Y}ЭLqKorn]#TO] *4EdE/jfKsckP}<96zzw}[!<%m!P-? w|pFƷ:o}Ќ^(G" ^J] mK!Z|\}ddX9RjJ.:rEv mN2&A|ng7Ol<tTyߥYItnc> ncT'зinXKֲu?qZ0@SsG[3?Hیn̉+0j2P{Nĵ, ?U݁vY'ܢq'JĮJRV9<)Q>7gmV}eYfibzk%Y_#EmpEa*O/ kXcI&XXD[i69㚍nck&Mv˾Îy} 4“T*;CLXƤB͛ЛmqLSRWRoM}^m7EP" 9Z+n9[۾md;|}oCM6.һ5amdC0ٜ]6{s۳^]VG<߁Zɷ&0zu[Wǿ:HIѓ쀳첥bv]ƞեk;`̽"ҩI/lK\&{'ٳ yLzG@{r|4bK 6쉚єRw5euXģDKckced=rj KX&%&ngEà$Y;O{SY%y Q %Tt_H2`);޿Z L,w ,vU\WYwdш\*]&NfZ':wK__GMz|b/W&$uI!ɲ/ wQ(vUXuP`9XNat/m#ܖI, L-׫ǹsOṣD2fe i})9-;L_\qa]øX,{K5Q6RzM6Qߍ4gף8fM@kG^&5 _׻)Qe x]5TlY ٤ $S&R&  {jԶM1bjɩS.N왆yNX=//uhvrz՚ޝ 6junѥuditm|:vZsy4q~[S,TowتLGuʥ RG8Ӻ!P-ZH$* IN kƮů={v sv@|<^* ]Y`ނnS_?y6j~Y %}%C#X\78Zg' Ԕ*hK0{ !~uзL }dٺ443f ;8G?0zwYpF8j9@wG{ ;5)ŭL,VObf).앍94W8î.Pp6]l^|Din uRKQT!S4`7|emob4Ze?>BI~[P/dۮG?<#W;Ee!D6y]7f[wbt?Ocyi]ڮj+b*73ob$9'j2hҺ\V Iӿw{g.͛*ݯd"I_qDچm蓜5:6Gk|stDO)5&.~cƝ:IPƌYVy1, szFo+$y/2qҪ/NۭS[_+e_bT5[Q|ykɃ쒀zD]szÍu:ZTUxjKtӔ`ټ^>Tz#F2YpxܓOlՠc`r~= C0E}X|Vʼnn'("2-bvY]ed./w^{ضW͑謆x ҧ vZa̶i6iÁc67Xp}V.i9iN3n[Z [3m E534|ƺ}ioӹCf0Pָm఺ з5V;Y -j2oBV@ksەy%͆~ٻ1;s!q[xR?*AKuideCLϦ'mez6VoOפpy*=nvϱg;nFYTQa]*Ei(U=sn4Nqq#{k&O~둦_fJYEgՕUQ}ݟSO=11d3/iMO IkM1 !9vc5$N MsA --'3WW ugn[bġ}H}8%U0˓T"nMN"U-iQ7UE3G(&~q\ KJAl\}&eib4*TR}V-_Aʤ}{:{UOjn&ou08`5Jgx?-]OckjbM΁Ԉa&J# _{־b> N1fLFxZ95=`,Oh2,k u[]]ati欯C1ynкâُ;rCk-x|Co[URGfmX\:lKv>e6oT\ס ce>)7zcKQs5k8y ]߃fu1auFyPl-R)>a (x7~:c 's :l$?I7+2J/:I#ݚg,q3@@Le?\Nz&nBa̤۬CZCهz?6h?NCxJ66́=%.sW2ݗO܅/ΜVM Z֪\F["{.`u}A_=`АXԍ CM=L7Ѵp+[tcU&`39AD2͚صL$3A /$-F%V9ҍC9eA. kYoBSVBd}//& $^ҏ:M}>:2^iyhaqn$.D -/{ӪŰ}3v;rK tIzW9G3%~Fx^ STv-݆5&zSXn;! pEG=uٍg1 Z"{J}]l4y{iܿt$bsAT+ kfX;4Kx&AN-8ꮋvGAvkgF؉9fn g{sX][y|8s!l`xēuRcm} s$`ieVSs}<+ku)MD W1|&bإqr L*k'nƕ] FshwV{ECm;!5nZ/Ze|5ݲq54Ӱuf4m1GmZܺm/]6Z ; &X4ܚVkDe|8|6Zԏ|ZhQ&x`<;\hAK0k"g)1Vg,Fs%c&ݺ=>pI =x?NN*\θn*|Sb]exةmlk_F^3ڥV6Dչ38n!̃ W@SFEXKMFX,cewW3]RZn/BV˨u7`xIΟRWE!`({}e7"'=4#ݢgW|bM[A[gi֎Ln[g{'R2j:4!$JBJ:xt*ұoZ(ҺCHZN|iMz~;=YщVfF4qH IsʾTRT[VΈΰS&η*,\֧3\o4F\9 <"u,+I2SBT.צ.^__{m ֺ}/ʃSWW+]$+{4`[@^hJt#=1> ش ;oZw42Gۛ}?y $F+ɿ'x?7}?$Ȓ*%Mb-229ɧp5ϭvϙl|eIMrfuV/^B@{&wbdhYs, &CJL:Fw%/bvfΟĹڊX@{CBw@_+tm4mWU4m aNQzmǨmGk?ae%**~Pi=Q+GqKw`|޶`M|ףx'D4w0J!O˃Ԓxfѽiy&떷pݭQ-K+_]~;2`S^6JdL*zҸC-GkmjӴmSKkP4{zg~䦮"/_r&WvozuA,1~9.9XwC~ 4p5Qi FkO>S Mh5y=ab%p?[gk[i D{6gYi5mj !Fr+"radrϳo نAgOf̸ͻZ*fX+d8pQWW" ݬGg:`\t8rv\nwd%q,>ϋ u_!+&1ְBL,;&Dˆqv=EDVO=7T ^p JAR Ddpy`7|&w'OCM[0em5SBS?"uҙvRRaJ)I;P{x'v?*n?S7sHhd۔rkVΉ c^+\߈GO %_`ZdM_˯;4xzGuΞ̹N=G%E>62y#Aul wN;kXZ<{T<;W}L첫'^+}1܌s&t8W fM]هWnN{ )]8)r*e *Z\[[,l߳yixW0: 5&ШF-}9qKwh׵5+޵qUճ3_p]5}M][$׳]~zmUgEnu_MAnH kȾ`߯@9صf9 y.W,!5]x~;[CTrnJd9$ 9JLsg}˭(60p+ksl,I:!u}|sR>N9t KEW*yTg8U ^My=nΎV*QW\7ܱכn9l\<ֻk"gT _"Óx2^7k./FI#Ds>g/c`w2>&DmnDms@<7͍Cߐ r2h GX$.g8(Y/]!f><4ۧ,KlDJ ǂV?!%D2W, ͖:02yi7*7k5n՛fL]k1{U7Ю1VњF>Ze}2S{~v67o{z1'?դBPuלEz쉑]ztp 怨M瀀:J0y<pD{Us;>_v  ͖%an]rI헿eqm4M czjMnŵņl60}&FDdك/k11 elǮõdkmNMalxo OthףSQ2S$&blpZk:oGM6_vO/_@*&I}>/+^cXH_ez>Ik5UtDt A#h$ gE9Zt '9%J5HZFk=B9^vs9: ׭Qwc`8{~?e,w΢Mh< c Y5'q;%?8~7g/}gR8;(aji gF-:xI6J?Xc/7>%}1=}vQ`pGƮ;{OU+8p㳌eF<Dx٥aW2YhanY<33y*aye#Se50Sg ̓bgQpabiy3w«^s+vjn*{sOtiuREbĪ9JqE7s}OIrgNDʤfE(:hӺ[/mY݃i]ԫ& - R5%>ɽk4aQ@c@YuEDVuo!ĈZ &N E~TP[fv#@W<+QΚh@v4nby>ؒ%jFjIEיe3{\VӤXf5KyWkIOd䄑t_Zv]TھZM uCCZ?k:_z GYG!t{Fbbs~f#w:c4 [񢯿kKpNmoܪ?R:[V|O4.&]u "lnk8m7?]mb1qlمv8<>vSX dy`ǭss'{ao+kQs{?5]?W6o޻FQlڅ)Q3`qigΝ=G=_-tQ)Q&ʉ*a&IIM mDßڶ;6]1%;f38m۶cϮB f{;I~/b>x?.`x$;==} NDYG߇z6#fX*~ewŷ_)~?8sz]lBJYԛI:FL;2ꯓ4EbƬd^U!эḋ[NB)Ͷ+HK(1CLζOҰ9NF\3O'Gl_ܳseYNs1&pw%q@K'0g0rըߑV 6ŵDn v͔>xyKam}zN܃V7 g?Gض;,{ c5z&neUdΆ&W' {='gd|?&??&K6{\DGΞ;)&r<)naR#~`pC]2rѽ tؽMṚf pbvhѲa״]}Lqsmu}8ճL}Ü~>R}U^ej˺ˮskPȐ'ڙJR:A1\':p'b7lt]ثL=o{xq k'*5 fcΗGsO`1vx}mH7UZ[[>-z=r5בo=/y fD([vC9ŞHᖐ܊waԞo~pݭ8pՄu.:56Y /VN7o}#>![%KYra0hIK)k$As[3F%&QfnMrm\{I_Oo{ދGyT[l'@Cc*;f_y> Y#9U![wDD%^DeYXr'ʍ-d'?#XWpkozә6cOG/ӏH<!ti)f,T+kLup*LI[OulĪQCa6=[ѓWjss [zJT;@ʠPפ'-;F$ _~ kOmnS ,C#(#d7sOa7qfث3ɉ;qi5jOPNXey,1km^9U<[A9u ǟ~ZQaqH} ֲ%鷽 C~qހ?Ї1~.öѝM-8yבv_U9Jp#~5>{E`5 |#Qh!ز͙ԁJ| '<Փ7^!xNxKbD.hmK>ݡc1ҬfW{ӳUΨeYs-ݽ-֊o]oCV6v LS MNBJ}"ts`s9\],ciYH„& QcIM-6YYf-yRe?F_5as%yJ '>W /~׾F_C\e:7,x4/յ&/bpbkۥ 5^0d85ؑMSv-U sΦx܍mShgHٶm=Dyc2}8=@N &yV Luز~ع֖֙ZFjA*ol͸9+RHbTwx]i 6'1ރmaa^{)I I*,7Γfmp<ȑZbPz w588(&<>6`LO0mqm/ɹ%O&Z-^5&4潻`zz7 ֍\2!KO")ݳv  r1b4` J!3䅆jbtt;ܱ[}5z'{*ù=> }سЭ5Msͣ';`(E8k벶뛗|^w^̟/D`1ѽ3n^-Cz<4٩f}-ZU˶޴вM+.zgp Ěn9Y$cKGy4Q+4-G+0/H'?Mf,VѭsUZ9P7ki hϒt]$k_;w$:~*9Ӯk,ǧU~~iRoaݣH~ћђAd.T!ѓ1rD'wq J=DQ$f||lrRa9,,R!$Uͪ[]QN{?/jOӳeM2 U`fߥ=ޅs0|+kns'>@\iIP#NϬ,,In_w|1Qa(ϭ>wuo׶kb1U\:Vѧ?/UuZs"JzJ&i .`rI@+$Nrˋ%B^#۬?nwgWxYffOɣhyy"k;J )~4l4VWW07wN@QsgՉ zLnllְ}nsB_^Yvmau_3A/o,&No`^o44uSYVqnǰXny'<+1w9u .aWƲc~~%^x˧_DZ>S𼈆)HΫ&-|P5ij饭gױ^Ԓ-ޫxqMVѱ[sv̺0@m*< u F(QJq) ;Dqꏱ親y5A xjɍ$q"}&wnESpY̜Wc##ØG__]6M%SɃ=Vq!3؝C~8'Wl 9g?^7\#W^N49J)JVLlgI¿k㷧R兲b?K'&*=x^6۷c㣅=r>q]PdUwNnSZxN?r==y! @X6ߺk5I3$aaNOZ}_|2(څ:wL >W@$!VcZzd:yLzfFn{Ԗ{Ăƽ3,`dэ(^؏ۯîD&ʝvrv$`m'niw<>ġ-a_*x,d%W_Ω|h62-#tE[Q|cw%R4qS9'777o8 o{q`q´] {6W2n8udYoĥ`&po~|[C\W`-)GZ,1QuD4V,ȋL唺O$}I5g&c_R&YlU_cC%CoaZҕ]aܖVyq8GFaԽ_UUş{%3 4u5Ӱw [fe,,=p,҉vVuG 1 x3aٹ1٥+3h}waj΁b*tVbCe-v4u㸉@yǮ-n׶vv;H;٪ۈV8~ jԋ+aG<~FU$H wPvi6&;PBH45'9-V߅3(bxhYDOhOb0Iev'j= m=)6>ۇo|P71nηM. $0(M<ĶrE|[Ws群+ xJo^BIA[U˺k uP YW\5ՒoѺn5 }30.{_+_BؕJbx  :IaVNmbbN@M:@sp.K$f8|6:`Sܓ lzY w7 ^Լ&AJ,lUUc)z#\00ۡ.ʺаj}4П angGx*PP{çb~n;r(dў_ޜx4 ak0ReYupU)JO7hsjY!׾O}̤ i۳DL8tR\Xk= =U/ç?%n#x=e7K3!h( ,Ia^PBj0UC26.45A:!X {0ˈM8öъٝ|jem,RnX zuJ/=v]*cs(nbc{+qj1QtXiT0aJehmnC{[n-O@J\myrV4TrK/gvQ>t#фTh N4J~1\ڸjU+/-o? }PN \wI `WFє< tVjZ뙭:jiUc,ZSXLMY=X]&"LG2m,^opj}.jYl@&67??T*y ~ wlzJ[8gPp;hC%Ou!*VxSD6XeG=zl4a:{mXl e:-)YC+30%bmGuݳo҃B}{֠s){Ffjȵ?BW/@&HcN"Z8ni)ofKӂτ& \ T=僫w)ZINen]4ДJ*c(3Ӧ\ Ħ+Dw7y^ۊGf8`gؤ& hZ#0->Vq ;J .WW%˹g8It\C\6ja&h/fڔ`H ̲5}ٚͬ!.SKŵJnpƻ[/S(֟}D.* elEwbtbg.}&A-Y2痲4Gm_'U^5Ϻg{.]__IPza55Wv|L]\O 7Yc0?cEK?uTc_s^ g;:`q$LgxO Y Q̤svH;O6GY^:=RMZk0MոOGKig 8?'uӺ֍M f=zx:ݩъp3Nw~Ul!lr@ E͕P+3VKu-L i窅LTu$i͐oWfX?%UVQ)FYe=> lZj 3l%!Fk6G@SYkԉ&O@K&1`d0vnczBo1W?4j2)IV/5Pίj9 ײ= Z u[pïҫ+ bFZlgH=.9mڢ kV3 ˒4};8wwwŭ_;ƃ \l_bcsKğg}~NXOWY X-K&2>>S1#Q'c93pn:91[c:;7YFdmβ=lK8j_ގw|,>=ύL6&,Y.&  8԰g1YPئg<:4S(̋"͔qJOgaCӰt [[бl=:3glNۿ,D*fJc3ʂEs)"AK4Vְ@Gw^)[kvZepnC?xh?M㜞'»߈B{8+ZJ C|QQ~dcs^\UPɥfPTl<|LɮU+XS7?l{K̄ Tc_*?߄ PP5)vJ:gYF׺1p5!lc։ } ,b<~_b߾\B+ȱZik(6ewt 6L};݃c36~NMN33)Wb,}Y1٣͎1% u ahA2kM׳j[5f!|pַ~+L^; ;3Py8J ivMZUM+Ӫ/nkIjt8% IDAT|>1T;_OQJLqtlt)&&tݥ|phiQ8^x{%{/sT﩮]ք/'T=^.f׀Isݪ-ȩavs!fOuAZ|^ ìɮ vM7=o>O`ߞ_ cx?5KZt#P]#Bl;l9:Mr)3$EgIKeG<2-z6a^~[n?!4eZJua)װ~M:6DSش\,a|h-Iҁ ƒA8iQň~Px>o<)k`9ǡ۷e+VM:4efw5lJ\"g%r?lZv؇ߛރXt zq7r G4u*gIL>&04rvoi!^vੇccSؿ?unkcڐD"ۘN^+ټ m~&hƐTE+luC=kN]vP?Ѯ p8`/W?/ ѧCkWkġen.CׯMm༜U޿<0W*XHDS[7P+h9yl%m̰&Ie)kK>9ѝ>tt=f îgK&bKe?_Q d/$lכʾIm_ևq/L [j`CYd-kpU۟ۅq3e29[Nu HZ vhSarYQ/Ud3a&=u/*q-pi!)ە)wj`>O} ?_h<ˏOwMw JyYM Qcš}xns kN/ds)rrtt.yl߶wdǟD4r]sf8ZΑa>BEw=m^j2)kNmصK;M m?3>6I^►Wn?;k[sjR4Rwbrr7x(<@BoґlO衷yCRSYsi(fQOj3eKT8M;N5T/͟ { _U?YkWC3l2W1/F: 8̥4<,dxN\2alQln .[7[_QLmnqD7 .}ZuA`[[f"MFZйU[D#bC5wSe:ծPz,s1\xZ9=kja # Og#عZFw<2= 3v ϊI Ρ\HjlXf|Gbz(Zj=nѿJ\m&Jh=T\Du^vT,h*lNL86 ʗO}߹9׎%n[ގ'XawbۙMa|0~v~ߢAl1A䥗5Qn:WŸ`cEu[bb2C_dgٜ/ZQ rSq&kׁ%3ݩp(>U/?k=izbqb8a<8z \?191yҋc)=٠Zd`lt ;ׁB?:W0(& .O׹>bXs2=ʖ|/ tӗfv8my^U* ښռ]Uh/C>R]4bv! [ڪIi/|v{׭<Ý^5G^1x_k}]W6xAV3s3ngPj ȪQh]gKJZC/ꙙCcH & A4 VgM`M%^<1&z"[-Z&0z) Р5j*5ľwbpxf93^ieū򧊨QK;' 󜥼X!|῾o| fy[z޼Mbp/0=Qn7Jܽlc㗜?(NC H,qEe8h>2F2xy=\^F@"yVWenԛPn1Mh\J׎YJ سg=)T8аadӹMҡ8ϴ`Y8n bXr1*j(V r (ˆ^Edz}r3!>T+īޱ+i^Gٌpp{=ГsI1% l`g+z`5vXz6qou&ڏzf!a}M55i8|m,!<2ZEGt$%>tx37.@w?gI8#`,}2]._etf&xԜݢF2Vӥq\}#j\rik5a=>vg ;cװ[veONan\Ӑ9Ӟw] 2M kddwav;|AeffOtnf`#8phԤXN3:H/l2;ݏct->)w˻^,Xưɡp9{:x^^>t/55m {Oٙ"~s{qni )CW|? /_ r\sQ O/17aQ5JvKI`η^.~ézlm7F>WМ-IXzhXEL f=8Ac=ʆ"\raD2ng?>U\mr~bֻKFT=\nIR?K<3x[= &hL˸!RҦ޳Ƿx_Oux^G`{,>XUo^uc`krn ;Hvkz6?o߆:U'70-b#_;3j]QVG?9reGihq׮:azs;^Ȃn\֡!qؽNԖXEe KqB umy W\y~xŖ#g\Wap :: Z/i`rw'__7!n3ޤrj vԋ|xO  $7wZF W7$˞g{biR0߇=*88긥w6&?`/XӃ}k`j& -Pm' þC;qyV @mmhP~'^_}[co% ៝mlJQ1[ ]KMi yx3<ƽ;wV,]K֠o:ZaSFYfwɲ1{'?_GG}˴eB_Rv!pGmרVyjf#fMaqq-u^n[nǦ PH// <5iÊ9y]_]/|9)0(XQ),kyrˋ9间׌g_#鎖vAo*t@k'*\1=Kc12{p%'3Vbպ%hn GBȈ'?~&TF~TsM ~d%} h x]=B6騮GY[g,k6'3o]u] Se\d[|aM]g*Yםx~8wjj߱w9M`M3N%K|MʪYNx[_ҳ+ -@R?^+y4qM&FP+Pb~heܾ9WU.+VNO%!E~[?Z,$EU ;wwM<88>Ĭ,҉\ ͹N]̮$!'CJR X{56 g1[0F'~NLfbDOooeJПN WW }Xһ(D&Wb&Z+%ƧF؊BWwbd}Վbǎ`7 kDM8c z Zޮ̸)ɋڗ8 {lN[{IeZR1]bE <ɈmG:%itJ9W.sÿߌM71mMEdOl33vcYQ`<Ҕ'{cCd4HhT=4r2hDǝ@{brL0}efODcҌdJpd?/e:f쏯Β /SrN:7xF':QG7X4]WSb1ngMZ'(jc/MqXN,>XaJavO ׿|cb8.&Qfc&v?9=ƀJ>/%mQ M(lx}1'&j'`S7n#t_4(˾(o'Sa.7(j^ﻬHW×m@_q;Np+8b5k?p,upaO>YkUšKMk7ۥi}~nM[Zx״USsyh\˝X[F[}r6Ŝ:2[ͲkejF,КvLY>{PSE ѦΟG_oe9Jp])  شšA5[Rl% ;[Ÿc+оNV]m|A-2I1|, ir"&H2U=+2d)5Id.'FIϜuR{sB%Nlr%*ԛE,kssf>qNsyfw.6xrb?d5J`$c,uzoATx4kT9/j jcqgre BAe&T 6ѵC;%JR*RpCV1ap$P&yT2dxOM;8K,#נV})k\My\"Xgh竔?1 Z n9yq-kt w8K,3CFC(^zSuѽLQNC?v]P($lvo!Mʰ==#vd~qI&pAsojA>Kή]L8i99f<%[2gBӳ̼ )9f%Z|7DmuV]d˧yA!pVN@:kx~yY{qlbƊaX^g㈍]7g%xL7vZ7qyE8֧39SM3Cֆ03GK%`g{ <_5{Xcs`k2١q,rão4yլ2 `V :3nmzr^ ~`Atlz} IDAT`6 Zg 'd=ӵ ^=LZiɮit>jӵl&VĜK2$B Gjy-  G ?E 7r\cKMF W2t#.z -{\+**f9,y/ĦjZSæp8)4Γt[*ao|m#` `&!qmjIH.Ԣ%tgP FKˡ=]Szosp2"x;*.XNg#d <b'6-@I\!<^а{  z(VNɐ3MR8B?)R@CSt:&^'1y^FEN"r"+eعϨMVAK7jBE4eHːxYi ]Gt3JO'x{>@`^N,skyФA z~F(ζ~yJ0s3yJ+G7-S:Nۺ<:mGl~rvR̤V䝣A.Z鑫jgF2(ü\ZV1]kokn#ŶG|=Ʈ]JD(`4M[ͨ]v3C|OTPLΙ㐎94R%& e8+]g; F^dC,~!pfK(1&VNve>\`}ZiQY90U"+b s(]eS%0-s)SD,תZYdsdF)NFS$jXUcfG˙JРei:&UȖJD71w(7 CE \M`#ֈf`K"˯[5d&*OMkΤDN+ۢP}M#mfNF<Ɯ@5m&q#Jy"1i:DYŝWsG:”j5$Bx/Zxm &^/pLۜ4 &KjVpy`#uڪeD, 6W;մ_5GM3еHR8WešcQ,3N)$#v"ULvamN>Jv>6W~بyL&GME=qej哆0{lT( /g/#># ސ dSd拜9KREKQ%[*܀- TxJ@xwű_&p^QzK^S}C䖍PlLVj~!u`L߆ .|*|:pxBϨӾ.kRlUW|@q0^eL>n0}j]}j=Ie^gzZog\gעMum^`Igsm,<<GӶk< =۸dmìMh~|ڳ`Kw &Nی//G@S{&F`-Y e`?cdmelrࡁ{hD3# \3hŧ[YX]α~-O^aPuwFtGם3qO ;Yp[unж{ݐ5lfPwڅuA[,GFپ` p ұ}@o:YwmU_]뇺tozB uzka^Y^aC(Ӧ}JꇿSuj֘Uu$!pgWt»lѵ]55Ko.|m`B]ĥ[k:P۶~FҪƞ(j)S:jI6h犹.>KUsߡ|׋K{P,:ƙ\5H4S=@WQqu0Fn_Y j(f~ ~.H j ٓ6~['З@Mi7K ;^Nmy}N B}&0ծ5ʰ kM)bfhhӦChۀۋ܋yCqlgݶ,wjLo['Vskt-_"c&d4V|31F*.(<ŸM'H8SKUS+* U/TJDS^uFN ^ U!bBiuT[]8zAKz+P"t`SȴR߆Etnͤxz-#ָU |G]O?=&(8,kg2ڌ"R*d՝=kl ;K:bnCy(0wh~čo2o ,+ z6i/PC`V== NkрFP{8͝?F|f![K]okvԣ4næ˰hMVu8Q9u>Xd>O) '½jiGb2Q_gz ^`\-GoM ̶vUChBFP+yݚG=CڎVOوzg}{Or<,E]at0o^.(HEӍY:טrCCob1s}vnծ-;jmfp+FOo`9`u@V oչ5F/~}+q]|gx:V@6щL{Î"#aAT؍E j/d@y hrc ލbwXI-K &z` `bġ<@5 @Ɛf(m:8S or`>ztj/6aϔ-uП;ҷ6߆˛ܭq{-ܩq:}A:ۣ[KLT"3{"f^4U3/ c_!˱vM睚{`x-IcCY'G~>,}k]f́jխ^*Hqۅ~PmvP X 2 pћ4tж/o6vY жV pP_۪ME`3T {{6^|O+# }lr zm>257oЈU: mkOqm4NcfVUUkdtn?l3kc{TKǚPY},ԟh(|W {HhX3H6y{Q$ҽ.b6W*]acg<*M[ rXp;تZ3fZ7"ܽc 3:O  z ]hx\=ץ!i' G]}[vOj66Lv@݈Nu͚H=FDNػw5U]c[SY{ryRC:TyCy8$X7 .)ًR2+PH-C>D;'#)niϾu$l_/H 5x=g>x㦓+\O?$;tԪ?u60:tY&ᖞݾ!h t}rCc"&Bi |I]%8 y{Հh?opﰷaaiW=9^aW-hIJ2kq;a믋'8Й[ǪYG$ku?ZmZ?6E"b8O:ұcPZ\3CPVxx ? 9L&Į#SvC^>Oj3b?-~K~N{2{>O7͂rm]k> m0TwݢqgX9lqΛk$q7Q<򶚪_Y,m>'ۅOw?8=9 v o!03 חW{`^mZp7\h޺kptm= {#`ר-VptCNNiXK\?)r90%/f\/I bK֋!v|ْ[uoݴ+ i$2x7jϾ;@] LZN,o֌=zztp]6؎+ UmM[D.%' Y PbP=9qm~痛dPݿ=v?&+[@iUp'_?X 4.zw NxE g-ߟ,B^SxDgKwlFCM%T6]Oq/G9@Ғi`I4wD7q=&7]l_oM*lǭߟ7s_cqql}/I55~=.*`)rc >87!&!sd̋:x iWcxC)F5 U5цUU<,LbzΕFH)\ 1؍bY[SB2MQ҉hZ{qb*vl.m{E g)+\u@R|+OoMzܖ]K8b*}i[?G{`c.b“DT7])h,ɯ ]?,fffpg{XY@o-?#%ΓFu)MHkHŪ2&b%kdM]bb;T JbrrexvS.`Y91]lLCȷ돘8<>CtTb2C4_\3.# 񺋿Gі֮`gJX~B+R\&FHY9o:Q~Yv䀀C֚E58cA:Bgu@vvClw/$ ou=>}@m$IöY`%b{ӏ,P熃uun{h}nGmm˭xhGv.Ǣ͞ߟ:):a_fPVc"\ʴN2:*|V\,bD08A{N qgnkxߡ?>y;o)+N09|cblF|uB'֝7+|pep7cvy~{;?߿goQ~ ͇OhAs[ ;cht_xȷdW_v,ظ}xyy<>qKsvT[1Yދ]2% d,|S N;W,gྍx{סgmJ ٧<'ݏcί;I嗜lO Fq˵8$U|]`]މIH$i"0]}ͷY\|Ooxe":ڻwq+JSql]a\O/Ú0Q|銷bq1JT6Mc%"#'Us#v׳ǖ HI.fc9Fq hg+CݝoEH6a&]u0 d`mڽA38Pl;F!O/m6~VS]_'ϮpzF?QOD.0I}g H424%Rczh/( 8ePntU =9IX' z"J:.A&K4T"ebRLJiHO~X$r.#z<(<ם!'^4>mPA3PKL0=ih+G#2 r\Ƹµ덬\ m[b*sb6szmQʳ8m8Vq(a*4I8w vN5ʼnt.ҎU&ΎYngS[n8d?;_-c.Y:ь5;|4RJg8b2;E\Ws$Iq"-HS1imK 5)ʠLL:yvݻ_א^>Ҕii-1XO'_ڊCxkq}Havk9^VCXDž o?qKpsJCvIY kۘo{.~P^:8>vÅ*[аmh84]]giT#5Cujњvle6Q+9n{]DLUt:(,=q{8exp޳@:%?Wvؗ9v v=#B'\=Z7:22x-sWlIUef3&⠀D\H)F*&JD(%2F02X+&Z*\R"( "Jfyyf{۽O,},9y{tj>3NwۧWfw2(`8E)Xj#*`߸zvwưc$Ͽ{Z)8#{3ǯ~0+ϺX`7Fp[[ƥOGiٕ.2D`EG_ܰ 33롾ʗ֯-D _7cpȱ8c3y|H2,]RYʧ,Q'.Ƒ>e QWw*yuRyAUsԳT2@ضe ?Vy?k??ue < Z쟍4o. ޻qOw&1* S#~iRA>j`~A:Mj̣t< $M=񶧻[bASeLO4sDv7u3gAXr~7|N7ɣ6Qz=QV茽0| 0_Xo{* 0[R0ֈ\%`3Q0Ʈ[1L76a 箚ϪЧɅTScf=vl(VyScnDq g/^xqe17oXrQ\Tْ!|1uo[6nǭކ՟+gZ3onrXc~x1x 5eY'S߸Ǟ?rr\7Z|/$%Yv'kvcff `Mvb||۟ɧx'qg7^5QeK<%~L F159~r'{f-.8]/^v*+n/ϏS/"c.\wOL${ tr8na!K?[&}j\sމ/^vm pq'N?\z֮O܇fgѕwclg]S/j7/^cNX\n9]_Ű{c8UC1{T>k;|)[v}ݭh⼏{㚇.Fgj"dR<[7}OahxWTD1Xv?a? 0َe@<-M߹@7m9n*u5阓'+B_:%o$'eY˟nRbg 8{;j1kj6qnyƭZ氦idU_^1uf2a5.(6lnybjD گ؝lq ƿm6ꄋG0hi')=\XU&̔ҢXPDkZ"[Jg%ι Fns*K_Z ˎ씔vbgnZ?!%ٕϮƍW=.|cPwޏ]w )81n[l-7$Yh/܈Kt=o`dm~;g%B8V}+ X| VQ=Xal餵un9o-o|n9_bLcU5R/7p;Zk$#c2mڭ;q]>w>sp`Ȑ[bwpapp8%M9|[K|mE(+@mlNl޴|ࢳ3«^}gwjxhP6~Y`upe``]Pܻo܍|Ź9rl߾K4z.Y8$X罼x3]3|xE. g'$>(/>\r(.2c>(+#+Ň/~Y~pNQ1/bζlV{yYv~?wQЕs.7z#w D9A@u9, ]Kt<{$A[K}+6\G:dIp9~ |S`$.,zwC<}Oiq/yN8tRl݆`|[g|fT[+b,,ceȐn,kڒ"t=4K`GK@{сL&Ahڏ]ӻƗn(y7m6] o]aʯmsSX;sGgEn iɞϻv&?::}d`O` #@iٍ=&W, #وG$htcxQlk!: ̲EA B+u1#y3*Cr9{R&T@l,2=, TgzAHiUgY-gT@{MW?[~8ɖ;W`V}IաYu*U>`grucزacq~ƘQBĹ~a zR~iR;g6 RC>WI^J{W[#y'iFQx:`]͆弩B[V`hZjP35Ϗb-+8V#/uap&w]6TmȆ/87K-V#O-AdM42qnϼԾ$>]0u }b5^7Q]SmZh3wGk7tP,d,-z6Yݫ&ѝjBzR7LdH.TnWUz0w潂)IU 8-36Dj׫eE+̤[EZefOJ* 1ex.b9\y`W3-E'Jdpۀ\-jܳTE[?Ղcż]V 2#ٱ`Q?kǤNc@q])QBOI׬'Pm4cle-TaRJyz~RAtHR*POV~]RϳU݄Ep~~[rN8MtqS2sYη]*Ep2uD QP&)aR&L#u{>* d툴'`^mỸ {{Kh"hskI;=Oʗsɛ-PA[lq'tEER d\Y4eo85gXⱤ5g}`3k~t}Vk~(n N+amO䝓xy?Zf %CePӐv]$1mr@` \%4`v%(wU\us|c 8~#Ӽo^~!|9&5ެT\3g򮃟oKIDATf ģXG6} fnvV̢p To+T3+Kh(QʟB{smI֭,YfhɅmY4:ɎY[]eS@N4P10YWۭS7yuJ6֬EDtGkkŌBEWx,O5\}ҿe>,*˴Yn{BإZaj$lF0H/EZqq)o@ v[N"Lm>G%^|##VZ$nȱh_%$`2*ʼ+UfpT9ǘ9e=Ӏr3}y;4& $ߓNv5@h,ؾr: \q۝xYPMJ'|JD6wo\9}Ģ%+>zf-ɼ9{7{F,"ծRocBccY[*J6I6 $U[ĹuYs_{&FG~4r6JH{gϨy0ĝ\hF A) c{.tJѱ)aXu2Ae̝ 1n[e i^E޲+^{kwnU+^5a%žzok,%L *)lGɪ2;dC6`ˬ2qL$h_fnI`ʣn,RJgQb)li^!cr<ʭ^a [#0,Ggu&9-eϜBW 2iϗ]~[絸@aN WokYvk{Jg։9w 3 (&; ~lgW:U( 'sIX{J Y 0c٪N($u7hڋ215 K M$E9<| 1H2zx1&\@@υěH{Ʃ `uT/p4Se)RwrƒNKܾ=GR7jPOJcr7':õxʰ̛;mOaހ݇{̨b0DXY{Y\3s^8}߾;Plj {v"[W" {r8|#<2b5y9 Kf8HJb{^:h` A/p'x! _@8q0N.j|kDeԃeh/sI0{>q#@7_dy =l5k[7&~7dQFNy,n]zhnwjGp Y(Izl5,gC'}[*؊E2k^)vMx)PVHf̷|äyGAx_q^91/d#/PkdlɱɚHˈږ|j{J,8oڃ%n+eؖ1/:<'ucHJFRp%vش 3/aH;fZv}op.i{w]0-[ )/G Ot(tZWXJH|`΍>ulC/y.y~39>~Lxf9]47=׏Vyx=T=8ذ8Ӛx7 <#zo8|7=֙,5#\Fq7No$dvD<ݣ<9~EFN1F ﺙ=FKs& f>Xcʬqf5 n< jesӨxCS'# #9(8}ds>@'tR*5>w@\+װ_&@c$oo+7I9OʥԾP{au>阷^]MeqsIΑn;lαKgslcb|ԥq1#_kiF_kk=x{׼8Likn{6vZ 5UV_I %5// ]muk˞hu8k9.转;a]{]oKS}X`)wʽF7?Z]?Orx- Sn۪>k4p.2ݷб7ˇ"m Հ=*õ:XߡSv;1ZOj羳}h zk9&90dh7'C&X:omX[iȲ+`v!sE?Tb*LTzvXuI 3UZʿ?G Nߌ~^3#"K L4>-fhoU6߲7˾ͷvVƳa_YgLG%Ǿgl}XιvE/+k^88e!._$A%NB"^ݫ̶:|`5{j5u;cwk]20a?qO?i$JN1K_~Z ַ&5ֆ jk3cYzga6U4bؕ6}:Yomll-i@/?`ھGR_H"w_g2үk-,׊i kZXy1}Z_M>1We!slg.iPI\)᐀#=x}^z\TYܘ0m%奄"vK}3WłN$ N}M_1ێִvև٣h]xcKCaRb2de(z\\/40c^OyPKӋ+<ۭsF~֯LQ8\9gY~jmUVM /.mlsPnfdQd:e~ZIFR#̈́a D!U^߸ Zlʩ#sy~Z][koI{$)(??SWccƴɯ{_H([sosn [<"6V1YU_ssZNֆYd?o6B,{Y}7su,xkko:?Z]ӍZPncK? Xri6ۆSQihݶgoR}׵V\{jkmYzkk*g>ϧ==축:xd9Zj{ `X{?;t0ox ݿg"l!#EŊYrGkg^jdUv=FUyckw\q*61+}g_md5 ܼz Qִ4*?vm%m5۷9Ƶ-w&>]A㺮/lbC,A-:CqBn_Qݬkfv'^R2X;B?Ig?m#]I$G:X^ΰ *U{?m>0պTpwsF=&䓴wX.U_o^Y8'8:<=%w~ەo+7gcUs X{,NOGg1y^j [@i 9 gkًlfzMnɋ\5PV6K[KtkmcsG,ުL zmi|쵮l?l g9ӿ(evR\8iߵMuZ罾ڭsv~oxādlA 0IePZ/α66@ޓ[oMnh[a0{\oFo?5'uzX72X\s]VVE ^ [\ѻݶ1dž3gG$n#)R^K׫F^%M a}{^=1־DZCowI;s?ܒ{I)c<> WNbK2U]sԵk3"Z_m `}{+cw'ȩv;|ضa轲=N ks ޡ2 A}cs۷}?_N[#C+Ng8lexpY~CFS_h,=7XC—3;;Xc:w;{ \\&?Rz]GYoi_w;cM*ŷ 1 kgcZrT2>g<[wK!}i ?]er2*15bh"Y&fb8GF Fdb*z`Ap~s~W}cF !-]Տɣ&Z5ո;湮N- ȍsg!M?Ձk[eVc^i`ożQA֝vc׫?ܢض84RJ|k))گ^՛ұj7VRsߚXj1n a'@$7!lnTK ,c;3#b|S(Jьn{Ϗᓂ Y#7>VwT:P鬽k/x"}okorČP=D~3w# m7U3Wbj{eu9SKOH`#B>o>"fubի'nnk18nI  \È12_ko.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1OM ߋ~8rzv5`CDа~>o.1wcV1[ 4M3vd))BwS>єBqSa" `yXy7c=m*^$(f?j ζ%=/K\P])JTl1olݖ"Y *@8f1GHlXbHØyd/l|Z}œ_'>e xVpA9ԕܭf Mқ{Z'+&aqM/eyX>桽sTǁK( -ZEٓq'J'|wP?#QR)C MGPV S1C:94ap2pi\Ps:Tkւ 1j U?%b]B90 bxV[ѐX)]&IŒhpfH<'|Eg̫Br'<\rm6\X+Mv$eiw{zesPQeˮʻv=3Ea *7+b:HRMZ | ZkbFHBPwsD#]&+ud2$@4 Q*d=|SU5.^tjrpn JqKz8dr5@-_ 3]l l \f̰t*PHXdcQڲ3PRGwPLEon6h'B̑7yDb0 0(Lw'Yy&@v[mbE6zSS.1aJ(4zW7ȆJSbEN^|j>.͛nQ96,~R\֜&2sGz %F^LPbr2r rSn|6@H*;tN",%]T*ʥݻ\ط<8r4Ph RmA!Ad9,~>:I5Y2EPּ ,g&x0+:tXeB'ƎYרPDrkV$p}̠m$GV1ˤzTLfjB":kyrеJmW#R>B#Mks$-\]2B54(Ñw$fU ”B@Q%~=1jbulp6es[g"&(z9)Meua^@G]_TV؞XS)wh9XҐBNkrEi, Y$9;`A*)9,ٵ;Э)sVgbW*B,a#I99]: B f$Y%JqiHCjWyd 'ɓ6<.VM=08/Lc0JU'@<(JCĮ&M8L|e ۩8LrN\Wg/2n1D6Y~i/1&4Vՠa̘}6U&d8:]^)d d)4JQdz_]dn]-r;tsS֓K뾾,ۜv+)ܳb7z_]dv.]ԖNiﯯ'w~}w,ǘM'}}|Y?8݋Wc%SgG>$(O2.oH{{CE15ec=[#x Õ` b8G;J > (ɣAWa<7CPC7%xՂ#ݪ85X80ͳ{=MTʤtJquNi#' bY I0X"MPZɰqSd XH!gF oHY>w6}zEK1o3&r ZrqS]h~y9(.B0 81A]%&.Iz07yE&d?WvA֤ (\>Z4Mof8 (װ]ӗVҟV%D_pox*:)w8U >؃{+13NDד ՟>olW֔&}-tq˴ȻBg^N:׿ūa6df;"ǥc#3<Q f0 f3{fd̃ -ˆ.m6z1gsEmk7&dVvNɦZ6μcM|y(.ɥ9D"LFS!d20qo{v.;8ωŻ{ rTpyީ4DξPd3׮Լ\lnr N2IokVog6ˏkR]Μ ~(hRԬieO<2FyDnn1Ju,Lp8fbHы{<=̋eCB&Jƫ!tR-i {)6INPvs,jt*4Ժ5;_&/eED)עSr0-豂_seqE '}qY32)w)Co;mrwV/œMOS94[+{ǂ8"3qLS:՚2ZpַEMoZ-x4kJ\.ŕmX!,Gp$3}Gow3] ް|!Vp2aһ@u{N-|mvrn-H_o '[  <:yߝ*TTz}wœs7n]-rqܳb7z_]dv.]ԖNiﯯ'w~}w,ǘM'}}|Y?8݋Wc%SgG>Y"p'"p'"p')9ÅKRk 6y,x3ڥ`dBDzdzIY7]Pf$3%6.+O|u5ߧz݋0 ]§kpJq[&˙kCDUx}^l[\ݣǤͩ 3sVx1 %HD`PV;l9lD 2 E(rg ZLϛfG^!cl3x{ cePuF^bF3ڲ|GPҾvsipj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'"p'"p'"pS9Fc$^iMg| {3r0qhO%&$Yim@]h*5{Ȉ}fK<;{̯H{06"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06']ҝC5;]:f(!P9 & IFӌ&eej<E;vǚ{h5Msps(<1#_l7migCU} n0ƚseۖV~eʴw{,DG^ڨFzT Y]q$%Z a }z65M~V=٘_UvTGOgꚦ?٘_U?%NO?It~ocݙoSTGOgꚦ?٘_U?%NO?K/u}3`sJs uRq {{¢0,I<>醀>ے6׸B5.(9o.J[d),Ȅx#Fv66o;k7–lc*rvq+cdddͨc5C-nml P- B2\!0 g!; ]&Gb\LC"TY@.4r0u012iQ!hT٭Z:-ntّs,͑ٲ&ӠbB`tR*kY DC7\ߎezCmbv)o8v/yLߩq÷v)o8v/yLߩq÷v)o8v/yLߩq÷v)o8v/yLߩq÷v)o8v/yLߩq÷v)o8v&y&5O1 x3MR8{qM|͚7\3rV{Ms-3Zv`:]1Tp'"p'"p'{v7C>pj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'GRr`ã9{_ϯ*GC:;.R.SMa"=J'NN:,#'pYe{,bdY;E˵zy BvfwQ)t00"UFlL & v䐶$C:XQp'"p'"p/l5rY6,ad{qP&0^,@;YX,^&b Ax\nRuRk:Ч<R#A_R' pFØF#06"R4Li,o;Sq#2bͯi1S҃E=cĉ$4!!h\{h79_(35_n>]t#gI*r6&5DM[9AurKNA3G/2 *ܹFz\`x&%"g dXo_X;7mR(:TX _ - CMbgMNMK䩌a ߳RN8DU/r.|9fg®-Ug|+JVJNE]"'ɛf)O(Q|gȲmȹ_=jV-J}8Dguvv+G&p6w& "{fXjf-9q1+ŋ* JfjY.G 3֊ovv^h˯Stg_,h) a5ǐkT6^mYk*r>FzSXNd5)"CEY` , ` =c_O$c37~.[c2&ڽ9W7GZ"X䳓+HR`p 9^[q-,?h+Z%BUwc+ӢԩS QMot썀%fR0yL$^aѭ%䐸H$XJ´ yC;;{1.ÄN8DN8D_( 9,gn QaQmʤXջBXY9o<6Zqkm:Ώc)6@FI(łI`s XqU&dCmMbA\9 uֹ''#`y0LXc3 #7#]an$Qd=G7;ɘnӌMVI9VTShv\{:Q=ܟbC%G }׸r8a,YF{xgם~'?z 3j-Ӫ&:pt><2nxb}_{8EiI}fn[O$c37~'q_{1Vdug0!JR&6j^ JVI/?Y8p v1=B,g]Ƅ{3%x# CϗNh}o8CKƼ[ԇCMz)z'^v<}m>-,_To?/^Ml%}X~7GGV;1ݞ-Q;ܻfٮY"p(^]3 rυ\&>Z3tπ,W͢\"EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p*]Kk/#˶o-'zQz>ٿ'&A'"p'"p/t}HWI}^3S_EJOrJ5ʄH*utrp^҉ŪNJLP.Ь8 S23mRL"_l qf&K8 C:ԍeh)Sqmyl)R:, G*ɣYy5BHꇐ>.=I+VUc/;Ci0yi-$֍Zkz]jCiTդ`ȋiZixr9 FP,A#CSU괞;{ʒ#bf,Ui '+ eUa^ 4)  [`9xt8gg EʅKiɴfˣQ{gLv2Z.wK}1N% L9P51.<ҌI/ExICڭ~+Јff l3Ha ]F"Kt-ɽ U) 5 uIqc=F]ɽLi ЗǦ6.I*MѺpvc\f~,kfdIq]s!˚*CW2zR?};3˒?ֵK7`>qMY?I1Я;NWXP#$9g"ux:DUܻY^4#Eў-i|wqګx[sPm RBPTB˗XeObpV!gqNjH{QmҏR7KvCjQ=@w(:kFUq9&z^;K (;ܻfٮY"p(^]3 rυ\&>Z3tπ,W͢\"EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p(IFlnX:-ycou]J|U ېk/ginԱIz5@?:kvJ[7mѴtڙYudܜiq-L%"^_O1 oMn>1 0 o;{qc9טӏz{-^ɷ_#jP7 ȝ<ApvUDHC@!@Z)}I(#0$TnϦFҸ!tt@C$qKEwOf-ح؟q07LzΆYZT"LRRd9X Qxȳ,ns"pXwEOU߼,8YXO7c`j H,3=zǧL)81RJJQC"5h(m)5nb '({ҔjZJ%nQlB\ͩNQ9HIBLL"߼"p'"p&Y&NSSM$Qgafc33x4&J ^M}6h4ہJhT*5{t8+gZ&D yJd3LσX^|{,ģ8 2"?1]Yw=[5>sPJbp (ZqquB#Q87="*{KP36%v:e BzKWƜQҖ!R*NjQ^@3ic[w9F5j'4䙳Q*V׫f%rݷGVIaD.ͽJ34#Q[nSy=Frµ&`̶ZxUۓ=8s=n"e.K|_S! Sr#-i}cjQ i_Sd=8ppBՊQx7m1645npy];Eg"p:G{l"[5+?N8Ew܋&odYUFn"RӄQWxȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RT&v҄kjr)|ekeRޯud2VCb mF+V>( "s}WIZRz˺ɠnC^dp# IG(O? #= g##/q/5tp,tqgXqd"|AqٞXLhʅLȆׯ!N1)i|&sTf6rH'e aS<< X:ܞN5} Awx)b}ڐ J]hB$W$]K(Nܓ6HQNǿxyš@uF*0mz\xD>LA{aܓ&"ɩzޛ5q_@#3Q 30ܧ78HbeUܗ98Euızf۽Fm_KMEk{+&–>6@@BDQxvRa@$ 0K"N5J^Xia̰&VCYH,b::dr:(υP[Y3ofӳf~6a7oBvSvjDa{^ʭn>!FP\-Q9znxO3e`8gNyu-VL)&J?̠KL|$RhMpw2V,0gz5()NqitKۜ{Ojt:& $uvG ͧ6gff ݘca>4R-mXXvSg df=tz0 jLfdohvD{K#BС"E^r{DZddXY'j[zvJLK*}sjsƗOOuܳz~ 9?Kӧ:wnY`=IOAڇ{iq;w,߂ +Hqٜ$in;pP{G0!9kץYZ:Ŗ9W%Ȋ􇎺P($\D`BozWلDnQ^|aL߻,m ڭMڮ>){* 2C9p-DOkQ<Ϊ邆PN$L"=#˶o-'"EO7, U~Rc媣7Lϑe|)U^j/ivksrVmս+JkiF2DOB7qͰ!PbC"̷܋&odYCb }7nS *QKXn<#1z EKO;ZL(j{mdT5PRNhXKI#yYPbx|>dthx֨U.^B+n7]]N#WŠ%v]a$ IᲯ \AO]3E< =8?&gO%zN ?^ӃnFxEw/I(+E9v=UYq` 4 mn('ga x08 hwGEg=&stWX#kwkZ%}㰠"Ybn& F&S+<4TQgXńpx;490,vg"p*n|p jzV~5 ^(XU2lr~q12v6KcOgx$\">8EXv7PV}ӎɫ+[{u*aCffcF],Mn~`xpJ8d1gZbgWlŬ:p ,@S-fOGkѰш~eg"sq,hKSvpG<ˎ_!-Ny/G9Q{}Y-1}[ytބR֕ek Awjڏ`+*+XM^,(FUR8|Y(U(ƹ VYΞ]G5-7[RLJ[F:7k"=#*cz@g+JrDp׫,$SUX?%&GmmܒL3$48Ӓդ8e ,Hjuu7$l*O Oke~ꮷ,H\k6٫gk]kjm(ʓepOq LgmαRh%R1Klsj% kñ2"rRZVxEBz,+D5BBD&% i`PKܪNc26|?dTI׉&TXT*TӍ*{=ݭ2-n# j|JYӼ6iUިy!T:pBrrL.oF_yap7?/L45OyE3K>Eh}~FE"T0l7GmWucN92-92,xtf?EJ}~?ۼ"=EwgAtSRFiÙLR*ѱۅy^bHV.bŨHུ,gѹ&C^7@lZYP2Gg:^oaPγu< >g#}\j-vVi+үCFt:yх'*?^n?apgJכ\"4쾷NHuFzRJΖuV$ ,!ܰKoe%PQefhCsh;[Es^H uvƿ[- ~qۄJ26mr$ "=3mOD{MVfX+x)ŘEe"p7EnYU곌RR4 hN8ig#f19>I}fn[O$c37~*uNulcK6JąG:6^-9:(ڥmk[Z#,91^".TVE`U%'uZJ{zB"Jbi ?2}v̶ ĭ Ʒ%l-;cI5^LJjJ\`{\A[$X|R[Wg7|v4\@ԵX$S̭pumK! a,ꛑ:+qM ͦ2&Jd h}K1Ȍ!,9YД;(x1Z"9j5 8mUUS= znv[\jmtIԢEOY -:%kLYSwRBN)(k5klj`U]CZ'B)XG`XΙHLLI fKJ4LEo6{qP Rԇj\Ұ®Z SzBv3ou)%154?y=ssX~2ތ`rId,H`:o+%yQ V9ԇAl{MqoD*ųםVJЩ[YF4X\yF%?Yč9a>L45OyE3K>Eh}~FE"T0l7GmEͷԇMtm*|}w39q['ijO3YUZFêdH8SMɵ5&!:i >^@?e6-2[,{YRSԝJVfƔf/RdVA'"p'"p' }wKgby8+*ZnK4kCfSVrK_&*Q<p̀3)JQHFHV,c_ W;MxDmoN3/Nv7GP=/Sm +`h#i OcSG<<LYnH2N@GPYo8Eh"Ee~Y&_ڢXR~ |VBF ȃ4K/v\5>pה28:-H[ ѩjg'1ᐪkXَg<"EgNMqچc[*r$O[s5wʨ+]O]wGTgNs^;EkNFWY\O1"=7]Lu{b5[v_t%",okQtΌd} 0+< 4gI$"Bo]ڭ`ή1n=q=L9cIQfVѡ\u }0ILq8DN8DN8DN8DN8DN8Ew܋&odYUFn"Ro/lQ R [hF=bblʞ(,'G;ᬕUGuO| IկLM놚}_ZpB#!UCkz7ڕ%Ţ+HwE>w܋&odYpiJ@wDH"Ox -8!9J#Ө4XOJj7kU=D*D UlLt3WI3K>Eh]Ij {m3=;|f;$Qm6o)D|[Rgld nZ8ڲ(isY+N⦠>:٭ Y"p4uS) i)8>Pgnk[ uX&R)} w^(Y88!YDZu 8q*p FLOS8pP.VjbW:ѠoO^.|Y swa,-cf(;ڲlY^]Dw ծ=˕LF:uI1[E0C[WaCأqq24$Rv"ҽIvNhI٦RB+]Ol=i)e$u[ \}A#RZcuH.]+= ;jDCx!iRz,|,vd#DHbHlY!M[M$UT+ل;O*씶5H)U;aFb]('.j tmp"ƥڑB.jcoX8f͊n9?-ty[p[Ckh2Ќ&Յ\I%j-)EP셥_7>^29+3QkΩPd)h56[zOX@t~FSPQ8DN8DN8DN8DN8D%)m"LժX viV[[jĈȫvj#DٱH"ԅ; 3E4lz Tu+ڔC%aʈzGRD}H>;aLAHsIPZ,ۤ+[ӬʖlD-Gvtg8qN|:FFZ&B]קmkCSUg,XEhmzzpY?R*ZAԑ m%ʚo]7!c`*,TEPh8C{]2:I4a$ne3Ac㓃'vFOu(:jn8̼,9"&TPMtʫmI(WSk77XpY:2Plݳ_O0[XdaWfc*܋}{U{nPܭ@*0Ж{ԍZ#|!g&RqȽ,τN8DNE]"'ɛn|*?)1Q|gȲm; exjWç*>vz?SU/[`TzϠ͵Mj e䖹@R qJZ:^k& )jF*Ǒt}Ǚ= x /T8 A4`C0+{HywL: ԡM"23!P࠰  ,87mM"a Pö2ΞWPuS)UQiw>A;jh;(j/VZB-7k,f<̫ISU416(1;r$ޝ! FI!<"E9qhLϘ֘ܧr7 C:3jZk\z*iIv5POdl6*k:RAlEwkE~|[yNָGKU)ۿH^*nkE~|[yk\#%zv'׊_;uqc7?fꦹ$W\v=2XǪn"~xٺcLn\h5'$2<, mʕ@"%@D v=2XǪn"~xٺ=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~>E`'NLၖ()((m@v égD*)JcD Xa@Ԛ!Z,~fS~?VU}dkE~|[yk\#%zv'׊_;uqc7?fꦹ$W\v=2XǪn"~xٺzomWpL?3qۿH^*n7݀R8WWv?%ʏ>6@9Daɲz&w7X$%JŌ%*>&aѧpL?3qۿH^*nU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_OU5">w㵮n=U;wk^~Ms|Hϝo:kzdUNDZWuS\+zή;Z,~fS~?VU}=T7Ċ޶ָGKTߤOկy7_ZgamʹLƷIU|y|$_*$Xg"f;w<-00ø^,Ydlt9Pu}*KXJZBѶ36Θ Mmuw-3IuYj֙xF{kkoE/WifV^T7 "Q&P7aÂejmORn &&o|xCL%eY;=(vU)w]և%Ӑ;sѢLIƸ(52r&ӌ`DN8DN8DN8D];+EIw 9#yFr`c9{{?x2qaLգ`gZSk@V ە{ܮQ'mv2VEa=C2WoeWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWML{4G{'eWMnslwO.(]Y7!jl> Xo9i\R8t _JhaOf jlrc%"p'"p'"p'{kMiI@h z^ȶNMz1C%C+ai]Cr@9j$jHAenOK`m퐌]=0vԉO/ZюF+htu[aA$@MN\#!`S !98DN8DN8DN8E6#[5ɸ:vraDU2'05ˋR $ȎwsF;kcFcDfr\#Gl~ZҴmiZm 3RU>ڛF4̸[2z;:[%yqDRj>n/ x8ON+\2T#T8 'hQG&HӇ}k FX^x~1W';߸ffEZוR*ŷ9=$zL slj;ZmJRiM ߋ~ep.Ճ BxޝX/|=4 T#HN2=t.$<hI& <&w 7)&$'<s,lƎPy" iEtƖtoqqMգ q*GÍ1qձ}5.2d*\բ"p'"p'"p/B%ZmR-`1$kF oW8;*=Ҩky=CWֹ͈o-%'8i\(ٯlyS4ֆ;E2(\ƱEhtOr%kaV %8 ÅJ8Ӕ33+N8DN8DN8DUy+h >/_E5m۞'Z׀.wy"p'Mh.a8"Hr `39 3)vU+B!vdDQ @0@{KMl΢ۇ#=(YD#҅ynv yMhIZ291P¨i_ݱ={31BTn5dK|DcRR|qFP :f>J Ix{DCΏfT@˼9^B^oxx;rɈ:$:٫Pp-ußX3¤&2cR$gJ#'baw7UeƲuW`/Ana_h3rɊTAFz BӒ*-(Od̖hA>RꮪS5zj:宬Bㄠ ^F MW**U եLFZkFMpfwxš*%GhO`4r3کX0Ѧxq F5 5B:1 C'$sSP)'"p'"p'"ONiƙQFm>p=5U=ٶvӚ:B /#Kuɬ沚Fވn <25z 3#aDb'-fR Kgp a!K:Aa(1JJ& \]e"BC4UBbQ^jALzK,]Ȃgт0X4Sq2 w)Z+Z*JhcxB# z`G3&hu# Jm(J83ٻ_һ!tL-:ī$pY o`g7HRs^ȮeQ0VYsKN-cO*ߍ7Q\A1.,\m94:C)n!j.VR!}<ߟ:p.|CqfO+_\gq uu7ExWS˭_tϛ>n9[Ar?7T1}_r O.;>oc'd+¿]ow |=P\NStW~15<ߟ:8Az cjyu?t+p.|Cq;'M^/~~?W3]:vO+_\gq uu7ExWS˭_tϛ>n9[Ar?7T1}_r UOyc$*j) ayXgUPI-jia&*`0y7Gsc0s bGnj3$yȝ .V#4U ׽;N4qXpnvvL ĉ@1dLP=2ӏUWv t8DNf95NKq1sie?#1!/n$&w>BC0˷1λRE*څZc_zquU FyZ֛˨ׯ7kY[jCH8acB))U2% /rQdCf,T1w:yFuѹE,[gjÄ˷aruk`%Q 6#Z% f!R5f`cWxrp Ȑef!fn .UhQBd@@gJmzK'BvmUօIn={cdQ^5;'FʠULK0ٞIHց/F18VPR`po884c>HyYZH95SgSɫ:Ee[kf /Q ' *9e Ke'iC\Mwt`!u$%AV뭲L4@N p"YijMc{nRCG~Pz`8`y7t#MF՚4]M}+v_ؔj{!΄ ԥJO{X0gpE뮾Tf4u*{/};Ea̸5x(P*&4͚TWN8|[H65Ƌ f&Fb 8PJBRsܕw#nlsc0gG^b2u/qTۙZmVΥ$iͫl2PiAԖVNyw{.]xӤѪ$]L4B)6܌ ם|ӅF2bQs ŷ7% F .ʤT2qޝ`38Xr;Z>9&uI" zUu?t+ܩ8Az>n9[Ar?7T1}_r O.;>oc'd+¿]ow |=P\NStW~15<ߟ:8Az cjyu?t+p.|Cq;'M^/~~?W3]:vO+_\gq uu7ExWS˭_tϛ>n9[Ar?7T1}_r O.;>oc'd+¿;2ݚ+%T((9ǜ6[W6AJșx8]x]cm1΋,mLg.T]TWKVƚT#04Uχc4b%Ƕ-@ʔl94**UT/8F,B}+t[G[fM/t۔vt"V.&-kևƁ)!ЫK+}zz-yzcT:zE]%LTḈ1A:<ja7 HJHI% xȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RN8DN8DN8DjEbtRZYpC{d_Vxa\v`woIp#Üwhq2 kg^wِ=ˇ*i_FɓN$e׽Gq0ޭ)ʨ7%Qy•/ KM&lce-EP[c+;:0y$HhrOpA8 ;&Lgxzk'0-kɒYL1"tqXV^>pL-8GWve*DtӱuVt(zt[kFgS=VYC2ut mw3ڹk?M9}-˫[kFg+_o'97Xgۖ g {L *#eMtL_L<`amkHSZ,rIw+Wش7C|mw܎,zM@iq-q|%Ur.J JPq3` xzqds/X[TwGsTeYn,&@sS6}o^ȬƬLT\~yÑ.MC]rm#ف y&y 8DN8DN8DU/r.|9fg®-Ug|+y?w15̔qGBwk"MnɀcO'?46 bY9]hNX5 @hJ淮%ެڨhv_NkRoF%vO'9d.ybN|4y) I,C"m"'ɛf)O(Q|gȲmȹ_=jV-J}8DN8DN8DN8DN8DN8DN8DN8DN8DN8DN8DNE]"'ɛn|*?)1Q|gȲm-º햜m%Lu@~P:2lgLKv9p3U dBk;ܦ5Lc>Hb"5s IY+Ok4ntpN=&R&pдڽ9S2 pJ 0`@<%@ oa>L45OyE3K>Eh}~FE"T0l7GmeS'"p'"p'"pKb8s&!fid=5NIJBb0 , c1*IԪMP;KVܠ:XXK0- ^%C1J1%{7EA&,.wM:|Cdž wXf1!qiAvN yxπ("0ER2FE.fis/C򉺻mK{p/sbS{bѝC*2E "MXB|؆79f7gZ͍>BG|q^2scgML1Lf6|B2رI*7VA)ZNX9BK(#ÌvSv0ӟO% 4㒢ګh\ԇN)zH~,e, etns"P 4DYp_ Bc…?-yb3L_6 Appܓ2IA3$E[/!Q7Ew99y#/鑦[ÌI|][+v #֎V\)u.l`ޟ_eB.Y@Si=rj`s 38XHd|lkƪC3`u^S1#69앹<`-*y9. -iծZ3tπ,W͢u~[Ԓs~o~=b`Lu^Q;=*DYGL49+1oD{s̡d A8*k%yR/zB6|6Ͱu۫'6ŏ]mZ ]k FBdf[Y1$%H$0" "'ɛf)O(Q|gȲmȹ_=jV-J}8DN8DN8DQ Pޖ,#6 ů#9 [ =BE p_]R@5ֆH N* JWlamjazZdRԐ LSTZ~oR[aUٽ4 j_"^a 6sr^ָ%#ih?+4(;qh2r!:r$)  (J,XB8qn-;wBC{BߌI/Z/;w.')___xwD] ]>Ä*D ݛrȫQW'"ݫ)a~ͽJDF.+. b(wxg kJJ*`a</qլYtnmGLPv,]G慨kAUZL]k G߾ C6ۖ ;s:$!a:Z0rŖY@(,Yec;1p'fj]p! HkylJاki1]50ͪJɸ'ŖR3Li>ﯲn\N6;fKSmWjqxmHQTDzQaqp B32)'"pVѻ #nrxm} `!x&e7E,*Ⲵog3D-UBZqZDUyS[dZ%P)|qc˞TShTt4 '"p'"p'"p'{v7C>pj>tY_6ˍޥg,ꁭnt ~lVMEdr0K9mJXLy+kcݜDpf=7 OHbj^j͵9҆}.ڻxkH-}"r5+#w#;4sӔEPby=ag*<2+X/r.|9fhkž-Ug|+o !E5jaOroӄN8DN8DNW7Tezm=WԳ%l5<!tp2 q#N4N8UrӮ)a]k8چ\ܫG t1hL[*j 2uX|5fı}ԛhmb5eDR x+BYl9iaa`4F# 4a9!Ys9nyԪUZU/lt҃LAMh< e{FlnXXwDyJPy`43 "7[NK ɹ kDLKeR59uP+^.-jĚtć1Nm[ Ff4l(`t*TiD+tAr!g1dY0svsJF5kԩJTZ5Z}Z6 , s W$*bHDnɔPlbT#1@?by*e|/?ZP dDS$@eCf05e=%Mn`ܼY !w8;ؘ20D1ղ/i{6tΌlQ3"6W < Wl*I7?lAEdΙuE h(N `{3vV"p'"p'"pQ]Q⌻sg,2pZBy+[[0 d!^W66^A pS/KV;f%3Eڋ zV6F'J`ȕ&lzJTr gpk XT$[] PM+`cCR\<L "<%,^ϴaO]6 [WӃYHOn1DېlN8DN8DN8Ew܋&odYUFn"PE@MO4Q4w$mFx) <16I4J2K$%g'{lW5S5u,Dӑ#@跣@"qSs+WEN%íXI yE9܋&odY{}<;i[T;=˫pN㑽xBNPɫ Rl[#~(r=Ljo[s;Q.3Y5pkZin2>"Rzal`3PԥPibJ畫^V:=a&PY\5рwگU7(s:gyB@d;2Kj3#lYbj\SQ>N!;\%WvP`&ķGŮp7Y7|h@ZoV%Q+YIؠn2w뾼#L\t} ۵q^+F=@)2km -ˍ-o ;kZA0brLuY.N#|=f 4< I޹=CIs&Ӝm Z(FC\k|pefZgZεMZBihKYlSK յa/HZHU ZRZ֥X <|?2,7dkP3ʡgnc^9 k\hUFُ'θc[\;y9I;֧@mkٽkf0f9@sdq= x{=²rk?Z?g5F cB}/=_-A_ҋ_N8DN8DN8Eo k}dauOqTr;rV1HJ%m64L'FH/Jg,]:\jDV]# #x,V^ ="WGMxzu>[3 m"U·,|j0)/{' wNf p57@lٽD1 :YCY[vLqQID (9- P3pX"Xz-TîJdE1T/[9#Cd ꓌I0=o.8DN8DN8DNSgNݿ#v-K0dXc"f3'bhdRF`$NƤJ""8DN8DN8Ew܋&odYUFn"Rיgbٞ_QG JR w ^,{֭ZyؤN"GKD8*M+9)a>L45OyE3K>Eh}~FE"T0l7GmeS'"p'c 4`,!`ŀ2!c{ }c¢u-C T'NLZH0o]_\ɻ [[ekb0kts%LBEx &F:4iH!&J1E*r D'NAA !!vp*v{~ZG9m +~D<^' sj;YeQ_K"sr F_bފ/ qrT2]0VJ6އYeGWddx\ش|綗`. =8qGLl!n) p¬alF;Yܴ jGW'R*nMoB\D)l( vI֣gji鞑=}C>=;{g2!9 JQ{W*LDO|ȷy]*aMIw|ʑB~IXA@p紋০l#Du稧QfF,[q ;8RW^g9Zَc!@ԯ!s @"9Scfuٴc_s'iVDc=>igdQH9+2dDjƤ$N"-e3݁_MِHfJVBy/Dayی=q,˄N8DQWxȻ f@囡 L|Tf:Y,E*Y+8Ew܋&odYGۢXa 3Qشa++#j|g> VII(=N;s,Qm?KȔfT1O3%:RQ.iI‚payP`/|:v<ᙧJufCu^N 3L3S241 jb FDb,*VeFϨlܨm܇-|Cݚ}{P7& TFH\/dt 2,J`-BbǏg!9,8(Yw9= NfK m1t,L>%<9,G]@6n~ &70!DX3C?ʞE҇1glӻ_p/A\y _tY /` "iu3!,j{11w)$(H=DUOEblAr !‹ D$1oo%lQmZpPt HJc pv"DZzKX /18xEYfJv q؋v#nӈ˵!<8=H;Y˛[֞IX"Jj 43 8h}c\8DN8EITqa2DQv,J셊=biLjGǧCLԙ'z,J$C0asUK^n~  onm2\i O'MUf~!FOA)FP8 ZFe]^:h%@B1myІ:)W@!П!9V`1oIMԳHOwCFŽP*uYQcB%rr `YxGpOjqe+!/fhUCXiR_8.M N"J-K;EĪHi)7Fz5 @EDN8D'NM^D_Տf߲V<j)D5:_S0vA`S":3,R*h&i $Ϡ0xDN8Ew܋&odYUFn"RӄQWxȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RN8DN8EW|ӆ2 gQ N>S7yzP"9qΉg!!>Ap' qیnjvH(g{a"2.pzT6 H Cq/}vYR jcS'HL~gOv/ZfQMpܪѼ/$Y:zK L9DnD/+#`DVc^Љą Q`E"ϳ"*cSBPЃqv8E%8ER]Wޒ[1Jc:ߋ%2#+vB mј<-567!ڝXT`r6fXqpUBVcQіw@^Dnc൸nkuY(_+Me&rGT2&\:LkѡG>餙܀{Tn;bSBȂaX/WFAJmnG#k[3(A!3Ig1F>{z|^Xa{,mRn{PJQw{8As)wQm2Z 1U\`0GCX3xE EOK(z?niY5jfw+4BPPq>UXXgRƣF4s(ZBy 좊NQdX (,,8 ,01cׄNR͇ N-_Gt%NmpFV9 VڰfGE: :J[]NӄEt"p'"p\[LlVe&E^[iMw6d8 U/IB#  ?(En ptgS2-[Yfƞ2dmZSg3L0b=|'L7"φB!X"p(^]3 rυ\&>Z3tπ,W͢\"EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p'"p*Ņ;c]FZ׮J ݕqR,\Zcqs$V'"p/%?t"EN<QWr5ڞ^ 4HEEmBTH0UCsg&@1dDڙ ō4kTDUIulgliuA[AL<cL.";ײG'$ ُ1.] )kTJ \#=P#0ZHc]"p'"ޞx }8ƖywDp; &z1 x?k.BiG3+BN8Ew܋&odYUFn"RӄQWxȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RN8DN8E#Y#[6I>bN(!ocݛ}ȳ;a0R{`g21[hNȶ&tMH!{iOoYj`@Lc) WSLoÜBLAx8k,)'"p'"a=I{Sa&HUYqȬԑ곊Ǖ2,:_tX| w-'zIkj,ة$ud)-rQ('##ɲ.;_A/J ʞzwi gIΫuf=J r+;jgB1Pok)8X!A"0(SM`!8EV鳵oF7^hoXunڢrf el5Fg(&7(8$R+^knM*NfVc}gP:孲MEnîzQ0RL!\~(1D'-7%NXiv ʮqvA=Fm 0*Mr*^u6LQ<&L`30K-APϤƾaݗK'y(\ Eu!(=ѱZ"MhIv-DZ\]JD5fn% Ğ8rP^8DLZͥӱ\zQQ7v 6YB0dX;.f%9/`ٸDU5qRI)%eN@bެR[?kwpBq I)],xDN8D BΫS766#T@#Rj' L3 pcUpj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'"p')SDb/^^Nk%*vV[W|:Ja <:ADEifքS>Ǔ=SmV)N1C%)#;:=%o^#MFWʧek֨""p'evU:W̮t[ER攁0b$.+#Fވ ܗ.Le+Hȫ5g.iV;5YkğanSKXzޭSS32o8"ʽC۪H=K#n)hK_~,]'YH/G|g1Pci+ΣU&ڣuҍJO]+,Egx:rnv9ƔRc^}!we;` ،4J[]1qFiea*@7Fէ8mN8E݀j205X*o~MlXCC+|"j w!0ohu 5l7'wM*ME%'xî#ZL-@}{eUfz%p<pj>=h3j*ui%?LqYx('zʥ}rdU[3y)QĔ"<E!m6Z6+nIZ/-]Y 5% '̚*$OzVI*Ry"'G~w6l5/q{61kn:a<ئk?RiNnEkv !䩰JSNHӄQj7F$QyRKNXGUPLQI QXIF׉Qȫӗmv-=ۨ=i,8ZCN=9npX"ݩs147*kR v^[S3S}OaE`ԭQ7y()hmX@YP] jb|~Tٕ$z.5Y[MP?G11ckwʠZg13*piG0w/w0緳<"g}qt P]S:m,KBz(2ip[۶,w#"ʴNwabެ-QiK0U:P3-15XDqN@CBxt(*2+"N8DUsg}oF)&nAT3*IG8V0ָJf,"&X,b6։;ina`emNZFftd(8dIЧNQE $!DZw"p'{v7C>pj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'"p'ZouI؋fV=,F16͵8 k=$貜R!V'"p**,^sήtˑĢH:L>IdĔY6Xlp &d*<6cF$d%F,,N8D8eVX5Ŷ!n~96$vՎ/&ԁQS X*ic?Q+'&++}ؤ1+i WmdKȏ^ҥ {!b ˄ HYuzԚ̚hs%)tc+y[,k@2ΕYC]:UY\U"JTŦ@*R7"p'{v7C>pj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'"p'9RM:u,v]9:\2ٌ!1t"(cEh"p'"-E+Ju*U9͹ Ar jB|CH?tbsV'"'[Hs?M!sBn]LܡI2Rj؞ոQ 93y h4SMRtTOH"uER{\!p :[apUZ5 ߆ci6StM}Xa$ jY1Kjќq\U5Z*a"ۜ"p'"p'"pW/JjF RbE%)U&8"1`rYUmH#z9*Pߢ{{x ժ TdB_z#0B 5[c="p'"p(^]3 rυ\&>Z3tπ,W͢\"EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p'"p*쨪[&q޶V. 1ΦػE"$,9l^8&a =xxiq+MN8DKkZpuXa-1ݣgpŠo\7*Rzԏ3]V ;Gp+2dZ.9 K3dՓ,{"Z9f \6M7P-eOPOիV_|z` vS"C \\yП9|=-N?=}Y'.SVmt\.ڇ,[9>879"OqgF|z[_i;!dI4ָ>|=-z{OOWi)?qgF|z[_i;!dgQ( m8&KYx5z Fr2r3 Fia=cxg;Y40H)N2)ƴ\_m b]0‘+\rk@o8;qgoؖxDN8DUwӔH^VZ|-S~H0QѺǫZ"7s?f{8[AEh"p'"p*a>Lt3WI3K>EhW+%y{v3C^'Xj>tY_6}xPd\/?HqS {~Ov_ȥ>"p'"pz#{ `wEXco4^6cΚ$Hm֦kMe1#* K&<ZjKXeƙc[7ax5M-k]=nVӚV+&L!q+i/Ã}Y(KeIwaҭ4u!dK,[w.Yi~O06o%L`R?x dIG` v1*HG"pޖRu8&Mг+8Fj.<8 BH08Emd ^3t(+WcnOQ3 VgL{+ ,eID.9A )_[xHx3SePrg#ş`@ I/(I$Ke,\']u-fg_Z{TqPDiA}89c6;^V֬;; h#MԫYu#2#"*K*-irԵ\BS (Sx|4,DL1cR_v agSXr5_cF8&:Ɛ0cnD"fY;S[{vgdi[U reէ8DY.s~d9VR ΌpE2mZ0-UZ BB[my»Z'3tܚayr֝ ք&%Q:bAX'J,aFJDcq%3c CIV1> C(n5h}YSِ$1ҥX="ecSxXb-Ë"C)U[ҵH-< =GV7>6=!ťD `2\I0%I1Ǘ e.h 1*WS˔ ͶwK ֻ ɌU>uu}Tj}[hMfˮǥW"4g0yE-iT&0'Pa& # ^ _lҊLk`tm L \pj>tY_6UrWM|fN:{Y26f#\Ρ+&RZ D0@dQxȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RN8DN8EPYHSLBs" MBi#,B,d"㳄T cc:]<>= ٞOo2yVE$6շw/"j+T8+WWZkbQ8o&m+ɢH̚Zß2^ ?Eu\EwI׾ O軤qg )ce͑c8VGW8W,jpj>tY_6UrW _G@:."EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p'"p'"[ w [/ZjBaJaMXQȲFlTD.. ی =Q=4e[{A:u lWfCL#&!p$ʼn i/Jkrsםw93Lz!ϕ܃&b]jHG-V{C.kvesrV*R;'Ob|ҏJKVf;-$%>8iA@EN:lXv†uZ!)&iDE7VһK-m˞瀖XVYH(hɊ4R > Od+)L!JU t+KɈ;\0"3kٓ)'"p'"{7zI#`` Yis@->;]\UT hphZݒ!njvm>Y~l)`}qm ~Q9KK\iiՓ30-N8x2B Mt7Y /"i}.'-SRϮɒHn.ѡ OOP13DA9J$`0R=v&Vhԕ0,@ 6n4AJfYQj؞x[}f %> Fdy ,f\B!Yڝ+0cTab$HrlTzW6MJ1ƧPQG`< w%]%o1k yT j& 0!*BK?k.+ֈoO2//:ۀ``%J`["phTB|7 y6[_0:\2ǿf1sdU{'tƥUV-.1J f~+As@N֙J&g" X$,N;&e n9RVZ-jk6ī6/Nwx>xs8R&xTޡY*av3%qk\hM<]t-Ugo+HV gd_u_Rږizژ`blKGZ~~[GΦ9a [LX&j\6o4‰eV:,dz+N8DN8Ew܋&odYUFn"[m5N,`Im:Dڼi?"eLY&b('iÇdnqROG)e}gXd5\O5c@l:e}AbS)a 0,"lS&fRkY0B N2/gUE?U=M*[㦫Ypˆߧy]^lRc$/6jȂTLI(ev zB#JȮ'*Nѹ9Mb6ee/gHӻ2=.$YMҞABaGa3,N8DNE]s;S?[9hQo|q+C5`&pV`o]ɥNW=nSXԁMBWf-:a$ь4icqC6ە0p1z@3(CC*ӏO= + qV4tͶ„2Ø xTŤ RoeFF&J3]Q FͰQ !RN}WjNlj#cN]DȸKzg;!j1 j*ŮhNO-mW'BQlU PCllRXD h=C%Dq;}=|~p`} No_)+ѓNm5606X Mgjě>0ʡ6ۂaM N*n~vUfv~|Hz;nrƂ5[ whRM, $pΒׂ>ɜ (DN8DN8DNE]"'ɛn|*?)1Q|gȲmM/XC\+{ٝDڍr)UZ3tπ,W͢u#B54R?jžߓ)O"p'"p'_=%{5hoXk trkDVyZa-24IBQrq I"AlՖį饸:=7>lsk৊חR/jJarJ< @JYJ6XE-Klk~b`V6d.:w\32Va.׺+y.N"DG%'$VK\0;ۭU~FEU:w}ٞG(Z*4Dm1xOk za')).exڥ&^/BJRQ'PX!AEIĘDXXggn++UBu]jGKtJU Skzy٫bz\!q FNrVN"VG$ R,Nڼ!pn^ Ɍ,(b,!X8EΟIp,V"Ir]/s%7$fesh Kf78h52#aJp ^c%.L N7q ˫Vwq%bPL3JZv>N̫fgEfkCaSq*q ;ɐmN1̳z5mPG4g&F=}g;4ԚM-ѝ*ۇ7]CN/[ٚ(qttss@BrUR&NY 14k9/t:aոvoD" qHBJ0iE D X4k9't:a?еe2&9rG>L8q~ ,Jsq2{Iȃ}d0@ w۟q#ngwp+%:tuGg^1Z"Gލj0np)"Hb2%;lR6!AYzUQ :'t^J;2EY+1Q=In@X1 ]nEQ;#7Fcm("?^ ϟ*:mIryt^x\GYkWBKRǎ81e^8DN8DN8DNE]"'ɛn|*?)1Q|gȲm;-IUSom d[6]V_X]jY0z@w\z]>hOk)zEȔl\5Մ }r3 exֲӏ QyZ4MZv<A!syoO0Ei{EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p'"p'"pCε}GO]WXQ[;|9 a~gTJ)#\ɹbs@jed &(uvZoChZ.ݭ,n[V(c~%T[#\Y;ZT$Bt8jM57=%䫕@dI)sbمYl 90Z)_], *P,QKZzGDxY5Lobid͓Wmw0(أŧ J9pF1vHM$iҦlƹ4neJ[{Jr올孈I#8Kp^\[лV:6H R8( 0@Dg"tv3۟\u:?P'#$({l8;>ﱎN0@v`81c_"p'"p'"p'{v7C>pj>tY_6ϽC6g5'[1Z3tπ,W͢u#B54R?jžߓ)O"p'"p'"p*W kpÜ wFСZ3!h{iwpEoX FDI$&q犀^pEj PljkF9I7 !B8ZDe&(,!1.w"p'"p넽ַw k"AX$$@Enq% VwG큑,A䮕|Pko.CAWWcTjٸGr2$p9Z.mǨll$"kBE)Ӻy1shс3sPT|N=֙B |e#\`4=vd/ԛzD!ȌPHπ'\p c8E,q*izMz)[(1w#^"{kΞ2->-ʖi̒P֚ٞ?K@4:,W,҆ 0fX0`sی;=}8DN8DN8DN8Ew܋&odYUFn"U~oӊצMԚkrxMAVGPi-aʤ #ŭv\b2 Y+gp{*C"*yx$ 2'8[9 F26c)5oCD8 ( FH  +jas8[6eX UIDz.?GW8ca|AsΙ W 릺*LN펴W0}"Hl{6'9,_- 'M, ^5Oa)0D~{~7M2gf㮻X\G^f:Uv{]l_챟AbطW\seY}ժ|ߏ*bp6y|CqHO-W|P\f uu7EX[Ó˭>ぴ#k>n9_'[B}s?hGT1}aorO. 7Џ=c'd*~]o o {_=P\NStU19<ߏ*8BOg3xm:vO-W|P\f uu7EX[Ó˭>ぴ#k>n9_'[B}s?hGT1}aorZObkjަ(jK$jR[%oxlmkDWi\]'0Juk|p<ue3W/Xu9* *uS* 5VmWWiREtj)\G,ՠU[dekݲ&4L=#*|F/oe!>(=d)vR1-#v0Eu-mDU(s%5P P5FJRDxѮXぴ#k>n9_'[B}s?hGT1}aorO. 7Џ=c'd*~]o o {_=P\NStU19<ߏ*8BOg3xm:vO-W|P\f uu7EX[Ó˭>ぴ#k>n9_*0Z],ivN#ҩi\}5LaΊ*ؙQD:XFY`׋Ѕc-2N2[ǫ6W5%tc 0Ƙ`q^2^8LzUi3ke7DLV?|P\f?#k'}aorO. 7Џ=c'd*~]o o {_=P\NStU19<ߏ*8BOg3xm:vO-W|P\f uu7EX[Ó˭>ぴ#k>n9_'[B}s?hGT1}aorO. 7Џ=c'd*~]o o {_=P\NStU19<ߏ*8BOg3xm:vO-W|P\f uu7EX[Ó˭>ぴ#k>n9_'[B}s?hGT1}aorZn)4>>=Cy {8,', =t[&,#]{|Y+S &APeVo-5^tu.( Zr%dլ+W{JWԎF_9xcI*egU׬OVjS2xLoJ6I y,rJR {]R_=?%٥gYSRJ؊U4ۃa_3Z9H)^ԓ%/XZFVfHO'[& #^N[ٓ*;8 (8;s̶g]E["[e1eހZӇm32^,weD}_%g_֔qC3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Ro5u7¹]uEݴsa]~P5jQd`zm7˷¦̙@/t9!`ҟFd3Z^ 6gZrE܆A0HiR =n>礋Tݒ!cHfjiY Y Uz YWs?֔qWt΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPI_%g_i)+t΀zYPJz5m]i^8c{ORfo\}baMN eQ!ak: =:QHw@V)v%nfLHXr5wFeǝ"+&qj/oi)+eŨJCZS%WNeŨJCZS%WNeŨJCZS%WNeŨJCZS%WNeŨJCZS%WNedlބ\)u]hԬPBn6tLDӌ& K֝:fC* tFe{eKUeIVlK $;Qv]҄RP,XD +/  XTaxAauq: F¥J^HPĦ-:w Y4kIh[i$ҮlY$ 5m-EV?5>b\|~3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?Rz YWqkJ|ĸi3l?RޝvvkޭUzEprH&V)rcg {T',-J7^7XWۤ'Ky˖˜^o2嬚ikYwA,*:Zqִ%D'dAXwV^]3 rׅ< >Z3tπ,Wٕ͢} iL2/r}8rLZ=|[˜[l5oћk/{Ȉ}fK|;{̯H{L-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ{Ȉ}fKW=ӱL-ͻ 7ꆼ:̠$*{XX!UŕǫH&2`=8(MwoߎezCm;۷YviUs Nmz-2mHmzWlYF&`iɓB {xQ5HٚHnL5{e]G_ W+wJua"Y)srS#N*Sڢ/yLߩso~9}ئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿz_@D>3~s+iئݿڬ^bMa I4[8N@ĝWPhL ρ19`{{g8n+YN+BR3hC]U?lJQZRUì\b !0F 5`D:D5Vu}498v^\}anm?ݧ DC7\p2!ﶝanm?ݧ DC7\p2!ﶝanm?ݧ DC7\p2!ﶝanm?ݧ DC7\p2!ﶝanm?ݧ DC7\p2!ﶝanm?ݧ DC7\p2!ﶝanm?ݭepkߵ֝i ҹ0Jc ŽF %*gxJꐯFq ֢!b* !e?l kN>Cx$ıË!yḾ]*5`!J+u**3Cˡғ\h#vFu3^ m'ghy uP"XCwOHR<7^%zCmqW a]p u8t?_Wڊů+FrNbm8RG7hI#nL *%z!RAW=ӱL-ͻOm W;Ue!-Њ"U.zixշXc*,ZXNT-D` p2!ﶝanm?ݩyF?ҔZ̷ [_ZY6)&вt=@0 D1pĘ3LhߎezCm;۷[O"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06"!i.8v^N06Wݨ4)ߪCU&_&R>I QĞRLh 9=t;y;ӷi.4*kBJЄUiZqV⪣Ia9@U}?ٳ00ҕBB\Ҽt^f:ݑ4R7=9Lm]bʩ}1X]_Q&0ZOnX&AI6އMBO#;)њ0f\vU9b]21Ӂ?jHёJ'ҼĂٷ܋&odY5 s 5yL~<.01$^4i5>Ih&r/V ),0% >V쩹!H{h . 0x4IN8DNSZΚwOUXO53kt*)d՝MaZs1:H&Bօ(Ci <ĘH2Xȴ>=ߦ[znv)W)w`uN&#N,++VQQKLe*@X)=HoOV3>978DN8DQWxȻ f@囡 L|Tf:Y,Ee͛#hR!,6ƈOd"Crψ#OKTDХdJ穬UVwjtY_6}xPd\/?HqS {~Ov_ȥ>"p'"pRݗ/~Z0Zf5:e Jc[ړ+sP /zRacDIjF$^A]Pn͠}G%t(:XR!k֑xD,g(LanI<~:e%xDuwK2Z<`9]MP[X0Xm^hc?9#N{V\(dh^ZQj'nliXq96Hq&y& K8#`\"'XP-9+dj-9"䙦#.rDWgĠr-*}>aWwV͐iʶQSq0>%Wڵ\Uq^hc.=:.a՚ZUy$@WjHv=2Tl&gFj[/̋sm~ H kXF=М0P=Dq64Uf~ɹnjv(ԒFHb;JTr>ZfŘz6XCr]/i7|+obqBLǡљ'\t\6f(xlgNգ *D% kD*Jx`*Y' F8Xob4oW(:eA3r]ϓD~!\.8ѩ.d{4s0Br;-;'hmG)PyVZ3G Pf7DY畒EhL±͒0& ƣl as[Jmђ##2ɍ *' ݸqiÑ; =w >ەpN~tpn+AuV5ҼwU^ Ae6w;rjfPĖK;/P #h ZP0R)Hmz]~:eZrl\2aQj^jsq21ggaؚ"aFvx B?( 67mκWb|a[Yo];]jC.:+B\eQchĥGLt3WI3K>Eh(}cG*EOU;)o5x\L*PY8VїtGGY+K}@^g\QZ>XUeX7L{'aMh[ Ŗґ pI([{v3C^'Xj>tY_6}xPd\/?HqS {~Ov_ȥ>"p'"p͆Ym麧0heŰ7lfj{p/l m0\PZ **E>:Z7K; g, qͲuFJ2D@iKC"-`8Zv޴v&:)=h]MuS\"ՖZ:#[*{ HWNl-Z,,|e'֎he eMst>0,EO=}I:oGV+H[q9L Ǧ^JNJ5d/@$"L1D]'_s}1[Ϊd/Gѥ[A^OyЕT5g;3C*2Uͭ(-v9Ȟ{9P6xՅp19~Hti_ [2w&Y[.u!|{r? !_V)c؊ۋNJh3P6[nIu\^ B66xEX1/\$nA(2X D:뜍4JN8+nl1H_2_jPEt9$ݕkf1+`#3']L-H8 {c0͛UYnj4 Š0\d:nѠ5NDzZOlI![ #jW$cZs倬eq^Љ7Aq`cGҮMf];m KXhmYrue-yhoX*,mnn&b,(aJ3Y(GJT.-հ ‘YF`jft %'R̕ Ǒi%e+.umtx$ZȥycF7@ 2U!]]aaL7)0@g Ya@FdFuD( n(U_lz𡁼27NKC&ԁA?7=X_6Ж>?E*"ηWz_ZwOOidQkYPZYy~~X.-rS8={$QO/oXxE1 Nt7 $lv1`hJjWER3DI(R$Fa1tOk͘*~,hک֚aR2d5/}2ɚ%rz mHrSG`FN8DN8Eۂm5( rVѹ+klM*QzRμNOTYy|`asdTDN.YN-RiR-׋8IW$-J3U%ffmmJ_q:4d*ڨӺ523a\szV w3UUrY aS$ Q"=HSGWps+ Ӑ0),d^8DN8DQWxȻ f@囡 L|Tf:Y,EGN5^_闵۝-Ew^Z$n%iCg{L" CFXqd5{If.};VpO=77UVHx۟a1G)Dk;Ja#TڭB3_| <";EO7, xSQc媣7Lϑe|-_}B?#_sH{#ƭL)[ >Y"p'"p/0?_/O"p,~Y&y^pzW=?(_s}1[Ϊd/Gѥ[A^OyЕ 5eXnBd= l3yG锔Ǜ+"bsX_*Z.Dx"L:Flh ,f-ZUmNiRiVZqf֒ϜKf2DͪK,3t#.A]mX|i5wO`uĂ2siA&1!%u$4Jg>-SC: (2+h Y|:b%q%Y ¦ -H::o {6^U*"0iIZ?vL?X^zeĎvFhٌ(=t~LՌ䨑魵kfibvsܽI0UP-,I{SC.,ޠ`HaqT+|bpwG4g_/mé`F3%3یkB,ZzWa7XBl*+INly38Yle'vm:{ָAP\օZ&G2nrh)B ӱ:o-o(ф ~Ë0A8ėyrf)̀kɭDK0ҵ)K8,25$!9V(DZPTq/0SͳC07Usb{nKVͺ1cn~.k9:p?z 3kߩѹ"8DN8D^iy"sx_^zoɸE懨߻c^"'"p'"EO7, U~Rc媣7Lϑe|)U^kۦ;~%{}TZi SzFR{xiҳ2Tr 'r^{8n[/^ yƦTӐ!N!%ZIg%0I/9,4p`Ðׅ< >Z3tπ,W͢#B54R?jžߓ)O"p'"Q ;[$a?dJɣ19HwiZ{^n61̜F{jl0ݛj<> tRģ=e:x. ,(kEv<楑LMI&X5osV@`o^NSv= iKǪnA%TNK ;cfGau Xfmh-"d,U||G*蓉N䨂xEAU{NCk!W:J0#gPZSh4jH33^]ң9Cs-ۇU%!rLS"5OgY#Rq`{"ϻR[n[m q\0.*L Wy(uy-@׵zƭ=uxrPa*mqDDA"' A; `pm Romj c^VlY!(-Wl2,[ppnv9 v"nh925Kkw1 uѧYkia6th .(CR\MVXj dLPή4kZeaevc;| tǭ.NqpnhhΦ2ɶ%^@S]^nisN.Ҏ-XkXksPlY :RurV&bߧu,ª`*te5V,J"M(u\χo%B媏7|1n,&ogY΀ L91 𝩒4I]Ѧ0rFu p1e"&nQ"*pl+ޭ>͜ǁYhq۟X=g"ɡ, 4Os@Gt3t"h-3"亮f1r"FZ etV^zO^11/y64_zzpuR?A~[-s^;774CV'"p'"pzPeJ]cd#`v#eydt!-uz 6[7)dC\{$m ]aR뎞Uq:K(t'9 FEv~Oܛwr]ei>T݃'VZ$fq"*9>'Y;757#zZp[ ^$zN8DNE]"'ɛn|*?)1Q|gȲmd5?m?שvk=p#RٺA/GP-LF|K '8Is ܋&odYYOo:'HQ=(oC[=':~S|1<ZG"RWWS2/V4E fgnÂ={ vpz2ƅ2,#5=u32EG=ۢw]m>ƍQ\|-$3},-4ʎs(Ra~.ԥr1cNy387%\'aMK:tR=hf5A@D>gcVt? J[/wCjFZBVxA$eѧ,L'uɥh F ^!f9,]s<";1;5ϭV.bdک3ձV)`ǜK#nu#v YLqԒI+YgEnK=M7Ko<z}OKO${qhGڟc95[BSz2),Oᒨ N8DN8D`o?ۼ"([-n!^9۩$5RV«!;\cJj8DzQ:a@,WVPE:t+S%pD}A ơSzB80$% E鯄N8DN8Ew܋&odYUFn"RӄQWxȻ f@噡 x,|Tf:Y,E(Gk2.iwڤ8թ=a';k/RN8EPTВ1&<(@# 4]Ek"Kf:ZR$Kjdo/Rmtj]K=Tb?:*̖V8*;lh`!"":u!wJ]; Sr'mIߔM$'c6 IBeLӈRzΨD఑EےݭZ~.Q{Pa󍰃`(MlRs?;BV:*$nuuX 4JuR˟n&]:mg4@`];I;lwĬ$0y`CE8|8?O*N?ʮӃ=9Eht;C`)njkY&TWaG+9Ñ=K#sZ%nbAc#  Ԁ/9Hq*)C פAǢRIWLL>=9c/vX,k qߏ؊]ڛ_ܛѻ34L䘵m+ۏHq&qCfpFxEgZxINvG#,"s~?(ާG+E̴$_܄ދ=B'Vrz/8E0n̬%#{=gpUbQtemNY%,8,NxV+岵;=gaz#ͳv&Y~Xi+t2[ےr yVw#\-9xG CάݚiwGen.VUG' ) ӬUqUwVGDqΪEWuN .*CkU2 ξK Vͭ c KLt@&) @E DFliU%[M(&[,yr*nEu{i#4658?5aɊO8Lt3WI3K>EhW+%y{v3C^'Xj>tY_6}xPd\/?HqS {~Ov_ȥ>"p}ɿ')jăXKXHrKfE ~ݛm.-g'tnlh/l/4seP6D<pQ%RB,b>нGncbj[I7҇F V+M|e:GRHv; T J/^ӄQ쎿OHO:=!?78D{#l):K`11!nd KRB39uӏLI* wX31F카 C2l3ăXӶonRQp'"p'{v7C>pj>tY_6UrWp*a>L45OyE3K>Eh}~FE"T0l7GmeS'GR i'2(eQ ( ,8ϱ TwHWD4jd0U :`4]%*Vm++쐹 ȥĸ|VHL m2HRR2+-m[ߥskvaZ5*)j孝u:(1@bdNG)a-qoZq:F۳\ Wqwy[ZvzV)0ПGwgRj pDlr/,RhmuE;_n~ԭE;p "R›g{!\G\ s0.Y&wg05T3 F V+\+Vd,ΨL#O % ,:Z/bT2t U|Y[ D PhoVd*LӲIRWCi=SEu(岍%DfuZ3^OAt.wu,Ǽ(QF`P+=N8DN8DUCKaXJZ dʥunJz.qVd; SEqZC-z^^ t0=rk'$6r/_ُQ,E>K/ls*eg "QuDI03Ǧ"u(Mc%ؤegWGkvĪr%-^MsİL @e,\i2z<>{> !:ڨqĵ<ǣt\)N$8f@J݄3,RN8DN8EPU擹\WUUiʶ#6ѮΔd]ѯ]`N٘mNCjȶB>ISr*GzQp/j,L?JZxjEѪ"=%j[>w\Ν>37ɁF:Tpj.q@SW)Ow\ È'g!UրoKn )iUcR-fZQ$=H44(DXoo8-jȝ mYuTϑ{)b[ʺYwaiAZGy9qz8=C@8DN8DN8Dbn!r:YN#Yu0I&0~unс.TPnL'XxY"PLGcӛ:-h;RQ/5qt֬qwNXeVs^Q$E$YŗR37s"׽Wz8ep 6,ƨK!I4[pR{\"M[HK'Gh$S)hd Q[CYackq+"Ս( B' |"dEZm|yr,^ǎCx(R hsVXd*ޜ@(YjP}RVJl~[[hDy,I)-/^M^TO LB$I!)$s-'"p'"*Kpܶ ޝ:3WQmע`ڧC-5[Y2T9 4Ɛi1swmK-g[6,r'llͰDCr"cW SL9L<52+ J6+m"Ι*)'ML~?ND=x7 -ѥ̋[դLLȗRޭ 3=r"ɯhur%-~GKr,7FkLV:fdZ*pȤW"p'"EO7, U~Rc媣7Lϑe|)U^i(^]3 rׅ< >Z3tπ,W͢u#B54R?jžߓ)O"p'"p'"plHI_ˬ#CV=PB5&Q!c/Riӧ/ELa _-Xz]Zq *eg_x}|g _!~r3_D)m_8  ) hCB8Fʟnq%:SnvV&%˜rW'"p'74,U9){z"FzjQ$^3"_t^ן]i眣mMeZh4ޖQ4R$Z3tπ,W͢\"hl j1WwuXI0<{!gFMa_+ъcVYM&Њ+_**`Ǵe" lQa I՜)Yo#C[*=J܅0S<2e"Bd]=X&&˓1 z%8n\Ze5xڪ~ Emƕ1oeB$ juFyYDF+~~(?PSOxZ5u4cu7JWē]|ㆴkin0'AM? h?[ӱ*a_O!wǎ1ccT¿%$B45c_=nSN7St~.KIWSֵi݊ض*l0*)[FNX5" qĺ)DF%g#2d?w.Z1k {XS=*ԖhyMfR*q g%M:A4Xtnv9rI˜ȅ&<" |j,ehˌ5  6prd*y2ԉ@[+PSOxZ5u4cu7JWē]|ㆴkin0'AM? h?[ӱ*a_XAnͱ rb{[*'Kާ %Rd`w.1q·pو-YEvVL3{RESկ%cMxVUcgQ4`5g2bZS.lZRiX(UۤN8DN8DN8DNBޠ}Lz!(ߙ[Ӈ#P:cbRq=rd&?Rk4)?r=F-r*Is6(WnU@nm SX.c!yM׾%OQ!/!-ܢ.1)Mt@_ }*}k"N8DN8DN8DN8DNeЈD‘c-WNJ Hs#tad%0Yp$#Z6Ti7\2 54BhJWzY]@!LffT UGΫT[z gaP񎐯׋ckPQو1Gi@on<#ZSVsѮ󧷯6MKɊԇ;dBEBk0Y8DN8DN8DN8DN8DN8DN8DNAN^S'/ttq`êԭpn@(/4fl)4b4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+?߬v3:s@>4[׶^_~=~R{'DҽnPO^3y}o?㫗?iIJ=A={h;\c'tM+[hn;uo{?#;\uNzݞom5ZˤJ|֓+Ae>&(&O 0` FrR:?I0s.4ncytln62}8EJ;M:өHjCojvΏTz#7)Qr<ޱ'!:͞T ),Fv??0)"xD# ¶օkSdn @;qc؁58N$AkLx͠r]жnU6j`5u҆\kLصsZGJYHRQ8V" DG$L/;|=1zDvPڅ*$m{N1`͏K `Tt2G6)v|X_N:) mr tL݅Dp<q׸c䫇^"N8E`Шcz[|,ro( Ӕ,rn,. "wO ih@wr`.r׀:xكR#p(n۲yM춁"fĘ눬6tC\~֤HtlVa!{4j| .Dmg{^Cٓ롡$rƖ}H|~5O?YMR-!d%s,qP&ZcJ!*]YI N jz{w')"Cn2äju y$N5 rkGnOacr쩗և&& "S#2,hإRvRϬ ?ݒ7"1&r9bHb4xK@bV}e&XM͟Ub~Gd|yDI7=32潉19u"[q{n+v2\{yoµ 2U۽ c3ֲ$1$m{૖91ꋷ1@qRayZm~^SI\jh|%}*\mRFNW$dFjvc xgX|&FI7\_v@MܘRnIիl$1]Y5:xMePXY.~qݰc+r)!2{C0It~ǘ0ź;UK hB +3Pf" gv9ŭc\kɡiyhmU\Xφʈ6[&7gԚ6Is"fPQ݌hۡ>VMͮpZM3hy0y`裉` n#Vw3ܠ.lTxMef:;<9ot~FS<=%fhB{!t%;[R F0,]$n^;x\7{zPuh  {NAQ%mNJ$(6 }v2j᝘Fuѭ혎Xz:7غoe2i5D_-2YDU,JKVT`sP۔H%*@bdjTdōK-3y&(F?a&䝰_8j4ҠӒNFj^ Fm-ibcƸƲ\ 7XO rA!}6!ȟ +5 e?Xl>JU"u&ƕ|Q:Ҍ|#j%%ZQ.KtjVXX -:U[[h2e66y^!1Q;(Zqo;fir;U*1 ±m/b ψ^s0!B+%oJCR"'n-W/"4Anir] u j%Crh)sA%zqz6Կa dBC10RKdaC^ Xөys\Sr_98:ֳ؂6%ˌR ͫPKZ>"W~tJl2FZx]8rVlZyczJ˷; v^,oܣ,nɍAAg2;jȚqF;/CMVFfaWjAyueF+GFAZw| S܈n9mv{4xڣ#^P< -6um6@ek|crѬKoɑ 7$|طKfF97ԉ Ph=6Bt3pZd2fuP6T=}RvLB^n]Q屒"˄EҞJ%*Ӯm-|gv;[N1597|<2 @mLU0naj2#Ceof#\gj-z0p* %$G+|V (6/"2@T٣W{B{ZУV 5L)rkϫ/Pu3'AJoA^Ɔ e 0 ;#>GX\<˲y7JEʹ1J-u[6͹:{#.:*&J+ȫ aβZɳebc?fv5Uc!|iTHU"0&RaɃ[c.7%"f:2i/ da)EqMJ*4m:dbDžan[òL͢KpYit%D ɐ_^~2  |>"d$ES5-Sn|cQo3' ̏*AZhH4Uwd2<2 jfJ$kX\YV _9(vA)%>Yldy"ۢ6?ڃ4 f2='CcFDRnStHϳp}bomW^ {h˦u3qAZNojN8DN8DN8DN8DN8DN8Dt]V |ty *,8i̊p-%"[*aKCL.l,0kClϊO #t!VF! ,lcnV7^Ѧߌsdg-ƧM̃Fy>fytV&ѵ DTBl_~m=$ȉ03-[g9D7fC FMI;YH$fغ1@9rGE(9Bjmq8C =D~:slϝ&0F8rŽ=Gd$9&tă J,#ˎ0[.1%3\dZ-pf;5w)njl~Detg6d@7լBcK 3rLR濌KmD!VڋǎZ{ W`8 > Y]0ج']oc- O4ALvc ֠#XbI~%)b@Yp#H*7I$g\Z*ي99KBK,aX\;k~R`a @-D‡LLyst7gUJʠ(4{m QBuk[yɨ&W3-s|ԨNMNʛ6ԣ8. 8Q [Q7pL3( Ȼ0i3M.> պj5 @דĀ?T5hv|[&bW*eB&B<4N2l*&Qt"pQP"+BHZ6x,Q:KQahs]0m,OnX.GSE)-jJkָ`Ok 75^x\ȝ2ʺim#+r{BrK,ub./^̣PwvԆ/. e:JTfX.xjj %= nn1ȹ%p6֙Pb+-268y8.˓:4tnIerT %em"vvXf?/#jF ;KR+VWGa&GI 3d\&oLe^mPG_o7?˴/P'AL.ųxޗ hlju[dGᦽ5(V<ɕNy(sDK !.D2,@7x1d9rtnAs|UУ9+ʡ*Y2uW^RWG<ŶC}3+'l[ SkDA8j5a1sKYrO͞1kY UxGÒsT[ Hِ7ڶYyY•y9Xotò׷J3j;ow&F^B;3*ՙMك%Ow8m4Ǧbp"d p?%go?vمQpbQ !m2ɟ'k{K6{*8ڕyY#QoiZ5כL^[V%q:s-}kY{h« ( FCŁڋ]mu|cR|uxZ7m zTZVAcE9K-H{d2O-h]ɒ֕g-tNRt](D#2vػ[3vג#Z0SDli r$x;ɠq`5:o2exZ11 \Y\vk]f~m'dXrwd v]&)QdI 4t緰X=.V~ . oءvh95miNPjTVCl9'`yM/dٺjTrk\T\L|❙V_C+$*5] SX 08{7eKxC;gfn5`yTx)\է(E+G!wfd7kghn 2Hc\#Y Nى3#[f$=r"M(XB<`BSs;),iɱh$4p @FЖpjA,mWH"_b<#6\wAiڅiZJZX@h&q /ǝ7cv9م J/ r,Gq'qc\+T*8E23Cs$I.6,rgp[Eئzg5TӔ4!K.fŐ89`ʷuŇ^oڔ{0,̹!^I֋wÙ%d-MiV*)+%+"%y!GiB^ 23` !ȕzďrvv"&l ҕmZJr3̱i|]ďHpKUuSնjP͔ גTBtёԷ$Q3Roy ɤH)dU@gthFaq->_e3F rwM\RIb%i[thvTXmsi[pM`p+&@!O9X)cL)#ɠWv (̩=0X/seVb)Zޢj*:T(YUs/+*eR05f'Wl3ScNɛZ8|\5 BwkL%x&$2w+qzc{fB5uvS>ckPge0!qLr-yji@hzG.bX j]Em%>EfG1 kӇƆ Ln\]#gx؉ d,kTCz-jFb r)L<GdB{\T -خ.Qzå>(YzDjaC#lYf5C{\ W2n^;6:90RWD+2;#NJ7!ǵ%XScƘԉHhf TQjjYI@K E2uDHAu\m!L1x55բ*k,qs;k+Yօ SĆ0!|p;gceQqt £X VC3k˜+&v5]DX3($β2|mAZzyS]qRt]olIt$> 9!['⤮vD;Lw3CZY)bq#K4a>S̷1ɟƟ2my#3 t, :=lvykڠF]5vmdok:L@0ueK왼{4Z]mreQuYXSAX2uJVXfɞbxX0n÷ p#Ȭc;‚D|. yTDY4P7E^q d0՜XD5ȴjגU8{CZQ#}nZr(TԍSkm-)RLQ/q[M3fvϼg}; ٙrK` o0s#Fۦfjyta?[$kD%uǑ(V'm 2^n4ӧ9$u ˳ dx6(0 Ոoҵ6c*gFB"B&d}XmRRՆX0a&U)Rb7@LW3fA̡0<[[㧈-f$ʸ9 Aof;:ȎH~V 9fIz|]yRvS`Jp8ş2$ $D5TH 5Hv ٛ w7ȓ؅i%H&1VcYz3ـkP6eZj;-Cx`r|8x 1%hxɍ:5(eiK,@$dmȞ#u9h1cKb,eWqk)R6*:KѨv~bXkTx0' \J{K . ̗9$I gt6ڷ-c@Pȓ.Mj4"YKBgº%/`ۮg8X)c9cԀ[ ' (l{wDk݂i3r8,Ɩ7jrYD;3J&@Zr$= |9v.kc7b $ı3F`Iv96\#.k2q ^ޭCWbW*ņĮW%5 LRs 1p"] A0&0}*5:p{11 yӣ[=eѓdsه4|? ij7 6ˆ$c̫gjY;- tj=&6m$$6\={MnRi(k1 A3&b~O @Z؊{Zqj0$I $bqkm&p[jyqY{&pFd^z)-f;%H0Ҟn:2KվQRLmoɍ# J4kFj- mPK!d(H,튉iX) 3IqCKA9w9 =J#" | 6,_elwlvlȘ8T3#ɮcC-y @O8<ĸJ`|+] ϵzgR`mF]djE\nup&7*~O?1#X:Qorgčk+gyɜZ^Х9y PRCқUCs p ˌ]!lnb9[Qj֖1—+666q$hq$]Þ3qx =nup vkFu4آI#1_AK-|ԻU9Ԃ-1`dX- j( t F7*+|2v.1g#I Fz\1v+ƱSQ܁l>6ؓLàndxOj ]nV3[D ,sT͗8rG %6i25}mjrg1>ICzf FL|=v#֏=8B, ң5r G*8aXLH~?CnUt(gF[4ld+$Y3!`ͣ78Ʈ7a§NcYEz{5#(I' cR}RY9hg#֦b-6/ZS~-PnvעH@v>g4ǻVI:ZO>LZaZPk;n0C"k$!"e ZˁIO+#0&!v,<r2+KLgNc ŜʙՐUTBʧpڦa k pQWVPpj`$\:RR*]k07bfFcJ@ґ,K#=A7(l+‘<%kŀmKU! J?{嶁62*ǎq0o3Hx6C+Ȱ,)tra&3%df^oXYϴ0;\Jӫ4-elEcRj-ocOX{6`RLA1* @sba ;y-;Lw(w[=lL* %CIm:2o0quG1!쓷$e~Ųw#[ۮmp[YTa>4r&hܝRcJaރK@"ru~2yPbK3:B{y&U0͋m{);W^vuǫ8,rmǪNkRjQ =)ŖX mr cb Y3ٸ1Y/Xb(> ڤBF0eϭ$[ U2_سTZS W6 g0$ވWWdjI0]V&yy$g N95DŪn@5[ٶ8}IBR-' \&HL4ɳlj=CF{̜̍gOlݲ LD\LHS)JS+Ipg_w{vjm%ķƹJeCc}Uj': :8any81E+9HVm 5r㜦nXQD}nh8dCMKJzeÒ 8CŁ-mTɦæcb=Yg !7%Ӵ=I.-Ȯ7ʔ1jqŎcUc[»"Bb2Sދ(}sXZ\~Ac ?;t<~R5^sWd:wĩ>qz9 ǰD":Fb;P:Zˈ~s׫ևb: {#:qUU$xaȧ0KVZpNx #_4SVVFᵎIW9VGd$˥;?+i2 6\ \YB!(\|#Ձ,g"jHqe>H%F%!lVУz% bmx7"~[}^ls2ìYM+` VX{ï\ЯKd@#6եoZrf1&F(mO fyK,)ʹhؙb'&޲mYh˫\&LJplf>rHwnYrv[W[ҕjM -Ȯ cש6iZo2oeU3ց4uBӶY'P#.`>ò"fYLJ Da'3.^:%(Px׬pV ؓ\\.Ca~2^ir#@+ tghOEۛ;N(sVwȏ.{+KmVjHGmW8n4qY1YUs[X1 {]-e dXJe /#FoMGs r:' ifŬ ҙU$d ֈ1DLej:J2@1I8N;]ga%ZܣG,V]Ie퐁<{!ѭFG+Hw(Y3l%\ɓW0LaՙtZڶ<"uPTLtXC-Rيl-ݕBUyT\FڕQEd7͒e1kj,ʒ,r,(c"ظ4yitϬrZN4z擡4p󡍺 df| Gq"&c]G!g]Z52bĢ=U27?MUJݖ(pvFMrs' oOw k@ G7BVFbx.wԻ_W410lX߮c@̎42pl>/SdHoʩN8Dt]V |ty *,8i̊p(]6ca!.UzJ s|=e !Jڹird.\)R5NuڮnEjAܘqN{6Y0̈2^sfQmWUAn2{+Vض7<-1}ͳNDn+JzK4Ƚ%aw[JM_# i{ '<*Xt*o+BI eB2n,mYV2pF*܍秶QmLI٤5Vբ fxz%/3-Nε v#1ZjDpȞgS0" ɳvr]B(yz' b:W8}zDjE I$p|9i)Yb lqooycLxC{IdۓeP=^= GwbM̅oiָ,$hA lA͙Uվcl|3$s34Jq&Y%I(aam4 zWU\|!-jUqHҪ8&q*],Yo2F@Ie6^pݑíiyZ%륽$Ba IF3;e-!oH^J>pQ,I3>$02Q29 "OFh~ݔ̹mA ]A=bƯ+h.'1]g -ل׆--7G. 3]APϟMFbC%(E\ϑJI66poRb\ 1=٥p2ޕ&'Ę0 ҷz@R8vy$2R\ 9a*a$kV]U¯FrlE9-$TP2@ T2Uǝfs16'[K'ǒZ_cZBTNJBo*TR0$TI&AGG4il-jn.-M4m\ZIseJF {@d[ts} سCÿOIN٬]FY9=%.-dɫNYDD $B2ƫQ 3Ň 37 הTvq ^qLbHP-yQzh %{g2#:"E|Q']%RtxqDdI'\9mk)Je*589nR;@ V 5b.4.Ҕiƚ1nj}e#i5':#[-*FNaH0l$Q(v (\ i iך~IPEn0HkzGO!r+YMdK<%"B#Tnn b߯06H {br)V흝U˕w2eÀZ(鞃H1 l?>,QH8oj, {a ë!$DHؾR=cWl+Z㦇q9n1zV.;/yQlVFx;hB= 7#~T6[!e:a)]#.Bl/~1jLLQ+i5Jr<$-)1YXwxj%bDǖ6P)%mm6`I`9P ە]D؅xmr1<0wna@26 c;iQ<{v@kgB% B-h fɤh݆"XԠ4KP0HT%2 -qq2f3-:ųltdzyswF E:bdv3#"t8%c nKDžW%d?y=ͥi*"ػ-Sc0EwI%Xt[et$T%tdk)9i{4uqCŶʗm+amjaL]ɞ,YnQA.;9.T;#DBeWKz +z =aK`JgiFgLq\66ǩ漎+V& ԙK+!LrTjr-M7S󀙄&,gNʶ8!r(P$3lI봚3n023F"I 4cS1蕝W:b:nw,v ˼4fȜyl8MoI2x6Uk,+2ؠ*&Á"?eK*W+]XU |YSQ?D4IXAɎX$x}ۜK ڷ] lO>purjf6ޡxn+6+ǽQKlB;7IV4tXH6vx!ATaK]N=7[iƆyřFv "K,ҕ Յ#I A卨sū"mҧ0^a I\H$9[ǘi05!pmG[߆m .;6y8f+㈐WŎ6ܠor&hdW|2n)uJБ<\A a"Zr`b7NƄS(fr5)U%,E@1@퉆7e *rPK3$rV\ٸ*$U0eSCRguǬ.3D:Ide)O+Z4౥\[u!5yFfFcC̑3c3Ƅr2ZFqn:E@ecD)v8P7wמR[q͐Kiϱ_Ebm)GusG̽F,e7ܻ̏jƔ|j[yTBZF(O*f`N,L̶aOh}2kB[|Z-w{+5ߙ&7wI K9@ xXztn'_2d aF R3PYS86b8k&3#.3=2evLV7⋵E Ui씮̖]|]撤\*z.R09 )Vݍ'3Gz! 2򤌜A]v"Iw{ `-/[ڳ ϒZ*+Plm6%LS uo0tg~s C* vxZiFZAhϽ YpZ %nRq)޼yή NNS@6x[!+ #!*Ŷ3J=.q@ۤlrlh2+Zћ'3W. JgHwCV2m@m/mO}U0JˠѸd gm&]{>&N8kPf#XpX.zD@^ 0X֒ i^:0 r(<> ڛR{-oզG2س|ksx0nb:Iؤ7w@k᪳|wE:l*fr^! nLT$-Yev8=3Sĺ t>,pxW emI擮wisHɉk'N҃ZGq|N[\\}xy߁lƴ9@*kِ Hce\JT#qu#fhFqhXBP20V2r8bw(W:RV7XVW.oo!G;=C/-\m&\}Z]KlbgwC "zJga[NgX4#j:q1 KF& |Bs33C@ `flxoyvRzܠc9*Ec$K _ nBCLG| ǺHOrpmG( 0dierlĻWiZ$[[}t]Y\1I q{^VF/h$m}(' __uǓc.'Z:|p#7=_2)'B%&LdV<f *kH^q02rf#- Ш4kWOč\&6=rT<߱ ,jĮriZun6aڰT=D']5t~5mEaȬRZD;l4d}$XnѪu0׌%>wwl 7d>:qYzs٨G"vW[ rkt9OFJ֦VjDm, N7Z08qM#ےܛP6 ` rjnqm 5"*1Z3%ř0 "M:S$H)yr)+(Q#lV[qe[\h1HXf4ٝj.6H).-A ǒ2fDy{NEyzlH*mCPYj7 E/vr/\Ó 9q^jpȏ>$ah&Dchɡ*NI=;l6VSFq'UÌ:TlJ Vh%q 4 {XJuR[Ę6qk ml}$FjfͼFԊT "Y͕} =y[^o}Njn2%$j4Zb:("vZ%V(beL2 ooMØ\hNKnKGph&=,NSӚ`@FFk%rMiy`o\aG%hߌ}FIVqX HK4gFrvrA.Ğ+p Ǘg M.NX[*md:?ն3+Jʿ)Ѣ<;YmWG=aD~%ǭf2մ[gRh:3%Pdےc@Sx3xbuklnVc^mEk2VDH-3xطk9)D&͋NέpCV,Аsf] фG)I3aLAn5Lv[z) ێ2 q2kj&'|$SbM9am"EzO ~z48q. y$Faʏ ګ[#nL*T>]&3-#d 4iG-M$ik3b:u(( D>2ե`\ׅtmƷj:;TLsyHV$ LuƇ<Yo&>YF1dN6L`ۭ Kg -;mWQGԧȢeRM*T0\Q$JPA!#"):CkpR*N,3,_.nsKkd+6b6aLI l C98NVswl+8E%n;uT(NPhb&;? ;kKs$rDMǚ%2d89!y^ʥ  K4- rpc33\}&9e RD=A;n&ȸ&9 []ZH'*[X#.q%R2[*Ɂ&:s~hN&Q N"PC"Vޝ))HdYJQ7"9J+Rf4p[eK0_FTh[0o[Q[=&tQ!tqi<\p\?:(k6^+5L/.LQuY102xRjّ3hv,Yb:84LO|Rbx#lΞcZ7%TYr0LN(.]L8m ,|d&@g*<*;fӅ[b7Vp|nO3e,ݓcL}M#Fc,Im[%HR#$ I! F8сl `#1afo 88RQJtNJmۄ^aˍ$l'8oQl0e&dSd\9XkfķDEkS{=r1mie>1,؟Rk"YRh( UxVCV$]fgȤdJab㔻+S6nH%( o`P#+qaFb3ND){RMI^7dl kq,Y00~;3&NzeH|6Ev {3l-%hpk9Dudb*yn'0)8QxYS2үLT~oXHO,3pK3j}mudQPLC':{)mCۥ$Үzch}{Qt873͘4%0ohì塠Ǫ4+*@M^L$k 8)31WT8KPDD2$ˊ1 d'97 88ng\AUf Sa z YLe uoNclG/VW_ɈҤCn4Hь.G1ˆϽK 7v*ZY;-Am)!,|{+Gc>*Y" rNj&iys4#Ճ k81r`ܥø vrF/AY$r ї1r݂]lvtguT*2~[R!H`6.0\%M> &E4~oD(HMY,9zc@!&AO;8cFa9IPzZۈohӣP/8oIs~ Ҡ> 52zVpS!|zWε xlpy4ui&ڕ}4ZJ\JxhwGbL.lD+dR.Lr0 ^P4ذdKJ*xchę=h ѳVkRz"b,;y؜> \֟q6G67:.Zy4@t٬cWڵOH݋q"TsU5MK$XJ`N$<0=Ht##єeGэec9xQo{3(27FnѸIe7 d6 jMӭ-1[PJLItċS!p‹0n7ޙ4`4|ٗCk 7Ĩx:gGcЙKSJc̝0j , nncDT z"S'>2b/ p!Vv ܟz;dg4ŋ1HL,=b|0\!2@KPLx[nW&n3:?!IRfD7R٭<3:GD`Jl3,%bi Āo8QCT-X r5/M%Ph2Z5lg$J9c8pnz" \&A\i{ҦL0cVi%:H`ĤR%]Ɍ:)iM3JXYˎ)2^Y&fBy@c2Vn['\WKuTPgd%b (3f순&i _-V" Br0PHO’RZFF.d7mvIGh6,lz38crRZhbArg`ӞQ'),&ұhv Sڛ huCh@*uE0*xr6Ww:AizsYCv;o5xo@qOV҈x$ǗWuחM]!{e; K]YGA6r&U(zZ(\~*\ ȀJ@I~C;6DŽd@.i&\q3, 0k&[%C+h)N!ݠpYZ$ d93Yxm WfJ0}$IX@TnE`8o їg:w1dnJ8-% pd z(]NsbV] W2$)-+WSFb7Vo G gvl]ĵZdҤ|RacB:V' ׬Lx$GrsR/["mܗJI 6]7mKU Lٽ? :GKqzSr`nD)y2nRXquqj4w25"6G$/!2k9+)1cd+NMcPSBr$MޅQc,H%hb8"*{aMݮC۞'cVM ,dH3Bdή1qy5b3oٹ[a>2A|,$KaH=%^|涯kJdo4 h<-F!)7*Ɯ^OAog&l6F0݂˻f\}烋VAtP=ϐxsyi-obm-LzGHя)룧%-gɛ.sPSi3.6lrY45Sp( a2 ,npaQFVQ/+ Nd$,vMLA5ȻaC > ̆5qY , .׃$!.V:0öᆂsbc֡dzuk-3b9ї9hYr$_',W((,AC:)RfV1G. ʐ'p$S/32uMkW“&!Mrs'B.j}ex&A#ǐrKYM$F6PViQI,iu7tf+Yb+UbQd0n$WGSnЋYD/@nlbU47 ȤmǧϏZzѶȉb?@?Fhbatik-1.9.orig/documentation-sources/resources/images/group-logo.png0000644000175000017500000004763613063003371025363 0ustar mans0954mans0954PNG  IHDR3C sBITO pHYs  ~tEXtSoftwareAdobe Fireworks CS5.1HtEXtCreation Time3/10/12A IDATxwde?} ;wOwOq,`BQ1V]uwq $ 2d&=+q{qWz>5svMy9aG.SO=1v@TZkA۶mۺyN9ug۸^.]VV755Ib r!(}b%$-JFNay.@C>_u %^jDx3U*ZR֠sNYg0 sX3IHDغ~;ރO|=AY0 +@ ` 2 }k]i-z/[ҡJxCP;yH ץ#ZMΘ  4_]v'?ɧ~: C5)Hk s AמO^[o} ׾ܻw死k"D(I0 p|ӟ$IRڒI["""KFi"cIiR 5)KHY:)Ȅdfr)&&ɐ5DVHEw'Bq/}B`sgͣ5MED62dYk5YMFՆ"k*ngTS1QLdȒQD!dMhZ5?~_CD}j]Oj< :D ѫ?ѐQl)6[dRl(2҆RLa˫5kٳg~guV65!>Osx͛7_p ,8E[nDZtzqX,C.D&}'vuu ~jw4ߪJnMo9phyWB*wޙx4zs^{)$GGFG/X~= %{糹fCӖ;ZZoj }WIoz[/_5qLqVĂ8ca~,*ܽip@l YL"A|xlxn\A E xw(J9_lîS9\j0t:0,, 0p,hS ¦^ꪫ.򶶶={qg?srr7~˖-p[ߺSZϿ+Z]}{?ٳf=P}{ϯ4av '|nپbѱ :|Esܻ4eO:ŋqo_Yyҩ;O^|{aLykϛ;cfk4?hooW̚b)5UjgwB!(A'łBq߭x1C+XYҀaZ.prR*t\{hA̓p>30 fgм$Iyy}S?1;g?{7߿sNDsc G:Z1_Rё[vlg??#m>񡫟>Vܐ了3N:U{7jh/9ܓ;fUGǮz׻vO_cO_6ʕ~+.ony\rYP1c5g]|W7rS5]t׭mch\OyW;կ>$B: Ƨlh%VtJ;o)8fZ)s&X<  n@㐎B^r[M镧K;z.2:u2v_'xbllldd{]n݂ ժhꯅ`x/Zx?cg_x/}Dc׷w`{_N.u Μ>#;(@p v!8I1[D`XX]p`rJ 64">vM˷ X $dBׯpHι6ɐ;+Wq;vضm]vadi""͋go|ahصv*{l޻Y™@yX,]2kytþM9勯vat<4l~-7/p;{V É!eK^$ѽ=YK,BXX &8 06F{\M8[|ۣ~4L1  !DI-GZ:I0WLhC3|׿Wi%g560'|m+Ν}+1c!DB5k|s MMMg}v!e;s'm֖L —-#lx[n↽?ntI~h"7r-eS}9^ DsF9J\hkC4lubP-n jTm8:d{r9sAZH_1a`JOؑU*l\{LJ?.4eA@"X'#|[7={qrOۿ{ɻq~﷭_W-V$R?zDZ @B1M2VXhѢG}'ܷ Elzxtttxt-^w''k.BSK[K`ht6wqبØ%X7uI=mʏ|զ4<'(6][S]9dbZ5Q*شkڡ ˪o[7[7 3`ҔNcąl M`)K]4+/`>0]=/i葻zw B潟Գk_38@`^wt Јv6?nG> ~[h۞}293S s"wlDGSvCCr`=P b!Z3@SkBTjᢅN;Z*:cOUJT*cqHa#?ܵ$E%L*5qidN #jUɂadLDb\Ǎ9f\߳\)jU-U݈h6" n\ҁ6 纒1atώ(1;*0E® );.KŇ?#rK ']^|KW=?#ojX#ШvlYvN̙~A;BY͘fv>w:kA B ˹ A0`9{l_$+c,1 GJPJ-<&8$_gL3Q Bts]k]skё?86W5)-]勑]|Ajt8cP9DYcGb JBF2ÕCK b7V .n4 )ksM| a3 c Rpb pk844".4Q/QXRI.ro8R *mkniߺM^{ٮ&4Z];{9W^u" 21x+ !!%";"GXY&[kDJR4+dƘHC{NFd22WqRB|ޞN+n3j#2a=oik/)?;:heʵz&5:ւ GJ"ldρp$@0'BGZ@A=PB+#c#JsK3ƈk8HCpi-mCiťeAƘZHIĹ` XcH8%Dq$9Z!ptO5i3|OB(;md2xL벥8$,ZL'zҖtd@d_dM\)VϿBØL&ôJaQy;MLLz4 bX;OFHշ5\v7=4^˗%r"(=m1y~}avZ]BQkYLLB^񃦶Vߺq`\kOZKyudT*k.e]9l49X.]"@čLBRw띀ƛ}`0Љ-NYVo{ ;'Ե2ڕ`X3ջH1$8#pTdm۶9R65dɒ⎎Pc4KPأdO8č6apдi$K# !}088@:9!pn㦡!^:HYpX5 %?#9crgy׮wO=իϤ(gsozE{CqI2Ls?-?EMWLp.R˗Ӵc`Xm$oǝV]D)8tQK#۳ fΛ*֎Ha5J'-9'S=mmOP@4wOJ#幌5\c>Vgvn&kz=3ot|[KGkBbmm[CBHk淋t(LZX2{G@d WA;28%P\h )3J!@IJWbp3VC/lhی!ꎧr\nCC;<8v@~.պg`G[[ְktqK3/?o`bZCWPp-[rL#edJ3ɺktzbǿX qgc cbIz.su?qUƽ]_ѡ}w⮃c# pm]9uū[vpwk::mصṵ;犷7 vrb^]xѭ?q:- %O*}_3wٜs|C>4x~_x͇?w^fAșws\}-ZTVfϞ]Tݻy/+_[~嗿/=Qe27^{9ss3ƬՎsMMMB~Зͯlґxϻ;.g|Tξ]x1]]{\2~i<묳>/qaz;p޽{[[[|W+f̞ޱMK.ӦM{x'F]e+K~*= '@;h!!hqٜc!I0@̾nxN=R ;un4`0뺵ZaE6brN2-=5[XYT< oetqTPW}cI)({Ƈ7=pMzf ;wdg@hpfsN?c&O{gc?{ig^|Z7PAUy9׭c8Vnڴ{ߩXy2jʾş̂1ÕmhRdT($cLk;22-Z#իWoٲeժUFsnZ֬Y /LLL]$k+|8ElX~ͷR+Z}Ν;֜F=ظ~c#PőQ^~=HɐMHI=|޽bػߜ9slܰA04>62sz"Us-]LimQjEe'o+!ǽfi=y2 &ftѣOݷa۳ppo Ю hdXc]bbuT7Pk0 3ZV5 ߽㱗=g֯-n6[ MIo^kliyֲ}mܧVS6l1Q PiKO%/G<+|oV~+N1ذB?_7] K^tXqT~~vwMC '}N^}e @ oںpBT/]k0f͚ zy__׿˗۷.J!)eZGp~ɥֵ/o'vDml5 8l.4_sk -[?nC?Bϙ3oh/˖Bm,Zxl^LN75yCӌWe]/u#3n@1KVt0KwPkQ3zxׁ*kl8x}kU3q55ǩe^H7"p$m(77\So@ tΒx|haCLf~R8I~Q* IDAT3]NgvTK+c a-\tՍؽghCX/@|7䛳 v~[J0V+VW8s])c00,*k#$1wy_Jk'j*/wg͚#`'jZ/|Qxb .-wTh#H0?7t=&ЄըM]~0R+yٖup2dx[.TCsM/"X`,nzϝ3 #0x0VͳJօLUx [ \z=YVruKF71kǮ[h>JȤ!RhH𚳗.]ʖcছ~pS>7mp@k8j* )AOo7.m֐1XB ͉IΫj*$њ a:t(Y{~{Fw.tuvX ƠHR[ g F"iBHzS:T./[|8Vkc1QSsF5kjTu=.(YA5Zs A?cK}0*%. ('; _2SjMPL  E0j8&R4R#!k0Ơm5FM3y׉LHEmĖb!C~V|*"~ \J<ʦzYO9Uc_v[^i6C3͘յ lhN2tԌcb+ցø\c#)I2:1⺽;vq1ٳӳfl|ᅛo_ၡZ횏|ҷaq@2${]]fRB @pq>WJ9S(լsK6ͲpWk c31 uoyEh8B)5wz[{Z+ J%,1`ր8OjͰd?aג@BNHJ{ɉL& d[wwU"pY Bg\(]H+kq8}G_yND{bóYkV1݋ƫyֻO])̉bMuhצ=^ٳqݎuCqqRX#,Z?ݣ#n*bKru(Nj2c9T*G rqHc ` 㓛1:79TKZ&ͭ"bHZl7GEZ9K=넓3yGxwO^s7_qsO<@T5qNapd "h“NZ>kVo^Is,IHŎ$w2ziӦc֬YS~IKhH>,nmfϞ=o֦C#g}1Pnk@et>!\5 }T8F?gƨ#fcAqvvv`,Ξ(Vu w3/@p媳z|֐ztc8ϦJH$IkBkBͥ3i(jQT*׷߾!3h]5 s]5e`gtl?tT66  AE \ZZ{:woOo`VQ jPzMQ1<ϰAq!`FS6eWM5[A(i+s/D6>+sNVtOn7Uֽ> F+%ҐنF78N, l!!G򕯜ZmŊ'pO̶V$AK/gMxeGR_@3VMɭg6" ~r:)*(1g:1,n~'R= d< aU캒`2Y-ǎ?{][z-BhI,]bn"T%0'Z"cXVzdAp3S,啠ey8΃ .:HVP-*WǢO^ZIXy\Mk?eVLК_jS>=;YAŒdx<8QdM@I9λ;'&&q1Cs18F:2wo|+z+/oذ)Vfkjk;osϽrJ{}YcygO? ^H$K $a͑4Ɛ2QqK0 A[ ٨Ұ%|r-5cAGGV4B8\:_QD,륕0XAR021.)202˪d fZw% nMԕ*9*td!N!(ijcwHh.J)S0JF,eD2fKdŨ^O!\Zh+&EOsXNNw]׏biS^s+NjfZTϸ׌D%m!LGQ 4oJ0wʃNf8)a#!y^ƚKIb'+A(t*r#_Mȶt57Ok6ʹz}R Ã:0YV̳/t9194J͕5ښ6Zwc9d2g D3SCweSHƔiqN9GB*Gg;8?Z:Oa/X$MZc88'Mv>TAK*^68|sdO Ve iI9`uFWKWk5  )#28ed]t (2$mq !":}iR#89ͣ, c1ऱ;FdGO0!jlr ס6{6w4{v̞1}vlF8֒!EHqʥ8Nq3 hS'R!!E*łF5 fڂXZ*Q*#8Wp &k%9Ju :HN:2z^^4Y'bLQYV .8""rNml>hgL[dT Yεsi$LQDTd~!q7frEYk%p\(b1sΌǭ./tF2鲌&EmAwSOped||{se{ t/oY3k. iFlj%ř㈣52ׯO{zz;pO(|tt4L N'4Gǘ#;Y &""sfU81lm#q_ziގi{^R֘Fq$!Vz"&&uZ!ɐVX)iS31J)Y搈b&\Ǧƅ\mrN&  IB"„*HZ(lz ca%+b)*% ྦྷJZϓ`7LV`RHVF$׭jIZhPQ%)#Ci##5a8ިRԵ5 )_ e jB0\V{ txWq!\3Ky٬KIgimվg%vvϛVz`*Ϛ맽Zm=c/27j.jkn\Fܫ\t{ |j[ĒrKZpݽ{wR?~ooJ)k+ٙf3}yMNNJZf=\.j#Q2yR*JH-\VCHWr"0:rdS=KZzªݛLw֌zN<$o(9FLk]0滢liL3)v ]0v]raS9 (yq2V[9)mXF j8\#xdfVVȈAa^OZ >$ L1q#yXaC1RjjPSFZUK#+=nX4)֜UOT/ϸ"3ݞ59<:;sFK[alϾzzz[Z%= [ )re"_zU:wg/:ڻZZj-HBHBۀ#>؜ClK6𾛩z~ZL>'i#ZQNFwy=;z믿eğ'jƶmۤs5:\}ꩧvءiڡCym 6]`a9HQ>S DGDmd+J]DGWS{gb=iMe_jM{ex=k֮}pt"(ת0*@ \#*DQ]:C֪6/Ia`D .TCV@B0l9O5J1,Ll T ;#*24,"Eõr1&az 㘻+ Xeq *w`%!- 08n੓kڕ%qE :z @[:~ꃾD2v݊Vm\W,UTz-7t%y⹡0֭on3:˞ yOKURa۶(5pޗRou? 裏~ҥ\.L&ReYSV.k]ݼcx.jAMUl,LQcuwFG(m^t93b]llaVG"3'9B ÕllPJy'թ.1]o^zvL7BV(j*jNh#۳ ,M ŹUE9H@`JN WC$` F]}a|Dh Y=sO:^f޽{lںo߾Bo[oe{~󟧔;_Ww?]ɑǾ??~w};F)g~Or ro˿xGߴbpKCuk8뮻?=Ξ?pݺg 5MQ;_zq9պ}d^Q\ ~dP#Lg;ۗl\p趠g/.;tʩj4MsKRm<8ٿwrMZ-:A3z7s{n2¡^9vl-Mv9Ng_OY/߭m3մu,ƸIE;#S俲^i`ťKJ.T*Oߞ={~8pu]i"0"P(D`HfO8c+ 9Dp2 ᜟp^S,i{[Zk A.aؖqq˖m VtKRV,{g/wݶ?}n3X<?d==4 ڊ7Dɳs ӫ 8wof8-̻}ǓX2,?sqܶxCP%λPG_#$J pl^eqbT,sc*FK=-4:>%#]vB |Jl6;888N[[ۚ5kxSU0 Hjnnp8lv* drbbR8 BP%V 4m&*}UUJ%ig| C600%]B1׷m6)̟|C:t{;8 Mc"AF8+ d\Q R@Px?w ~嫮` aE\)W@`\E\LLs'ԧ_m?}@*@vz7#Z@OiלL*kf׳{GY4uXyc?եsgF Hâ#TU˫M%c#10kP2pѥ7*Pc2ϸXZ @E\wǦ@%_w-Otu Hl r1Γ^'7ܺ#ʩK0yJmL`B9!1@bB2L___$ٹsdBHlu߮%rgF]%d.-o0$Oҟ*S@_?9+V|:ejueO= J}f*{?'TfM._R?<0)Mewcgk"|OH#N+”jryݢL]BÇ{\noo={aa<ƹ²L_⽾< .GI.@ -B~9sFTc_.]+߄pu5b9vTUDxX(BͱH4 bU* &1a:U`4ǰ"Lt :_Nsi-x\ tb>On#%#_Raa[EI܁/a}ZmnnR8qB&q +WlmΔ+o?`0 z˖-rΛ6m D"I\`0. Q)_t+fw-i(ebʼV[½V|)*^-ǰX Z4"~\}} [\^>9ē [7mf4OYs% Ru.RZTB9gDCa_cjP755avIENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerBrowsing.png0000644000175000017500000010670513063003371027016 0ustar mans0954mans0954PNG  IHDR+ pHYs  tIMEK~O IDATx}wx}*^d\q7L %H i$!PC1B`e.YJ[|v4}l?3wޙy{ڳs3#FFB1ba<-d8#F,F! FUe/ԻLX',-m)l+KZuw-%{`wF;iv-W$?\u ݩ lNz!#)kg,uֽBy71bĈ2cJ@V)n!HeNops88=ߍ q^h>WL~r?#vXٸZ>d{2Ȫ*QN ܴeª?9~vSvN|izڸ u[nYv7;Z%|V07; D ?YMij?D4-\)yFrY#v*2\aqSM77YmE*ká8 FTs 9{ _lhAƢwπk?K)6w/>4¿FnIoG|>뾂e/zg {mfщꂬ"~ p 7,f{]zM&߼7^ՑyWk<0j[3vOXS|<-0h@kBEw'F|5o7w"?W ̙qѠEw=yf+>arEMϻ&߯Z ?w/=حoG< F @P3S@$eOpKj 04@=cQv/qi/4M?lR>.ۑUX4O쇂s}`f-g=|f>gߐُy @_ 0ƥd?Gk|KLQ/[_X/~[,@-@D78+[9w8=g'_޿K~9nw^´__heXtƍ/xM|'Yx8s|΂W@v5jќ[^?K_TIC%mgg;.r#s1g9x(#_|0m ~Yo f pQv6& k-Wd?gIܭ|^N4 f  v="ퟗ|Uo7]/~7`;R}{@7mZ˗^nsBf\nai|sӇn/Y:Ek,Y=`yy{̼0jܾr#YCp@vCeG1<>lE*mTeǛPpf(-ǚ`*Zxu:';3fw/pf,g xGloZ랟r^W&_.ͺY7y]Lu_ι9﬍=`EcӖV8ZC;Oh9>+:͇^zBṛսu΃-xcuۊlyʞ7=3uE zzu7O-{}MxH_?w $T ݵz%#C.3SgjYo5^wV|>]iC!mA Io֛&~X~𝟾O=y6ų񟿮^IlS]>4u kUhwsHm׎&P~r }莣J@hsIhXY1=)oCSdNͽltԕ1bĈĈ%8b gI[bSDZ_q]zz:Ubg ! 8%f`#Ϛ%GYr3ۿ.H.9bH]qbĈ#|ؙk#Fp1Ĉg6u$~v-\ٛ꾦NS#4~t칇 x쵓8nq}v#|6m$4? -c#BZw:m4nڴiڴiSNvo.9_G&;qqY^{hs-ćZ)>SQs,?S~ֈ >*q3 ]?5ƽ%\ؗz)q9 W~_*Y#5c, Q2 3r_8ƍ7n_TMI|vy𲵲q5GHBL6Muk(S+\-3zQ̨/KN9bĢ2s=g7lؠ*嶦nHsY6l1cdBo6l+,o}aںu넛mݺuZBvZvnkxT NPsB+ΚRM +1%nx֬Yf,{SGX E@"bF?V%|U]˒8c1dDs9k׮>Ul^uU؃w|>2T8p0Tom8TuvZb5탫?bg;}+;x{Tw}82FAA;@,1b 5rF#F%F,~b a {ٰ;]C̳? #fh8 1-#Ng 2#g#Fp#FX?/w}|7/'g~'~au?GN!'ADg0V6GNGk "W Yݱ#@pÆ1|$9=UqB(o7]X3B$\4CVkwJ4{rӭm^履l g6(J7kFn}gfa(|?7^ZAKw=tnrevr6i+|;WUV)߃٭X,OillT}4(|7^E89)S&H Xnhφ]M0ydGYI9e%VKOE{W跋IWdjGŚee*μ}&jjy7-9Pa8Yvo֟V0~nh X-6 ?v8߾rr[%Ν;w\J{OlDD~6r\6-oH}!IJlWWWEEEIII[oyu7ƺرcGm]/r\zzZ2pV/wߺ= S^1{'AQ( w o<\}9WL/87ֵb?+wc󰻻; ጌy{oκ#MV+LsV r~vE ̊N+xoΚj6rc!xM)ŗ%J ag*#`,hhyV[[iۣ{>V]]ٙiŒz+++MA1EյIӧhoo2dȈ),_ cYZuZGDOU}`i \6aLu M1\OM8Y@1hF,ǾC5n~2Y1ZRRRkkk0͍97=~YyS?s ]Bz=]v/~ٽ?ʖ}7]w|KZa ^ }8mI Y%èD [ZZZPr<Νt8e9F!rrrrvlҸZZ| 3e8PsՌy֡꼯,?~Tt9nN1ðQيƽ~\2 QB=#o.dXB&4Mp8YEEEN3|ib9ݹi0!|:\Z.; EA/lAiMK`9&1aݚ姦juX^qEQP񤧧oc8!Ro)]W~:Kl۾,wB4Ov\ni%P{FRZA$Λ B'vmӓ-b1l@GNHMME }2 cZ1ǒ}?k]B7~OEff-8mԈF"Y^xYIr6 Ͱyw.-G[(˲RB(`ذL(.a j].WCCC8NOOY[Z87?9maY`,BӞZȅ^8%o>/jM>˃ D?8Fga"/ m].x4g,zSRR%QPYM 0ɛcBnӝSkOCzpfo >'8a#DcmtZ?~a9ƆX !K2ͅEo%Ph(rX\fFMuZ<+ˆC4hOu~G N0}*Bb'ՄZ| fʊ1AC-0>|0/ln^^[[+Cӵv ku$%%go}zC Gn[⽓ie`C(&L/,p;p! $n Iȟ],tq\F M.EJr@ [fs3f̌=$gKw{v?{L&xb\NTogqV#2.ant:SGym -3yv+?,!ot\,V`X.f6K0:}z&f\;eڏNmOSjG euPVbEq1aE<=+V+EQ~?999+++WC0 3kwTI9M yg{7W5:%9%=1:>KtgO !0LGG(..6~ c8b%yb0 ]G<`VCh ::?^1Ԅ`08d[~=sҜY77B j(Xch9@-fVcG B!>jgee9N^wcV#ާQ@9Y}k\r:e>Ǡ?|路Nnns,[/>Ye322(bYX͒Y;xϯ}+|࿫ KJsBдi<_;v>u+| XX,v=FTPvGqVʔ:33㸖Ei]@6 {666ߧzdZz`4& `Y6wG\`sl 3B@YyN8mGe塗fEsT|>jMOO;&~tƗ&:ׅibY/Y{{ &"p; effRl\fŠ(+4Ӭ,Pss3?SFd***܋1MJJ/=tᮋtwwh2|,4p%RP~w* r3 KMvكa6L3]j=qɸm^p EVeY'捸k矬Xʱ䳽y1, 1R>vT?s@Nղ5P(dX222g}Oxngfd67=g RSSuak]Xl.F!v{I0 !_nfxp$%% ڐpXw.O=ayUZS<{dbw}Zxj(ut̟;~SSS^tw0*CDe O')U%Fvti(|Vŭ6:2|_~\h<ZgO:^qY#~z r0[>~Jq8ѣ B?Ӯ#fɳ+ţn|g N*$𘛸ţȿayxMO&8BKĝDLy iPRRRcccMM [*>5~^d۞&>~SBxYdKtgI{)&+lλŦ|)4>q?latMgleID7#G rtXU(O_A<:$憘U4}\TdK <8^^=;7;e[dh?nkkl{-uȎ*ĉ Ꭼ2,WUGalDgⒺ~q >tgGB8Og̻=6g̃/`G1bp{+NJD\!04o@,v"T%Fp̷xCfɐگgoݾc~'8i}tΙ{)D^??DX?֮bmTh~~MuS;p.OnZYTTTIe⒓| bxt bgTݻw/h7nܯD?a5>pLHw0,bgBvj3~xR_1bgY\رc/ͽᇪ ?T5u kM'.4'bĈi8kMkԬ@ Q1,ݿZ0=Y(|)*7*4T1WReP|Z*;m+|ͰP՟9FL6 H6X$Zת}b_8{9zڍ:k)}x%+3mClK[=@!jYknf촤GrڴdWZ%>"& @ N"c.2յ Zķ//Ν TbPn>WjfvJ,o\i:elxUo@愿7hh ,DbTL89qkeˏIwqcGP1Ex9R{~K^6^ž^Ww*[o}{JCZmžRY656e]6w z8y˦g"[}yn44jo+|mބ>²0ax:BCÆڹ~z(oX9CsKD+K&Ed-6|7K,?nOM0E;vsG& Jq8l@}Κi>gjI7 չkKIclBqISΞ4ep8 |mkwխ@#+!f݀(p8RRRݱcCUEXOqNm c@{AƊU)nFJ=L62aT&zWҪEnWbg"D [+(5ji &;BJdEL6X6r/fFb"g-d:V8 n*Ԋirל|WFy`WBuLarNTJK +"nɯv%o֦erVCkwV{3@Z0t!Rmq3eQ󫉳f0 J@);uC[S L[0U tV-6oCWX`:4VUETWLU]GmBD v,%W5`f[>+Fi?@REXЉ)1[ucZ |֤ Vت5m5qP;/qJ+L-A伆~0)Օc@YQND}S$vj𧏭#gu t``ťO!8'> xXQ s*Y"n@);p6jV q$rA4Ѳ1Nk?!&pIXKOceQ:\ 4:S$v, QcWaYe6&u U`*K)F(&BhO?#|s-2&`(ȋ'Ĩ!6uUWPaAcf-~0d0=MrNi5 kB1a1Hq];@^q%jîz \r#_ERI"C 4x/6'#~',NIE!jt}ҤIrm۶iMY=DJԢjt2P\tQ`HYJ J i4@FÐZu,Q# IK!]f*EG$-؅t):17(su(0Tf8o*.Tv 82{Tk<>WE<EkũXpgM%՚}9x62yAgUu0Ʊ6UتحRVn\YQb(DC]׀JK"bZ֐j0\12@0"EIZ!CR>U7?GXG/SVŔڮ[k>+rn1BTt5,]ԒSЉ⊁"9GPVKᾩ bڎ-q#8+8o\椤.,ϚtNB`fP ouUYKR#9n <7 MH Z]٨g1Ϛ[U?x@:TTYZ1ueԈ$&}XU0˂qBИ![ * 瀑|]2R#fКZ-^eƘpVFIqrǀ S=ƙg=`$_W⠖ BYz,n96ZTO>kb$_1b YYF %+MArLYNtR ^YQY0R(ʉ'.6j DϚH>?0V< $71b Y~o1 g-2+D-o_0gHFXB, 6H7L%DtQc/vaY}aA+xO:Pzxxt m"ÊA!'Y?k|aA}2<`!j"Vr\^|C-}>#Kī=L ےJјU~hgHn6!ڢcWMF0B1$5 5$2~?ltqg+NMVp UL{T]qKYkL[mxHbTO)% Zi/cH`UŽ5a@hF)BQebϪhFR+ )V,"5@rB(Jl%V^)5TUH᭪`@DWѬheq8gU_up[ Ui*B.h$m@[L߻b[JêX hb@ >.ړf5voC,FcN>AT00JA]7貺loxj1YLlؚW 6jO ݠ/aR㓂61'TTaS:HLNot]`@jV;ҝf8YnwnzzYR)"&+u Hz1Lxa`3RC'M7@x0"m!~ Z56N>9F4axJo{tw׷on|luC#Ԍ1yy- Gd㷐2JAlȋe\3r8@p)']7oMaC :~tY@|1g݂v* z+65mixj< uׯonޑ1&7wݞVu&+ BFn. r"3:xf/5 BPm)aREXc՗eQ1(~2ѻ7x  9UWlj*TǑ6hnly87wFVx0Y7(r~þpB-bqiI D֔kU?kʤ Pt"W0+f*,I*Zߜz9(#xV}ޭV ,_WT^=A+HeC_VWy];h+(8vA&8o`fu\Oҕh)]@Y4`J62ߗXbyi IDATŔk5]ABh!5]Ng[ <))Zqvtcׯ(|lcVr#] %nNlU]VxNgVrrÑ!šzîJ60@m_lz|-PFc\D[VAZAF1 !"YNeLG 8|ݦCI8CVTV~VRrÑ gmϪ@{  椤Q0z3@YW^$^.М_&4]p 8M_aA;7kѥ8 {F43^oEM͗]b1Al) YB Z'ZnC?Mʼ^ 1AjVX> ܂Xּk6 ٸj.*DtWu2@%K{f-`~h߀9#̏{[޺삂cZ !uwSӶX¡&T5f(^%D)*Ch9X} y_:q~0h2bNSd*JW*!XL 0]t003檪TpQTWvCæ晬]oޗ[# Pܼg0JwF1UaWe SG7eqU%EUd7gU zE )Ձ]MUVЛ ^رeP;xڝ0Rh)tss ׯKK$V+a0VW]&Ҳ;7wZ.V,%j > {âdPR(pA!hLa^,HS6,2:g}΅~كC'\?m/P[T3Y"iX%É9qȭ-vvKIK7KULPEr $LUa j :V&M,hdKЊE2VFNDPD NR-W#\,'N|ͲaÁKz)wiuР@0^E'P&<Ѵc~3m1A$Bsɢ_"}ݶ@ +x,vB,UV˯lfNsudeumowX,fN@J$gO `1>io?> D+s9d妯z+Fj'Hā]liizP @Fh}|? <"Qd:]ȷw0*қl+%G'j ޟdsYS9Bj庲z4[?^H1䚉A(ZLe)UO0 [IbI˃RU̸ ʚ>6 dVp-`;8YhT3Kf-]Ԁ[sҭL՟t<2fT1D$+*tBfsVvfl=цO h;3T᠃PaJۭ֤`D 0p ˕5V[eUJ 2=YgU㺔!8P hX 2ߗVF Cdu!i|8G: *Hl$$2!酔^x/ cLӟR 2fNllϚp ZT,r4őy O÷[ 숒ܹ;{I\r{W͖Ukun^عĚm[[wwvZ&y,կ#Mu",-fM,e\^,Bi+j+wyv%5 *+n--׭[>f(TV6zƯ۫7ml4B#ġtMg#*_PnUDE}FN OAk-6]I55_A ;G:OqggbNmIp؋y|fn{[]ֶ?׭:$))'`6:1|ҭ e)⫱ tC$Ouq%thrB"碍dRtVE4Rvs(~2S{`6ƥD\5gdkyzW9ee??q뺺ޑކjX4m{ f4yy3A?]J(;w:άIye0@ jZCռѡO,|V#x 0l( F]8Ej/=z+cs%^"q0}UڤU80VV=?Z+{ܸG~h8\9lYk*]Ur+۝_RrEamm`5QNgVjP3K(&QI `4 TUEg} ,+LzJ3ZI0MXHJU r"ΫZtը ij[PKAۛ)QXIcA0؊3E)>b΋ @)3pVWVք BhgeϒKFQ()48 N0Z0*f  P"H;)I *`)\3nuWiY-zGc|Vsذ[&LkX9%eȄ sD-!`2YJQX"EtBRE0gŲ~`ㅯbQ#jVŠ[\0\VC.Ҩa#C^IX1UN F%5bj+ h (#ٳ>~|cKh;"OkLS^UAJ0 \ ,rayѠ5QﶯQ'Gz+')PR@\,3L2**+n _Z\<~mE^ ך\\ZzŀsDn,!P$W 2d*n*P++$Y J D;Vf(7BB H Xu~$,2\Պ=Js2@#`K5hr) r坛wа;k"֝?'3,)V 5 ԶRT T( SRwB-5'L,`fA4ti٫a3HEj͐DXPsa 40=+R\%KP`"Tt1WM[3_ς(ٗ .D[1#&=\)`dˮcemU#lT 0]^ZB2 l^d:u) ?Z4\8Z Rs˅ bޗ%0 URW5*StT^<<>*[{! $,d"$ "(\AWqcd'#PTG Ì-YMH{ {g_zJUkuq_~k뮪wQwy)rgdElk b >e^-Ao_dI6]KjM}]BaP r"dԟgeIYhx TW$ "ń`9kA4P:̴s^oK]ݷ ݿ}v{49"#S31xiYdMC^Sx fKm D}h`$0'`k8Yzn:݂|faҭjezKKr@PL:eqβ*_ĉOw55Tj^#>6ob⠌qq4Ė16P` ^ڙ@oEs k5&FW`eI اASl L*H J%=AH`UMר.eqJY@)UsTitW:r~"֥*bȵe WeBm6u  3 j9b#@4PKṗz`)O"0brY)BpQZ*«kerV:2"l(00+cLʋ@힠:ecD[P=r-,(8>}_l8Eγ]~=/ RF 4'<8vРoFddJb$+L]U[zL"P073k^ꁅ-eU㲳&^, +3CLH4K _dP.~`ࡉ^A6 ŠF,zt`4*5$ (C[ضUSwm }y&wྺo'[wI'Ee>iQ'lgZm<{s;fg~ѿm!Ei-8 NfSW jZtȐye@i+ԪTk9[vr\t}V rb1r$}@k'|)߲lG;S;It')_t*|Mymfz1nٷ:v}#=q8_99#/uAԯMpL兂:L8nǏCBB^uŠR{V]wv8l6p,^L|A߇OÉFa226,?!QZI=PJJƍonS[T_]XA!״0ǡ9szFG8lx+65UV邩`=,Grر9Ǐ>

bU*OU-`i&!.CyW U=fJu"\ JAś6oDĬG1?? ز%z{qA҂=ԧfa02S!181^yUQ55{e$q߾99bb{!66wUƏ}׬Y/\~7dg_.B}ެ7~7_ƚ5ڛnz0"F{YfNc[bKA褕Ԡk5,u2ݓ]zTU/ѕ:=BW Ύn,9s.ddFDgPHmNgBr]T=F:l1U@[RgvjkO놬ӳ$ 2rE),<7c%%yy<h?kp-]Dg^MQEF.k^t5%.՘H R0u%Il/KK]%%; @`%[ƒAtvww:@*֥fe9! nJL=hn>a¦1yrǎ;"8}W&.x#ѣ:TsI@YF*XezYh eg!BɠZߋbb! Mce Tҭ.egnMNvz*9QL>7VW{hTBk%s+߁SSǜ?fq:n vwϞ vcۧvNAxyo"in>%LVUdѢ{ ={J{oO.-_ ~b ׯFyV:B0)t"OᅳmӦ1>˄ًZ?k60>[6qV;Jid6; ZrJV:p~ݒp y[ D5AD+Dqwx<o=e ރh,XGUT v)NL63  |\uK}EVp|'YE OUcH!Ʋ mU ,Q-ZY;:@xQ-o~̺cڵ+"&''Z[=Mzu௷- Gk}ͧ&#N ֧ 8UɊ7+Zh]\d5)[]0U.T0rlB1OLR`M ,# 1*k[!v 7IQJY$^Js5 !!,@n`jЖ8CUUQIGo5s mtF} _Wg A#/DGG^sn@FjԨZ~?/lUnn۵HmwBWV`!F(l'\Ҕ)Oa@Ҁ H2_ Ku&}wa!ZFe ),*$u:L˃۹HwMUl:d*:6jXB\-Ax+;:x34ŏ1(cm. vbFN D)3^N1:2bu7i O2p(x10 lh.nL?nLp9t]GҰkt5V\=+ZZNy<'&fO~n'p{2""ٔmA_qEٳfu3gfg AI}n/|WTTӕ3f@zO32RyUU'޽GΟ߲bo TU}c,;-C@ WguLk pY /w͏" O< Ɯbҳ*5Xk @_|W0Bشr X3[]@yga(v<+A˲F Fh۷ͻw('9F~{{Xy8(AS^immm^Am~2ryN dwNA8.5Gii8ɨ4e&@ ~G6m: υث~^H.},(88dH7߼oɓpѢG>uv/_ҥ+n3t耷~r`k׿k3GqRf%+î̎b2$ËVԂEkQ5xR ˜Ø '=p61)]~# LU.#hV8CH%W0ၴG )pVّf7jU߹n`ZymeEGgt6vz ~!ޓW=n]zZnwu!^^vz;ynJ#Aϝ{)Yhm;V??ytZZܹrs{9^ȑʓ'k?pք cgye˖ ͛wСk>\ydB FIS݀E(0b KKp'II8.BBBsV[+k:>_kKiTKHȑnxD[UCmy3:Y>}{O&&#u̳gMzM5 Ǐ_x;vy%k=nַWގ9}YX\Ϫ}B|WV/XqZpUzz>A=ĉO궶'wm?~^ޓn„߸q#{{}^S)SzV,XpWSSc}0a“wi-?!~1M@26=} {nr]^o#ϻ1GF8NggEgmZP/m !!6i]zu[n/3PQQn{ق#r˘KOpS-_7(d/^ /Y9eJQx֬$ʃ}=lB|ܳAxA=z/ݙ)+ZTsbI_neLQQxp8ԩ{ϓr DֶcGQQNq88Qq}bN2@zSNvǎGss,/7f,/yMon>z;L/ܸJob@fY]m\~?hذ由 \> ⳠK81m|ky]^!ԧ 2Ș^jʕ-hJX"1%GigMK*H1q.4),,zͻ ᳲR/+{+f͗;A|ɅP]‹|Yœ-5M<¢7޸[xirSRbuvlﮮnz_69S}{qcc%KV WBxBȚ5/oXmm3۶lhh˜8V*#Vy:eTZ:*gəs<でat>l;:B5nwQ4o0LaZq|d3\5|lddJϞm,2ftd.(Y9 Q5rt KE,L*ԂYpfEwKq01P:e=A$NmժY!Kz<BΕsre3fH!Dx{ƍ***9}3N޼=A/YrΜ^p؞}'?dӶmEa=w%KVϙ3ulsN_6o߾j 0QZY5 у`,1͓+jkjjvv8mhPw 6nv^443sKP[L'F'=^18k37n1efq*Lm t3nuWey. w bTzKHtY t*Dwt4q 1*cH!njUsg&m!ӧ_;__O m m+ض! B /F` `)J{@Sr =eC7(;tuX!_ k^uġ#GG9|G֮}W.H./驧+!!~РW^ytĈWoSHlrhy#F E9WXrxx6W\Œ m'.\Q#BF ?/x!^~k™,yر P,q+ 4IDAT-+/oErKWm#@uvU"j)|mm͘qkp7aJU=쨰A[% n T%޷KW8KLcSQ7PzhEV&zw~Dt8n^ۯR^*)9TWUa}& <iiEv'Rfʁ81!xѢ?EFyNZ_qGz͘1~^[.~-[6i;*)9q\qqIVV#:<+˥F=%Lҽ̤МΘ)SaÌgr&M_#lZI誂WV6*#ȶ̄~&Kw`z9ǀ%*3ZA(cH6$TZtWn8tԝw)s.v5-[@%y,b&^|TWUbq^^60Ƃ oӦyeLd4 ٤_q_V0Y SN:E>XgsYܐ3=3rgn90z4P[^wy_5I2VΤL\l({_<ƍ{/!!; fK ce ;#DE<ܦF 9#Qwm FE1&Ab#r*@;_ɰ ~DUVy"s``a<Z7F1L[fJddqj;ueiH'-8cAW%EE(FdVL xYgJDJ"FH>vZcg.@nCMbֻkjvrOOA( x`g̘/)]juP||3"77~7]0z]PN@o(K(MeK`3h,qk]ֻZSꓽ{ϐ~Ae)P(YT`\9tvtwc<0ѼEkVݚ^*)v|(H%52pU:I,Jx$?WqȂEyA5,wzeބ=@]VID(Kvn{%FiB6ٔd^?rҏ:mݻ{w;q%(Pk5*P+upX%TXHLRڷ<PdQrp *"HEBx]R0PH ^J0U#^a^%l_n!CVV8skn>Zx\\szȳۣ,* i(n2Y46bFz`pl!7`|H\ւ> A ah8GPK_I2+R"% QQzlK8Br  $:dV0$U/{Z3k1>-m \O{<{Ѳ^If@]1GY_9rd f!5%tsGf0h%_",^x ,12%;޾U_ p]7}߷aBԩOln~'p ԉj& V`ko\G`_@I-=izjpq9LiLgJ)\V\?ZJ?ˈB[FY"L4oN|aٲ##2e_[Osd\$tJm-u Z1cm11Z!FF.]ݖpALds@`^Ż.mk?K7#)ϔufth?_wlE,d fA3ؤOKdMeYKKWi"Ik`F0*͝A)nfNzz2SKY8ra y)\ުx1 UZ,)RҠX;it N>];}8o?u:C.zIf9ӷo}aI88р*2*oTgC0LcA@ Zft`Xņ"RnDJqEցMU[7/g_b%"-bphkIՂ)mہ1c>/cf}э U[ewe)_|j,/%P&_[(jN %n7snu)>k ņM~5}W>Mo.MV)msjEhѦM13LTU5~u6)Y-7h%4e _5˳|B54 d㸈Qp2+w>Q;\.hloֵ[6~G h JE}ZfVm«2I~l q]?9KIENDB`batik-1.9.orig/documentation-sources/resources/images/group-logo.gif0000644000175000017500000001622513063003364025334 0ustar mans0954mans0954GIF89a3圿.3~-a{( )S|dm{3K(Pvhe"3SyZ{JRvo_b|Z΋Е- Ro798~R~s\xWZAVtwÀKZeG=f}dc^ŴHVQXjXr䝁d]ͲF.Uuc "yPb[[[8 SGQ,.TkǞY^\{hrBBB{{{b̙f|YÈzWJJL;^zhdWd.p6c~0(7dGf Qyݴ[^0:]xFQRznZ[b䄈X 333v]ZlCUMfXrBPTkSket}X`I vh[lO5Q`TtK;<g05YrQ{Ŝd|cZ{ggݞ{/<ԝRRR'%(΅˷y~OKZY˴x]HѰxuj@TPD8`Tha[;СY-ҞYgt捍_㠐|] !,3$Ɛ/,c LeaE A C1u0$H8YiF.0cʜI͛8 `'&nWCKvEfH|IpAX&@HL5 KHqҎɐk@V:"ο _g9HA+ rឨ10ՃS…3'zO pUG(PQCIMKH!Stq,C)SF! 0A$cl$0ǎܢ98ƒ"sS9-aK&0djd:ӒMg YXj0Pb]`J fy]  L…)s#,60rM ,ذd` ?,[%6trbP"Lj>{/L^g%V2f> K(Zp1Zyb ?h8d`ɒHbEt= @r$ z 7 q/=goLZ3AX2p LŔIRApU-\pBSq%p (P=*!cؐ dX@pN3Wј 5+Pf"3SWY+ĩsM"I&4beIJ8 . $ g"E$5?*2zH og1SՀ:w6MahHB @ Cd"D dȓ6# ~^ jP Q/iIfh@ (XOL>(=*T%i#k1L.0LR@Fg @(n@$p M< !:!!F! A hD#'ɐ>V̊dIBԬ>P,Mt| P}L2BT8Ee|.BH4<'8A G FXs5!Ft&CU4}! F歛1gD0<) u0`5`(E9%ȓ5L", pE& EP2'L5h- #rI.vh>ĈA ĐCgn )b S^ 3eC(h,d Dppr 8H%؃Dťs @ C(#{@FTa Pz cdcdXn\ DFө"l8-hZFD(sQ4W2 O|I>AXMr J4T\(0 2\0rtH5J'= pP@^C pl>  0I؃8c ǰ^"@ T  >G"1p((sBKZ0q| Β)b@&L6 "G ^"ӊ` Ϛ-EF0&eC=X W-6?I7 5,xXq zo, *1id,y"NY`d67Ѓ#y  |\&pE`^ 2LA' (+/V&A0s;0)vknP% 6nk$B!Gdzǐ/qFxpE]? =8'`P7uK6? P+xpe&8c@kP c {Xa}T`y@0!|u|b B;~vX V*kq 1)L0n6hr0w'w , dTFO @ L  ;n}tF$ &JJ:6`r z XVi60k}'?-Ep< p{aa/B T—Xq@+bXwn2(J h~aT!.LBn @"I cn@uR YwPS8Q@6 ?`B6pFF|s2,x60Dc7`{P w `.`ih"Um2 5|01`aSf 1Q~ΐC@G&deh=Aư;` w0pfo 2@P ` H?g` wh$: 2`2 r3yGs `.^0a"+%|Pf- s{h9tP 9@ `B1 K yQcI[` `x{@ I Yf?V d6'4gb0oiy&З`s=`2jcӀ<@8S`!|A"0 GX, qvXmhgAC~A*WȐBЈ0`&b0d \?]YfRc;Y}6   `u &c`  z$< 9`SY n`@,@k7}@nq֡! 5R@a5r bE) JmUhtPhQ MG@ P8 & h`28 ;`;J`s3Yx=PcI p/:07O@8sn@ CvL`z+@ d`S|PAKjS e¸`HD20|CXc/Vm֨22t!!P QRsP<5r14WJ)8)k<2N4LPeP8v^[h,!D9RP4d%L |`*!8sZ2l2 #@iaJzGjY09dFVafd9iH!5iB)0shrEhrOC݄T/Hk0(Nf*Y`2+a D2, NZhJ_A #!iC L)0©2ip.h!9xLpqvJNaze ~ywCH9CBԛ"i䜆&, x yNjz GAfMNп2+ `K*NA\vmW^E`jM}{tqފx!'#KVYz4-ங1_ ȵw6?ROͺ0oERWKs%ھ||W~eVgBy{y0xMI߬|}<7 lU`oeB/ޘj%/ ~ֹU?Jr3l.*=#%08O(a5w7'7|Ǫ zvb^n7\N5\o?05w j/(}.Ɔ}5֊8&D苖{e97XP~3*Suw~B1@-QPH̜ܛ:H_V@w|(`ONXA{_m?8{}/n~| OL_*? ]sş?~O큾ӟGo {d3}d=@]p_ ;G7@e5`Ε^ 7}#_r˂Ķ?pޓ;鎳2zƐ| {Cv_,3V]rs_K~=@7e~+^r勗 _a=F\{}cwN׾:WBνcgݸ\= ' 97+O9 QiY$QQ \.-Hs2~j҇S ퟚ?/?7omX|t[f +2ʻKl/þ܁բOIqt5g +w+?<>Ê;J?}iڿerNQ50/y;裸 u o-8WWqQdsVΦ}~=}T!!3huXN(.h 8%_Nޅ֒c0``p0(WhW@+ϺIRxVcWy+3FuhU;>ZՅC`QvJ@kZ+^|0ȼ?Bp5BS{w|07`Y7>e{-x\h\U4K[⤣7ٿxMQjPU7wSb<ӣ+Znk%U?Gޜ;T)Us%ϼNjX^ޡs׼9u?%:㻏ۏ/x@o=5ҋvx|?9/N?)^ҐT7됥'Q?Ϟ3G6{v?fvܫ_־r] Əmy(>]K.=@YiJbܺnIBezmIHgtS ON_>OL'$﩯ߔqjBS 1o_'6`(Sgŗ{0O=<3OSgZ|e,F^<.MңaHyJTlJ&|5[@ZtXo'<ۗRcְ/}!jh$Ɛn5=.)_$Hq[)Yfŵ~4{!G㓰DB̬ "Ȥ'@ =G7|Ss#qU, GGF-S3 Nx+ .G)odDgƟC=@ GHg{3y%@ P"y<@ "JL?n:De+[S=ɓMT 䣿NFɋ?8OV2׭ni^@= vZ,֌s^l\5ALbk׮2eɓCK/'+=L:.j)P`L02=A =]4eJ^l_X(we[Zy8%ƶP<催O,]֯}IuȯXC C0os岯xQ#Yf͚5ۓAķXSh_X&O^UVC G:xN`ʔ)H=]aD?TG ^E " u;0uTaaJ*RkziӦKB#SN[[zɓ7,lՎα>?+e5U ~PvvTOy<4;!~ P"P__wy@ G=诋@ D7ף/"s={`7۷dC͙s Gƣ'?0a7*o|..˱?{y@D=_؍ɢ::>D-ۋ8^@>|ةt׳}ɢTp]p^9 S ,dOm# ,˪n듂QsJ ]GKKK_5BJ)q]&McAiR5-_.~-$==U0 }v[rCs77>q˄$O#[,l ]c222;C޽k M9F|77OD1ntܮqCss t:5Fy`&,VI}/m{X".GShiiiccczz:!Dv<7779rdH zߺ:]Uynn_زeKYy9Cw )MOO+Y j >vY9yTE3G&%`IeTԶ\1}ESSJ0o~{J9+*}gv'R;r=wy:;&Pe~){vqボ!ԣRd%HKDm',uI+R/d[IJUJ~&Pk.B,))ijjJLL f%&&zޣG"",Q0͛ !1!_<|0PRa (@_\\C8I.[f_NʴͭU[̊$AH<҆7K)Ǘrbbb]]ɉr7w_U%_5=wR +KwV5o{_y!_2!v[¹!?rWEϽ^&!%uT$9)IOu/-N)I(0²%r6fYU|*l6_vn[RRz8NGe( H!STU0@yؘr ͡ڂtAc=TRwք;VDl&[X$υ3w؝B;q8⼼P wQS:VHtcxJ]}ܩCbM)Fƣ%%%@v=*Rѯ_?fDj nEk6{nwUuEJz9r`eGV@(S!hvNݷwT2כm6{Jr-X^g;8c Cr׶9~ˆ\8>2Vkx+Fwڐ[8yN&fufK#}V eY =p1Kv +Ι@y RC(r\+ƟDڇ_lϟ9mvfWo)W}m~c9@D8ljjjl׻wofUU%NqqqssDz Up8/q‡/R)¬8p`EeILJ:s욚Gz@Cvޱk[Q\n9\WYzJ^-{K/֏R.yw=~ů Us8>=zjc_^w zg?-xk!}kdz ˲ljjAȑ#n;zeYprҜA`6F75h~<?>$mt6}~ŇFZ|yu^7pј0΍'|ZS4 vWq%QmmmFFȑ^WRBHZZ!N`tJ۷/ qxi}zkoKq>ߢ5 !=纳cţ׷WE\]Ig=m<:>O91. e!`!H-Rt@ `=OiiiNNNRRRyX#6[sYQ m`}Sb!ͷo(Eb`UV]UOl2y‹lt86VfRe*G#c0VBxz)))iiiBIcccb'MHH`Yu%Q~wYsm_f~B6^u^c_r) f?|3_xþv- ,G@N-AUE,0! +ztĈeee.ge]cw x(a9HUnFG-x=s'ItjkKo(` `0( VVVrrY߇HkcuJKCR)qMUQ=GszXi-)MϮ$FJ|U y6PZ Ym jsel0 Y]WITxzŏkAJiÇ;u݆Ϲ˥:y ,Mzswd\yyGv'ɐ>rVp 4558 E1jvʞ,D)eFp,jll8@ZZZVVVuu0f̛ ( <Ё#}NIկ!cy @ /V%#r"%y|?J Y~P$PuVџ19eS;qc卣ZaYOxA+T8a*esn g)R@FV3"A!DZkkkr݂_pr},>{ϯ<%Az3)J9=ۻ~t ^_4I 7j""xHSJʴ !D .N3|>/|D)UDzO}_̖C3J(PB@@$ѭ[v\]mmRJk[3O1ڦ&;WK,Ze'(6y,BOqԗ\Q#vS{oU; r~bHzM))) D%1*(3J /nxZ(SA=0a„^~X~SG+n#%%E8 IDAT Xjha->>e'''&!!, [[[98kiiN5!!(˜G@ZZz}}]Ul44 Q(d_V|`UWŖG礵-0o6?cLټboyMYYuFr2JKgr`0Ⱥe xi򤹔#o'Nr:Nr9Nʃa"۷-Rx2}> LJH;R e)i0$hRŪ(hzUٓMۯ(;QBef?oaV=p;E_Νu>Ghmm1u\;v`#^ ,677#g {IuCѡ=7'c~S=N\sk`6\.3j)06fv9K)ϹnvP EtOhiiIHHRGq+w-[[-Lq\cc 6-##.s;̌L i^l_9NZT/=ZY =U_~ٷTFB"&$$Q"){fkkKKl1Aa+JP7$ 5ek6ROxmAJaXo~jHI4 *!W֜'INKp8v:<'H8΄X3(ձ[~s7we9i|M^NxoѦz8BC.7|h5# `0v].쓗v322p㏅0e*PEZZ4405z8{}ʰ>N);v:dq ѝq8ar%&&:Nal6HV0JjSWsT!*REA8O@Er/T~;SSSN!/I ((k ^zZ[/vRD&D]&1Tu:n _/yz{|j`o&{eVAAv.3̶_>IxhǤd-:9dI&k>y8ҏ(c$G`_aRiգ1>N*Ñx3?v]Y= j`hT :xoѦϝ %Q"z/P%']Z[Mbapy#aM ?0=v.^r9n- ' Z$*cTP]ʏ o5>| F}*U\\)hOɋ"%IYeB]N̕}4X:""NB3vۡ|<'V7<_WҡZX ==G%DQ@t.brnxwFTJZ䒞6&*\TǶ}vD} f@q.x: LKg~X Gۑ=\D@e'at-Hbu(ӏHV'ǻǣ0dP)c"ORR7v˕ q^zVzcC"7z {!*Ȥ-/T i.']>9EЃfOٹuѓvm[#GOAt&n}ly\" ~Fm^[.`< .Dx~p˗-[lУ#n3~FZ"DwQ[@*FA@ v*}3NИ\|x#tTqkg;~ݽ;ϾgN@t'qŒo|m; "-|z< ۢ3ysc? Xa  o- 3""QG&,-l(}ŮDD t*AtM "Q5w%%N)ƌi$ɣv#-((8N65NC@ P"G5y}v:cǎG QG=Vz[qu/Y{hȾdgcW"Gȣxtcц)Bn u/sF .W}sꍻJ9T={6,Y$={l͘?a„M6ũ'L u u+k! c' IOӧOEEŸq㎕7|pųƎ]v{R6xғp1vqUjo^ɝpw 9C1 bn1>";V/1QyB***!luŅ3O5("Ԭ>`Ea;`NwکpBqUxIGŭjZ0DQ(t g&닻GW=LLn?KͪV>M[HVE+2_.EZE( 4荏N<5;;`].'xqh&$K ڜ^W_`BO8Z:z'X*34jZr*FO[~3 B !6K%]U-Y5':vL0[[[UHt;>}Zj\j R4Juśr@ZҩJ:{Ϧ'\BZwfjAf5_/يi0e>RZ3cF T7Wbۂvy-jIբ.lSu(Tg|T{}SnB0&gei/խ:;8}0rɡwuլjBTs[Ax?䕞s뺑'ڶrOW|6 rMnθ{@}C+p`kn/mݺf昼)i_Tǻx?|p˗-[ J\^K(v!73y=uͶ@`} ~rA0IM9dF'$.-zP+`VRSյ&ݎ W-hy4''G\q/aܰ5X7УU[fΈ6rN'R9+@\ٽC"wt߬^G#-"r;fSSV؋'[vCr9Z}[K+ˇ:t|<8h7s@ȣy N0`0}>_kkkkkk]]WWN)/f sfdx<6M6;)@tSEDΣq\.+%%Z=: j0y^ u'!!pt$QEDɣZ|ex[ u1ўKN\ .@t'!hTU.IE5*9&m!UW)r0VS,T쫾հD 5U+xY_ 0z=G a$w"1"0:TVӠLAĈUҀ> UّH yTxÏ%%0"YycP}9 jvT )%TڂdJڗoEÏE ':efHT)BhHj*+0l!N%DXe@t "BSYSU֌VбTH98 ;*Q\JU%j;e:$ʚDXY AƂT ʤ]PEdS^N@ zUҧ;*3bs.6۸NJ/Y fUhPjHȒh3 U#!Ui%J9hVLpIjME)IUeợæ $~L(E\4Q-?BNF2 T㦼#%WŠʪ#>z6^hZ? 16xu RK`^*sƋ@t?kً:5ԢENAjiQSĄurhdFjh5 2ADr•+gA25'LysID6^{(9FmjYtu2QKje4mݍq𨚇l MR| VGWU]IaDƋ@t\g`"ђQ4QQ5 V\zRk{ր(:qVuQRq%l 9JjfȮ+ӎD>M}Ƌ@t=JLX&N㤀 aޑ*6VjZLdfT'(] ܍(sUƀT%Õ*ȼy+1M2ll)ѵf3&F` s8ԄK"|ďZt/RM`ʗČ ՞THPĩI.tpy<0LrUY fV/Ԁ,ZvHJ;!!qT[x4Q U* *#0#TƨhGOM=G :54e"ZxkrT@t)=j>bԍGiGuԭyc`>_FxT7nl=`:x1\*NŐ^M.䪒ȮkRՏrQRXY#2,#"'Үn燐v xďͼV&KQ*]bPx,St%2l;J !ʫe52R!RLH ԣu x!҈-ф#~E`u4Sj{ALsUФrTgY/ g׍> )DB?VG#RӮStu<U'z 5Kݙ0rS8PY"h2P(ƪԮ+6jU)4h}TkTHV5Uo#0L BjٖQwM4e60?^}G\h]3,߆)Hc?&jҴo#*vݖ⚚~_lK9Ñvg%$䤧$& NbF 1R̪n5INF^kuסp%&ԇHD\Zâ14Ү4V|T\l1S %&<՜c W&GF*]P0xxyG7VWob6i/$iwk XQfKFƨNg;Օ$L1&jyK)ͅ$ͬkHˉWfB RB)E"< vȼ( bBj? ڳFɩaq/ 3/U݋l(hH(%%*U5hmZt 'gZVXY2`e(!6#fh *WsTkQ]g]=*Ir$t  JG0Emz,FL/4y]dDad<(JJ,1'-.o߳eIj{ i S&JҶJ _Mbbnj0BF:{2v D*E bbe[QTF]07 h&%\CPJT\홺eR5#B5L}lD`'pVz=RZxРKqZR\˛ !Xeg#QZZ|^ kѪ̫HaUR+E "ף$2Mya GCfUD-"ߤ$%:աUiW%E; T}0-)Y\QdV {{VdJT+<4!M:I kj>V!Z^9Cn'xE:~(̣&S)`cTt*)V3ZUv.XIβmm5ߛ' s#++&&槥 DUE^(ITҚ-*0bdy5QVUJJα5CZF]թ /FD55t5",ގÖkVZT5#l z) {\>Y `?n[ `[篨X64tWyէ<Uə6OQ&3TJ0RFC潍 1Q-$YN+JW#e0tYՍj" 䀨)՛L1YY縇OL_ߗyวb²e zVWegOP$|Pg;~gȖ zWn܋W5GV0 E ,VrȽ؟0 h P hďF^QC2qfj"pNèx>hq<0p} PmTY<CiiMv;vx<ٺxܾ}ĉC C)GO,XMYf}FF~uWZR8_)aٮFB$N3]MQСl*#jSԫTJT8j{H'e3c{v PջwuNݻ1nlkf:J6[{cE2z!Ҧ#q}&:T*_~zTTPp_/qd׮7|Νn޽!87]WiT*Fp+fb@(@*lz]VnMUv%6L\vV5*:Q3]nU~_S~Z+J;= MNQ0{>" Swo"@BR]Ri\Bijә765ޱ3>~![%#j-q}&p;VaftwM[i=_~CRRnBBvRRoBn_|sfo޼5ܰ^""]RQ0 qO URQQMv,G"dLjiPd U3>Ó΄_B N'%1&O--}{r۹w/p wvrZ+9ZTic #%eXCB3EZ[+23OSӚפ0Uq֍7˶By筎V˫HE)׿^ an_|-[͚5g 55;w^7j y!4R8d `ndZ6kFPú%ǏL naVQtGAIL9?]{40>xEs Jlyyyy톙3zL9I@A?ֆc~=K\ _rBK Vbzin0m JgZsЕJxq_z0,55ugu>0Ds#GM(R072jRzZ[gTW4L ?*FM ɬ)JGshͪR?4 4k2fp@)Ȃ,T)>23gV|UʓYYG&p7CY_xzNqP{4,Q'mʆ?Vƽ˭EJdZT@Uף`~nQMJ;0X.M87BRFPiՖ^''TZ}Fp I`|  --RVKh[ ,),=TTcY{v3t9[ɶك]Ngzbb߆=,6#fbyZt+Ffs$&Ѫ:IM3jjXyB< qmk;s/}\K v;dKdR@Ѥ(+A-{IU NfU&a 3{7RT<Be%T@jMif5V@u&63\})LY;=4<lk3H-tHB_JT!LlG?=9ϤÑjQ::T*I K@ UߧQ-.vVէFUӺi 5 t^&\Щ~R@3 *TjHfŕ*TѨK$ VF1[cYhj*xg޷[36Ml'E~}Y'3!ZA*j7~]Kq|AzV?!R^hrD8LQոe*%TP0"1m}TG"π# c5! 0p Cɉ0xՄGѤ1OlLWoQ q1L]De/sڤ/yov_t,RșXҊi&-ޔ:ے{-m]Uq|yMͦuu;  |hzWTWg.K$FlCy4M+(^b]!՛_}6oy6ѫ#F ` N]+W~7jRP0r͚J֮`$!L[[t]]YEű/Tl#aFw O B!j @ 2)1jʂp: %[ I5"i‰M<b]zSXؗLǰ !$@$ntZXyEI@ҦzrGii<[CNEbF?726c Gk&xRp?9?M`ckk~{͕JxHVk 3GLԮBUYt<`S}u~G}nɒO!3ϼ5_g a^{O=bz ^l KܫW3<@* 71CѕQ [kN2[nh #eO/RfC-e&_U+ ƦH=~2O=RXHgX,_x?ס_y6wQ6 j$3sLE*[s\i)wG}jJk m{ԛ_YV|Z[++al*C(RU #/$Q;K0 !)!* ^%D@,K) ݎ O}B%;9zҮm`s6\r:Ѵxk+${/Slu]*3Ɔˑ'σ@ G}'fQJi[h@@teAuRa:F8Oa@ D7@ yT NaJXC& ex>DhV?yXK+8B؊!Tj1sjZ;fMnIӻ&8MvI>1;dû:͹W\R*f1 #1 a W Uĉ¾w@ N,|!~`0dY8kR==0jQQ` qRbҬY-[fO/(^R [[v]+eM׮LZàj$ @z[H&I.~4{hkk(qGWfy5GՂ[TxH/z+l\ehE D Lڴs뺘EHp8/e =jη20zt_6Sޟ=yHAzj/2f:oc.Y}'J\uk_GT}&Ϸ͝fMy5+Y=3ex#D%`)*KT 2#HUva0"?K&t.o=Kv}xַr+0}̀͞k}T %0}\k @(lZf0z̙yk~ⷛ@oJ5@tTOG{\0fyn ]1q(Rm6QRu̽՚I\p3s׿3# 񦧆(T;{~xg>(PKUcƞYc7uֹyCX r3/M抢+.T9{gdYYݽZ06(DIpj:RtY.dbA2ʹnj7:0Ȋ<"AѲ^.[+cjY^g4v?>y;y瞗gvv=9>/mOV{n =t߷h˽rsD[l޳_=D_;O]~] Q_=__uݮqq/B2IRfJvxoȝ~]yEozivm|xՖ׽2">6o5?[o?aGG*k<ѯNZO~qWG_?O+ӟ=CK_:Kh֗ }suNuه?'/w>5 z6 "*먜u ٸA/DAs,/޾v"z]MWeȝ|?jp)}GT=ᅬN OyhǮ7}Gzen%wwz+:]^_]Gu?uD7c+7ξצ~p7"i="Eo6 ,xu3."Z踀>H./^^J,N.ͯˈ�$}U?SDu?s9O_}+f׏?y7L_+u5;ُ_Y1<[WꧯW^x}DDgصzf~h]DH)v"nQJ$FPhDcod?:S<NծziVo.goGK_%?X IDAT]D^.%z>8g[[[J]cWCvK_֟=ݿ{eo|=m} vyS-Fŋ\F׽q/Vc*>2ƜLc)чN|24ϟMP@߸={szrg?#J|S/?K^]7y_F~g^Ig7Gp:y__᏿K@ZEn=}u{&dLQyK(ҾZs:o`vھ}mˇeeM,7njI| ^{L^sɯhI~5c_}q/R8sܿ?Ai {5 (߹ PcbODOe"]_w=tO|a1_R@5j4[{6S6DŽ:`ڵ{ͫ^Jj>}|7j 70l먭3Q&~U1ez݇N|rWS1$" AϬRأ( _GOmi_#͇{ $à~~ѐ.}A,UG=0>XіWgr *M9{EرHi"u?jQ@RЀ kFoR:*Ə4V])mX$fF#n?S>FB.<"6Y|vD@~AS]HF?u,5t5G~T1#ѡqq\#Q~4J,ZF\ dKd]*;oZ\MK$jDH)9 |-I !"/>8W*%ERJdY +Ѿd:Ai+4I}E an5rŝ]ꃀ|򵹥(R1{j ZG*(5hf :Jq1 tT󣆑-F i@GCA۠H@GCqԿ.P?IHGAx[P{Ν[GyDǽum*͛?WPOF:*FF'٘42RAG;w ZGmbPXq<{ \)unj\+>3tW#%g1LMM)'#E*w#<7rbRyeqmo[GbxK$rϢӆz:Q.úbWvl: JRո+T/1_K#wLx2v@Gܢ:|b"coT3"ѽ(q/''3}tyvJ^32ym@yj Ԯ4PnlyeHu?P)?jti^XB$ƿ}4*ˍ$ J>RJUûxͪ}4٭RL{Sc:ȧ;B}y4ςjUh[% 7O?R͋(GJjW^敖~7"ҁ?d,cTɋ '(#61;gw^3kWUBD2o$Es#;ڶ (;zDͧ[Rlތe-[GV@yST*<~ID+g9nXl66m7no4FcÆ ###A XWH4/P|9e_h?oT_G=vp@GyPYP‰}kЋQPpԇ^:%Ǐ5eg׮]'92&Ue~~'.n~rIǏw̅͢+۶qXG65ƽwގreJnE2ϝ;ӇǕ +2QFyQ? ()q!Mc:J/cZqt49)å2Gp}~pG#D tph@֓x-XevQFFgYJ'E ?FRFKj{.µC!KG>9G`r_О'~Q4A|]:yۉ֚H3R؉Fj<(Qʒ^j556\JQ;mbOT棋O͛ز=W ~tqe)MO҄C7!b WlL])~Tj`Oq QjB6GHu`@5%}sZ+#uG+}f.-8u+&b\!|h kAUǏ\DLg(:d ܏*Gܕ]#ĕq+0hqܕ J4%#1_wy±}_V?J(&VJ}xڵ9rt3ulnSJ ^ɸOہ"S_~8kho!noQ9O݂pz?¿}4q-V cũ;vnF<$*se"Z4Pԧj7Y -j1R:D^Dҭ[<͛7 WV4ezWdLa ::L8h,H1d .O$k8'mjiMˁjFsvvvxXHb"χ|^-_q?x(Mhd;t{g9WDGBC_,F3Ҕa7kЉ/thiEQԭ;8wo0.mu3úCYUॣDvV5yd?t9aezquGDyhԴjk';';V '(HO(RZEDqc#Iȥ%V%9FEZI=0;;<&+E9P_?J~tdivCD$? t;\u3em-d`D/D(ޥ#m3;̞&L(d[;6,EϨ84A|ݔ2iEčfUAKgXD~O\%=Esϙ|rɧ F(Wiy?S}uEh +|:f-TGS2}zfQKj*|u&T&/_V n|]^+8LvFHkٍ7jVߺAT~Fko>Z]D㶏BJ+qf*d"m15}l-u|]ʢ10# Z%>Z+lU{&X3^^SP4qԧ+E9GJk8 c}SdH-Ff,x?#׉ }khh,@\@Bp"eDULq1TzKlbdR[l)F3"+ [Eyu1zdM3=f?}ia#q])@w(*̈c#Mwd"RjN$׭Xh#x@a(V\)DGə͛*>­PvbFVV@DK)+E9PGk"ʁ4}hBWZ 8Q@*J}sEߕΡ=p:ds%06,;pԜFE b(hA<^:ؙKvOoO s([5"C,.j~(|/TQ.|td4O}`4۪x\e}98QG:J-p"z=n/={'iDTQ6HiL}l\ǽuZ" GuD ipzE3mc,EA'=,Oy6u:e.d_ (U׏9JNk%{GjQ4&*,zz_ܾEԄGj\g(yѸcADxO ߉RTna+f܃n+(?? @hDQOWZ|/ET4#vhwՀJQ @uTw5;8R;(Py&/&h~P[Eexh' t<]i[nҿnfb60~:7ͨ!1B]ꬣ6'~4F<' t%r[R8$GJƳ5?Qg C pj𣞬vW}hvv\}@(Q~Tl4%W NsUŭV7> @uTX55s3ӧs̏0"Xn*H' (uÏ*Zv]mۭV ~}Q᎓'x}dK{S1Sq |(;8mx)/g5뀡]G#-.? hK8Q[O' ~T &]R&Z_1zb^A@Q1+hmvSQָM}\)`Xċ ɚ3 f|r}\@0~M)G)U%GU$K)4hN@iD^7ԧPZ4> @À0ȒR@h,}+3:#JQ^~R~ID!T!L~džּRT^y+J_SM!rӕk=vƽGu**[pQ oeկM65/i>}a/v{ {/v{..t{pH-DjΡ@G=T(@uT)u!H)@|]GUPs)UDR Dc0/rh:C>k.C{d &u<(KEƘAd|>|ؙ-,'Ag^H-(CL$QꮣG+-,RLDd9>vS$+8l+i;Q}o3pԄqm5R.GiR[,}4yRrtgF*~+ \9So;IꅐsV~(,^Y8b\2sr߃qAo\Wni;';.\)`8~TyI{mqvmcA3@Du&s9涟@GkDkMDTLDT&Y$ ЉBD˒~+۶$ۜKiqmMq7Q'#P2דr$L4]GEH)w"k3ݛWp841e26TaiQl)uPJs\NL)[G{4K1: @AzY@(uG+E9Ujh@uDQxP (Q\): @}(" NUA ➫h: bl4%W F{К{ӹs333st[n}(GdgOd'dE8XK*NVnvWvՂh: : ɥTs<>%սO}eW ȇC 0 *mg\ɮŴ>Si\ :(pzŶhzZP' :lLdFmb98Tjk\uyEG_RQָM}\)`X$g$P6 f|r}\@0~(G)U%GU$K)4hN@IXGSA>S6.BCi@(l’R@ј:ODhщBD<3B]t_QCt@=ؕBh*©K&\iV=|Gi`O< H `▛; Q|'k. g4hPn}RE @q(ꨣEt( uRP.R' t4$TJ'Euݏ%\iY8}C{tެLR@uԭ1CR:Pe@G z)TSLT )M&\޽fe97pM/k’Rxۻ|/{ j9bG 7ԁx"])em-aA( :::]j:Q/uDb"0M?M:fRHi"*W~R,..򙋋9Ԕ@v&Dzi bI,4Jg"eG-sB尙-VbE!].Lty>+e+ bIS ƏWw5ΑUCpT<?*TT*=T]٭X͕tgnS{-kb{)aP,0꣬܉}zO[;ƸȲ{86WP̴8m~r÷qЋR )MDQ#dOAhn ŴOX2WsD)W.'>4ЗdO̟G^yk|Vͼ 0qA#nd D|dՏ ҍcbC>ӸO}sG~Ιfb=]^Q%GA!܉yU-[5u{Pf鳹^WlV-yP6VJ[b% Bk~}gnV RV"Fԛ[;ܲJq$3?|jJDf-7]WĦ 4G_} ޅ {O?Gi ɔm#8?̕gsoӍFctttlll6͉M677FaÆ yu.HWrċSruu hHG݋FppCVr[OV>D4;;{> (کϯ9FSpjG+xsUEԍAxFDbD:';333|jM^;)SO)ݱcǩSb q=~8J Ak׮BQ;m\M[Vݞvsjp‰֙?8J l j=|? ᾓgsV~tǎʴ#{S>Gʠ,4 $ 1wQŹ Dҳ/F\@vjWI۴Y4SĚ*?3hG IDATQյ2RpzŶ20G.*xDQŭdn)eRs)  ZdbHB+7Z(suEbҝMe)@W@:N}4r3 Y>%}\@>~bhv(h2?\/9J"YJpYaI R=c1vr9կ b렫Aݔ{vqJF%G'>-ޔgnRQ;cFښQIl˯JKZ==vx4yPH55v֭2Ɛťz|k^-=WߍC54Y} jIPQGMq'Vɉr S/E~~Qkh~>jpӠM.2k1X?궞E4?ZIW*Kvtn/rZ䪣NԸ:RWc7"}s Ҹ/t߉B>AUy~jw_.t{.^.\ljRN }*.XG#& p7oF˂pa\B]4ê]PRWz$j6"Qk͹s熒ě"آ:+(}\P['r Oɇ!"5ҹs333sdyPxh ~xAR- 3 iY$r.4,Juꖁ@Et4V@G[V^V? 7ȋ~(/jʶL}[9^|kј6Ci,Xƫp ݥIlZU.Fs*[Jm?3r9JQʠN_D;v7>_ߏHank<}W̌qM#> '97_hjQwڦݕQrS}Gx6[,BVo{h3fmC97X|"e?vðpzŶhzu -nb0 W}`{/ʶioeقXWꥣ>RJgdɤIIy؞2xƏk |V} cg{~п\WD#:J~!*>Xh"T 'e{${s<{As|(lx}kwKJնʋ9,i%?7YyVJ>i)) OGbY~FCƇ㗦/O2 "PhweQr LL:&Z!Y [|G?*{W=^BQ]JE#[p ŕ"eDh4䫎G)[I? @&?i|æf%W/v_qnBwbnޅnog%ૣne%_t<=Ҕ4dѴƶ_JsC^ GmW@G `CA0kzLfwș ϣ1^"%ul˯)3T:E 'KD3S*UKG%QRQeKtT7tץO gW*©D`T߲( ŕ~E:D`BV_7ܧHi0/HFJbuiLvUI_W^׫BΡ=p:d&`C4ڛj*Ifn~=-lMhC GidR:Q[VL癲^v[^:OLJK'xZ#ѯ71gWY[tq3fR9\JgWEє[e#hv{|{->Rb#!.?AԄ ɍ^镅+&=̜`κ(/E9?q̰ht^D @":P[[@tr!fCUGmHDkM  )_DSvǀ,+EѲ(.G.3MR:*ex~+۶$ۜKiJtzǢ] GȄWlY#G 5(swMD3!{GLZo=rX9t' QKl+fl0hbཧ| ~Tffȟ^A/'Us6o,\K;,+EOVquItwkΝf5^D *Ճ3‰ W_x) 3Eí\)zђ@:*5U̬@oGK-Tqo> ^WQ݃ڶpǏ.ӬRN5$J HG[(q'J}v-tѹI^9DAH>EsJjw珈fggq߀HTYG l4 D+.;8wo%*n- K Q}&JMdgffOZk'e{)A8{]IWeQ\$qCZv]mۭVKȧhPw?`[:}gZrm6UO?j cMX|nUA(dGFEi"͋#Y НB$ b@wG9mх+E۶8[hqǀ])ޫPdR?Gq)l+ djSM$c کD/))PD. D={wGhVPfd5AUS/>(_"GGlb dV[kE憎Ǜ*ocoiC(9C>+0%4vuDAA+CG}, z܋qfw D1BX" c _*hLEҒ(c Y\@T_5(HG.Rhȏvmռݿ?0 WgQGW#k ;o_X :,ZdDd1v+AҁQcS; idJ,"ˁwD326' CAQjB~Fz"JDRE9P_uUf+W@D$ E? zVV^WQH)(+E/\ʭG^L'qGwaz^[*lCuR>zk!.GuԿoQ5G;Lړ/3~ߧ JD@V'}Em+4eM:6^<gC GidR:lE+ u=#B1FGqGXdhǽp-,'sETEzݎGws)+'r}Eiԏ23 gM#hv{|{->Rǣ`5ټ#%> Ga.(QF"pzeN{P9dW ٲ|8єGlĢjGp1ux"XKKhM M,NGkkG 3˱O),J!ㆸQnFɾ2Cgv&ADz]ܩvdKfmM)=/PH饗Loےls.)E_PVUrhQ>ړY-JZ( Ev2I2Q=ɛQ@HAa_k- Ke'B˚jwiV?M'G+EѲ(.i2LZS(# tŒf&ȍ˛gzKV{C(VK^GQ +6vnOD "ֽH{!t(2iAqS$[ wB(@RVҚ-{1AAYhO2?v*)-AJ8K2EFiH?*ty(# q LDuv*(s)%r.|Xrўw[)($hMXS5CrAQhFI\G4 +E9P_?N=1n:-],IQ@(RSdh7h*n0h'~+EoE#QfA62~"3^GV7 H@XLK&Hjp:3r)-w nZNSP~t _K v\Ȥ r5PL?8TRVnO^;9iZ\8GA_J)XpƏrԔ+hQEuN.VYzQLjx}q ~!tD4ZO<"GlCrhϧ~޲"ˤm:V*u9^9` hўR"TNMoB @& / %x5V2mPB`ɤA˧#XxJQG?2^RQָM}Aݜ(00)CPe'QVQqyb=~:= A~dcFWن-+-UG0*{ (OyfϞ& ⶏ E7$kbM㲔}'8Oq_,^9ȑ^!'9\?Je ߉Tٿ"$r:y>pw_GPp(YFrՔ;Q?CI(c Y\@׵X$v`:91V#PI|0DVݏ߿wītC稘 ʏT @ qhGal-_#^G-pfo@N#KDIIy3͢S)(SSS{(KQ۸ SiGTL^Q#?))(O2o50*uה?TZnbT<ϙRL '9?jdH?&CRncb_ n>* McE⇚̉V( rQPeIǏZ*uoDtM"hO2oqLdڊ(dKDq9NZ7\kSb)9ODPm=)KZϖ%Mn=[C{d &uA1N@q30KZݲK)GDA/A|ȷ[[ "^ږ0垇nJ>ꊯw2eӁJJDhIRLDȔdʘ .{ٶ!N,~IGE54{*DB:mKMik2N{̍LJ hjo >:#TBCpx,(8Gj}Aq`~~w >Q~T˒f 'M`׮] @2fO/ qJQY5YL| G UF*pR4n=-}p]2NZ(c~"љh=t(HhTjtlP:^~4z]R)"AOz(QDpP@n9uA%{~,RM2ўJI7:Q^H@ũƨw|( 'Jy](T_wGz]p*_@0B~.0CG: 5M0k@uu Q~O#.QE8 05 }Գ4Rd@uQE8Sm( ^{>?%"s~0~:Jl©0ZobeS䏋b&N7qD}~Py۩N)綾^=8o % SG/&뮙ӏ>steGތQ丗4Gwq)+VPXߨhWPp}uo <5>}5|:*IGC1M p]}fIۢH;eFOeEкx"eF1ZXE~X3XJ$qzFSxIwx ? kpqh^T(c1#b=#w ֵk'4}'GlF|R%ӿbPMoVݧ|L`~4֟m+1Kſ<\)cLv>yѵ Qnt~ܕ-"zmy47!gdŅ#ܿѸ_X8h[ɂϼiꍟ?j%D#ދ^\D|Hy4N%bV^Oט@644 E϶/ bOҮiR>'ɈGq}z9R~O:qul%s˶^y^DDZҬ Pe/?DΛo֋ӜLN~Ӝ2i?"+NWprz7ҕyҶC= C7ȧ݊i\_S/?ay>}c>.Wuc9+l[spicWNO鯫v>_9A)ymն_j @tb=/ѻwMD,q̡hk~}gnV oH!Z Hҟ?b3-[?rt[>HB6#G~K=7_MD{xݞn4cccflNLLLLLlڴOlܸq|||||h4 636R % ~4R5 , =G"(:.d3Ѻ-rQQĩQ)KZBrow5~zAyaG:Z"kUܩV诣̻Ѻ^k~ԧ3 KGz>=.Lr *yY1>#kqcQhpZ@)ETQSYShHTXoED4;;k,:8Qco:گeqD7 @)@ݍB]vg7_.zz.cznwE)=;(}2w0~%ņGkAWЪYML(ŴuĘLs_whكq,|L%Yϔ]i[L'74f}O\}γDSgy("XOņXP->^|ҳS~#dY ؏zh'+\(YQT8ӿ&s67m `[7ҵ}Cd5Xu>kw-?0֟#΄[IHBR>rϤ_W`x9X^ hAh4P2ET~i65%ψt0 =nD~RRYe{ :)52:KkMbS59LDR&YrUGl+_*?r%/B[dy^3y英|VB\C- dY2C߈ߴB¯Dʙ_›i A]BI\UymQ?k'd6$dA+ 2Y5-=D/?d+z |5~z3]A&i;JҋdPDg\*$V߫Tv R7jhˤT*+ĺ/H_dG+rTˆFS%V l/?E I utݪGaOE GIDAT"Z4NDC^WQÑUIf=:u#r0ěxI64gR#UQ=?H\kTbpdJZ͸[̨,\-Ɍgb2XdB$a-㺜kG9-,@-8lUE$L.+֑1j+D4f96>&y&J~[RTRci  '{q0,@ԧ끃!JHS(5jv4KCG]Cs[e6ߩ* _HLIzL$A 0,l^)l4^m`ZSVPaRq@+UdW*62Qk$ ue1h(Iup )5ZRFr; jCHS7 ?5}Xv6CLQVMp*u_\*d-,|!WEz us$M _4+]zRYTfTQRYX҈zݰa{P-2͍M"@PG%vx͒*Y02$Wjut_0T/Quz>;(u=QdA5~p*u1-jRs+I:DzU&]PG"B+_w"$MMgImr-Hѓl. YP5޳W־@ׅ@G&&&66ttÆ Ѣ(IM\GVRJc().;g^rHu## W]fXY1Rr܋tj,s٥MM)WfU$Lc1,U+%o0AQΞ$,GWʲv⾕;3WʽXȝMҽW}eaTU2ǘUBiӦM6mܸFFF6mڄ)ʣ_D 68*u?ߋ4(9Hz1+A؆Hv40R'tYz2jyԩ!܁ҙHN jXWl)WTŶJ *k.{@IQgo64;6Nyp,f|_ P&}A-ens~:*v)}E ,a? m#ARjw0m(Qy[}M_M9Nr' DWke.HF,,_٧L& +s}dyB=lItG[%Sf\ $[ɖ$ʤ26h-*T4(_ⵏڅV5AM?߽DcZf7l |,ƺVr4kr JAXS)?aP5"V$֓/CtVU5j~뉲,< bƍccc7nl5PVu)j*OzyC8|wҬ?OpĴ!]u/PƪRG}|gum-ʅ"c؊Q}#Ip+)1%:%@ la*qHﰦ5G&R|P~XaH҈ЅIc@4 -%㣣cq/Ad G5Ub)np#%))ys:yPEfumD)3i!W:jtDdC%Z^D /2ea%TIi>laqsT+Hvi)헖ԓWsDrc*r˫Fc|||ll=tНhw}݇@I2JUS^~P(I7>woG3(jt(Yi"Eϗg5=ؖ@")Z ȏ*J ?9:D JSSS,OGߊHmJQEQ\D} " FDa,Jq eeuE-ebPn?:??B$J_3+gQ&ـDI PP 󣳳( wdu톆tIENDB`batik-1.9.orig/documentation-sources/resources/images/HighLevelArchitecture.png0000644000175000017500000010414013063003363027464 0ustar mans0954mans0954PNG  IHDRmP\ cHRMz&u0`:pQ<gAMA|QsRGBbKGD IDATx TՙߺnAPTp;Np#(tO 5h |O5j41F1`mG0#QQQ!l VT{uwխݮ[w9}{6O\!B!U> B!D{# B!BZśB!ڛ!B(!B@! B!P B!B!B@ B!B(!B@! B!P B!B!oԳCҽ8 by:p Ax㷬; #>U)G)a`so<6'P 65I*U."AFm6/Zf 9(˞dOMD"DVJW&3iy)s6'P tYx$ig!{뢂W9%q6-KXlN@hwMtV#Ge8*~ #1x u4L͋8Ĭ؜7hFtnkh'ѓd!$괣KNc 2$h91@9Ԝshm4uHg>&L  h6Or@D" yol͉o&P +Q,ffsB7 h:5\#¡ۚW~mf_:ily:D-\U ɏۜ!BATVVF͈O L$fˋ;({Р ɇ| n&\ՏQvgo-ucΖKn^W:# &B{gkkoJN愸_ A`b?P C2"Ѫ=zvzKA/?)eۤ@ fD(uPM6mݖ|QGٳ%6_x+C6r  Z(`c )fCyfw\/_"C'rW;\tE46SW(ClvU+*Kzoeמ}Y[[_I'#7[e֬Y=j=mذA+[/(cƌlܸQ  Dm˖-RZZ21cǎMo:M<9k׮iӦi[G|ĉIoG7?zh5jN  աÎ&- #rmI&t >DZnʔ)3Æ{~H3d[޻W|D;εW>wAIfẗ `ȑe]_ P<宻;S;t8?_;<9s\s5oQ8!,x:unZD@<C&D1 0rI MgyF?xm[nEDn…FB@_^w838C_ɒ%;w\R֭[/~ 7nvi裏jtϛ7d]Hߟg?d7"!nKYMmlar$ȆErpK ַfOѡG cܹˌ3t࣏>Z$8Cb } G=\+r3q|a#n~۶m;2m?3q_|!"K8N\"vt:Sy~~E&"\rNWHH[&8ﭷbiER$6I8X*xeyR)"ǟр`- ڞ)LA@H؄vFс{W;  CNb8 R-Qw$a$8A$ u?T8 |3&?쳺;#VO>Yp2D:>!̙3GYZ%@H_ι~7?G? - @?ֶ|GtƟQA:"Y #nᄂ+"Fq s[!B BRWWרb^gjr'f881e|BmA@8m85U\ଙM ׶{71łX13 Q4I z`k ^X5q>EHbE<ᆰven/kcж&;CcX\I[Oe،@0;=!qAF. :, ꩧL8}tnăDE!Nj2yla:9V~ m;2ݷ'm>/ -ڜfW ;|߄eZF^vjyD{q\e+_i ˀ֯_?Ê:AhX".+j.*)E2kGXg>Gqf5(gӅ3oo?{f77gpƙ#-w&F'\";"Q`rO*+FIML&ʨb;%foDd히dʀB}%PkvG WL*k8gSUTRczZ`|PׁPڇ>S&I7%جQ5;$8ٝa}˼rhmݹsuN]uaR5j~[W.׋$֝WlD$愸]$tP52?o[ZiHA~jyD{r:kD7dlU!F@ S8o5/dSuL:0 Z%tjrJ[V{w:͡M5;w>`7NVY(..ߨ B_;ԯ J+rIE|G9՟HLQ`Q0uM6'L⮈تlA|xa\9򸼹7JU@B뫕{%߬P׼pg_#[kjGD7exZ;;]//z^4>ȧMwG5guΥkZfv>KUm>) z+ RVS8V-6'dה8#˟TjKf7ms#<Q0GGw_<'"94# dT2Wԫ p߸1""~':Z`ZBXi:]choL9 [qvb*^?r(#hsBH&Ag+؛F~KBucu:`H }RjMC)|j+cWrm%ΊhZᳮFuC +hHFQnb.kIa'1%/\: 5)@B2 _0I/ts錘Q׌E j3?Wd/e/<NBQ#|# -usTq›UzG%G cbkPBaw8<i?lufm26 KWR(愐eM *=:!V5k8`pg!]7Їx:h)o}Ǝu ?A TQ& @~%1S#~'F*z"e(٤( @vL^dBztۢjgo:oX9G#{2*s`ĀX}Z+ˏ(l!ࠀLZ|M/u" t`@C,-5M*gƹ>kEtӻ#2B@!$odH_+wFY?d$AJB "4SP B!m|%9FH7Zi^pC OGroyڃ$G!&…BH6<Q@ t[׮]v2k,YdI]tE% k֬c]=?DSLulb B!BZ'cM ͅ+Dpa?ABBN"dd|1[NBBM1$b1Dc1>mڜm7M]'JE/k*+%~%UO>(uַ<߷ bmu(g bڜmaw/H}~Ss$8v楕[DD{nN (9!;@3owF GHߛ k}-?iɞ;5kOdM?;wuU F)PzﱽR2N snިzRԃڠKd+^;{͹A+mʾfsDԡ|}!opNNN s=@ !T=pxRF˔Czso%}7!JUCo~O=\&D!G4TΕ'_^%^X`/(P%%qN<\ ֮_ئ/NFHDhsBHwa59ooI:r){p)~ `R"lD!FӞy2>*7hyq~w+̀> T)?&%::YGخD߆.3/߅?P;q\WKF_Wi>fOd= $KyUuF ذmF$mz+6P@ t pªF]%fPdNйNZ5:vg3$^ DFgzaޱj1x|>-҉N O<'qy!BzQ=GcR뱮ɕ>;ܴY@zu$EVTxLfBBڌZ)JymDCQ G%I$'Gcq} NmNDŠ>jf}H=#\|+" DRGw~$E3йrJP>ے+m)G ubz_8#\R愸YմKںY=.VT1{s0"1-yi)**[aa hrt$([9Q"1bҫEb_k ڜbjpUn` 鳟y>2 +!QW =Eu4+ r?"ۻk MbA]C|><ZQ 3gKLCNZmN[ c셇oJj|f9!>!}ЬQGm%J$ "&i,14S#Bp6;ڜ7WdBhTv .L[ +BF$ct7L!{ƞF"zҟMCF:)fi0=JtV ڜW@)_h5Z)L߿!edaHEo %*XtH qwb8{D!Ba-0HU|;`WϦD`;l -] %4&>/+S9 ΈR|vl{ȬQdƯܕ=AϖBr^8t9āyΜ͉# NGS+āV`BqkltΕv=6̾ɪLD(Ht".9?l ؞ڜ[$8  9/ @C0!t ر9a9 ܗXP+P(Z&Z Lm6)Sͽ9Z0I7 fn ,$蜦kj'c6>ρ~Sa 9\pׄy.zJ>:Ym76H̤ !Mf$:t~:om>t !ri$NglV<ڈ6Ϗj5!B.H,DisB7H! B!P B!B!B@ B!B(!B@! B!MZ* mNBF!B@!M 'I4*>ڜBF!B@! B!P B!B!B@ B!B(!B@! B!P B!B!B@ B!BHcU> !C|I|!B(!;Zi*>ڜ|f&0@! B!P B!B!B| \ROdI_l̘16'W)SȰaÚT&OEBB>z[)Ξ=[hsB@7NڡmN!.f2f̘& IDAT#9!P )3gloܹ:MhsB@Sq-1L66' |f:?^#9!P 9ΐ3B̈́6'|XxN1oY/@h9l!m7rmN(:]h# Q/@1YXxL9gvՑۊ8@aVD,@:[xYlsصc {],

O"$>#>UBSMGq<|N(:]B$KjP^m %v$m6/Z@2f%{j" $axf6~'hssBzT x$ig!{뢂JW9*-<lWUH4F3.O!ΎK$ Gu:_PVo36EissFH ]xxI'QE\(C9mN(H^bW64O 4J>ffsssBT 6s?)lhsڜ6'BbFm(hsڜ6'U;sZ['`6isB(Z]1sZ[ .H,Y~zٴi̞=[/^,cƌC=9pBٰa 6LnFq "f˃wmtزQ\m3$._\rӵ~yFsiiiϵ8s.%G̜zj]~رc5kjG}tp@tbʔ)8yu ><)FV\6c}@mm>=:y^& {YdsƳ5k~_^^7/j5i$<H ׮]5lLGHӦMӵOC:5 8EF"D5ak|~uN_z%- a{キѱHwy(?Q)OP 8j4s‚~z}˖-ӯ[nյ|Ȝ9sp(~aPDP[rWB㏗oYz)8 {1]S[`Yf|)0%/RKc±7p>׵#Jz&K6dzsG>w\m H3<;D„ tXaԩr54s!`8 Nb'zH_ p}w}ڑ2DVXE ABL@b(THp,hD\?w!/  j&i!tk @}.4C&& lQ q = ;0m+8E:y@'Exl͐xi| ![CyD@=B 9pw}~o% 1۶mK*8m.zH6j L*l\y啺679Q1|628p!$Lmn'&[#(1f @-:3-vED! L/3D#@2ฑQQ0SAAL(Mo0B"uK£k5w=tB`DD{MZ &88|D:A}Ur#fRl҂gmݳ Hs&!`"FIMT@Сy b͐]9F602/BaajWƍK^FОVү y-h @!ϖEF`DЄӑFC%D`'Q83mplmگD)1A"ZksG<N~r}L@#`a:.B\hKD R;.j JF9:9# g~miƌӀ@IhFSAvѢEz#M@x77n6D!`+y{zA5D\}c.h)Eo3BEY Ѭ裏6*?u@ MHS-YBrO\ܓt"z6G"1ƥwЗ YA{jp(P8es@PaOww:}->-E lr6㑥Kejki-A%>j2MؼPsN׬ '| 38\)q HMq,lSt9m>/ ykآ=w5|;y:AFZHt,+.+TaXڈR#Q9㨣>jP  twض ,hξ=6NE{۟+N-6tّ6$B Рj~[=R\ΫBąScaOO}#m5+ڜ .lU8,*8}Q$&Ph` Mn9!(8,U^P&,U"$K4X#`PY9mNBTbWUf։-9mNB5 `BÊ'&U@!D:.滫j9mm6h{GGRuΉaA$QH~ [Yay`*+1Z;JP 4S44hsڼl,}}ΊE@ =,m2afȆ 2 p>fļ$ft,&cqX+3`YT1&f:`&uiGpB!.F$ӟc/̦iŌp^{HDs=60r^{MO!40{O-N!$o&z^6TnjXS!0}2Vs\8UUU%T٘bmӔpA馅3<35 5~ f&M8bƫY a~t7`pX ,ffA$s`s,fDZfncbLnw 5?FAc B.=rW\q͛QPXo'{[6`rN=8|ފ&DzWK;!ٌG@eЌZ:lbF?L:"`hO5ә NCAgD@gEO BA nM ӟhĀY˺c9w q~ C%(@GFtHch~ H!HG@ th B4 [iFߌ:ӇHpW1f~ƌXT7DXxwuTy(8ǘk,ZF"S43"m].Ny֮AH^ /EmNP Z`U/ނb9Ea:'A9!-FLX>*ͬ2nq9mNB*($|>Ƿ4{ >hsڜ6'3ZM9mNDI(,y,hsڜBJm$mNB(ZUK$j9mN@h$z5jPL2 7o^S~Μ9iӦ93  _q=^M-b5|={M7ݔ\"cʔ)ɚ5\ߣdպ&pQFiOeQ$wl4?x`?'^~|G.R}ʕ+yf ht'qMyAq,\!;Ssps_ >:;C 1BQ1c>{\{l?(V XٖV췥Dm} ү' }RVWվ7'mp2*T:3j. M" .% sEˬk8 =CAd#6pOfxE)D)20gs{6G << lؼyΓ8 yy#CG:Kl#%o\d"15 P!MSO<3)25K.D30J(ب} 3G8w&/ޏ+ 7^{2wF $(L875L: ٜ͑7!̑}~FwF~_(6=ܣΡ<p<6(_4gkǸ4uraVFl\}2qD}?TDoCS?Y}:D፩VGf։sC29q&/j؜mGmt dTM$ ؐQ8@3CA >Ci^ΎT((̽m淢0t6Md$2ܳ9f7ȧpPi~3 o is-4czsȁ@iphѢyǥ '24=bZlYg=)Rh:sN6MFք7?VOW@*q)c txJ5]‡NRqmtfoI.ڼ|ڞcSTqp>G|I2\u(0S!2y͖g>oKmN! 25qV6 1qy*Q[ $m͙[&Jc~sW?*Gm-46vfR7l~o|7:# &-e/PHN8mNlsg A^ARSh=r|W^yZmLcl 6BuA{z!a=)/IH%JLl̬QdƯr⾞GGkJi$8@^[mSi#(}yc6ws&ټ-)%K쩮9<_XS}/B G! L 4-.8TWN"brᾨ^[Nt{UGlSi#xf66ws*mF r{euB皫ĕ+$%oNBIM3œ3T#\? d}9q_+LQML +1c^&yO=?7T)ޞ۞sV t6o%;{?RB@vGD)|ER;däbo}Eu@hm&6qA%ωtmBUwddY=ܜ6RmgoZu9MmZ>w6/D<{!{}%lVpW}q[jʥk+e L 6ܠOKvNc:VPC%9ssh=is=笊 t0C$@ i>rrԅArǦ8pW~ 3}N{Z(~yC/}x1:;>_)J,*,ZM/=W׻]btx4@@!# [E-I@բ;Geѷr'd|_>9XG#n,OVРks'ctW\@}#пᑑ瑟oI\-!} .h+EÃ*;#ZLUB*х7@ɴS# B6L߿@+V)y~ )|9XXjB_⺃lpv;=;#IG!'jyT0a0]sU9o*Aqր> l ~@,xiOD{=# -^-6t@zDdeپ}wKYY;VB<+gqhshw+GvBUۖk??GpbID))lpA8Ő@lMU4ڏ!:m|?@~ ulڴInfYz >\o߽;sN+3gʥ^*|p8U#ZM֚ 訷ZYqdi7/L]0Жx<*o{h##-YxP9z#W e>yvgX1jy U$P n…/ʼyoO pwC=x}ys IDATdr)@ ! j |Q|Wu::?I'=ؤjڇStb#IHז*XFYC$:LI6dK8N9FX4'0j;M CTmohp`~JGS r~m9#dȑꨀScb Yfn8ujMzF|KH&CCZCY]!J[@B[jZd9F9f wb($F+@\` ꝉB XnuL+A$ࢋ.zJN8v?j(YnzZ$@4@<Br8GyCr\I}_>Rq[UR~~XGon)COC8Ԗ{P.AX@kY9@ Uh>UO\arثi)L^I&0[7(M< ʵʂ͡=|ZJbx9jI@I?suH8?}2a„^]$I( ȏtmՈ8q$tt2k,8YydaS^vJFQ߉&^8G)C*o?$8}lT>}-{n88=ЌʱEz48s~׫ йaҤI!1[vx%)5tM8(jG6΍g15\OA B!B(!B@! B!P B!{0rJ>}z!s˖-3fa!BAL"Æ kR?4D:Np4zgMs+uĉZ@ dJDLeM?Яef̜4D4w\$|~itzafvr%߿Zc_^H;d 8f 9[~xg?D)&8ןDϯXr)@}+ /d߃˥p8fo~dVۀTjA4m4>>?4D:-tlI$ZK"[?{෥g8Ikׯ9Qئ#/!Ou;eoO@ 1TO 8Nj_oK7o^[>]q(u?~Gy#ЬR¡[ju8@Ԫ&(!YғoG!V@k*gj9FFDlx b'󆈇/MG#](23ĉ&#LC9E,sˡGw#̛DЁcurW{9RRwz?;`juȶO%P}kuk# J!pX߈v%CuWᢱhDz֖e lkx<ަƍ']vm=t\I΃nJNa g\4|фs/A9[.U=YI݄LD֭R/?;A ѰO !*߭;e!ߤպ_(:Rpdݬ1R|Z<FE3P nqԋt"BzE>1X9s䖟Ll_bJ֞JxW?447tm4@/)(:G7D6/{ ԽD%5/32 yho7M xR_"cղc|Z  IcSx ;AKo{EH|G|S7銙V]&I#HoW#u.C<+El!bt UcC;~@5sIXu ږP[D-"LL- *$WKe7KE]$T<(E3Z}(ߜ{D@4*%jpXy JAAAR$4$07.>ldOMD*Q$K)&$dwvvTrURUFsHJ8zCacHoZ$@ ɁGbq#FE3TI=^$a0GZ ː>Ig-,ڰuUy̗ˠ#}ЬtJJozQ3`0m" FJUS0׮͟[&&{"`"F q|:|;X){aRj(ANOwHD4+@Q[ E P ȞDOq}1S[\8MσaLL-L$r@FcpdX!R]]-555RWW'HDcDm.67$ӧsTS"zҟM;)SF_YyɮDB,ӛGqֺF HQem]%0FΈ>8.o96pZ$F瓝v3[i0MvWbOD!Ba-pNS*O0`@N) !2dtуFO1a$yq0& Gȁ3zx+{F~fHsgļZ- ZNL& E~5 ]ED R+Jo\#RH>sL^. IVM:G@ 5r@Wm>}\cCsF.72=3$?~2mڴ&z2{FwӦMz2e KB/CkYGx0}gZ?ҋ3]! 9! _A:+_r,}*FOAT #jW:5) +i#xБo"tAnG|m#هd85BBx?l0]#DBd!L t5!.*9h:1'::"="tqw}D 3Bc9jFH=>hpsD+ DdC Fs=LJMt@ # FZ1 i 3~ 8٣i iCͤcDHHv[R8sD7nDB*a:-[:&lXfM=ڎQCp.8CtaEڟ лG.I`"i^щA\3@E9}pҥs{BBArrl򺨔F<pTbeQr~-zc6O>DM8B>^!a]w#$MGfy&B(I$R϶$h%Jy~#uѸ^GWKlvpl#@`$P dIV8/ӫEb_=1 xi]ezfI*qЖ{0MB(D `iYH jI.1q E0<@;yOރiB%0TlWU8Tn. ZTb0s޼yi{`ޙg)^4I@UAl?@F'*,g(`F}=~s9GExf$P H0B!VH~! [ڇ9 rrb2"l`$!Bг­`.{`EDl?HX4I@ +L]ےmԩ`Α2N438)SM u_y}}p5Q4ǷD@  n(0!`[^E\& !9YcU<0NEcG ƢyYZ׈8X8s8]D[L0t =o1bb\hGIBBNƖ*}(g}تZ%gKL\ewCܘ{'Y 7M 58c4# ^y} Έ<,/vง93N8p]-_q[$P dm ت P y\ N`fg# D4I!]V B9QK~! [IBɻZsYDv3i0MpeJVyI8J2a$npv%`[W e#AbkТҵ`+4otud$yZNZ )2J< p>e>9̓73i2"]& Bv-tK6`&Wo[C%,i-i2<4I(8Zݮ:,.(حV%Й4otO4I(^$B9Qk(ZgS t&鐲!R :!ˆψU^B!P B!B!B@ B!B(!B@! B!P B!$wh2ղWT:ƴ|ݘ6 @sfΜdܹsuݘ6 @cQ* 6m ƴ3pFƏڍiy <DhnL̃nozƍ~ɮ]\<Oؼ; i 6wSe Nx+ҨyK~0g򳟉K8˕; z$mv˺5↮yAw؜P t0FLȿQ/@19,3CNՑX qrÊى2$Ytwݲ%m4z汄`\˃=f s4k1ЈF|YlU>gYU\W IDATms?M33Z =AB$K2*"-CT١kpyvۼkIK3!t쩉H$FE wBIiG( x3DAĕ67b5sNw%`R= (DhDD|OTK0C .@a$ hD1b'(DP|1QA@Ga_Nizn^}wUuTϩSuC`0Qd 1 o4r`@\Y.d"s=H{B H{㨏,$ @c FCXay\&͚y#|H:G7򵪪*ȁf |Zx-r^E&휆O@FlD"syVȼ6$nX85A֒!d I= B5FlQ\d.2^m녇ɶd1Yۙe {6|Qqtp8"^OA{ `g紦FSF+ \dA{ @\!s01,:8[ RVηS\w]79NrrXޚ(-QwN;{3Jy)hKWBTf͡nzyhǰqY hL T}ӚhCʴnV@7n=xbڵ+EcÆ gV ŀ\pA s3dY뮻Jig5J2GC_0a7iӦʕ+IC#pߎ#k;wfñv9999r萷B6BJ[*ٕTʧV uZr2@q% z2k4 C+KII  x{u(LP.ݻw6m4^r% Ņ]t{hp½":9@OΊ W7`F>oHSqx̊@o.-[ ;,t9VPv 1ߟ ׵6L2{9z"Dϧ-[ɓ_H C!i1bY"W^,(b.(bL߂j97(cX}M톀{8 $r++mhժU`wLk.BPv^y`EZߜGґoA8HBFj~QD^!1B휶k׮:Sp5- 0SNN'U549hmAAÒ0(Lp(3g~PD9+|4qD& _~99 o dΜ9]9k,غݽ{wE%2lك~ xx _kJߎ!>˞AMk)҅'EGsp&hojJB^2= IYTmɡV.YрE? fb9VL0õAVW_-9j %  \A0 @P

+֢ uX İ:,V̡l5!d[#-Vd9 Xh% qqA蠤{e 9є˃`>?U2={6=^{5B`no$7I%r`& pȩzyz!''|>_)yߧ `p]J=@NI1xOI@[#bfƍ|? b= `u =ԧ1ѠAۍXq !4>r;Vkˊd%vC1U   `n ,tjW :<܄w0/'`2?% 0GX@ʈ=!$ {ɉ'rA5QxXf4o7xn@p?=~ oddDj- X~л'ƃAനٜ-Ǒ@vWWOpYn;*wZZW VJ=Jn1HhrۀE5eֺF2&7@ D08Yc=^ːt&Zo-J~ԁ< OpF{ا~4Bc:;#J^H֗ⶆ\}8@?ReQY;%uUOq=ǘzs=G{a`sD#5awI=r~޷~LsqMIDL65 8TzlVwبNvÝT;9 Q"s<,"&都׾SB3vy# nW^zQSEVn yc_xi~?+wPޘ}|D/\0]I0֔ԮfZjlx\Im U*Va<۪#{;Och|Zi_ę?ҳ{}tYsQy󀟦|Y,VHr}ra#5ހŕ)Bd.2 Շ E).vt$amP2B;-` zL'G\yOY+&Zv @W|@JxÜʠ*D}y9\T]11{7) Ni Eڡ5ʼM<`bGD9@zʰvdW䗰~X.G`1, ]R_?lWb/pyyDVoe./g5P*BLf+X;#*e`;,T3;)b~IcU\IƳC]Q1xH\柪gs3r~kI EE6ԳŘP[ŲH|_\LX-|%~\ 243+5 V|XO\ EF^!4LJ=&}ҦU=?[ ";_Z9]xiSODuiH_щn ͬQCA~n[;;.N&w Q'WEX9dHYZ4[%"s! "sA,|#ek1饳mle#n^|}v.0}wGWXns(ȭi3{ו[iV-LW#8J9Eupa>#H L.iXy(#O;x{ t8(_)A7^bp>$!'z´$\x'wsш+ : '{ֺƒq@y}*͕#mR^506GOwϪw䥑J>'ԥ\2RYa(vENn:G^ :P׀ d 5]gē=<Շx 3C哬 d9y$.Q ؇vUn7#3Ms尲Y<^Xy.z\: ;ڵ;%=?L\&$23 ݜpEtD{%o'72u@a!YlFcjZ\ZDkq?@ a/*U h x=EQ B@ d)6P_{e.!م5 2!+#kfh'ޣ= #G) \d.Ahj0$!l^[ނLQ"s\rt?~u>gO#ɻ}"7lE'QWMCMm6\'kNF{m@ʋ{]/Ջ)\U> G_Kf\d.2ċ_ϦR Oacb7TW)-;m+y>pűDﺳNi^yI){&zrϤ! '˖mME"sA\yf:w{m4*͡%QsoH\% qx0go,9Ht@%׹) EY" \v=jj}C\=/od+-"7kb٤,D"s NK(o/Ͽ^'N&-6~e(WEAy?G9Cn&ENf%Zm 8?P2AӿN{cy:IC ʤL8ٻt? g-VwdSԭ4]@ D+ JN V[yXJQJk,/}=P0F{:?]5J^Z/C)\]I~1NfXLW&*!dw\Φ7DPrYV-_@&V7XlY[֘DA^$,J sy%&c!<9 $sǎ,{tҥYiݛdt(kƑS.;| B+%5eqm$rACA.ɇ& Zj*:@% ( SuP㲵͛YakLjOݺu+-]zŖ:>1hlИ1c7 22`cٲep͝wɕaV֣Fx`y"]܋J<8ۣGV@}ܹLeՖ-k;?~|-Ԓ9uzŧ] Y&ĉӰrJ,Qzu YN4О 5xFt~r| u={4!_ӇFr ]Mh7:/6Ҳh"-eǖ@A؝FPλ )ӆJCHB3S m4g{Xp_IHuBBM̞<jPYc Si㷺9mAj9RmYe ,lZ vC,A:pnРA<`ǵ.\!(mB!``р€rCke%gЊdX`;9P^\$=d:A} [IkCaCy< 26nG-3x@Ў@$@qtB8FPLd!{}>V^ hK{FmuU!sAr>tɍZr?_KVOC~xBLxڏrssS {taX1iWs!׽ǁIDAT ^?R&`7^[]poS纵yjkU[홀rA>e0 ]r427ח@F7GLcALhֻFdˣJCyi$2OO dt qhU+*(}i:oxT;8&" *EAzB;six֟[S[%_^AYL 4ȁ1\A+ wc8~[aЄ[*%*02КD6cb%OA @4>SVP5 -[{O-\ >2AI n`ρm۶qЀXQ AzeL2G) @=տAP z҅wiCN,nA ou60e@=I\kn(v!M6Xywx+Ў K䧧Ֆ3YcE(2HTxP*\5Z} ~ㆠYZw1V8Fl[Րx oA`oRX2k]$i?MBb`m̢VyE Љ*2:֖AX[Pߪ܏<'HBCo-uP> 6حNn2+z&jA˦/yCjGy,jHE9N*t۳Bٮ!%XQmDii)eee||UU_``w}NcJ4ყ t,Bb,5.)"kؖюsâ%4FG__ "ֲ8 VAj&HASdBz1gOvO"/9`jP q< C@d AgA ;Mcp]R9=(PD~k.`W>2S JV \6[Z9z h"O;_ڡCzHBv 8IЇŤnh# Z:^J6&}XD&shDHP90{Ҟ Hɞ&|F0`Nw1Ft fA"2~ްѤ V"< ރ%jh)cM$AO5@5-&ى-uYɩ 64$%'KXd.2g" r9HڦMK;`rg{K); Zф-dYx]{F9v5x1x/g^pyfBegD$@%f9`u&OW͍܇xZ4 -8p F:{6|H" 96KozP͞KEw;I;iu%50]Qk.vՎc}2ǐ=moZaUճw'Do> ,1r2GWSTvW|ϳlg&7OnGGzJE}{pȤAeO k馛/&caաgfRCJLiMUP\:3yr7o!nw#ݳi% ǫr[ӽZ:uUӕn ӻɱnc-S i/:}_Gկ۳G~fRΦd0..{o_՗SFdȘZ67ږvIzQ=O to7[Ս[=CgJ8BIMC   M  Y!"8X#19TWxy56Vvw2$%Q'Aq?1c1c1e/3m& BƖrS=9LdSB,*c F ÿP֦Aߒ#ﻧ%zG'5wO~JN>j؜|/}<=+?8<^x{WbqPxtH{^Aߒ#Zc%@Z ^xeqc)i[d?PߗmCI9œ[lfg|J0p$˳M[洝{rU JgJj{G!kEƤp"Kqlӟ1SVY lrl*>csl&ʉ5&.>\,z{tu!V5vkKT˪%+'Ш/qW Umm .H,~(M<9@Pل<.#fM "NW~gTg.܉؋^ɵ]]<$j$A uklWi|فsTzCX\W8~B{݆GJR.o]\b/6PLl.lS:'ة+Li4!,<(I>GvԩݫzEƄ6ZfIv,B;ރ}:y$1c1c1c1c1c1/~07Ѯ>InTl_BeL۩JUQ%RhB)ZT,PΥ˖ orqƢmH!ӊW<hsu`]927X$۶lDJ #ĥX`Wrc3.{ ϖ&l"jꊜ=vrWdg{T nVԘXԙR$,{6`jf{I3KDxMV7$G*Dgч cޮnm bh"fƢ0HŒXYAP׳e@O#UzʀlQ<ԱfhkRY[\T/l t$1Y*([œ! 1Q|iS e!ו]q1{5V h$פfLgzwLp$n9JlIcck#ks33z6)RBށ`JQeQa AZWGP0>db1c1c1c1c1c3Oi(jo?usESR^jl**7a Q :2 \xN B/P@'`٣_'4=M7W'4=M7W'4=M7W'4=M7W'4=M7W'4=M7W'4=M7W'4=M7W'4=M7W4Vn ԯ8McaҀsΒU8^?n (i;gh|c1c1c1c1c1c^^,g 1cû֟,,_1c1c1c1c1cW/%þrqc2:y$1c1c1c1c1c1/~0c1;`}i22c1c1c1c1c1eyx _L;,71c+?Z~L|c1c1c1c1c1c^^,g 1cû֟,,_1c1c1c1c1cW/%þrqc2:y$1c1c1c1c1c1!O$%;5]zC ̅26>  nOeiC ,"L'ʯ놼ʯ놼ʯ놼ʯ놼ʫ ^Ⴝzu_XU#B}pןXU#B}pןXU#B}pןXU#B}pןY.ˆ{b Ӯ'˛dz\1)Z(FPTJy{Q>a=cO c1c1c1c1c1c\Sõ!Y8:98jV8, իPai bCI?/0A?xq?PuO>DcS'?g$re BB(:{5gG/ydK (.S<β3(*[epg2ɉ\Fo:q?PuO>DcS''(TI?/0A?yy*RӟR:dI`L% !*ĥ<0RZcA4[nc1c1c1c1c1c1!h ٨|ɕ9'c9JɞեahDiĞXLM$?XwQMg>9(uT/r1Ux*JHl}YwcH*&Rʏ"" 2-\$dH7:$%O T?ئ,խ8Õ>3Lc}c1c1c1c1c1c1c:C`HFXN1c1c1c1c1c1c1c+} #a81c1c1c1c1c1c1ho7 de1c1cQ^ATW:UUI- !c*"[xsM(j%0ջ٪ $=W[2'6=oBҺЪW2@e[+X1T;_"uUdɾ6V;mbTn]tV\#-7`x2>GA9j,% 0z?9msbĕKJߍ\㬻7Kf2P4Z2{ZuEv4ԑe$+ǣenP(mTncǝ,~qAd< 'QƵMTZwT׉pT=4S4l yC2>`*zT ,Nk/*X4WLJΙƍ˜[XD[ajgo`Sh mq ?߹s/'MC\KtN#D 2ry5:)!ѵ2CӠ^!d9a[\F>ܯֵmȤ!R䨤ك:9egNNY((*$F`f8ݩ{ԘO#Wp9S71=ڞG9Iy=yjL|svoRc{<}^sړ8ݩ{ԙR=odPRNk>z92n9\22bPyD#(בNi]hBz.1NLc1c+eG >-ZgpM=2dSƿTAM.j`[2ٗ/H~y ÿSӯ;8ݩ{ԘO#Wp9S72*Gfk_x$ۗzu'KkkKR3R6gŴ!w‹e>tO#Wp9S71=ڞG9I>EdTu͉FjIsjO#jn-)738BoWR }F½p11c1ccrbIO$HL`NKJbH4AaN`J3aף{n="k@˱<5 sk"M7 ½%!y_Fw jk<'9j4$*X޴aNC'Ţ~} gAbjP K$4?ƙ^/N@!(d F@2RXہRe4z=Ӟ !Pģ%=R -`hvXeb6+Ԛ2٦̀;d &B:$IH!%H)EL2rQ ӐPtH@@ACZֳ^ܯΙNRr"9b}lG)I&) :ރ@XZk_NcWuqc1/G; TZtvIǨ8I`N87P@Bh>剐*bUIԖzrՒapJvT"Žz޶o8U6$KPJINrjӧ Af3 C[ֵٚEж'"bJH4a(B4au"y~40BD\:޶ z}:. 0@  ,ze#!w3i^<(>XF->ǽh>:Yj$(%!GPIgbHǡӕώ ~]/c1c3G/CV|Y8Zv 乲c:DĞʗ +XkAcY3^&Fڐ0MنRLKO|y.{nѓ(õ+[}-mߤ pA_(ӈRpDI|ԐeaZdME-*fsjg-rfhܘ#qbgZڨ T3dA׾:+da9?**M*K.dm_9 -Ԇ(9ܭ5;H4yML.?2)wNj bZ KA"vT0[=`Iϕ/:*:VH jC\{5 TK\Air&f)ѱ{˧ AޓqUѮjJH$b(bE`Cq/leVINm-(~*0,t;8w9 ]7u"N}EN\se[$dqQQ);p~zۗ "bM+W$='=YL. ;ByG.䨅>(M;hˏM!վ2|\'F,.ߧ}j1?Mފ%+˚+çV Zr%;=XjeqC;jJ.Vle{LOW[x,'1cϛFA}By""]Rt&meNꪡ#Щ#j +tjsXjt'z*SH D5 v)|}BU+T$\vΐm O !3&^ ZgYE;yB5ܿrIWiB޺IS <5juukskHd$-bpoC)zMPGZ^]Bm4'uBM@;,UGHH6\FK4|XC-ju,ye֪ϚKb'BA5ɤ3R? $Cz~0ں=`_t1LEL7YqLٳ l"F#I+9Y|mihsm}8 ̭۩Ҧn( y bֶJY[abQG\ &(0hR$rl).I}/Nm]!IⳆtE]OA=?trqAœtdBY!Eps߄c.收*4I|G"_Ƀ%XK$u l& ChA˧1c1c[}KSO̓AQ˶g%Ū>D JNfEDt|MCWf3޴${-˅m-s:N͗Z7G r\lLaJPP,F~02nQc&>2nQc&>2nQc&>2nQc&WBuTdA,W{xzߣ>>ec1cZ~;Y4bu-Hב^T9"NЃק_Nl?1U c1QXTca7kEK'A㉹kEPG.>]'`Y~Rݰ-tbĦzeU c1QXTca7Foc+\g:?^B Fln }+vkb~Flc1c1i,e}3b8!l9ܦI7Oimy *9XE,F[ N9!dWxdhE\WǽA%&::v)<D`^ݱ#U˅lYy9]0E(Tg5+qXRhFàMoGGGGGGGGG>W(*.b+E4LȸF$9Rn-P:9{F`gktx1cP*xvD: dкm=dr5mQ4!=8dA C?3/?w*QESʿTQ2}r_<|̾(\EO3/?w*QESʿTQ2}r_<|̾(\EO3/?w*QESȷ|\o^k???G Ĭ6cP2F4)H&4shϱXwzk[T5 lZַpִiVdA; N3ڐ&spqJ[ӥ@y&oیzA״`B㒸DD- aR1t؛Fߤ`lKތFm A/׭c1c-.Fdki!S6cq@ؤFPYW>C8t>;bQ'dt=r {B#nf 9PȠDT!.E9cYԋENSQE'(I,HQEQEkZakZֵg.2MTǯ[=ILWݳ厂\FyݑkT m{A)QY-'LFG|xSW1 7ƚoZk5Dzsq@4/&@{rF Dzim6*n?[]oyB紼zOVN7:j$kjh*a HJҵ/I 6dZR#I١IUMYjm*Gc?D]ɜ 6lyIJq{mEgɋj&ZCQS}z)rKJ=dR U~3٫F)IVz(Źupskꑳ-C Q,[+;0и"ZjCq(%Ug rރaK =)pm"Ngae3#TZ+&R2 fHsJ&ݷ&D&?D-ptʾ?2Wtp;8#c~_:o22>imHᇞԬņ)܄ Ȝ.Vw;s lRÓ5)%/֑CuhP1$/UzE y*\k{ָ+;k6c2uz yr'vn,p:.$pi3(lQmsIc+cBIջ5Ȣ -*N&r_OW32n"HevL74*z;;-}|l7ج3=VJώBSQY4k46:RĴ+ >ŐΨm U.*U%-%99FNedz͉r9 + 4"$Fȍ۩4C7Fq`2{nOƄ)Pٟ/ؿ2 "Ӟ` 0FH~J'g !тXAH>LG1ŋ`ιΔX;isy` pX(,#1U58`…,KBm|޿:2ф[m\y$J8:ӹЃ(`I?MLU#in!Z?oSU]N2P5zJ_'/|NӔkG(X%ڴؙzbzE[D⭤+.wR輼HRw*8,'kFe2:hKɶT^Qr諞]mR(^y[(-m*U5s .(hIJ-wo>a* X15_7drt'5~;'VX3dD5mPj):|P5=NDO1j*Fy0 }e/="M-aO)ҜM$"S 1&W~=i䏛j/97=Ǟ;W;Ն=c;B𨡮+B9Ƅ'?({n|&}a6>2$@kOW{8Qx\&scM6pPZYpjץ19 ={G g(ͥ3F>Y Ѝ3P\R^cħkOl`Xsr4hۉ+5ulL䭓GKtpOG* ug8VEjq %%1RY.8^?!s^n _&*u+F;!oKdo'6(:&eм|E\թX36Jp4y.y!t\]pqc%5IhwxSp& .x]7h= QJ=]5ӝ1ۅU]2F7a|1XAN TKԠVȥ3򣺊~J+&\0mzoתy/^cשz^v>mzoתy/^cשz^v>mzoתyل_@:R6®G/P"t/haf_\{edA:ⶳa5CLz C1X fYF ^D&]$wNΉ7'5IV D޽bo%M様q-2Խ mE[ MJ%~%"E0v4ҙcGȚPN'h3S~X_!|Z7C@͉ntYF;|H̾G5Fק7uƷ7q%Fq.-n1Jbn+?On^cKޢh )SӨѬ#*(IIf-K;s+STL%H${g} ΫI.b29sސ;&չ(c.F^̍Yj\$(aah@x+XK`UH&\Tn V$bMBEY'# 0Ge]9Mh͉+^|Wi۬H:(0it7GtS9A'6+/E,0@/Fu6zc}_3#nv716zc}_3#nv716zc}_3#nv716zc}_3#nv716zc}_3#nv737׎~([.{VVuiݬT(u!mj6g1n{n;jX'gU$&Fs#XPA5i@ږNI}pN{4k{W0~y1r|@5 vON:b>-]UPH~@3Z!#_hoPah8(I,fSg剋UPl֝T1rmN1"L6s%TV(0C5kȿu%0jG,l~kJߊ4ݒ]n#iLG$D-4ljW1ҭvg6rוତ_?g[5#Z!dsN_5%~d(=N  |["UڿwaEؒ!MiκaGHåQ:感0|0i0 U_*!i}gAS 6C)x560Ix[er.Y*~)51P  Sc(?Ǒ'$n4yְ8XlH^h[%TQk\*vBsH=jy^a٦bKu Vԯ)S-v]L'U!3q$iAq A)4>Ss,--S؍Lʩk`g!.0l ?@޽V4FJ1DJ?ຯڅ7PU&=|H4Mz.@Ԁ60J H,\Iz"z.Z }̀8TEELK#6L2p 1)c7SBeV9ZȪkHY +\ z S2f{wI0Pj "EL'X45(zrmIQp5Ns92P#6E6*iuԘz8sVUcy xPegX{)ѠTmD)+ l9B ڭ)%3v 6a1jhX%E.E--Dԕ j$Z%X^ t0Zۃ/S7 1c2MC=qxo/H5Fa" ɪĮS&X]kmы뎬LKkVktĮ`\f1с<d*|ƾ!%&"5 T k{L\[\zG!8boHBV} aI&]WKҶE G }&s\BSо5_3FB%LjX2.{b78嗵b["zHRlc_oz|FC"Us_B$)T+co7xg{yg5sgꧼIՃRjDp<(_q4!lr X AצbG׾T6/ lJڵ葖,kkAӯ`iP͚ChY"LԪ\ P$u|5Ahmu2h 9|RئR2EgA)ڮc \B|+JnvIݜ~+roF%!5J 5=AHtӍ=1޵@]C:jNѨ(Z%Ma.R|̸%0LڑfNɿөXI9] u TBgd[#Ls7(ϋѓpPS\S)0); } ̎H1#~HBѥVzS^ SU?4}3}k PVaRr<64ˍ TA @ּcr+yI_!%E Y\z3C9#,Ғ8,YJQ~RcNBa!3ZӐe|a81cWG?fxbp1c???G 1c1۵>GAVL5+#lۧbjk# r$KVCjŒ&1&|b'g\UK+˔k& ,ˮ;tMh[S#IdZXJL؏٠B~2*-#@~pPb=AGzY_0GԐ=sTq Rϐk,`Fv`)H|K\h(N@5; {ˎ7[FJeIG#,BNbKrsc? [cBsX}m **וYSذvV`ER.trsG/۩O#1Ze;NA&q&k䏦%NotksZ`bo= = fGVMwQQ&Lc[j?*SmHerǣh;g]C%<`8R64V_F(F3wNy 5PZ`v[յWkCu0923Ў?sglr&̩XB\TNmN-=`^1.[[2*O L'nZ劦/OqUiWq|,.0OcKFYֆ`w";:޿Ya1cWG?fxbp1c???G 1cu*L2TH"s,XӦJ9b4*O4A C!؅kYUP ;ʹhF8^u).WS[2C}&ңPQ(h~vhTaAXS~)|V; ,~alCgf|>ŝ%s.ƻNϮ&rhxa"/ͪ#Uc+o;E*`/Vrto7WY!fʬX徆{XW[ pNI_Fbv%͞P>'K i@Q[{rbs{b dc4J4)iݜҖ$ceJBcSR ʪ٢Ζ_ ~ֺ_Z4kaCbKҚ6\py_-IY_c&L`UABqH/$(mӜ h":oB Ͱ‹x !YOmı;ת֧z(}7 YūZ̤1j]5z׶H! B QFH͛ $Iʔ:, 4:DRσ{l& p ]#sTKFz@@PIe8]OTfdd9i@\.ZNE_a,%,qlNgHV*N/T2{` Z߁\*"YI<&ZP]U1Yܡ,f@[GjF2hszt$NI  B6ǏeGBvZ Mfi<)齻dN쥴 Ƨߠ(:lQ1h cpZFIlSz6t(07Gm!K"@QE 1H8cevEK6θ 1ċ2`h %!^i1 oS U퓬9J4ČRH\}l^K9ºFt\E3y72|SYI P`Syh1cS0<#鸛gMHՁ7 "=񶧨}()f0lm.%PJF_"EFTϺ9Ols{XTϺ9Ols{XTϺ9Ols{XTϺ9Ols{XTϺ9rq쎘fTt*fs`KvEԗ8Hǫ󋛓pL0 m1c0Ckzc绚 f,268`<$ NCصz޿FxMf@-F)b {rl9tq$fA_6y zDЀ+T88Zt3Ԭ~wiW?pS]+kSVTx-of|_;2N\/P kuc_\vbkxvtuokJ{do9c+c]k!^=Mz˚L&(,;z-F[-JNƥ9Y>VT-1DаuQzAKKFtl>+OTH߷Ng,RL>qc1c1c1c1c1cpwŖ,N8ggZRdp )}#hc%%{l'Cs;lh#7D֯]]P-/`l tҷt Z*^4Gl">B;JBCTLl3W\]еasb]$#1ZDͮh&ql^ޝr)IsՍp $8G6Xc@{LN ~ ryL{>JzڧaKUcKt2'g,MlN{))O>P5-- 2VhS DRVqbatik-1.9.orig/documentation-sources/resources/images/svgviewerDefaultRegular.jpg0000644000175000017500000027332013153020772030130 0ustar mans0954mans0954JFIFHH&File written by Adobe Photoshop 5.2PPhotoshop 3.08BIMHH8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIM Npg@ JFIFHH&File written by Adobe Photoshop 5.2Adobed            pN"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?Nȱ֜ڙԝC7c3ڝSO.mE-x͟7BҲ_mo}sFͣuVUc:k?CELX+sw;l}!ޞj8rR?̋Ҁ:/esA=zIY#6ڞ[gS"?k=lSP{us]$v[k۷+~Iؕ=_/,q}fƽR{BcˋN7h3na渣WX57WYZ~aV슰UUkkaE,e[޽~?/\Xq;OӷMu%c+gQytwCQhw\CtnnchÝkh:7}{zloƫ'!kޗͮo;ivدhw)^,4Mp=c}_:inYz~m&˨ -˷d3?\ݹ]t(PgWvGq8Scw9E)?w31`K[c?\kGeb=ܬ Hnӊӿ].gЖɰk?gh~~B?ЗxtK6x!3p6v> uyc?t}1>"?e/oq@s|0ltOk?' m_n!K_v/1t}TqpQOяCj?22@x;k=ݱwwq̈́qMM9)۴u}OY[W_7= 78jPgRۗݱúȐڣֲ:k']n_ьOPf9*%^KxNi)CjbaU,*Rױ5Կ ‰躟oa3>K ^?ޡZ*SM,uZHc7=kkƫ=]aVvO{r89HoQ#FmY}X}0g^i--:pMsW^.[[08c_#k?sOgվ[s}Vgڱḫc0+{n]EK}<_ *czuX2)ɾUn/y!m;|j~Sm +6?XwnWuuFK1=Uz-ɮmƷ߳o,9zKNٚn"6=߷'4G/'/"#ԓnT߫]*̼aZ/c]gO]K~©z{ksi}svTw_[9Fket) eKuh.sC+/ͨ_YѾtiél"%u7X]};ơ[:~%tD=O nݵ?iiea4:&wmA=S nӯޣl[jgUϕSӀ /_#!՜l]&>rAU$o#!l#]ڀ>D9Ygnf ؄nSo.wYQVkCu`vzeTUgVe7!5>-v9Sh7+E62ΩC=g1wY weG[GHf kZ+?O{1}[]9[-xk?!fݲkeѬ7W{y6 r#Ā ?s.o*v9XWPAd}bc%4}h>uQv͋oO9 !bȋHX3ȂW{bުkIccΖRnVq2:_x*>>>av ӺN~+ȹ ;WQmoj~}W3̓2jw2?748ߴ<\Bz*?@ mK,mm6א>57Viw&xcSY^5?G/~Hf&g_]qwU$š&^N1'@Ӽr}uDMv]ܖ̰9KSS8BIMCCN    ! 1AQq"#Ta $%24RSVW358BCDEFXcv&'(6GUYbdefrs7tuwgHyx s  !1A"QRa#23BSbqr$4TUct5CDdsEFVeu%6&7W g ?W/ar5 EzS;! SJiMck q `."NG#>=`-o3|.#g7v`,|4|dGj䈘2u rf&kA!~ӭfZgVTn;#qv6%hVnz9ˢc^ѲЊ +PJ)h[FOAofW{7_mO7bU7ڌ邥M7:+إEn5Sܙ{maMpzRccxٞ^CóNdfCVhvY;czٳ!k%4g8"pMWP .n ij=-=k׳٨ -d܊^|j3''Pk$VҔڧMnP_!0oe6I(>~h'D!!Cf@W'}G|-^d';<8HCp4U{5I#J =](C!j DMnOٲ~GہKO~2 ڔ^M;/?j)m"^`'ix4*J0Rcn'C_!}'O+ɸ~Bu}$!KE^e_h`4>g Өn0 pO$݈`?)Zp^M4Jl?$!WoOH`?):kMP^Bh'[Z>y||4,Nדv?PW9N?S\ GO/φnP>>^?-Է? '}s򠟀Bt<4P>:_Z*?-lA?+fy7P>-!8y;mOѨP?* \1^`+JɿtRcCh`j?b~G?*GpP(o&}9C(Z i}s0y7nP>!!8-2i5ka WRtE'Æ?HC_YhBjOшX?*GpL!o'cJ s?F@a WRon}t8|Gm<–_ҔT#Bon}8|GXn5R~o@GO_QPBW!Z?NGAR/ Ѹ}qԂ:+s$l)g#40 ypJʼu-QŸL~T b(M^M)(C*R$Z?UYr>ʚ~W W /&hZ'3GASO*j\4-Ig< -DMȅ;r.k=Z$Ĕ" bTA;mFfU b`޲B*kFDB`EQ-AA*ҥE&-:Fu+MR)Wz7Z%ܱwZg RO&`z&;dM5I``GCܖ8J4R&S"е$j\dFIR WLek֞Q&!,D;MT@wuJd^i]Z7Z%ܱ/]Yz)7JTXQݞT])ZfXr6ԲqTJ"#R "NB]YƠlm7䂱KM*(RZ$HQ蔙CXm6zB9jJf%zj$HB5'\U$H]U%8S(]wT",$"(F 8t=-m'YZb5F/CmB ;.3&CbBҔjJ΅BLJ,KLu V8(RqDҵOQ{,tݳʻLT:=LtNĉq*l\sc3K+%+PːDy MKrTA  Nah\DPB._X,咰LZ<]ZK%ѕ9s9Rr6&6P8Rs;Fo':4Ҕbqv o*rJQwgv:܃qݮĺnsw.۹v.͡B̳q=H>K8V8}mמ,?zm.WK&4# y߮eo?星vk{ӻuzgJ1rr2vifujQ V$D{fD'6HvhzfՁ f%k-BKafjmtFyvt\Nq(tKq6v?;n1t\U(P[]։th+]I}l-rl))en]ވ'iviJSO;/pQ/6 H;)cYk;fbc-r%FY NG v<B/e xv-Yet"%I*:܏Dͥ+]6foMqP 0Cz:XH,UM9"n{\ *MLpfvgSoV6[>hv`,ЫeFp~VK@ND;n0dBZn> B[~VyC8˷ȯpY.5 LwI  J|B5 -3:3s?>%:&֩T-3fa?c,<$UDBƶF!ޢ "v 2ɕ7b dh6& ­17q:PTTѡF)|7)\Mϔz'F쎝{^)w[{)NJV%K2tdnΓl޶4$$濟ymq6kdafXoɗXuŭ.-7^f3+D#pdX앑oC&ogCIJJё)Ց)\Eҥ{]|oPT[Z'o'MOkVI>HhU@zR剙ln .S)*P)KKg,ZUcb,[(/^Ps+%yJwQE`d;k5H ~V4C8Ch^&օh&BVQGy b7 -Xh>D*4.&.j+wZlyf !%Dɕ#~S<썓CVvZZl$4Zg=0ڗ;I$.6"2n)BT>lUqLmVJ%M:PԒŪn=Il53h.X;;xf y^zdE2‿O)\ +S*K}Me}sjy'dTo%IJ,ٻ=b4l+li86YGYbHY&F͵ӉYZظKĩ̚rZmim3I-k˦6Ҋ 5mx}R%mRFO3 9cits<ɉLR= m1j i^)oa5zbSJۢK.td#Ѱ~Yt@X-nY;6"IJTBtDw45.5 dN%OA6;O6)h5?H4sFQʚN]Y_)1LSf|]qu!#*4&QyR_֬Bz6H%8%}kt^Xݪ+le-<, &Qò.E8i% 7kxLc ǷdUO?wZiT3&Ҵ4/B4. j!4E*wS@m׫E<+CL7%C:!6ϭ4YCJuR/OtIo,AX e؅M *CƆa\[Lb"ybnԇG⣠x|My y.>ڑRmiek%hCh[diՇw>iJi}ֻ&7LR錊>e5LMNr@oW;o6cC0 iجf!DE^y6iKh[o-di$r]%.%M#.FKm ec:8D$"#3=atDžB]PzdU);ҴWΘP:ޭwG8ӷ*t lS$hU(zV[*z=;@TPqe9CT6]T#AG|&#ppUK\GoVP:ޭwG8ӷ*-"o5&Y՟-i]f攎pw^c39?":JhY&[K+jqm\ 5hsK<9 9>Kɖ喁t|XkemBNXB8c/flfs3+?xx{"+UWgFmi39zoT;Z+*xl.ޞb9\pԊc]hřdy&#W۲֣Y3(] )b("[DΒ:#iVHkݯj9&EW5/h]N|u"JJ2VDO,TIXVU8a\Q["LK$Jz3QբK{vs)E;_Vvɭ-vl!iˍ.wT7=&rUgIeۮ}X.+ERm`d86AmL[#) |-g,bM[<5&j0Q}vZ2i ܻ:U}c3u{3s?''-]Yuy@5Ao ߺ(Rt*Q /lj~oß{6Y~?uՒbŋy|3E.aP٪k+|9?KSnur\r7RvL1I'y_x3ufUf%a}rvoVV%b#!.pJ|EȈgvfwGCKo͗2;ma`8Pz[o988M4T JKJH:p<\C'ץRkyUWԑjhg(8Lvabۺ>˔ MȩT%2Љ9kvzZ)ƶ +*OԲi.Y̚-'.aQaJ>vrnQ˟m62%6t#{h4 W A.WEPݳƎp<{9vi}۽+6JSBNw~~堥~Ѐ75.Ji+}`d$7I 7҃}>N꤈ZE[ FM e M(r!Iė=3z)QŰZetDaoC$P4jK+MIA"Y7qCKK)JH(RD$eyfUJ/zX%f|T}&)y jGleoX3mUpg pq 3Eb<[6!iklХ$ԃ[P Q)3L)WJDZE!-%ئdt\ee::&rQ׮+9ZoUpfN M2ʌ-gc5@MfsI-KAd{}RJ 9wB1\KCEhIUJyPIwJdJIHz)ݱSlKy'%A5s"z%Q0[Mr4C 2TJH2I&- (eIJ AF2InWyPZeyj)btq]'ғ4-K,uK )C VgFCs=MehnlI['!3A),0A0'N̪%b"#aPZdjָe ԦTJ6tz#!Z:m KIJIĔ"~VIe^y ٦k.9w.mcDjdΊwjJ `%~TTCA{eӥn\fJ*Iv͘zI8 'qd=M4"D xB]Ӣii' +w:ȖZڮUzOHfJ31ف%|ӽVY\.0? >vXtJMkPh!; Zp#Aa6qoxMpؗYaN泙8M|[7Rvt ~xx'/h_(c@{ o[x6tаr;Ixm^W(=7ſyy5˯*^:rXaiMe5[CmF#?Tm:w9zXra4'4A&پ-ɮx2E|Hԙfh (qff8o<*U%᳑ HJdCh +i6͂[e5I,VQo30=7ſym-۫9xmy{,O>W0=7ſy}5xlBüJ>ۇ}ʻ2a`ipo<P6ra|z4HVa\;>>ԸK _'eyO qfkfthӝRgWmVjXõÔE }T89*T(ɿH^IF2L$wmLqYZv^|M͂^UFNTFXmǜnذknJc\ͶHJE -U=;d{ Od}FmJtEסAjI$aM28", 6Z-IR*[bҫT)x'II6*6Lb ".! pխ[jVFǽvmtaB.% ))**SSIZc [&"YRM4TqiѠԓTGQ#Σ{mo) Z{o(b yM'VFMv̲,TAKz3l$?O SgYv3-)аU06ebq@Dja+;HN3NpzA;Ml~c2u:K&})K~ f)y)p*$ jㄉfJ.F$!.e`^挑W(jR4?JӜO۱^by9l5I6/%&P:V/ũu90͜j! e9™U,Kd:/R_O*,//RʩH)ҳ#(s( gn_*a$3+)Bs|ܴ7I9tGO$:t/DQN9B[3be+;e Ofu3U983rPtwhyAs3s[bEBZ{3#66\~C5K3;aI[f6V0I t/HpFC75v^!ApmtD ƙrTK46 X7IL%3U5lL)Wz0%s~XBȥGӘF|Șc61 /41Ӕ7J/̳T52r.:!|9y l/-ݕcjNi(!DpG Ql+723\et~pM.Ks0B΄02Zi2 VִKW P‰3`XV,\!$;xy+eA;hgG&fMSqPp9:"hOȊ}Jwbzxn;)g.WLA`A4Ӊև5ŰF|lʑr ISt+lf0yoWl]z@EṈ-ZHurZ;nz+"ITʧ!*Piߟy*?8,Lr ̰zMQn2,J5Qm =oRNq),mS62OwrfK_W_s!r쾞I \z9o/L::b]NF+Gf*G&y30IybyvieLNKC) SGCDk+m?z5D(UѻL7$tUmnoGM.NJaH!kY%,kM@,j]@7ޙP@/ }ˡG՚\1U:Tvi)-NJN1;lE ^j )T*vMto5( Q!SɊ]j5Wk uŶW5C͑iƕ0kt%Mx!+'U)cMi3RRWQM۬ҁsԺY”)EgKs!m4yH\-WiS-JHk٨3q5 INk/jpi:L'PJ+VSZ{PV+[We-3\ηI6jkm9 ;C;Ib},9]kMORM<6֎|UM k{S&yqnZ\T&%wD2cRJ]Ybt.YTl XʇOjg:#_QQYK5ꉾ^i}lՙ#rY{tdU/T)s-V "71`P7ʨw+JLLU>*9Ck|Xvi[2k8tkԎkEDeO?Evy앂2D.&jn^5zb~3U(d*se*¹+쑵{ssl-UTnKV^ˍ=U%jy//V!qtHnuFSѭ K jN$՝1i%nFs2w-|lf}I&GVOdI&z{ iB\H[8UvZFdgjP)+ekH[Nce5$:eƻ,Iy0F4\"[+f/;Z gҪhk=D 7kSSJsX5P%U5!r;ePo1:Ӻ7=H.se`UJTk+&%h"vjcsQeqFȅԀ. }&Y.tr|jpt5lt2gzwWTͨfS'iSʞ.>0XV`XV`XV4/]N_}5:L'<ѕc(H+d)Ohcoܻ^-:#ݫ^@}BnL ׅp CQ&v`nL 5D=j37t{ p?g`o~*$=-PTI{[;|G CQ&v`nL 5D=j37t{ p?g`o~*$=-PTI{[;|G CQ&v`nL 5D=j37t{ p?g`o~*$=-PTI{[;|G CQ&v`nL 5D=j37t{ p?g`o~*$=-PTI{[;|G CQ&v`nL 5D=j37t{ p?g`o~*$=-PTI{ 7qR%T܀fȔJPqWDbA(0C fCWxFuoЄ{*=ڵ 7_0_.*{^asL3uSjM*jQSA\ƕyjsQOd 1,%|sl٘ZY;P;n9b!ފMC6V,z}peu{%-~ڳRbSD c%7P)%BTf4S+3xfԋ3sk/l)].崞AUUE[RDzVpyqOiI .,򤊙{eUr2Y8{-D\*݆y t2ږ S&wHhwy(y5"IZM5ULDk)*%%]2L5(n&"!ƨ$X޽[J#LK+ZG9ycslN8Ȓ)O* 0CKЙ%j3JoxNaSv;Z*95Egor)]*-xFãd-L=` `vfޫeLn}:S$ " 7Ķ䢖W;vsW̰w%抝'T lY*F'X"͋sSoV&je3R* QPW*SJGZ05R:=F~y[%O^jX nm"yH:}*"\?&P , Z28!B;d us뙄%.cpZYbKPtQlqPvuRmKZ<+9n_\-91M5 ɑf9rHe&pLa=$x*AI:M馋Qc\sδ]KBە&>әjG9!F:Le-kxG5@Tm 9֙on:)gz\xIwknUJO2I˝&7+-U IPl 5RQ.n1N tt]qd2+Tg˧C+2RقM$$4ٌ˴RH6)g&xlovHLQL::]9BOm$8 L 'pM ZC8*^k3:ʒIM+Z !Q]) fKYEU%e !97Fe s\R-HJ1RC29za!rꥍ WE3PyZIY"ik.lх&?K@\84'1@skdUV"N*&N48st٧#elz^Ik)%&nbuZjgA5*7RZڻʹ,K3mMRE-"*;ӢfUF)6`!rLF=j6B#=Ȕ22 a-)N%$kB,-0^ IU9k{KhӖ꽩c3bKU7Vjbc"1\e:(/I7?2ʲ1<腎^%4'?Hz6J*8إZ5IFVUERZ<†Ueޕ6ˌl-f9`fYАތnt\5=FBrTcJJi|&TlՀ611RCB}Z)D)4bO|*|]+^b_*h.}{q7a*H-RRlt/irjMS%h}?^3iKxiH'[!͒$\xZ6eZm|_.TuQg Y6̦̀63T,9cetapS.L0BҋiUW&P PN4֛JWg=jQ9_D)u, eD+d.цyyd)JtB ›Кq1w%pnQiNP RUyj_arEMN)V۹@a+s=Q*haLDl`kWe'Cre w9RtIɅj1B՚lLqpE sp01 D Lʗ'-B.K4!,6fGט c||M'I1lJ 9I !$&n1(ʺWOMLo"=@0TBBFД )DsS'nmn.җ'!X*<6K idJLV@X";@.H۞/1ICc@TQ/`i4`ćI)-d9;I5Z'n2]֟;Hڦ5rCuiC.M$/!cbffAP>wД/Cb2\K'9Bs5ʍTF);Q6w9ɥ&w&ZN1+% gy%͑"RL4PyVJawٺLSܤS)EdZ{3! "v$ԬqӴ0IoҵU=2ޮ#ݮS 9\UWj5ZibQVE5=mrZ"MR}4|P\F٦O$',yz_|;;ѕoJReV\s ԹX 27F$PcPؽ{y^ojԳxliʭGp?U?h] 6ˆHL’9U4eKkQqy-SƆUL,*͍O(H{!fهyppq.?Mf&1XatZv[4+Ⱥ,ٚi%t$A)To4 ^NRR%n"]5-4JVIiRVNĎIU,t!L68&V[;FQe,uDmKuf,k86JƼ0.oCCiY{trs 43$2Jd zʍL2|7Is״:3Ls6>/wxׯVRK%`午j= ːPpΩXx̺8ۈ4-)ZM#I CC,iIITi=j22|g]iG-A/?]~Os ijTF:2Yc[5 ) -ӌ{2Os4eoyLԍS\,=W*4MRQ ٭FV(O;*-̕ȩŶtݮ`H=FأmVkV"H6f"Y t+0͗)y.:6N2yKBݻIh dWRnSZRFuhdH Gkw'6 MlK@(6QZU$N@ [7Pm1&4E$|kmE2SAٽd)B* F3&ZTn-٘0Fa,""𭀕0,ɛ zK /fCWx+C$7wO9+(ɜee9%d);vL-'vm;&۵춽^ ر6)fŵBSW螤uJ$ֻ녏慠^>4.K~ nuT\д Ə~X7l_FW.uT\д Ə~X7l_FW.uTr$ =jk"T2w*ajɱn#T{+)ILqE1,J@N7l_FW.uTm @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豅 @|h\Տcvo͂UN豇JA@j Hԅ LNYR366433ZdIYe!  ٮc yh˒nؾ]0h˒nؾ]0h˒nؾ]0h˒nؾ]0h˒nؾ]0h˒nؾ]0(" D"Wg4,ˊ19{%ID;JxNO:cvo͂UN豆д Ə~X7l_FW.uT\д Ə~X7l_FW.uT\д Ə~X7l_FW.uT\д Ə~X7l_FW.uT 1+N27U: 5JsS+3$O_%^|B{c +V6TRUBFIGc ٮcd*t:U)34y}7%%HS51&2/T긶yn]Zag9\$֚t{#M!dm7f 쭕fķf +q+ZXbUXe(e!0Bۚ[RR-ֵU(gj4-yr_Vnؾ;]U;( %D$)s`w(TurHޭr5k*XNVa2b9 nؾ]0ۚx+C ✲57526ghllhgp!+kzf($ ,OB=6 ]U;B/?%ucݱ|_`5S,bE8ŵćHҩjWDOt+uǶ¬*T AEccvo͂UN豊xHJZ])Ce7`oSBR,Xb0ȃcb,(vY{'\Yr!(2n.,]е.Nk:v)lJ3Q.{L7=4՛UޟNie _%QSk 55LG 4j=@/*$2938(dZ^a5JsS+\,L^%$906:ݕcjNi(!DpF zsn=Cy9P (|uۏP^N}>{:Ǩ~/'>=`v?eΰ_V1VZACs&zxՋogzIQRNPP e Im!E$HL@"@F%Wxg K{X\tU=,.dY?R2],Uy|w .xԾGŀ̗KN.xpQ5zj y!׺"Hj;/Q'?& }ԥG%Riұ,jkܖQ)NOwx{Mk TDEgs" c\;>47')["#ծn7 ->'2h|sEk3]Y da,*{+jظ۴}d,KQqY MYYǔv +6{G. 1aJyy0Q,d2^r%q,l43poGn6& 7:<]6PiIJ vL2uY:{k%4$asL2G F,l֍oGm4;eOBf.Zqa#]ĩ7K"~2tVkVFZvȵ&c-F,CqЍBE7 θZ}8ŚҴiG=p5cid$ofԺ܅<1&$K2DiP&ilDUՏIL΍.kQFi#uZG"UfHRҚ.4vvr Ϸvrf?m9\3v=Z~W^uw[]y8k<<)S#CDңhyWk_W* +7U QD)ՇJffZ9733 e*fZ{v*-j %0.JFCCDyLp褽3TF⚞ߡv]Iׅ%K)[EmA]=/gKyUHZa+!]j: M*uRtT= q[tSNrzh/EUf54 ;qֹN{Iu%IVLt˰SI]JVUZKHuBG-U_%bHFX&Ƌ8Nn3KJg4z|T6P 3^Vh9w}QRݡ ).ݜ,+4Қ\ & MYi*+ԽKĩL.JdO$3Dʚ݃E!ީ! w)x*:m^n`K\Y)PiNvF䓉 _[JdVZRyZSjB G-\hm,r.2$^$JAmR̷6cW%Fk^8i\䙆_IV&*N&U9V{lWR݂4ަ !L&K*LN W0*wk= &V#X&R;x}ANpa歑j-٨t%M%,URTIr( ObR 宻v H>IU*!K+9*\kU=]f/%T.~-A33 58 Iu)WLLite]8ZJաn}Nf{NTQ]Va2ieu{e/{[{G۩ TYH'&sDr)M=)b4n֟˵w)hyw]]v5;$nZ0Lyx 5ޥN@@*fM/Vtyd}l wɗILU;gHMP_}ѼNOR),+bJ{wاeS{U^r=]6{.ףWY\ʭ>IM@y(^eL3̰GFYp2Z_gw8Ƨt׫s אMtU:a"_R9+>ךS1Y[Uebr\.Sf%(@ 7eyV{uj\-fK**^q>RIE%В]o ^U9BEF)*ff~;SʯP`ne\ں ["_zWoneo#j3n8*^°KMi]b -ք:i8n1U*xϙ3HgkVN$[%&yhnj4MXwLPYֲ=B9];פeIHh$cfJ{ɮ+.mlgzQ)|e#j3U&^) Y+y9IrI!5f5.27RZ*`d]Q+V ϴ Wt `lKH) hnn)H9,T+} 4iI9U]ah٫mYN%{(Y(\-W͐ $ɍ1 ӽKn:V~ 3/W {~cDȆPMkӤHsy ˔bg6D36 ߀G&_S5.fCWxt\u&iBiyrvֺ[Xj=ʵ etkpotW03Ti/-L2W{۴ig᭚֣mv5z^軷9CN9UxvhТT4 A峗Q^ZrgBO{w۠{˜땑~P.ssҧDEu<V4H{Kڬ.mK֗fmV6kKyR϶ R5ټ)gUͩs?йF9i혯Wfm"%):R(rR{k.*4rNDHw-˭ڬ.mK֗fmV6kKyR϶ R5ټ)gU }VoRʗEj4S* NTKڬctta^Onzvi.MGo?.\DrH)U-NW+.4f伉8DȖkRP+17R4_KSS(~sΆq\C2NY-PµLb6|m@ w3${y`sFIXV߀G&_S5.fCWxK ZX]E c HaIzA -\U/{B7LE^‹#6p=ڵ?Σ_(Da)ϩ/b?CDd+ U–a\Xx9~G lCX2%-eأ1(wŴzaͻ-#p qy?~6P6cN)J0䰓e1o҄B\,7@*[Cga(|jaw~E/%,4ņ}}\+[z1]zTbwf (յ %­4$mr{X!/ml­YR>V94TR(*]G6Ss?޶?ޕ+;dG؃b2#EzHl}'űs˨o[zԿhQlVQ=±0U )9)['HJMY "(U!`.a@!B oCzRk.5VJMW4 15ŇF=[UNů°pelJkKؙU^`-!z{&B )~j]<`>2ny;J ^s`^Y ڊ&e$rkg3%jzlϟ?Ch2u n-2U0=jäս(?#kGþdZWfV_k<{C={Ͳb+xVXA9]lҵx 1y+xϟ/Gh32?^Ŭ]BWfoRX-V_[:{}/6!3WI\GHzw?~e[;g$I6?ݛ'9[σHU̶U[hHH|;^hB:go*r/KcfYsۆGJ-6n@ojYxaN^iAjNz)Q0U,47zœSxbе=N6"}},)~~4Q{85Sjh"v[3"9kzB_mI-UGWUl{RKKhM!A͉jfk lvd;~#ԍ{5=%Px#T#B DJ -4wZg+-~^Թ|RRN@Z) G?3r*ϱlLFuH`=Leʯlxs]5cL=5d޳hQ#5ir%Ĥ0kߙ}B,W߷Dd ,ĽMC3j|s-3ݘ%!jrޙ=B-=%PuCpF6YUy"t(TÈ'R:ţu*?L,3٨Rux/7Az j|J Ev "= CT#Wzy⯛cTd}7-@~}[d>kfS:vJϹ]r-d|žQ_3ݘsGCxS=TLa!KOOdY1O:ik+/;Y_ {\.&ccwR3ΑϚK!Fe]|f)уu~ԶK|\z Gn GÂ8]W] 3#ƠA_ }]\Kdd` @@z/5yYKxC!J>R>̇pn*5lUBϔ` @1 .m=_^HRө<">*/$)RWdS`=?^p!z:zN .{tvӧSou9Ϳ<;/bCZJK踸JaB;=ṕndR钏;>(>Y7űP*jB52"3-zNUH@@֜7Yi8(sΖDz!f$E XMI!lޢeg˖z$JZ>`#3;qȺ$o[Gߑ4ߐ/;:IocW7xXEb<:?ݠj"Nu/ tHz;1$Ze!@sR?մpEd?Vlxc 4WSB*"{?,~ef^|Ci7@=źo\>'r HGVVx:U@OFY}9q){i= ˺9Ȋi,xXtiPk"i.Eې@=22cáDLL B{[9xk9!&gG JϹ`:XV}tP+ )W x|!g8 g@'}o}[d<)-*Nܘzޡum\l>L QO);1Hg6;d<ͼ-^j:"#ܜuG;9xKX*O{5BUQR*4pW߲Ljy!k>k/@Xe(:,<9cU(-7ӈ'Ɯ` DqQ c%(k$)GYW.;pjϻ$Kd';1(?)3OE8;:~F vd}%1聯PN:{;:= (S#'}H8=+d<=UJ5a>1NOA{6^׺"HlcA*J õ$LJE#~!Ų{8D-i]32瓭tTZuT18-6TnPI3)/&l!ˤGݮp&2J >!D8v/>#m'6߅]ZM <:)uBePA-a!T{phvCǎz_r "Ev9vcU][z&ДG<;D-XGr8z&^w@]!k q}+4Pos,= 9$rôj p\x! z!a$rôj_;1,~ G]5`xwE%޾'4zȞ ^+"7@?| o] BQ9DU5) )z6uQƉ$ڣ+<Ĕ&&85(_iB=PdK@_6p,3P%y){(Y#XBR=YljRJRbDQV1 X=tb)Qk;HجO1e;D^#Xh( + ŔKBL( cĒJd{v|~bJ_^ДNGZ=%nP%*.|`)YfODͬxIZJP@by*}{(+k IZJ I9u0VOk%D*ܶEιg*+gQ9I SA_=θ+qu?ɠGe@θggl{x 9紀@*y R畲'eͷNRZFrQ APb" S\l7 :E~{*AF#rPmOS ,@gdowy TrFߞKwG0׽|w@3f[>lw̜?…VW]Ā*@WVeKw])S3{D)ҹ7`{ v@L<=KcNi9Cu :MYCl>|Z^ 5h[rLNv31\R%퐳-"= ,^ cluʞᐹGmu>S{^y#/*/ĀP M TkA z|ۺl%JUMԦE1/|{=W+~DRYxr?l~B W J/!I,rq>.6ه̻"HPE;, z(X)Kw4>:Axg03o|Ox1).!mI0Y@xx|Gޢ0lw;lKR:*OIK.Ā컯XV8ケ߷*WRW\Bּ컁ȇcܭvPeW ?Jf\jf5y=oJRJ冑t$,1 ,L'7t,܅'VxđH!"DJe,JjyAL9[)P "I~!+rIcDȿTehu=#K]bǏ6w)B_vjyKܐ:>ɲs)|hz J,8݋6U\!p%e&I7$=#Ώm) K[% Xs9cEp"础 J 8D5lۿ| VaO(3!p~{al)tJHoko~lyA}@%Ѓx;<=H e޿ր "H|0dDC,(瀸0kĠ QQ?N~som{+a<7[(6 a2b|ajG;{PKk+MRF\GFcwePtz߮eTχ04+uT#)\w⹷#F D1!=z(Xfꩽ'X5WR>Ƞ6ſCˎޒo{ ".{U n걿Ðp0O0oQU5zzT"=uTvٰb0PlUMo1E"1m"o$Xp[AU3G`I;Qw [Ge}=fiޮ *?Ӹ-mBNl:&!o[GV?ɛ<xgx :2[}HϾ>gL`Cfe]j>xnÎ/9\wе` Tn~^g0KdhDt.5xYe>h]?l L\,Elq?Pl"*?l/xP^8돃?vz#y9x=^E9Ŭ-EgdOSUcrx 6~"<=쀥 f`#nvIK_7>Od@xyf(R&!Ʒd>usd)Ez{K0R{/pvyŀ)g]XHar?[&!'̾xNY ̻&Q1oX>\v}N 3,P1 :>ul*rBX R~+p!_ ^H|*OѢ?&d3?N~so{+a>7y;h%}Τ\,"d![ }'0.$KHbehEl5f9E٬߿ w}" 839kKYnu51%<3`3X׎[AsD:~PavQKA0s-3H_׿wa;':3A#9H_#v뛘goA %ru[$[ގKZ~4B:<vAB \)>{vH x'ᷧJ9)̋.XD*oҜ$Q*28!U#!hm]$I!tZ|1 ^',NgHtGGZ2|l9 b1Td >e`E=>Q}cLd >e*!EQ i%D=Bm, cϹ#&z_6>@Qd}@ cϹ1l'/ujU-:dJT}Ȉv[b?!ռ%3<kϒV_6pZg-JO=Pyd- >߱tHόp>]L:lws1a8߬^Yףfg|1Ǯ?K:vSou9Ϳ<;/ 0LQu{b R8i]b9{`Pso5k[BԘtu+wR1/_ELa)S@wE^m6P)# cQDn#=W.ϡLB?Bt?-}j=B$+ ̻ ūĹY.Js߶.!2HbHZoC+Ha=1m ^ғ<}jkGy ##[nCA=W3Ads} Z~ZQoC \ &EG_X+^\<~g5`2ؐjUpeoK \#eRT TjΌp-b~S;މm5G[ "ĝ)eJ?)k_;)zi>')D@2yhqN'9NS# A0O_ևP?*'AjmN؇us~}&_#c`3=_y+zhQ/y^ۇ북!x%j-)[mDDDOcۄ Qy;u{m }X%FUN]>붅"&_$ yD"";S9\164>},G)-NNv)[׬CX}vTP(:bhDpH a=#7 R Gqc:͵,GDWm P 3O1ez}/Vt"8$?KJwr4/_K?` VTnA@hΪ|Q5GalסsyggHlGb6̱~+d?tԹCx'"/P<*7E~Խ霠{ @{P9t 8<Vx]Kޙϰ_X ?d]\sҮmȫNqs=ӛ~E@ps/%7"nM8D< ó޷NMݳ_f4&.cxЄ*M%6#1fOJ# 1peE@CBҌsB&ז9DJpo#6"tA|yaKP<e:A՝WIlDHȴN+Z$f>T{';(: .%%K%nHzHTzFT`זChIuG,^G^X g# !_0Q ya~/u ϸD5~ُSז@<rG~Ș~O^XYuљX)" nd+x8YȊr=<`^e$eU*HVx;^lM~O_w2;/PD987end}|yafEG}/slM|8V^VHs1aAm5 yAj"<v C>QOB/w :RT"r5|Z.uLVPÞ)}~d>S(,X }%}_#L KM|İS>础*K>el]HK Ϡ3{eIWyTx|ݍ^"yAjr| ?S9&F;/ܝNfAuCV B"ۃn=[ CElS2 mI YxpLjA{{ġwECtE`o{wʎ25Q?ۯ𶰈Fu-Q"T\0dY탯S|66#ZMoQ#$2.E.譃9~Vڄfޣ1 HtSJݑ϶aA8f&BD:\JtF8͚Mkзi$ r&sQ0m ] z$Kd( 5y9î۰CIX 1%1166j`Dlct*4(<4jb\w2"-#بCN)M6YgyL&%PEWIM>OyiC鳼G䆑B^)8[4'"6w%Gx"x[4ad:DZ1/ n*}D'GK!$[4S6w@SI<(M?c`}3%(h})qDV(s2)\~!"Jo-zbQl[*!KwSSGfl鳽G  )Mah6q"Uj.!Kobfa96BDE#gڬ6>48wg+WuLJ;~HZE AS6;.-k{9,PblEQ$ǿa޶Kfޣ}=* U[KTF<9[dk0.eP0kW ٮJ Oi75~,+l/ q`U<ֶKfgAFeY%iw6| ZvymWafiQH{ DD_+=u[%4S#ؘsuc[/q*RX5|{ d{%}oalupZ>xtøHtO_R 7@ 2>%"Ӹ{Y(꫶~p%7#7/ LE>um]i{83̯~/5BU) LPf:|2KƚNг_q:u>S;^y#} nHGMjr6"Dɘ #γ\l (c a+}ԮYZbMTNvm2G5#R,sB%*>/g>"/uSW)G IF[ï[%OELr!J2*q*vw78mt^>|~ I8x8zl=᜶@ {>gNǫg&gS36H(RH{Ym1p~Zpdž:IזȀegxryc0k"di϶HY?OOi-00(RHbbTg&v?@ySL.@O%=0vfݺN|$=>RLK]v^9"ty3̞eO(s Pz!J L~k2z͡v_WWHut~ona2Z|6|85}f7u0l->RD>1޻7Z&0"e2]!/Z&ʣxL6!:D%DQ">1twgiѺ.\"~!4(75L`01g+%ǖDgv36!) :&g܃:L0[-W͕dz`5JP4Dy|~i5O<Δ)Fsm !#կvyuCߘ^H >~ ^t懿3 uR,4a}yWOs'cG{SΪh{9>j3.["%EE˨>ÇӶKΫ z$\=B;_VO}Q Ϣ\8x_^qG=dҕtEtH YVy)C TRdCAZAt?Il=Q Q* ED)w[F/s9,h Qȵ%czyfsvAFfwP`=.&uAl:\(S9ꅲ^Yh ;\ru>S^y# } mwIDp|QCuSJƺD`l`Y{! Qj{h-*Rԛ#R= 2B*Yױe-wZ7rCcV>'%8 .eHHjԝ[Vl{OQHi.WpbTOЋk+b\?leVP5~%#= bB])mğRX$zG!y3CǪܸWxXRd\!cҷ5xeH<)Wǥoe<,=O!%Hw;- .h$I3Op/jU=˰m?&#@hSүJ˴.qO*6 TgUMD_6be8 #.`SҎ^˴ ,D>MZG@jCK!ùV 8h?#դ{ ;OK=,{*6 ɲA$p9cKR#$)I:Ϩ6%"xXfQF0ˠ;qao|sjo%\"8X< h D*9o^S~c rx [HB>^޿y/Wb8,X -`@t^ xSzc`”GrD'\_璋d,-S%W_X_far?o%/”J< jQ #>alޤ 9β.]fM#;_3z_'!G L'g\]zGHkNqs=ӛ~Tk[$aiB(Ed"6= Lb"¼?!o[$T]N#4)S#%+uW=ҍSPe,/k9FܤƜ=ofwom'ǷZABAc.ɷ3=w,vj9&<~7qwm _o;s-Ins]ݟz7^򇛈}8{.{ѾX#6V6.傏[VPB]Up?/= =o!YBHNz>Ɨ$-kލ̞d+GV1'/cʴ J\ 8%"ԧpxǛMdZ'~RJH|`/M| 8&H-InB8-Pmbr-"$dޔqx9٣M|)+(m;[DڼPmOeȴpbH@|SɴДu~XxKYuwmg#e E*%PqޓʴMFbRSPBGRx+E6wom'҂:G3ǛGd'{,-JwKtNևѮP$$$C)Gy;dg8:h.#>yv|k7_[n:R y$偶[7V+b)s`1ˋ(Pwe dI@[ T&F~U05owdF nYú]:}NmutEl<6a Yvc.O1S0;ݕGz̿U*6F9~`]OGf6lWH>KM f?Z1#Uȏ3X֭~H* dGG-:n1? /̿cbέ@[y&h~2}MS[Q*^1"A Ap @8+vfkjhBue#SG&dmfaaI[ :\bQkaaJH0ǂR.`]>\b./w 8a e*QD?gkm(Bm_=+L8ᕸVcȳ>:Q(3 ^@b&3rXWvhO< [Grg$Aɘp%K2QG-;h%3h3r1Ўԗb Ir͒~_I~ | ks% jчS7MlTu!.Xd'fO m`[G܎% IGǵLћZm7$.XM2}jbnHZ,x1F?16]&ڎ&TOKKd$ ~[*7I<iM4918ml"L]lfNZK r{~ -풃#=[̐i.X*#v)'߲PFtڟk"n&N* ,9bt'@xlŰC0մTu-~|fuun,B0pp8VޡYRo#Fe2(mYeP!ԩ][rn) |~"!w;h"Lwj|-Q)" NZG DD^?c0}(5q3g,jlB^2!*,rKl;1dERUyn(ȯ6iBOے!ۣ4*:!@1H ~p[z8+W4h:1&jQwN!Rr#)# ". ׎~ 2YC$8_jt3R" 1Ǔ`Վ9ڜSdqpSQy5qWw,QYa| VFnjq?,ERcPؤIЀD!Sqs׫VQG?U D,\˷3m/}(W'>઄!ݑ8Q[,K QyE#% kc/ =n* U܀ɞtCӱpضY~s/Wrik'0,2(9wP=|kM=Үy)WJ_YUwo٬aK,VNz>XG]Hu 8YTs"%yHӟWג*SئB EPD "9Vc7/46n^>ϧ=ٌmi@ s lF)|1j(ψ݋}1+6/J]RadI+H!!#LPݒ)Q;"x#: 搴DN9N<%j$ǟ~:J2#5ldQHIAT3J򊃂Or }n6KS -< CAvC QA:k4HY]p>3"QGc/ܹxMq3Ʃ$ w5<06P)SPxltd25=G{0cl|%XR<9 l|%Xs>J Ѻ#K_)gVPn>iF/9GߏYyXvu>SK^y#!} mCJPz0PnO6# }7 T\? y-7nfTMlAde65 C}o ^o=ά${)!l|bg:w^Lǣ^xXGm˻Y[ e$zB"]^q1̛USKZL ̣0"\I-X3ɸgj7d{[' Rܷ.W bRx^[VKP7T4 P4.k8 6U'cAbuަ]>¶ۈZ s"tՉ.BXqXid?s]iI1c `0cfko8P()*"Q6G9WNjW5E@sut~صl'!ZR{#12*D-B0)dB#3;3Uo؃&xe!P| аC [{PX#3TRlC_!5 Y G=]x`g{$6>bBR[>=$O<\I٨JYӈur"#头j!GDG$l ]b 6"bW8Hco[h^ճRq+L  2ֵS| rOM&Wiy.mC-Dfݐ훳aA[n' aQGN쒾,:"I"YslqcZs-zdTK?S Ѧ]U{ fHr4tWxg1dT Hsbe=ѷ^ٻڶ[=ކG6R=؎NȯCڏZI4܋J# J VIFƕٯ,Md2<al9Ǻ@\|<8(plu{h 3#܀J EeKeN6\?ˌV6q%sҘq ^@B -,lTr)JUxu4`2jLmqooG|{3#A !;~VHDh֚%Y= q4RY)ĝtNTj$"0lm,#a;+aYlD귶D"OĖ.M&Ô428!j9]bMB\{+rc#f6je,ędVIR$1D#6f8 b C ߜǸhHHeQ-=ՠG1,֟M>$Inr:#ز{ ಟIPdnzlUOJDP;Z4oK懢 /XvFrJ 6! 0 sYV!QQjuGIR$LcJ3[0@tiVPB$1:ÀEžEuM:WADc6U*͔%j0X9rAYʻË/ݥj>^G !STZwjRNz|VcJ'Q)EsJfurfcFrfb!&F":i/!: YHh)T>WJ~ș6V1;(/p@1e Q@#rBgD_jE'K k}X='Y!@gPBbvfqN. ! (tQOLs_Rѽ|t p3jb#b#Kth+ vݮ ?MV@m6KI뎕\*H ITXvЈ0Kqr#`\INp[-Bc9ߗ$P1sӎxm-J QΪϸP1gΙ5SdJns.ƺGy:u>S^y#-} m7J<0A+41Y)0ՐE{pD 1 0.t-+vW"HK+#QO% GUWV+2M({uM=,}In-ʛP4J׼oIn-ʛP4C;͞  5%V0*nCӯm?qBR-"S'PaՖCb6H2d \s.%7ScoYj|1iMЖCS/sC '5lL8(Jt.s8MCǑd>M60B(5ژm\7E.U~fJFdŲc`"WZ=Mmfwn|l4.3 [Mo}_y (fWRJ)2S2&''p,$@XMNsIހ[R37U +PNZaNas5dxDf s"l6%,7;΋LhtClwɮ^7n7\N= P$oq0Jr *MNzBR4N/YeΐQI.vGV酥E#*!>=>U-F2}ߤFI&TA0InXT>3c#YH$3R X{'^ZԳc^r0OM$,LLʠZ/:.ezjZV;RV= ~Œ0ފfG292ѺQ;\{%.{9F`u`2$(;;Ir`ZMSgc\K]ҏ~䦍>lJe;Lx_3PV﷋W]{c?/Geq枭<۹'nՌ=1lIuFP 25IVR] OSL8(D+LJQ2VƕI<`>"ЌBZ[-:L)ULվԪ9ԑSECd@rY~V* Rp4 .5YfwE. 2NMg7RK=!H )ҙNS6#BDI\W$P(< .!0kVZx-utrVXn6TY]pvX3!NoO INM<أˆH23;3"2c+*Ẕ~{KzKK WLl5fm@;CcZd 9Q%E 6G381ltit_hCoW]<_-wbW]UU/V֮ԙҤ2*NTtF) 2#3;^Q\ʐ%:(@Rѽ;nhEtWK!耇e_G8c١Ç) #Xi<{=٤PLԋPx^8S**8ШRB6F q"K0IJQ벉2I0ZDG|XMy;Z7gzGvgjo{u1vXٌCC2rZE^}dz<`鎭.tC.]CSrfM'iQ*NcnqͮSama3SOau}ռҩt֔&rc|_#"CSw.Qi4́!E8v4t4&^PEˈkP#[Q"""=<2/hӽr @Y>T;{-&px"ndcQw(Nz9a'|x8-Tuw"2Et.P0/u?*tMbi3QsG9*vPiġ0!f Z rB$ ;j۠,KLR5TauMx.W2d"F4-1IdR+Ȓ PG- :W&dU)ӽNV&X$OeGfTT[@YM F% %Av>]:U%vUJI48߂(%$tM_M-(g1Ђ\DsiIa9a<uy/e샾`n}EzS5#!i[8a)kno1\|-XDgyQH!R2ċOoiA'yds0InYRK @KF_uM}z['e@$ A, O*IT[D;Syzr] 5`nӟL++D.V?)"ҫH-OꀄRe$`HK("Zٍ(UTXkZB6ܞZBL*aDO΀Q/L7 C`=W׷aҔ ./+P#̀1 ghSq9B'D6*#7*كrBOXq"{ ֗8mtΚr&{uX`KJK/H "k }/z݊kչ̋b鋊`,l  . `W:Y3SfZx 8ڧ7I <{|_ T%@0jJHF<$FLI$Z+60}.RE[DHg~̏Y%W=HEa̩nJ %A P6(,²zRJf3׵]ٲWUcyu8PY<FK橂uca̧'9f.8ElL4ERvE{L*GSԊx)J]~-t3ˮጸ56YN(B-Ĩ0c (kwoiyZ$Yf5FQIx*M[[ӉɌ]*8Ѱ8c0~5.N)m'Camޙfk NCڽOVe@C" 8čI# _ (k? |v#)Za Ҟ nR$ ڨ4GiB*jt^f,W)ϓJ%Ɖh9N"ؘ`vۓ]7­KBra4L5D4;x.y~m L2ӺK ۏ88,Mg`a]{OxnULۚHN t^™iImRK($$8 L#jnA>l*BK@JIv<2!$@qլzʉR>@ezC[Ȣf@)@0,=mXq ќ"UQ}` Pq@#6 ;ai34 b臄vIc6yïDs fE|PhޓrS;ԏfg|CCԶ[e3Pnxz;Q>/K'<#m:}NmE56v^1)0E)S½\8Gb2 G  QTT= dt)BQl:[%U_!a+=~~u]$?->EZ\ s'.h\^,UN1SN}4&0`.Bqc>ɴsO"86X%֫p2sy6#ޯ(lKV# ( R95! ܬ|C{UXٚUQ7I1NѩEڈ%i.]'LZUJf (2(6# !b؀l͊ע3w;9et&PI+"TO 2^ ~6+)=NG&vT F'cvT vH~Wid-S*ㄸqyY 3s18Q(RXHmzލ7}n!y7@JڐG>e4H؉AG0Sd'[^{KPkJUiQQ1 $~7gwmt9H,'Yr(Z5"Md B0e,)K8կXrXLRwqŪU &Exϸ.(-cuJux"g$ v2JiSU>4Ru4^'YF&#ZNZxCB*GQn'y[UIx~Y]c'$%)p!b< ̀ +k2j\3734j4>7ɶIjBrQHژkPmyNo]^TkS6&TJc1srBy)ygLFrvW p: )QU v"G" T{>!4 Hp dzC%TY 0ɒB"bc" U;IOHCA !SsT[|y 7Z(cS`Po1H4p al" C0nGfڹĝȨM+P׶Ƥ{t= 7 d:Ҵʁ=,$Fͅh S#.("=bh 8,D{ͷ,+MjṳeP%Bň! yqg%̕{PB9^6_fE/{DR<+/Gy ؠ0QBaqd1C" 8oIJD>AVf3TFFs,#ԐOg߃BzB#~&Nn|s+KFTmIR!Da0-(2pr! L-kPR%]K,3Md,k]6oO&m!;ceFʲЋ`ٚOEK`q2L*P꧓JOƑ 虑g-(:=\i{Unbe:TRUT(Pr(a (!avB8ZhBDcS9{U^ė̻ சЅ(Pn\v`NTF98Ѩ@P %R9caGQ$BT'kRG" TxCp*>z(,H;џ*lU7G1'4"XL+MS3j򎩔V̰s1$@gڱHlC ֳp\U_Ow l(wPE&!rDq,co@]($IHa D1NG\qA3"@ExgՖlǍUUNW 1cVp[):Ή P1c Z/;xκp(s/MQHHi?N~so*/NYጲnN+*,+D6IȊCyB+~ %*BZ*T6GB-d bz^!a;/Z"8%'H<l0QYc4jKpbΓzE?aVX=M;FIM}={"ް +,Jud[zC#Rpt,D!֨] =*;cΐV` u/Xf"-vQZmW,G;WxQE CdPy9 "UK`Sޝ\7 k!F<jϙ l(]Kf!ERt98LLjvWDYp/&=&чd!"- c.fG@ CrU{Q}\b&0#Gs!ň=coH$^0Bi晰#Ds<E: /(t覹f!\'880f2B[8>Zu>S{+a䊋lciS!h@.Nq<C0l|VA2/T%%F5 va;@v mxj-zݿ42G m+SmSo7Zamxj-zݣuowvzS m+Sm۳=U^H)1O&[Fwȼ=XpGcÇkm&Fg"i%WW,VŎ}lXG56]|^ i*\u[+”@8\=j&a3:-fI‘褙lKT7c=ƶRF C:# FuLZH"17mb8VJcI*8m q${>IF61ㆿyaֶk1CpD#  pv05=Ealw;S>-"Wޱbp;1$7EgRg,B?,R^]wtmIܥ$FO*.Ibx<Xv!8W^OXHea1<`f"-Av=b,_<"[-8D6X6t$K ^) ssL(=V!Jp`apz(v-RǙ|;~pt_9 ^#uc0c)e>An`O;^aYlǗT<Mzz{ee"Q쏠OA{6^y";/F.Ny\ ۆb #p;.@UT%Cd+\?lh Ί`o_KLGY};c}.^lreᅣ{a[>lNw`]Ks< RCO`]K_J2ᅣA_Zy'ؖJI}*^hv"_pe8+vQU>h.7GZCx(8/K͈!< ZO%|"nKKiB#bǬ՗w}*4#L q_f;)ajˌ<1$ROEWF8b=?ѡ~Uƪx/ izj<1Ij킫LT}t//ܸ{2/.>ښky#/$_9@q.Éy% 0RN@_\%7# I9Og@VTA{]ZEȳ9`I7W=T=OdT{jNFqr ~/{ڭAȣ}"Y&3v 9tY&0ڋWpO_zg?=b~pX@{'#WQ̻y+@vEhbNmᅑ|(λ$CG{ٮ|qp3sz0y[=Ϫg Qyn<Vu“"j2kԭiRrBϳ^JsT?p]-gR9kx_Vَ2|#E-^@.]D `?Ҟfs; }`5wf?pYst=F l] 3.oxrcu 3_ȀU{~َE?Z@)Kj9awek9Vo8g33")yf=\uq[-/ 339?N~so׺"HZ;/>զ(va]~%mu8noj ~ >;E41Rduܮ ŏyJwI g9]]x1zHuᪿϭn]vK1Eaƫ%߰rTsrG)+R{H>ȗ}H-p_#31*? >DZ>|B}R +?US x?d!G<$r JZUa/1G|5J<5_SWG;'~ m(;>=ڛ]$ 5*ubǢ(Ras QqLM*R aOߌgZ.@ 5IEx3zV2;|0F=F7mEogR9w3G[v:ta*|(DP=Ls]Vz/JYǙ>59=ǖWֺp!=$ 8|Ҷ{9]%_"3 UAS:18^ ٮe=Ǜ|\]u[1NGYc͋|bna[1/L aǮَ9S9jPu-zg REP سb/Vygz~HX83a[5/|XDMI쀪 XzygWp$}| ?S9k[$A} mJ˙l`_ NZ@\/2 <0 ԑ?I1%dzE))= a<@vbèY 'N;6ro_#k|u;A>XQ:ug8+9` (W x\ Xzܖ0NEy~qYWIWg,OrXC!8>5W!#U,Uҝ}j~;?r,qڢL L:QN=ҡz=pFr G=@ޕT}jk{Xը ;^S;n7 Вo&Q_Y֤>kFz=۳2:,xMdP_k.B'=#-@DV>u8Nu3YbR{D2Qp6'+.pfe,NPhnu>d:\S+e~,3>I:;}ܺL;yB&]ag c֗7+Pv_o(,{x{.F%WmArd(QĜ@Qf}3o56(ASG'{M-骾dtZ\_ppǟB8xlM]I[1Ϥ= >wHg:k95o( q' ^v?Dggݍ]5ίF1J$1ϜَүB{9_IlTuOpCr)9`mꎺi8LflU~`D̈`25ֆAlW)3^\ix>Zu>S5 6qa[p<ONz9Ȅqb!< QYZ]$IZd7ْbDz /Hqnk6Sc3UN#GF0_({BH̰L)ܯA&vz/ȱM#2+-%4; ,"Vm9Jro&k&QMx~ 'rIzY7FZx~ _P[$D)YO騲p9{^M:I+(Hstgo(uyy|+,AFQNұm[83N=@>;g:נFx|^(Aٮ5S^Ptp%DClה NyA',9A㽝]Rk;:8d9M=ueYR})T9yA =\:H wy uc[5w*sy#Dž_cr1sk RQ^E:}Nm׺"H;/َ8A=5 6Pת.vu+盥΍tO$~Wve`zoy r:`4n􎨝'$jJnz`4^>'?DtJ p}goV AQHWT9& iq+`}wx}"Dy3N!e-dA-􎪝'&ZG1"%xq}wVU>4Oԑ ~Ixy|Be.%'"'SDzRPm _OkTw蜐LtakKշ{FTJzrD ̰ن/ݾTJp<~B44d i}wNaeDߟ#>Ajϣ 0!eD 1F }p|.zYq)W?D8e|<\9~JB',_lpoXuwk9mYq /Ddtp=wű'"S"pײD)'K@q\rH5C)T ˮY6BL!o T1TbG-IȄߦ["~Q>wí_ڋY?޽"fW`aap:-EsBtZ2^5rsyi>}=PǶ Djsb[PuB\ g)')>YRﭪxesЄfXj) 2--j+!@ qC0[>oңE1 XҪrޘmXs9{ EÍMRzͿIw6CjOYsܿYO(\B+}Gh3{Aի$Kἰ>Ţq r_"X~m/&Dz)Ee}\bpݐu侳hH G1 W:j\=lEđOE*\Ĉ}/ă鑝E"Gk}a|A5l~G/dxG!k7U+%ѐ!K-ĺ^E)6WT\^.;Ghb>;,:5'ieFVe /F@# Ÿv_e)xںx.Cd:nPCmUqrR?ђ #jdm6_^ e`b׺7ښ\1zg4Ar 쀍{׮Ԝ=~Xj0>F=njNE|q 'MWO]9]XT?J@i3>njj.WK#j}6V6UY!G"rz<>mvqԸIdRSx0V}Q jJ|ԸJqOl"Czǜ{SqҐr}5Kw-U@W Z-x'Y`9쀣k2,Uq ,:S}@:s_ QLj ݅]{ >Y!s睎#"<{ .ާ$D.]8-^fs;y8߈?#ٮWrg;Ag]tq2"9f<,$`9 u'+1EC 5p5/–s9ig36?N~sj{+a䆯{(.^"c,w *c᷵gcQ6PRfgF2 <~A͉pR78gx5Ka X! p#L uaۗwuNV"{5\@K q`77xקI gҘGMxB5$KGϩYNwEDԨ1OSw{V I"RUT@66x𹸄 В;Kee)JNn!2DLW7AʾչMJ+PmyOYzunn!>ˡiaEX~ɏ[+!Q+ss #Mzg LPwUÑ,/s 8jV> '5_JeU;~rf9^bb5\{S6ZՖ!D܃#Bg֪<'3ANP] ?{jy5ϱ #^1);[IrU8]tgu͑ G,BDAKfNYS "22+Ԟ䱉f;~A\`csx>;g =xj.)S.H|CjE#8-FEDJtQx\~S/?8MS=8tQgмCvuG'tB8^볶{33D],>r?*=PXtc}bOp[wWΘtczaJԀ1$<5s);>cQц~ 7AjW;K RQ^N2Ë1ue_;PYkyqնs"*SLEJ03 ,θG0$r]\ ώ/Lp^y;ޘz^rAJU.gjfs9n+F:}NmYtEl<6v^12wJcBuQa KG>Pl׼oC5XT1=2>4d]%c _惏[a ={UƬAn<4~_Z|IJ>hGahDLU~ UƬBX 4ۆuRߞ9H #VF/HXse!otD ϔak ˣÇ$WcݍMD5iV} WB9`.χ:~{$Dx ajAw0gjˈ.SLꬹJ TqCUD ~s$rFy}n<}W!Kd[5ՙj}7Wƻ9(01PgՃϢwD ʪ]*^{g[mQo޻Ft1)ǢCbϭ. ?޻"j"5L>YXy-t븂R|mV=|ajN>Fg;;-080?2Ot@Ґb|ojy8N|LTφX|pj.=G{XY`i*8j.u>Sڳ^y!lcagڮxC6[ 6nwxB q3? ozsbJLjա/^5l|%x^.cHMd j ]_=}#!0%}[r,0v@-v^"\KC?Lp o3Ū\=4gԣhgpbbP5!(Se.u;FH̯*?p!_6YypdgQ.% 8~ꬣ#?#R=W(HjH`=ŗV#/#$Bz| W} 8#$rjD09'f8o FH)AkCi?Edb- ij*b! g诼1`dmIoߛ@auP 6;Ũ8~Ho^>jϢeamEǺAsTa7T:AǧĈUg)L;9Pu>[aUi 9Fb]Ν8~8T|]x!Q0(y#=oYu3")qሀ8x-벜ffs0 u>Sڳ^y!lc`zi"(v[ %a 1_G֠PˇlmjVe9b/ 6E^o5 = {Xkt][+tsMtפ{j|yAMzGH%{%=dZ7g>3q J+6*3ahݜsqJbve+a$a Z*}S]0L$$Ġə V`77iVq쥼5vÔ$Ix%>VhRSC S!JT?=+!NU}0_u[IFR?C/"SΕTƠRC맅{L̯) #Pnݨ}L]OXV[NzI8Pyd鬶z^" <Njjyʦk1jqQv >pj}_V3gyw[8ejyw810\=. (u00s#@-Mǖs)p)h@7 NC~T[ǦRGjn:uii'R{I:?v}_jNHJ;^c罇lzG-i@m^5K 21x;g:3TAFfg3+ mө7:Ot՚DV _Cge8W9 FMhak3 _bQ^yYo/(zzZ_pg%j% Z_pD|",zۆ -n/@1G@]LNM:g !c\hGPZ\ QxD^fBQ;:XFZ&gK(./H( p ~FVQ`d ~(Kl5,E '#C`}dg2csX=_y(ʢlOh#8l#EXH d)X.G/ܧHB)GS@}qżH}-+VZ( ^ / ~V)T121' ]a%㘁|/(tKUZzN0L12,~%"e-FUШ(5# jV{bȼ9?jn,b/$cXO?jkY;9yu9sދx 4/Qq]o#M4sۚzԜThon`M0|C_v5X`s&r ԜrYf=bagj.n ?J ֠TMזy,zVe:6-{uN^jRGqtmX?DL$u?( =j߸sucEL\bY},gSc}q&AOҒ"V%C]q_ߝ Lb=7CeCXlNv*RN{"4U1*%pvNH+Caq:NKxS$Ĭ<8s^U K5b=\6q~3DLϔaK1z吧ȿIWW9V(3om5N;ߔe>E]ӾF>Qf*+Tں߿;Gu} TEX~!U\A^w#|󏹇.V[|_re#߳j|2_}X\OAy]@ڢ,r P'|xZ-W|140MyRq^cUjϢ(3ajkzxj@Ґj1^7%188o[ @-IǺu~"Xbt~8Tufg|O>aj.;{14cړ*S12"g-YڃG>5)Tak!B YkϮEpOOG`=_K)QěV + }t| ?S9fCWxsȉk-lpm10A:3 U ʝ)s |GLbECkI`ЏZL}[#TU1WߢoTs ;zn-Zko4%hEJ+D F rs9ޅ+jl+%Rn.m $T6(4'A +McbĪ˼Pҗ+A.)-;`7M)UR,CLwÕSSC.1.3M [2T&ST9;jUv2 ;i"(vUX2n2?bH,Z9q3%giJVWPK/=Kf6 Nlୄ՘" YG՜}vHԆlZ8A4j$WR.ҕN"1gFDq xd#Xaev %~"Pk+ ` W̌e)dm֝QmA( ^+ ]'x2ίql\:Pƶ2B+ @$&=-pqqFrio) y(ACQIJ9*XsyGjMӧ)厠4$t- CĐ@늂b!$ʝ91#MjX,hS)zKqAf,2T%dT)kL2I*u&cDU;%T`F%?pi͊DI.ewLG#D+T[$i TD8sq%0b=`@0\*jD@@1;*j7d_G_HO];JSKKڛtL[-L"-eLDdq"E6FdJz ,Dr}L7/"`RX9BFHa3)R ,beEG"椓W;(uhz2*M?sLYx-եl Ks"&Ag~I1DL{-t[("-B;0`4ݔiIs] +YR:um!ԸJ2CVp˳Jydښ]Q*|Kr+6KJ),tؕ; s"Jn=*eKhuKD%d%iYe`FiCe#C8ףpgz]J[e7 BlA4H)ZZ`1YH_2Fu%*}1ab LFqXq(d1IoOE]ksS+(&»tTʾBysOgd2yRLlT& op ]BaĹx5Tv[QAط.*h7wB\өh 8ECʡwMN9]=~J*Le+AwMzS JK<ѧ8f@bv&6YjjXD7+KEqWN\MK SKq؂Cf%}:%`Bt4w$R)=wӨ<7]6M%NpsÐqʉ:t>1T1쾈Qً0}S&" ""(J :G*RM!tmsї%@$]>̵HT;&~qNWҐ,x7-S\܎)2q=b+C) u'0tz,Ceҙ,qR)RJT.s9N ֚E$k6ӟo0.rLgckUTrr 'i !PT:dl<{ws^}5#Bt0iu1Ғi},hܢSnOe .Ib1&@[""LT tn b>J9*(8)iu4/W#ht rBF̎<4C{5S:#/ 5g}eRʲ"ѫTK;ٲYP'R(j@*!Sm)Rh"?T|J]Di7VthA} {uxA;LyeNTZi:mW o™%6H~98-P$ZImP$ӢPTUBz#:W^4`gWetuR[{0S F~{^9I1:3IMLH"NdR9' ,8)WN\&ݝW׫U"T&zH*w@n St~o͵ U)H@#8ʌq ":n!:&A_G5_w,݊HCsU;T 71VLS۽>M+a,gJsQ\ Rf+f"(IH g䳦E!IgN?V:[wDthʟ/IHSc. KB[WnnX5NX΢-!r%#qK4P_2JItyF-扰qQ(kUG"S)nS:Pԛr(s*5JT cm3w2&Ң[ҍ)/|d9}x3LҲ$l%&sL3Q%:uFnM|irOd|Rr}DmkQ-PrY% eFUx!+A6!&"``XV`X6?N~sj{+a䆯ӻ/68l~e1<3ޥe+wGhW^k vc繶|/(߭i_zV1K-|L:?nM=L%4ЄLQyzQXf@~dž@i, e#2!/lO;^$3B/kC!7?J|G?ҲZM i"<(ajn9~hL \0 SqJTHO _S jn9Kޒ^|v_kGjTN60ӓ7)<$ gam, 8#A H]`!@W+澣W Q+Au$SRfJ7LFd5+X10G%pűTZ%$$iQr(/ӵ5j:,`XV`XV`X6?N~sj{+a䆯Cqp n w^cַDVcTrioih}e>V]oԗvxk뼬AmpenE1,5!Y}o'p*D/Uޭo 7կ pZ7uxJ4˔%'45I:#31$Ow4ˬq;iqQ_=rVeNĨ ' ,yI%tJz QpE`_z˦ޚw|%,b g4: OAG;彵+zS--03 i*8R":QJ5-`XV`XV`XV>u>Sڳ^y!lcw7C)> MkQec;_ {,gzGy_B#*}ǯwᨾX.Un\/2_}m_,1|%]11u sw7W{,gzGy[BG^yss5Ww,gzG.b ꯞ6=|_ EprvwtxJ_nzd}s(G:C?wȼv.Y]10G^orG?{yCת= Ʈ:\h:]GkmÎ;5l#q?GOrs>F{X&zcakE=YhTQ߉sv`Fwqz,}\Cx+&zbۇ^ V]w+tx3]u\=qþGpyvȭ[J:`<3,)K/3:6J $ V ))€&1:[;"n-Scp֠LU.{EN+[dg"[BqA;@1n=|+]vȭ[.`۵~En_=W`sݫ+tzVr 6_[b\j{ܮ WVحv. J'efe9O.&ľCi H g"U BcydB0S .{UYg9>FggvlP|S$!ڟI'30BP),bc8 ˘6_[b\j{ܮ WVحv1;PGCS+ bM..yvbFѰ52=@kw-hz X0Tw/2PLy.JLbh k}duа? %Ejm]1945pZSa"tۋU4 %4{K|=/iIG.d\ ѵ&wjycEL,W*{Y(0H\f Z5r2ǜDL:i&⥵3BJV3C #\kmn>k$SI3.{lE<\*ی4q3}Whh$ i#QOR3#VFUTXef8fZeIeXugI$3T%).4 &ʒ{M%tɣ]GSj'RԱƳ>WSd9̭]f)+U*6\RDħVfT>%.S1V t*-ECf! ôĺB#\J뤗#ϭTD2n|dgESrk:)hzT"M%wtTSܬ{2Jۣ-xk9UKo*t %YQ7 Msr~K%i["H)K޴)*f89a$0?!m8(j%'qC1h}n2hLHWK&S:JJyЙTp\4dc3h6b\c,Bb PĖk|I-2+%Ķ pL+d)&`qٲ [$%DDH m.2&WiJfz*LJbt[$0+ Yӏ!q cgy/&X6`XV`?!7߂&jn`V %v?ZvJfCWx ?W/6Ӌ*$q*Y$Tb5L@E 9*qsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX5L@Ea%XqsSX.ZJ &&bv<Խ I@S)NHJIf¤ՉS crU5ug.kV99UzBOSB65 ,T#4 #(1!["""")T]333Oٔ핺:nT˨L~X]5S.ve1e`vOٔ핀۳U The Apache™ XML Graphics Project <?xml version <!DOCTYPE http://xmlgraphics.apache.org/ batik-1.9.orig/documentation-sources/resources/images/group-logo-dark.png0000644000175000017500000004576713063003371026305 0ustar mans0954mans0954PNG  IHDR3Hf cHRMz&u0`:pQ<gAMA|QsRGBbKGD pHYs+ IDATx}Uss MsQTP1ba:QQ0̘0 " $9ߜӿϹ 83:ΛVݮnY{)a5F1D i9 ?~lD$P*dШ4ˡӨ]b%gjw Ehlbgbl}?E(]g8O bLԃ]P6!~bjeJ$[Qb*98 irPx Aj謱fFi_* Z:Xh3p^Lr2$v8D 찻as 8eR0Ћ"6)Be`c۰B!±uNߧAqX : 6n?V1[ ?b 92w]8Jp8=>C3'!ˠ%%Z 6H# "/ep<ۜm _zL**r(RHx'Jcq(!g4v _ۯo[o`9j@K<%0ay/)?6P#8_ ][0rXTBvZͅ6.bS㍜MN1IEJ\7c&[ā%0dee(_<gKgW^3@$Py\?'5 )qxſҵ ѵLv3r cwYy!)oœb$?gڗ:_Vѱ6D1 1&iRZf/\fn\}ӝX<,Fi./e` 9H>q@0ߋ^'kndMᅬ*Mk#dm@Q[ h<cedehI1+T*9!S+MWL@ژd~OR#|]gKIl]`sNԍQjIJHs ?=^3>Gb7ߠ_~[6+6>3q1 ʄ WW?G}GkucG @B}/݈C䚉65Clp#xH%e#{%o>3OA3ѫG.Zm(*FՎ5DZuZL? f6%Hpc>_WX#Mf 6 + % mmYĢnTZ6BIg!8JK"` TkJ+o.@qq_( ]8q{%_= v;I Zɷ 0ظn5]WߎQN,CBkZ cnǎCn^0P67-f76?%=/pNsb`ˠp,y cw8? 䶢0ԣIPTd jqע.T67|}چ6L8k`9CrZ% Cʼn~)܂(󿢿8 \1#:>Hf>N 6u.2g=pGANNjuYGƠ3: tF<n z ?ǘNd!0Yb2S{ҥK9?5k֠7tp-7݊m- QM^>R5D+<0𗖭1ֵm…࠭]9b V}4'`q@OoȃwO!Jdˌ3qÃh ~Ztyvc{Ndd$=nۍ^iXl!A{vÃ/`2~OOan(|:[R2,%R =_-|,$PfQG%Y Hiԏ{D?daK/#Fs/܈֮B~A!J KG_Ǟ1R9z<.ԩ:pv\"!Ɂ8†iBz\]BOmI )iQs'^ جۃ)0*:1tZS 2HmGqal@2n.!yE}QZZhIukVd險ˎ 2N|WO2h3!''SFC1K<" }Ψ4I!P 7},z3:4Н!R.}X=%˹ٜt؜JǼw-`TWWr>3 r$fp05YR'ሶqfebbh%"9j586j! T,~6Sp*[ k~%)#n RFpKr2/Q!:b'=e[mw9GEdpGt8#$=۬6\^&=u։_86 *^|R>E-RˏR:<@ ?p1bF:xK!\n~XyXv {=TUU:XNB tdnAQ"4H$&%$iti] *)Y;jjAIANNJdKо6\,vߔ6NO<~_J{[܄'zhBt]0քء kcxC.'mEYAgZs"_l4= -VZ:<^QzƒSU/<_MfVA,@P:k f69^ib/U!).ϐręHO2dxAf2,F-Oܟc@{ZEbb"F/u_(H1j3jSlr Q㈍Bl2y{*p,rtJ wZbq@FІ$ aXhCQ:~cAӏ{ H'R;I =m+mqm 9,R8eQ.AJA1ĹyE㱪< D1_`LYjg?q O3OD"RX@j& -d^Xdсi)_+*F82Pt'/bx216ib"nL< jGZT hC=1@TĀզcOQ3ЉHz;dl'Fq4qmj"31[dm"bEۡKK l]9JMPߒ϶և&f7ӧebϏt&+2& %63ad6A^L /C-4N$yj!NPsƓ"z_Nb#` RюT'5xq` oQ\M ЩiDP%ev;e2!5* c br. 61_r/f# tw2}FV 9or2oo8(OW tջg^N}V&^n]st@ E0~oKW1H~k))♡D*dTb_sI$a4'-]lNJo"NNC"~ m=$NpR! DNet2$#%A F ͆Ёh=6<ƣd01m'DUKFجE ; XEn # x$C ֶ,[ ]L5  1΄_LFTU؏Y3hz \xp54cֳs6[)gVsXΎ%Y T>o hn8,75Go^5z (5 Pk5[OS]%fziɩxWQ,C[n.g͚O^^Tvիh7FgMÂW>eD;Ip}<.F<}su3RERT$Ö;]#c(FH#"fbluLĭyTDENٌ@k#Rm՗ m^HĸjϙY7(P֠"R2v{d@zbt_2)Bj"J 2SRBs`\6)@c,vzO܈J`J!'s_1+FJͭܯ4گ'.<w>*vW&É25'w~T\W=3tL2a7'o٘f1hdѣ44T}M KR, )(=CϞuq3~<zC]%HLʀ.nǬ`xGj*޽yC[7 '/ IHLMC8+Rq3_|k8Mp#ѓJ2.ej^u!>0sLر?mHnގvbؑ~N\2>0&hP42;sJ aqp6wJ4DV%%hy4R֨ WOy,ToۃW1yB#"-Mb/{"^d<ĶyB9<|3z$Y*%jjQ1 >^5vq|_61v rǎBfu>vTRq0!h9>W#RF~trr2~^Ą83.DjR] ^zdk[+=? B}J>o[Ǻ$cm࢞xѧ0 c/-ݕ2SKq y o} k>@Վ~3F ~1zۿJkNK# -:zo}2?[?_8Oc8\Kk[ ʉh2ih`Ƙs'ISoF\0rZPҳ* _I^NFGV 94'6`˻[ѻOG'y9NH |٧}`tMhQF92j"jKoCUUx__n%yd/˷ l1YR7Wrxh~$ޏs3A?!mۉ5z\bBŎ5o/¹AI>'EȍÂL8\m0_w-^+\wĤ>>C݄"W:&= ġ t:->_4*SD vڍ/ʈ 6އKPz8 $a :54j%wX~غK&74  Lw;RZ{bRt˻_E!)΀ފC{ jhˏu%r9W^xκ{|L|⃼?⮽op4U2Pz< }a`HcQN\}m87 ` lǘQ#H  e#v&Q  4筀}wc2'@Q]K>e.~yS󍫟@G{Z9tF|7ءq'҃ hǹB!ObIM5"!up{ !v"}p+J> yo5|ֺp]}1bsp*CΘ ɃՏ0v 11mhq/FVnd/PX*VLOmd<(3QSۀ|H2땋t{yGr؉YY_B%eUF]UD @A^H,~V >B47PPpzBNx/NĪ[^!Ye[!Qjßt779.=ٹoW߁L#y9XH :/n!4yw,!qHNφLNuٍ[8/ ?%#PYz:ElL6d $!lĔ|)1X oƽ9$m&]5C׊̖Ec, +ݦU%P paHR8$pQ&'^`%>c XcG @3KZħ&dv}8eO$q +43YL:!#^fNf>n⥸$R b}n<Ub%Y9v̾A^OɄ3'*Ǿ1?B"`ŊgVwKb]Ԁr^8HܶRcܽr~Bm֑C_\y P9n_=*dHn,%A@$c!"Kȁ%1 IDAT8d JO g.\<>G <ȯщ$x#.x NHCD RqEYy=i  C5@IiF+;(l>|Vd9yc"{||Zje?e{s1}eӭ<6cmH <ָXO5|ձԂ?p*oJy\m!tS+۰*qɤO\2jѲ~W\1F0ad0l7zeA#,BȚ8!2Ki\J`a) ^TGNj? e=(bd$2j$H2J⳵(\tXtmd.-B(6:V{C9j?=n7j**AnqФQY.!8}܇?%_ f©JfY5 fkb?J$ED64ѣ]r2Lp@q 1o8 wA{`-Oܝ^M 'C9~Ɣx\vtcFc5ܳ!iO=ORQ1 *'z `&vz ܍Z,wXm A8jwv&ol:A\}'4y%|#{"O.%#<9kj.́yGF7m٨m Yqiim]TЂf>W q 2s{Zē=|yn=fgzI{ld?4m_?85"{b쟉KN]jwR{0^ ȚX+џJIذ|O6m 8׎g8V_ #ƞ4)Qd1L lK1zLnkF1bt`Z]&AuK \oěl-^!&dhJ&ByhQ{:fP[&_S1ax]ky#-f"SW}'a%$gwQ ak--퐥@M2n`\$۬8>V$ \\>w˕y7m>~4O.<+014{wFE]]oT%dǣlM^׿<l޶_Gk)O:a$:OLFħJچ7;۞=_'Ak#:xCjCm\2=#nG",k/B07>&ߪ\B瑏?!vGtr i Ck@;BZGbAaa!Nc}\?EIv[H3 DڑA~_PVdh7C"Spw?QUʐD8 g$aĘ&΄$w)>ދQ B&4DJh$Yz$`t+&{Ұn}(mtĄvԏ5ГZX]] 1œAq(U6 ˯UTT9.Oj^JO|h)Ԙsimm]ؐpf*?ߏtc{O5r#۟!jx^TVՂN17p?`;NX$t 9ı5$֏}[~ ձ!`FHMVx"_J́aF>0|> >pAO0Bdzȷ!@K @/N1ՆbAdI{EYxo,Sڇ@ $H< qQ`$sY4OhF&2pS 5؄-ІHC:jEHA#]h#Å4&w}Rr`a?I5V^kbޭM`XՌ1c̓8f"F %/5Lvoyn0^ȂV#/"*ap.I ':Åq6Tv9r#mYi )ԑ 66[t{=çH!E!!d-x%&uĺ\֠* - Q I8)B1epHmC!}|‚.Ͽ2hi#1&;HX V?ga`s0Ɔ;V3O7aAXwHl.铽y'| +`KS7aW]1~[;dP;Ոv eĀ ft0"wm1=lB&ݸ1hT«F,09r LwǙTV<]\*aFG28TXE}l6jP7Hq"i5Pjܕں9lV>סA@#cF2OlÎ&[9ٛf4A'ʨ(N )E Ė"l}X5YcQ.qС J pئ::ښ}x˫v훈 | ;o5'GDN J kЎ[18oŠ8>J 6g/ |0`kdw;|̀XJFۚ~ĒR_ d5s*zg\! ΰ`L~V*OM72X9wغOq,Fޞp9}]4#yVVj" WmwZ7)svLIP&/Y#'AYnK&hnD{ m>.92/eʀ2- n\aaWxvȎ9EVC~P˼%,4rde_c%eyG|yF$8K -́ME*~Y@AeABVo?M. k˰& iGNh,IYvb[!TYLT p.pډxTx)@eQ2;={} ARW^eF0%~F Y3JYFva-c* #ÂՊ5,-nOB& HÅ0Q?]kS,)΄'1nx )ѲL5>/wc@chW7p`kF ꍹ.ÕS([fRakgp` ny1v wƌSMR/F\?{ j 9G]@5'A!Z'jЄ\@cDng:IЋdbU1@kd锞u(±PϪc7{^Ve0ܗ0E/2OxtE#&,C*(<+T DĊGv5Yk|=֡T'A12L)HA$˪tC!"M`y/q' ԭH^HH=jV qk,/,’꼸*X#}eQU#F?sV|=.=ɍ Ccs}R!aVnma\?3@}ZC=:$94 (i6 $wǦsF'7 b=JzWqlVKٯ.=|r/c懫8HYJ\>y,vnz2ޢm~.dX^:X@dТM~!bTXU^l+t|H>VȢ;NNkp d:BEmB+Ed$|!]PŪ: ˡ9Pj;Z!Hd9RV;G-M740\Q60ʝƗ6HP*Jz sw!s_|Q2&=>Y](>]]Iih>_?~9 zi_"d@>\fJ:8V^vX9fs{ jlh>;n\Ig;Pȑ |"|Mֹ#`aKfĖ5Uc3b4g_邸=i+%ʈ(q B 7@N\Q.OSU^/$_Wæx:#bu#" r &ck.HJGr߸NSO`2̂X@h3FdR @ 517ꀇ|Ψ(=~'[OEۙEު"A!HM &hbHy%r|!&EER*0>D'=! 1bL"nAX^Cҹ{ 9j@_Hjxs6>Z QU/9J;Qvt%ڈ$-oe2uۙys|fLĆ|d/蹾@)7|gqeߜh3Gey_c(^p9/#bQ*V !^jX~fױs.\ab/a?jrh x~Id`=:^@DЅQS na+# X/#/Yɣ i M"SJooFTIK Ҫ(àaJ(@"ZG.hRW׋F2 IqvXw46>7l!+!od21E- R3RѳR!Oq<2GO_Un& ;5c ˋt+!WzT5% 0qDcc]+p]]*Wԝ/zd/`ǀBrt[x.k+:j↱fHyxJ+>h% \a74rs,b$*FP;b=:<' pu _5:0Ӫ1pU%8"֘e 9_Մ[H菥3JҎp_(h16 Oл 73ތ*a|3"N gsc tV\n7_0CgԛEƮh jRmۋx *tzC'nAr(jH.yz;R azXxlV+ yxPI䦛xGq$ *R1~wJQRI؅C& {{G:{@ipp'7BXNJtYb#Tyycx4xb|b&r  p䕜FE1/mj+Y4>?Y!jbDVHbIK3 OlU@Eߏ"‰$ U ?-0-@I Y+H1_h@@|(X %S A WXA+h%M5ҎA@SЃ$ VA8D :ht7e0`cr` ~U%ȇ;Ӝzzڧ[ʊB F&`}HJ@kK|6 Lw:0~|}y!Rȟ`=CQ#mvXEIi  Uhzhu^[r*5C =؆~r`hl[b#Znw wUq9N+egzglts6+W7!{ lavޤGRoնb-YgI1b|#I*2pp{s=]yGO*0J,KQ~^1x=PJb-!* 08[cp]R*?"D#PD;29LzX.nYQO8@`b"+ K*yt>#qu,5u/ ܐ3bdUā^FEtFtdY B vnl@H!iH>Jf$!58|$b҄ccc: |QwPõ:Mia3437220q0Oucйa5!{X>P@/SHbJFP#ι!>j?-Q0'90/ӠA Х|))ohE?m-&r01$KPhjBZl`EFK5"$`)gi#5v xH\DB /H@C0z,0c%CGg ɘaGmm54ȏ$2ӵ/- ܕaCIR6+lI acC̩9!_קI+;}bɪFiR#b`m%8L;D3OMax寕8T)0Ubvd"U7-K#Ae׫ 6IDATp?7F2)+)ؘ:flptlY?vue6*#̓?kasT6 iœv=0j8n2  xt{#)١ƣ W9d76*c0{S-?DG^paE/pe0,aBatS3Rx6jg[tXU c90:_B) Aٳ|(Uxl_6ٛìN|I&Bv߈Bi4+Lؾ mke҂ʇHΉ㵫5Q04OXEp,rs,tF~,K *Gcȯh“uby8V~W%c/dC@؝1sVPM\T5TReij#y(d BVh$&_!{h,l')j٪0^{В]E:'PCku >QD~Xρ ԞubĈA6p)ERَⰌ*1"@'m%YCoe2jmbY 5$cGB_oF1uĐZ̖7`H zJ`Ј1EukxyUPچ%/1äxX҆t)fHã@[?&0ٗf`̅ A='kQ] i8Vܙ 0t<)J}k1v?^8kX x[Kv^L;o$^CK;*y|o6l?RZjGVj*wVu̩?MO ~|1Y -ғ@ ʅ񆁑ozﻀyy08 E01`2F_{ d7DH;j$c}P-CmG~~5xĀaf("ോeXҊ D -h .M6(6# s-hM%,YdB Qj C" <ׁQ((NPcN7VurtgH A-;۰*Mfe8'G'3|D αc%F|y*j#4)cgoˑ/IF:a'+ :0q r) 8R^K77^m?VKyՅgzIb*eL0P0ۺg'kp%80l>B8\Mmg->5gҵN;oX/6n&j.Z| 'ebzq@Ke:^ Cδub!MRiV,djCug}es|]z}4y UЕj#S!?!ՕБeVcON 0 h 0Š, "SUpGt'6{SE:yq8[#+m:bl}rfF."5tMIz%F% .JL\<zgpAA"_{D$J|G)Vi}XQ[5DU,֋jX/GA/_AREAT˖Q8gxӜ)W^<HIB] ICCm- 2KWAo|2\F#uQHe<m1@@í/Vi9{ TzS_SNVZ޷Tt'%GSi+84λQ:ϋ8vFHa 8A47͕QF\=P2kBa<Q*pJ \;YspBo| T;%KU; 7C$gl(E8zJ@)]H 4_VceKuwPM!"@ %$Erԭ-WBlךw"r.; IUMƪ. zOQ}$~' x3YeV@l[RT-a]m@Y(*Zy4H=[6 u`9?wT UՍvN =ݫ{vOoJ:'𢟔F͂%KT%: NC`1hA"͚xre@G)b$)>ɣUٔNBAot;6xȆ%tUFr5c9J镭PMdjRj@sؔN,)c}RZҠ2)Y;': w6 a=JGbVITk3y+sTRIX[r2W37\1.^M%NlڦKMa i@H &Ћ`lH~#k+44^s.9 "hxxӛ6mr`>B D00o<-Yȁx- ^@ Y K"2qXORPWSW֖l3p{zA/TRy68J]Ӓv=vĩ{hr gp~Mo2WnY8]VAfr\;߀Nm}eg~ɤs`,.\շ 2b@gm/L.14'@ήv똕 ^[M<'[, nsmѥq s3]3_?1Mk69p- O0t?ˣ]gw/^4#,C#Z2h"iщwF%UG,+n9Ty{ WGh=/ؾ9ψ[~i$?4S_~vhi =/Lyѻ%תUS^abHv vٌ._B^3Ҷ|7iX;ᎅ۟{|ǹlaWH?wKhv'lZ+^fIU*v{vɗ<*z,;sJgJ.m}n7qʖ|cfߕ6;/MR׋̾kc9i'꫔Wot/Ӈ˲얛26r@\2ƣ+?7 ux +yvP|_;>mw֫<u~ԊW?@Я΃+?V N^i?])wCo < p`߇X7OꦵW@iJy!9GBzeF~uyʟ mi&U_ [^}ӷw}vmڪL9a_,LgR^oݷq fǛifO?;͛7mdЇqoZf K baw].X|π ^6{o ./}:~hr7b66Dф% Ĵ1 bB}#bϭx;m^`@:DSĄ ZߟȬ^AN4hTYepD 7y@ 2+p2s" Y3kԦm}O̚7B;13+7^AcbbC 2k{x!K@ jFt@fEfE DU#qekc1BAz~Be٦3t4x:5+]xbaYVWkMzБ#G?o={ȠT fnȑ#Fl=C"igN3@ P{ LMپQTBN"J&lxU NuXjZ =gG`d_2(e@ԑ۷o߾}:zP5(4b,+ D)E8 F#G">f}8M?; mG | jV-ڨQt%*5tKOOO=zc7%Y)P \Åَ:uפOnҜ;v֭[eWo8{|j͛7mڄ++ Wx_jݠPkuViw2YwE#hV̪زe$!>#/]0N0vX'~pW4 fά@ -8?+@ YQ"k}x'5u " "jV-0 #dV@4Fo0@ N;裏@ڨ |6&Y{91FP೉@4I8E5+ M5''{^޵gE4{f}'dݒ[(d& E=kLaYu#ϸKNyy7Ĭ>x >i$Xn׭&MtVY(WPPp2le~QP?9vz8fdj?ŋ_111;w;fxO>"ylÇ˺8pЧY+/<[_Rd9&Ҫ }uM4Ide0%FtU5,>>'ؑ'|2...??bAAM7,>grYomڴ2q#Jx֭[[,&g;,++ w:.Kma2ϝ;Kk^ Ki4j蒒]كaL<< lι6Pw;f>j` +CCC?ou0TB .DEEf9YT].Láḙ,+լ2˲<χUTT\p]vH!jZmQ[@6ѣ<{mB@K雗)"""̚q)zݞJӮMdjpF-J]K&%*U\A>Rz*R x\h7f]|Yݗ1!_w-2ȲAbVBHhhf(-- reff:ul6,{9)oZ4 t:m6[ii)¬T8\gMf˿*&<44SN_'@szݷ &$$"k ׶m[f^^!+ ****H],+/کSK9M*(?s\yE9 L 1M6m:ro~u fw(KJZ;~y%G>~kg?>i5rYTA:\#!NmS}P.]j۶?5)d[&E<o\t; 4)ЪgyyyAլ2 8숈~`p aA.eڳKמYWuqU^%V_W;}`E- ݻu[at,jL)eӸP(c4qZJJKKh5,,bYܑifWl=)VW$1I** 6e*̇B=5TO jV9޵ǕT̋Oq6f5e$ @bx(?gj\~i 3oݴ:NgkNv0>"""m֩SLjp0hdfLgqq2=>\)ˊ,LJJ]4AڸTbʨhlpńeeYa:::ZR— ]v=}lbJ%DB !.ξ*rp 8]\Қ(+ $ou?<\- 96mYEZwֵcGJƍ ͵3(b骪>s԰#k.VQQQy>))I۷R jgJ&AV„(X3k.]&VUUVVBB Irt:ۘPnwcG…r-&N+gf_.6c'`1^7Y쳈_~y5>4v̸/XOԷ+HWZBu(Jٳ?a.RRR2b8.99Yz 獶) l6*2 TVVlXi2'͇Y`ZVktt4qoV by.=-(0fұeY'37zэsN曭TO}};a˝w+ȣR\~4r}U'F3jh^VV&ݔj; KJJ 2  J H'iZs\Vf CpX,6n0YeON0yY7'^T |k=Rܩ$\Y滤Qw'h7?ȁxYN?\>qcܸqQQQBiӦ7HP6Z͏@ Y[Dp M 1lذaÆ5`ǐPIBsE ,t^DĬxYسw_jhC h;:)gECf}{󌡆^{edVDU" Dݟ !&8fpY8-t~Vqdxfyȑ#R*bp@4Of5`1k߾}eYqY&^V^u!eY5ÇtŕxC Ԭ3+!ju0M̼3f=dY,&R^V‹f3+) -4feT \/;Y.D~(pm9R>%vJnfWT}$sǑl M#\Ct8jgvAX͌𬫦UR-SwF3;7Ҫڛ]dS[mHUztG謬qMt+5Nr?COUC^AhYws1KEU:׹[aBxɵWW'Gms"xQ87tA3&Z tqU?Ujm`@9( mc;|MtRhЙ4Ú-S']E*Ec֑#FiӦpY&MIeYGE>!qMo?;Diʴ+Olцgo/;v\=t@V#6M:oL.b]i׎/`21pň yr斟/t9J_YP4pXQÞȮ8Uq2"#b=v,q4 m7nPZV؈S[VkJ[4otaݠy=S!@ʋb9%7.YQm+>]F^,صmv38UK#|}4ԞaRʝ␪Bqcvݺu^߿S_IBRrZw{{6QKR *j;JLԼ,MS 2JhS籌v@W:JR/ :ȁԾP>5\~^mgY0UՎ'&'XD)#k@eՊ ?޽z'''}'&5LfÇƎ͒^)4‡d4eotНh4 M R5/^9i>4Nwl޼yӦMxQz[<.X̐:rcE&^]㬮q;+y3FMfk'8~W.w:#G[{Y^^˯y]TJL=jKg`TO,]Ѵ<&$$w_;vr ˁbbk.kPŸswɽM&jmgޭ[.]^q,x<;qEEE}`뺟" dXjdVhQFA& "2+^3E QO̺f͚&~:"|Cӿ iii2 {2p{/"PXt)^ A @  UvNOqٽFܫºn_pWEe9H[cnE!<<64tA .q^ECKȬxN62%FF#]zTVXSN֚ijmpD?;ݟ'Bޝ2Q*dmVJZ *iJa&EiVy !65_@4‰IƂJQ*,WE27Sit8C#Zl5+Ѳx2~ @Geځ Yu% ʹCqxqXhg`V}v̊h6j[K*`c^Y\A݂vڅY7㏊ BkIW+xE jT\"b̈́`Ur}9`xm`\ǬT{W`m J^vb]F VMnʪAʤ$05!͂Y=U`BZߙUArWZV]jp-'65!Fy{K)ϐVdTD#4:uԨRµ8 #̓Y8 "fyHmʪk5u 1ZY y+?&0ڰ"J"R_)JWM֎z%TQX #MY1xV`H+x5j Vu!tt-D֬JAc}!gVNOv_Ry=JlVh*-5؈xEhF KҪׇfEg 83)ZONU{-3BD}&0 DH*\+Pq2@4ufo1!,ʩ§N*#$e\͆OqU$*'v:^;A;YUMkNhDRhF ?M !BT`Ve&^U*]"L${)Qj7u:u9d-72oSݐ KdktF,TLee\ck=$ VIW]D/qLg@4f>׊ |)݋4jJ{Y1Xd}hDpM<e?-2-)qVvW!TbPſ7ș <פ[BC#]!a+2Ƌ[i\'X Y?Z5s^jtUFJεJBedVAJ^@  $La:eP|dQ )f?plnL$vsOU?s-)ݚ<[ +Ѹ5B V&ڸQS0|U3m6d2u)X;>A@6pkU<Ϳk01$^i bUԡVvE fL5G?"bXM+Y5SOzIʨ"^5Tt*5.*VlhWa@'u;3iii†C!Tm:fzyOYF1+H{:VNYG6"hVSYVV]FpK VټyMʠfuP|70Z?/5oL4LL$$e#^uFʅg4ݥ;rPHDcaVq%8 )S"f%LL^2W&FSPjeX-Me$WQiVC^}YZ_'"d kQk= UaLJS/#"Ya#~L޹ըT-!+*O.^ŇHdk25J˰,FwIk3#DA1jB")J y`MJ3*~2U6ԪYeѮ^10@4f%YZ_!-U8,7Xݚ(SL]R@4!~LT ɸ$BZMS2*s*JnMZ Tj,ŹӬOŏɛx?CZUD"ALڄ*4h|UmUۏBӄ@4lԏ &&ҊhJaPF#גxU#TiLvkgỤJHD}3TcRSH+2+_ͪSj*C3Ԫ?sYh\׬j`= }H& TaҊ̊YYuW#Z۸~_zof5B1q8AlߦQNjst06kF2˰ϰӯe}D@F>I6DrqS'~ SNN+iF(:k0 YxAN0\c"^1IZ#kY6MhԠ2 Sm*,V?U[S. ^'8ip)D+e\q:t|ЁI?|7ޏ[ ?"W_-8q\ttLxxWLꫥ߼3gGx־W^yfM>}…x!7X闤.-Yв*,y iE |U,M/ '55Emu&2 0kly9"B~׏?~IM rs? Iׯʕf,˺' ߿O?$@ [VbvV[gE͊Y LBjjJ\ʠt;b*E+NXرv!ԩgd$׋aL\3I8?ۧ~{…C:to X"mVf3?@xfμG,)-//غu,N޴i{챪*ݞ:r0Jޒi&B@Y)I: Ϊ3kpoKK%ك% k-/=5~bBBȪUZSv<ϹbΝ;?y^!!B**tٳ&MŬnQOAsî0nݺ%#iVPGzPlsFtƝ٘&/zL$%fHﱯȸBЫYAܫ*@A`d8:'8 "/Hƛ"w@XxTD\(ʶjZjU|7E"yX kxLLOVTR̩8Nf%*Ys%X*݆^!Rꥒ8e5I&i7%Erg)e*S*wZu`xHHҫbՓR@&7YWu?LR(#&"#(Z[ 3%:]9:a;zWطĉת( ;?r`'56oJ$ɢU ZFd\%7S3iz%"-Zs( naI @ iE4Y^ed)%Vp&-oGl5dXSR. KK3YXmZ+mU)X*,M*/ NjF+ i53_5+G+$ ~5\7/oWA~shfī%|p(Z)*U%FC.>-:w<5d9Z1ɅȻaaI;ޘreqъL=(l-(-.*'Qj_ZA{V8qT>fLdVTKy8/Q2gEX}PJ5C T#P=[V3jaB5zgG|<0Kb2+I:rJt JqPBkժ(7=y*j Btd^U919+\U }gWV #Z:p4FFX S2R,"U5l)gVY9'?J#>7׆6!"Zf՛A4g9U"XC*SƗP= (*'+i tʨW)XypE\0j a'4*EREDȜTSF_=rՑ;Za/auqՠA +YAG`[YIZ6$Wwa ~ +L0Ԭ ;uêuclߕIC?ӝTS*VՇ]bn:r:Q(i%LW3+֬Ҥb^i^SZaŐxHŦd1w4^)arr#A#ῴDYGcZyËE?Y~Ae:_BK8Pjf7ԓڗѐPh6<4C^10%ZQ7ޝt㒺c0E 6JLՔT}R@k4iU\7NmGw 5Gag%} U6[/뼐<=qVMWam ۀ+F"Zf&WD(= UM)B龞U)IKO*TmQP_51*AZZeU37]+ӲTUJ ZZ'@4k;_ωh J6[uB{^ 246Q->ԤP-fhR$K ֔)WݚUmؐ\^yTNS *'QeY #ZfNK1Ȫ.RtPs8qVIaK))M:S55̬6_Pq)ţʉ2T9pв([ 2E0tOh:"mA-|H^Ay~~nj6g2F <Ђay]/AWq] ZzFMzؔ$|!|֊C$&#ʈӸW'qVғPU3tUFԜ<'Ǜت{#pUA8Yur3qBUpl1@0#owAj,k}eyUm`碣͕jjM&ox#W$l0{5=f*z^1zeYj{p1l@'u;3iii†;é՛4SFR\vs,rށ?ɧJw!'w-[۷d mӧMaVkr^9ZkWUzU٥vGlUiS*,Ыyr![y_tiZZ^n՚͛7oڴ 4ԬYU8U9 viY(T*6Nxߘut1b#F7.ggvaQ7EGHJ)Xx|tNu.a݃y^ŭjcjZV.Ri#hF$fx~%{%T=$8hMI 2%kVyy%va+)()HHաuRHsHtҩW)Be"#hF,hs?s$ R*!U5g%m 9chba=*"7w{eo7u8.ԪlScUo3bY `+ #mJMBJ^eÀWcUY.@Y,]0-V#Tt{iZs,:hz"E玠& ųz(BW[=2 İaك)1037NU&`$YMU*2nORzMп[nios߿Ng_lJR_F2ePd򒈟Pʲ>@p#et0w8+rUD,l5 lԅY7㏊U2 mXglofbyw9kjOG-)|lUbJ=lvǹs]r7)8;{KR8uSp] Jl$j hF4OfS3 E⏊0ͻ%v޲)&wIfd6322dNζızV5&? w wZ,oݨfR c 2`+D%U: Gb&`VxOa_jV Nզ[sc˺*jepHAE [%ۢjVٔ`d0azkY  iZΈΞ> ᒒ߇픛[s_Uvϋ4m$o粲6%'OHIi߿GNN#۹s^#]e.}iVơ rp9Dsլz9UMP_QTԜg4*Ȭ-WB*Sp Qw>p+/oWJ$ԪVٳqBSػq_wz_:Sxrlk޼]|">~hݺm=zqf@֭v/TD*hFͪ6RV'WTZZB7D B$WH.]̱&v*,,?NJJ0&Ԫ"B٩S|{lp±XVT`8شi/<C /^wݻ8l԰7݊ hF4ҩT4D5P*z;vLW^x7x»B(Sגk9nذ%S=ULZjU }t|~Fઌwa l~yяW8ѣg6q ItjV.2+iVגol\ŏ_GW|~_F#o={?~iPlƹ<52!е8XeYeegcbz)ŨW*r'Ofի ̛w;< sU,Bx`kyp`? QzD* +9iV9U<YҬ/8qLc,|MƮ.mYo={HxTVKb!~mHFDep\ybb8cYr LO YWW_Ugѯߣl&3{In[Iη,۱˶o5̼$>IL#Z"]CЕ ќ5.N 58xCR͚D!W* #b6,}m_laab} EmUR!MՔTdofU!Zpx8#HUa\.!$;B`aH"aU7$EP{CI&uNB玈#Re <Е ѴIEE55kP_KsSRͺ>]f2c;B"RvtUY^jmR)YƸU5(BygVZf"y0%鬩 ifYbT(QEC6I)hdNό@4afJ1b5VPT֬~|X|DŽh.Wvּ/(H ,gT!x.=)e@*2 /UZAD@X׳2`S 7וgd|)kA(Z!/o&YMޕ0R [%wW|k0۳lt-kԦdZ\T;XBHybJ =[ϛRe6[  IU }eoXU*GАH B' lla'H\tr@=i~Iyf`ȵ\.d lqVQ1۳gyS;u?>ʔ׿tFӣGK/ޭ[ɓY22.;Ganqn;{6kqszLUW=dǎѕs_r}fEVv5N'^ҥ? 7wi3JVLhbϩ>P~o7vBB,QQWS7-m 5fT;ëNVCtGF%oK'k 2_oN[\yLu4nwX!qdJHH䉇uժ>}q͚#G>MKw,\uz+=e /ȫ>4~?U2rV^uUڵ4\WɜO;f9Ghgժ+ŵڴe6~eK;. ݋ eCA@6 **nŁ *2l  [{ҖIq˓%Mrygƌ;e˧tQc9**LI%T9FFՠwL 4*RO+)r;sZs0;kee:]Wղ }r Y;w mla IhRr1뫯x_}uRnnIHG{W^Wn9qh/$?Rrr|qqO 0+WPTT1wG⋟,]ك=詧ٽFs#2tTT& U'zG҆7XDV"vcNjCDЃٛ 3V#%XWUUŦFq03r#lU8&N\$-3 ӫדR›n'(( ?.] IDATfᆗD&axAa_/i†?ðc%쌏Bpݟ˖.J3tTT&v"v%ꩫibz[0ld7WaĉГǰ,˲l#=cJ)NN+]W׈KđGM҆t`UlIRYNFasKΪ!\Eaa*_xIumTQԩІ}|~ ɷs Z: 8@QtBIIMz G+ӗ#*5Y=@Sma[GaZڮ4Ǫ;=:NN-^FkS!*΄5OVi)o R "ɵI,H;WF!a%ڮ`e Hr8 ^TVVapVG?K'+!zt0W<سGDySW;ʊle+KsXmd" ;.۝𕎳B4C5Sl{8\mpH3||,?`ǑͲb:j"PI+$ 2XI&_AV &=LЧ&E@uzɲ [~ ?yM8C'yy99E<O)>99LJ:E)**8deYÀk׾ۿ ڭO #G nΝʭ[?<.5q˚8௿jy9 5$Ŀ?S's: :s !dĈ!7~o@@mrrˮ]G<֭_`\ܕ|`ت+= q׉B^75haszVή=ܟ@vΔ)S7fVT0Um]E ͧF,rB!q&BÆgXcNY7'`a8xVa+Ic:eY!mD\L=R6Xc!P Xv,òᄩ+|](uz VeyTVf{Yº ~˖T\ƈ+yJߪաc CV:p:=rOXX =ԫ\z)t86$Ru wD^&+/w+ B)S+֤mܸToaUHdY8BlĜBtgx8r,ˊ3H`OzdYFB8 ŭX x"Ѥ`IʛM_As ;eG1 4TŜ6iڲync̘}kINo}4=?0!zcs^vZ<`SCBrF\v`IIEGq*ThU GKa}L6-jV.ydUla5t(24@5Ǒmu !`Y<ϊ(UFB8 @`IđW2k= a*E/42:ieYV\uDV ;Lz`0hV]˓iuz|q _*h tqleeݎ>h-,a"": K.1U; &TV> ~r#KQns"pUa%2edGθZW^U 뒘jQ47UMw˗uV:׸Qw8 _geeu~g1b=ۺo|^RR2y/~dY ,kqZ MUDոi% }o'QܐvlAE9%~ Jn^K^`\yFY%-TRL%'XkV.=dmao[a Ə<++筇eK(ߖ-V+òXH䕑]m_CoVUQ3*G1c=Ȣs8>cc|0f"sUP,a4\e>d2OT,JIMbºܧFmanh!,ܿfkbb|nnb0!uM;eMZRIbrW¢n\zɃIzE溗s]ѵ(~ks>vL(D`\VcpSکz-Y*2鏛+pt-莶M ݰLe= :<..=:3g*fp_cRNNNbBɇNHiRq)`w].˱ɯQV@,dsK|=s+õ˪r'=G9=՚[WX^10.8[aWms_ Yڿ m"{_*m/嗟LMͲLjjߕN q?M-t7<ַKi鞂GP>@!P_N}pa] pb5Q.![aTJ#.@vx1m +cV.jo0x!wӃ)o^qEoF9}߷s5B8mݺ 78 yrLѣb=' cb+%& 0Ø8?*I>Zة=lXPZr==pCvM3e6DgA֦j>hJux"(簻 ލ * Jkm ph^Q߾f+BWW۶m׶mě,wz H#‹Lx7(2ZZXd G/_3u"gϢ+"00-"_N3:ve9 94#tIaS:AF3ƃpn%+)Y5+p4m%cPґۆvQ"NDC`V:o8eYBxAqON:&jD4%I1؃vM#-g쬯?7ϯ}O&S4+oX](Gݥss˄{F /5(o޴)XǑ{ #)0YIFER{h+t׭J_EaإY]|X/wY0,AMIp=UHF f9qH|54VaV7áwl܅ Զ-`fo{*W̙z~.%Ns +;] JWcڶ5kudjX,eWy NH:((nSQVPQV"/mu,=FhBQ~c%YuhSAUI \! 1\kUYZ-օ8+rBXZrAS.9՚njxh<]dccO54u_+@[R‡{[RS͡X,&Ez[MͩcN;mde;ֵy¨.q+J1tziU 3Rk$*Hrė+˚XZ;1|ȍBGU9V1Zsm&jh4Xh+* YSpp|Uq=ϛt/00n]*Tm9&Gqq ϛ,Ꙕ*)ն.]aTW|P% A[ *=QcVa])\HXWRĭƒ9*}keaYeoPs8{g9Mf0y=j̟>6vZ4X˚ r_n9% $l&\=jZV;y2+Ξ=ڷaaTᨊsXONiMڪV#qW4f%:Q\&+y*ɲDwX σ z &:v&ԗT֡9Xp{U&w#zUpb \y֤"$Mi鮳g[Hnn2p4:qL, BjX,4ZV㴏2{{#$SJD7Yc*=bGR:Ad1_CVwMv MO@V6DS|58QdYX%u^_]xO2Bal74!O?{'))Ogb;hPߦM8DZUUuv[dðH[Fg]]CECqQQ݄4`A;Bfs˙CC۳tHf d3ujz?yGvذ^|qe3).gm*$+2 bKJ~7~{LbNWUʈ'0>2r@e?fs<99?Ǐ%w:]џ\q6ߐ___xoll TI$DPee{srozD[ݎ jU"$K UB jEM_F76:jԈnҲep`DZZ,OY11[V@PUo#oXE'l޼'o!ֶm}+Aoqjf<˲r Uݸ[*`㱝?_q&jZ`͌zRCtt;)F`{Z j]d*96.nΝsKFmZvW|ؑIPSy0Y,uZuծ9{0!V*)M+kw`fsccc}}}CCl[IgȊ|ᘬ#+N[bɒ7?0v=ӦM0 gKg۶텴F!hged,X>}LvmvzU*W;ϠtbTga2gX8lۯeY<,Xl֭SR}v) 1qWig[w@rΌ>Zխ[+2~+Z 첇]T&$sqSΆa-``a&OͲ>CyR_f=Ǚ1}27<8a[,l~eaǎF[#nzB2 s;v ^%ϱ®8bU8݊V]߲eF&TQ):S'Ԗ/3|/< o=S]}'Dcuukp0oXljLr{M@!Y=ڻۦM˂j:t7ohmKm1B[@ 11w!/|L{.A p) <&yg5 Đr^{ò ,kƲg^"& He<S҆%b]eYɇFVͲVF\6+zV# ^ʢiHJV <`<  j{L#|[ VkCmm_ Z;ˀ+ 0fSZJ#Yf}d-jv DNQ?>o O(;vXVc}G ?h͖-V)/!Ukj$49[yLP } U "h.7n1!pD$*h,J(z!mqD".'^ub“TZZuTC0+*BZ;XmZ.9Oc?ojllFJo2((N"X:jlPVx%JMz\zH* $(l5bGV9NDLt?U%(uёid G~$"А$xYRl?DΪa[Ys88'Y|\'pA-Eh)+,E yeV*EX Ae}LJ'hGV'qןܥXx]<$U-IgXga6GVUU'tΪ)ɤ~ ;grwꂮHrV4[HwwC{=Go_[O/UדZPSj\ZRqɚPa6i'fOe%ۢE ⬴CX {memњJ[uϟrjs»ѻ%GPIUcjgEa a&MI p{F5Ec߲Y*_ S奨uyW>%~:}.tk6\m5LIeevpp"!VaϙΝ;%5Q-;њ}yy--L#+BߢM`U65R@޽.ꊆ:g-5̰2/h013T4\T|)A1 Ek2,3 :Mn cZLk?QK`C:W[7&lp06͔o43lylݺG 0O'&޸ݻ_rFƫ{C6&ҥ3oժzn0LVևIIQ e[!-DQ^2LPa*Ma7)pƭ^au9mThɉB֟U;=؃ac8m>hy;l)Zn7kl)ZY+rK:u]IL'RUղ$UN|Jh0kw#ØȽԴN GzxPrTC $..tٲ;֮= ,,pyw?߷ TN0oO裿6o5WL:yLaVT!lEЗ+i/rRxƂeL#h*N^P|_"x{QY>-Ξ  /e}bԱ26_ ћ.|N+OherRi0m ovc 7zڡC'AMbiE8gJJLJ8pQ-A5"99fKR9jC!"C0YݗhVdՆU4_shzFPwo9{TUWh€KmccUeA>q|%U:wM1ʳg㢣s$DF\}}Q1IG;t( 7I5†]c2wvtsL".RQPU >a5T|]&D ?ŕڥ[]5&Ɇ]Ы,WINrĕuul Bnpcc>X}Jkvp-l6[z:oU!X>,yʾπr0=!lEX=f<&x<씑u^tM{1X{p{a߾uo}rI!Й'ih?u>>e";x]vk=gY_B2-9(ɤ-v=z<^UʜTjKaV(6쿈ªKwVջe9RUR.i_TUlRe@8Po0^wOڊj2 UA!!;<Ԫv<}WǗT]jԗLɮӗM;U؎X! #CذYu/6 ݺN]`{Y\Vqw~ל9_NjㅻLa.i7 hF-:vtG6 7w9|J`F[=OUQ"!䚤*f-)a2~D X5#+\EO͐-EdE3\躥9[zkXX]tx|}CƏm۱tSy+(qYa`F֎f2f@ !e<_ d mߢEǸ+Z@3z ^ VAIm^I(1 _ߋ]|RzQ)B?:unqͣS%Xb zU˖ݛevY?lC,ekYy+CIU.+!$lIH)vԗl*UqZ.IaMTFNRb 6_aFVDi>:|9XV?.רS NS+V|2 I]RR&_K'**bsH" n&i| JJ(vPͩs4XI!JmN4焦I$եC%pR $@Rc%1PAz}DZChŃHfn5fqjvê<:\+^7ֳ(Xj^n\~֭=ַemGzttB ! eq*o:_"m/Ji!EkC(-(TsJ&2lvyPHO[myJ7V7Ub͂/ X`Soϑ]X~EDa]Kp>1}pM sKBm:OeQ9MۿL\_%ĤLDDwB@jk(TS+OklHT&Jm{x.xq=O @oق3$P p\pz8pzKڐ˚$8a-uRL]BHkN80U|̵M\q 30 ؃]O8[a]{7> 30K/$TEWn@| 30 3?`f P%cYtWLs50 3̰ 4,+,B5rpuCI VM'CɅVinyWܫ}Ď[PǦd!9*\˥xx:K8tG+^FƱٗu~^>$oR3r:6w߲RDZIqR܈,.8^ ֱܞadGfoex [1  ƖcT]q;m`%ep|*/R{XZnhhI`DZ,+˲ {zaB#X[4-T* CClaĩ !T;"{Jmmcd$Ekhhhhh:Yf"t_2˞{Ⱥ5@ha ؈DJ0 Q7\Q4`@lC1\Um "+N /fGdBha/Yp/}N@se1­#F+<؋muuu˗d2 Sk8aBKG >jhagU! h(@(JDa;@,!Wt; tЋ:8-҃ cF;bGgB{߅# HJrә|7e+Ο?V&?7XX]5x%&^9A>`{~3U=*~Ť;yfʉM\3x >n8s:6#I_>^:Ρc63@˾7m~jN߄G^|6޻ =?Z4g{*_~~~g1W}KH7EK?n>:|u (%"$vgJlĦC g"c)?2$рMLK}B إZ.6` !8i0x׵" kڿhkkkD;|’C,۝Rbۡ|jZs[Y~O~5y]?Ho~ܽk1sdWLSIm.=N>Oszd>PcحC;G:\c9Ǽ?9'3urOmu/F\X 4y[6}ӧNhpzjEx ?/ 7 e]uey_]RSE'@%kぢVrI[R ClJ1)$_:kJP:l (5$j°QrJbK-{/8Y;5(rV!ed2QU&!IW!j{>_}OVu^;:45& M^~9G|r"mbA_2 _L{c~8ONY}.JZ]V8@z7^v?yv1+qO&h dфIӨv_x9}-"7?ryd!q[/+Oy]7%d6Ec+9@NYB6`*Z&&Ǝ9ca "RWlJk"NqWZSJe9=w\ ]r̝֬6L&,HT *%K \h0dlƘsLvj? AjvöoBS̬zm9kG3~Kĩoz=zM_0QÀS˾~b8gʩ[V>t52;}6#eh|ٗw{: >v7pÚ.x>8=st礜! OLǖD,?䓝q,/.<7ݼnpd] eT!6NHP[ yolm;t b['їG`-wl0fb,[sڝi62߱ːXl)̇E\~|NOW}^C~{x8xP{۲`篶 O=2m3wM{m_v(ʸ{E'CQ8E{ylgMG#}Q׽8釓RX͂5L|ܬ@cN.HQ٧Y=?q@v{u>mN/zzbKfip: OO@k?:9[oy Vޚ%u?m)vJg~ľXo3ΛbYÙ J-ڴ?ueCpX(;'c`'i+}nᡓ~_#{LN9^m *WkRQɯlU^S:8 w->~ h3b3m wn!@˟$,ItHTԖ PyriYm ""[BAy۩oHy8,$\3A!c5?@6Nh隈5mZt 7]dt/J|ug, IDAT}f*&^vgmMe@D.m(t1"yvdž<|:7D~eY?1ӁAkE+^yin/F6r \˻؁4by~mCgfFtL1?]3׵K+m纥 ~%uLW߹ce%] WC: s e&;w'~udw0;+v@9/=]Cԅ)wߴ[}Q'omۖ矋;fIs]p^9c*?Y=F?qDx&o ޻jC8 ~?Y@dשtbeC ~ky1O {n\;'=T!??4f Lϭӛv;3_;MC3+\Fڏ!cM~)DxG&~g'ot6XGE8u kW5@)Ew拣@vzf`0s}y Q.ЭpZ1DpWiq ,i\˗)2(9V"m 6}{k33PvE]wnDDjkyv([[;8gT벌nakr[?s>9/̬>']f_%Vz px_Aa7N>yϧdFuXW2vБh$$u*)*M'.8bD]I%>bWF%ę2B%t)LB.z`UL*tU7Ub:Edd,IM `6 ,%)-p$*˓:{̮ŶMR얻_m;ah9>Ɏތ?2!?xpO=XHO }SqP8p_1cQ )RvnP$DlɑVK)k/Ǚ#M `ۖ,r˒ &]P&6sY׋w rePpLI:ؾ|~0@[/0@;\:!L K3erWa((wFVۘ^腲̬wvxša)Iz|dKY'0OVo"As~T/[*k'B_JW;Hڲ~#Y43bJA8!ቀznpđv_AJnaj2_Ŭ %ZM`Sos X  Ҝv^WloƴKo J1("]w 9攫ah RUZ, L{"<d&̙/^g={/^xL=A7E.mmn{}ٳe>{ C6ƺM@S,-|;cN<L1֜,-@_=رi`l٧$uk'o:L3CLi`]1dٖ n[]g3;U !>bOێ|Ⱎ9šcZI6Ɲ/rVncw8#ޚs0.5۷i);\/ @cb$:I|c v{IP3l^4/ l56RQgY=&>GHH&2k,,3ɒst4t_KkzFDMf9~@1vϑGJtO009@֑&c$MS~oWOM#s>1'%7D8~%@:T)bqPygoΈŞ"!C3 WC$؃]`r,!HI ';n頇nPd'e]0%C6yU) =l?9op ~^r*˻XV?~qɃ; }1/=? {l߶w|e~_GznMZXqכG9ۿٗ:7oGmQwU227l0xco0lAt;ޗg0\oMzwty 6JZ|W~W3ݹŘ 뒿 G^Ggïq27o!ɯ 2gVŝݟ|-<`lR_,SQ~"X|-|3/~;?˟9 еI7HJ׾ ֕VDRE[ Ls''Lr7Zw7HGv̢5̀x)P/魂ו@řSk+0#gKR!=S%j&"9hc}JN2b I8#a$&)NJwaIL2B1W*kWl,1L*a]"k+MRퟦZիƒ!Mȟ2sT"#CP֑39{OH߲oV졜*}μy#P'}s#csoI;-s8u+3-7 Np}A{|;/y58xL?yW{h^Ev~2߁McϽ mY00?;~H)uyNeG[vR?n zɜC E~= iQjJ=*M%YAҮv{-wX]xbmuw8/_q?TeXd^JcX$`ӆzzF'߽x _ǹ>4T|_zZ6/\Hcx"mkgn:ؑ~;ҶU<~/H8`ޜ ķ2H Y `2}gr9u"B{)CHY1͖hY"RE=Tlu!GQc(",0tBBw uߔh8r5rjuzVΜUʝ].rz"EEo˟ea24swHɸ0,Ǐݾ?$g,.pv)xe]椃gX;C23.%o8!'κ $Ow"cƌY}}}$(pVO86sUo6|~ș' rFX 30.^cJ9/N/[2R \z[-aBmTB(׳Ye|8fi'qz҂[JbZ Úۼ_m*^ &`ET!S 3̰\oG&}$E:t_+R{_uXH]b9,8II=¢>q̋rVy2t?Хȯ\uƏ0 Ԍh40o a`o\V 30.9{I59gY'dafؿk[$,,}SѦOm"f-fu_Zjҕ;2q߼ ViWٵ)Ҷ|{ށ$yLmYMU+9$Hg.5,Bs{V,Vx sʼx"yPKP-=3M8x- @I$Wߴpƫ:`iJ[kв$&l:rKotf􃩢xGl8)jLf%:F|{[n(5~n7lHg9ND}NZ/ϊB7}@YLUlY(k.SB UV0Uج@5F-֩&3\MUj۫;.'#TPf6H}ڛ>G v'k;h*5L,եrhFfG3ミ9'TIZ=$ǖi ,A9i vbJ$`!2(f4UU!/ڤB{Mnjm~QfaS`bn뷿E-lsfMᵙ7.F4u G)"a$(^Y19MZ\Кܫ|M.O\OZ]{+z~,ws^e,tyWu<u *VV|ۀ`*m }V>*ca*+!Ohl[,i+׶ &ONT~cەt(CK彷 m;NT]e Q@2ne[uvZ]̩4SG.n7)=X%5Hk:Hp43;`,4E˶I mҒRe"؅O\vYv.o9q55mvɈL{ޘ dڕ*]^F6/>P PbT91V>ߴ%)ds?hGcS{خƮzÊ{JXܱ>^>*wXDžSTF|{]j6r}?e mg!'@`˔Ք: ; @Yip N*$sY>j=&2jZ^:~`ڬ.xTV0Xج@W*+5Xav <(f U`jUJs0yN1 vU y2*#ZRmRVLiҒ\pu޼yhwf-DSCD[*ͷƼy14x*LUPVWBsb˦2UapCBmV -f .uPVJYUW-)LN`&.دH&EjC &Nf Yo`mV!%@9]su5[!@F: UV{H_U6+]Y6+P kkJ#, @YmV)P 0P k(fe٬r+jFX@nBb6Z)lVX@1jQS ]MjrkȼyWv[;_,=$kj%:uP <Mr6HCsF^yN9>6yI6]Ix^%S|:F(^-Zhrmկ~we˖Z\~/˝;wݻСCǎ;qӧ&&& H1gD0% ؉&e{sA7yHUqJ }3ϝ`9_^S,$yaWP nfopn}m+w%ײ6smM|'r4(r/uhN'9%.u͚iCoUl4S@g޼y6~w?wm4T:Armyjܷ֧716o{~…?Ѥa*Sd{o%7\ يU \r%jVfl6g̘~k4FZVJyFe]JO'/XYA{(x@ox`+k7~xA/@8%5 ڋh[pu]Ƿo_9z?#Bբ\Uf[%)kzԦZš)rto(>kMS}abmHYV}vL0P曡Z,kc>S؋v|-;솎%s"&s zj{Yf޽{M]YL0O%TzBeժП`93VtVS(VD5]SMFUgjV2M׺ 3 fiȞ={}={FIԮ&;U54U/BkkY2G+,UF~5cp;mV{r$%Ȑs=s፜SgKnR/JOԮ]^f;ڷoUP:C4j#xg!cڕ$Zn*V;hJmUu[ͼJ{x%hړD>UvJPOuCzt2߄JQT8̜>P+leŗ`L'UP5ij^e-fu/$ŸIR?<13j5ݫ;vJgܛ(O#X/,F{}=c9qmd㎧ooQSvn#:N'eGYy-Tq΄q^^=.Ly_邥x[)-`)͊+tҴ?zXC^{\,MQ6 yٱzI=xS;~]dKu/~t9T P@g^K7{~' AKĐ˟C12i}jZ͚a6vL6hQ.DS2<}A.6\~4ocx=~.k9b={)R!T%mݚ]D~.(mԮEA]$F eV\;ŏ]fP׺S q:}O\^DZ("?û˗4yҎ:%jgM5)+k>EQ m֑wn1aw.Y$\JPS=(jITk j3yM_zqG)Y]J玲Zl_Vѭ^TuU%*w7]5C}fa Pn6C`D}vSc?}=LJz-s-y{fv|```BiΝxDY ZzVիժ͈~Ό3L}&h4 N)T#*mb}GatjmT֦l+77i:β˳u%.g丹Z~\|˕{.8scn/_Rp``.;qD^WFQ*~%T־>jnZaGyܼG*LVZS0iHkyOi6gi ^2]v/k(bFxwQ\bCK{(i%Ǜ~h?~ŋ ьfY՚f GX+J__-|ɚdAv+xx%LOoyŪ,e:,V{B޹vGjX O[ϑX>88n۶mlf0viƌT.տjWV$%k.z{.o6T}oMCv?Ggs'nzl6PJ߯MXuq%AJ;AɿЋu,|66`Xwy S/;x ?~|k֬)WFmXF-QPY^Hiy.^*}`3 siYUN }B9ǽ6slH-cetJ };9.c{Qb!q6RK9J?!x-5u?~y"ҲaÆ~]zׯwo}<O,[L;[6v.Zd,x*eBs/O?j3E(/V,І׮XBz*1 'ذ*lVh&@lPR5NӼ0Mg8k7=}ZXa#l<дN'뎜y Yȭr)8k֬};/Y/"pW8~QʪQVIV-U?M*}(r ';xooGtڵk Vh*`ȵ3Mue>gnM8[UKlG*t".rǔ2:zS yzFO>r۶mc1=ac[9-Om\l:_=z~ __7ot'ni/ /tY"dir:gڃ׮Ceâ)[>/.O{) x ~i>VUͬfTj_ڬTJR~_irþ4-Z4|)"Lki(y!mh2 Us˸=]It,A`8q߳v:#hI7w tgUu/u J9e5k-Yr~¯~5D2 A]N&퇎mSpZm;ി^Fhvo+LD[/5kUdW+ZY?Ƙy9E)Y-92Ύ}\73OJK.-?K9VMOi􌊺;J;do:d|||ܷ\*HϜ!tr ]U <#(+ԧ+ eeU>Ίf@iζ0cWg?{Q.3΃ 㬖pV;(ou)Yxի^wIt1ys/RY#!Xt=X"ŕt^{_YI穳W AUA+]Ma\WQSOz )bٯjwg=s/v]ʌwtK;'.w_X,mfJ;Ȭ]؟هN:Z0‰4˷eyb`^T+_ʗW3W]u檫FjǮzǯzkƯzF˨|^Fgՠng+uʌ3O\oUX1*W꠨cln(]7CZSMtWJ*<*$Xѽ(%Ы~c/E/zT<Vg6T\29z9F؏JkjW2iq4>J,}o##'`%7Ė$~7LśzhբO>LIA.M1ZG7,]G@\j%h ѿQC 8gCOe ~@c d: 4c3 BOVZ+z#YUXF+)Ъ@<);g䟜4aSxTui)J##?u=+Vu!Kbrd6 * `*+ +`@<xs/غٛo'|mo{K-;oo7qK^ϫDb&W{C}0m@4XvgT{o16gάk֭V*ݻ>s9|˖go/_X+ AV0:0mV:+m Zksկ>Vj5XRy_sóg F!6$naXàmTqE)}>d;&G;0+y_?}﮻Rʢ0PP=~{瑩)`.]A| V0-lր$Z ܤf`p?ݴio_e?˪mυZa'h4BV|;_}}"`%a5 <`:)k3{]9y͛w2y0nKmʯPD~ч~TM(IcfUэoY%amE<o~;. e5 8VE/MƢ29tэaF/ᙜ>N$*/0/}kQ/JiB=8xLwenzk0^S_w˖^nBc!HLhdX7$$fq L_"j @Y ʪK$$:+,ˈL2{B xw/\0W``GAL|AgR߯Eqa|743<Fsϟ?Ek>Fe52E[)`,*I0KPaz# JZ7q @-6|I3*SI ,^x``.<}z$'J(_5FD'Ec:rR:ī~=w]wDϬ@ec>8q?g8;sOH!pqVNvBcZ"VI1;iIzT*B;o{v9?~sޥ34@_~/w~'|yf˟73վF:n޼.T*UU0op@p Ӂg}% RiTد";Ҹ7&>T믈Qg˓5:NdUj'Ϙq2.@y&`"w].7Owaa Vp⊝<ɲRi){fe5R2%*$_Y",>yt{ظquoܸFiZ) T\J2Y/q3f//ʠHJZX%MV*+kH:z+ط OoܸyÆ?9}^rcQITFf CD^{/c͚#G)|Zm}L-H FYۿpyv3g㣣'?W˗/^lٲ /phh+@/5b0#v۵kΝ{vڳs#G^TCǢb1.Og1U(J,k6ɓ=ٳOjꡦR5~gaҬϽMoXvʕ+-Zt}olVIJuW :cs۷ضms sرFRzW0uzg:;"CY=.TFFR R[9'>CwX+I!K+V0ƞ|IT j] ;#;vO׭^خ][ԩC}}"b,1W&ˆl!R>6RqqBqLW0*`o4U?=lZ^8(圱R)J[֝;:z^U,٩$c|arl z}_t/\hjדּz}N/wi㴦&PFRNQPELvPu3ٷƍ[|ƍ[v^b{'79i' ƴCcBUΜaV`j)1MU  ~CC# fhh8<|)c\p¨||Hx* xId3v.8 nd*RhOs%yJr}uDC,"5r(4Q89ck`tlcAq6}-3;4CX|̙Ì}}z^~E>prTSmښi#7RS/.8DMlQח] Y`SRKb*rCC#CCCC޿'i%K|^UQSue􄠚 W!&Ht4:*~Nw!fW0R3'-a&ߑǕ+~%W6W3ga~^yl>>Ziz`1>112UNʤTڥɐ-zd2RmR/)( @g$ ۳緿p۶} 3cA0cs>DH{Z10Jbۖ֋˪g5I wsܺLR&\]DumL"|Qܔ\'2}V`A06ӧo+߯U+XlDj*9 1ƪ]۪qژ(E%Ĕ4&ƒK"N>ȉ |bwĘڥ313D#pjBn^մeZN&Ie %jeAYzj*RUS2d'Ս*HB}bx:Z真{iƌc"d7zH;V)>i[GVx^q,Ab c2dt "8-qΟ|D2蠝7ٓy(n[G+n^} exqosZL[ZG王3+UTV~%ɕ]$DdFaE`0MꮚO~t.ZM<*Y*Gqѐjg؀mU^Uv2jj:%xEatИI2uD A+6RXMkPWSJ )4j>*qknx$ ë( 'fnl3* 鐄l(g !zk ^Ռ*Zs1UI$c%/^F nCF8Q1iY-Y%Ԡ_jIzLHYIHYnMOsbudrsJM4#wfF<&g;%ddo(UQ象ٌyRo0}o"^_N9I@zC )*%Sr5O€.UĤG7Q{/dULOIZKZnX\ CY;IcnF RCГWP KnOz0S`r?;?uC%9J(ER8iF+qq 4`Qkv tuBVQe%uH/\ 7JYČH,}dٸE)W;퓜:ege駆GL.qW0 _8&V:bzbܔ~{Q&LRf\\W#Fb-™fj*M4v1 E=R}yECdQ#oONXqKT/kT& 񍛞m*grx6's\$Y>ytw$/GouhqTGA '$)f 6ZDuY5ʘʒƒEGm֖XE1ɱXe4T +֤:Əv#|+bwr,YڤHsXJB]WurJ?Ob,#ݧf'gGzS"N2J\-aS]bGaJ7Dkx/mEfhP}O8~W%)TX 2$g95q!%:K`RS1dG#ş39% n]ѹ/"dIMjk[:Bf kc4X IY^j.$RDÔ:k 렲%5UukLu4O@Iz]\7X/w(ʤ+8\ C8,)25eÜ2' = s[(. S\'pݷAY:"K'jjƴ0kD4lpi|Uzy}?I5p_(TK$#ҞȁK"΅$)ċJƖ(jN?<'qJ6!׭nUMU`0j6Ae-cgMeNѺpLՌ#0 TsԆ&M,Ga` Q-Q2čQm=p}(rBDs 22)Z(R&fCYA],I!ɦFX%+KJ,Kן(bIjQtybit&,)ky㑭I+LIHOGK % 9,ʍ~MPSj֪T㗕L}IuN<ÁrIDAT 0SKYnKL7)CSq5eV*nU-a"MiF3i(Ԕ1HeYW3h*6갎9%*F=vYUeAYi4fM tvjK XFOPaUY], ;$7.D39f\fW f$du6ζTe$ @O{إJ_}ŪJ㦪&jejEqVwMa@f4pݪk Yd&دs*ӥ00 MS]h/quM0SMYId fҘkjVКIvHUrSJt UiV{{(S5+6jT>10`Z~Y),}ɬR)rsR*SNB՘ΞDeM6PS}kPc2 gԔ*%7Gb!F =Cf]ʠ*" V[[XQnʬ:.yԔ9+YdTR>ŕf0)fPYwe%m-ʛϚNtkQֶ)fAͼ61Fy:*l½ESZY-R*+b&%p'Ik-a"f#5-l6gus'h+qƵi^Ae郘r 5&9*7Tˁ0$LLWUq5vIkK%ɬ,}VVִ 3d\b]iTFRgkI XR;*wߍFQօ E”ѣh0ee-]nѣhIMh(k7ߌv)$Z'4GPV L/f=COA.kJ{0}sH K[MimJ@4r$~;Hl+4 ^|ŢSDekIM)nR;)Q9pq4U#mS_Ygc`Hej@L k V63K/fS@vh͚҄)56l@@۬Z6-B_i]hd:Vh@UUe' e+BǝdJ SfV}17>lc[7ս܄6C1s{A[SP0Gpu߼MCZ$2Ee}ạOn_Qp;m ӺO2>R(zxq~j7`,n#\ J'zQjaCm v3`3k}gݱ}XxXTIѓ]w׃sCϢDᙕEO 5}mS w?hHX2m/t H~ c]?L~Ѻ]5]w{*o˩nYv#%_^=9f$f&y#/<H. UoȪ߬[M:0>͍5̆PۮN3i3ngw)*L8NE O-j@J\{_-ի[:{wd;buZ2q }379}Uۚc?WqN&+qM#G9ua$ѭl4o;W?0:oR= `If1[}7.!pfnHgpt[3>okFZ,tVuz{w_OzkS ✿о!\WOKjťD5wDt:MOf׹'ӏMn{Q7VcY(~K^X_Su~>&(n^k͵}eM߲k=쵊95ӡB_6o8BIMCCB   h  !"1 6U#8AQVXquv$%2BRYx&34a'5DEFTWbt7CGf Y  !"12A #BQRa$3SbqrTUV%(Xe45CEst8W ?'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"p'"W/~w0k2nNifc׶H8̄#^.Hpuv>MkxsUCW]EDN4k)ec?/3z}PmJP Zji!hZi38̩X ,qW0(m}溓?q^w6R@qXժ,pm<#ɏ ; C"ҡ>GK.uTc$7d10Bǀ9xI':%3`$deH7_E2p-c7[ս18zXݒhd@f9 ["9"a[-GGܑӄ<=jf߄Cޡ"|yBTOk޳~ Rؓ{n{+ò֩!iOSt( ]R`@W;nl,gI89,H ^ =Ruں5wKQ&`u5Ǻ8#~wiR˯xqn1w~\_®nv%8{:gt>V]e?K%7W*_z+udOvt]/dL2oz+u?UvSnT'zCފY>]e?K'zM=w~ a.~ ?ʗO7RފY>}emK'Οti7Jzb_vt]/d:Ι*_z+udOvt]/dzΙdIEwWi®nvOy:=Փf=Cُ54zJ"TMXlRc޾x _ j8r8(7ctrYY΃@ n4Oa8aw{ <9xu'⬤4M&o;qKk~mhѝX6x{"FEGGnT/|Ia-fpTڣ) f_O׷ sFd6!!+D G0fPL?ߝosyVN8DZ~ڎjf@{2P5s {r~\6qI,viioaBvMY .e)`Ҽ>$lx=YR:Xg'k{1&FP9>ᄉ6P*]T-uG#i-k1=#TttY2xMymNRxNρda,gXEfzt7̫o=?3cG?{_֟籃C_hk`O~O=?cG?{_{:=9`!8X߭?←c솿i}NN{?d5=n~>Ǝ0~Otzs!wC4q'ZSӞ ~[=?0~kz}`, ֟籃C_hk`O~^?O{?d.;#Gߊ~j_ST=In̄i)|.*#d١ԌJH^W/y5eN)+ڊxktѐ92w+vRT b~βEo }[[z:-ЧKCIפ]zhMT,OJ~~NP׽{wO~?߫ߓ"|;q^߯{%{W'xEA#j"rVd4W$XLÔĕ%c2g([A ~lc,)"p'"p'"pZYdd\#X%fnfM~(3,?RTcoaF >Ri[K_[I=>CW.h=lsNq Z_,@@>=q~Ł@^RcRrb8zqaTC8B|Wt>|<55 BRǻv*nNRųšΰ<)UC:C1 Q$YuҤ!7fmBIrE{f]sW(E[YP,nQX¡TljZ$-(R`[<ӴVMf(a , FsIZ0)$Xm Rown\5Jwuh:0:HԺ SvxZ 4k!G^0υ8egaE pYHH݅@Wٮ.LEL5ٞoC`t'kY[-N#l4)ʜLde^#a3e7g$ Z\ihOokW#r DÜǘfS}J\X&ce#+`cwQP}:1FKOFImD@M47IG AMIʄ9$݀7=ě8Poanڽ1.X ̳շj81d,QϾIAc (Ie'FJmոm9Z3'8;ij#R 9IPSœ$ װ3bjT]>n-tWP gܳ[kZק2u-}I69mR0]F7Mhq^O8;ZjZg qH^:TI+7?e|W1,+Ԟf- JZT 2`kW@dKmǽ6J֔f\- M-^UR0^X"C~EWg!/g_ 3BUH#u=auCAl᥌:"LN}-:yZ؅)<\ <@h3ꔭ]MidQԇΉhG/PTQ<~>ײ@4JВWh"5׸Bk_|f=t62rsYňpWt-)]KT⢄=jy)+7'SL=w2g=\]OXӷx&![ܼ2UWȰK9LNeBF^Kys)O檊j}^hh%6{bDl1Pӟj^n%5E&r+x7.ÈC8  }[w8|^o=3=.=@\Rl!_ȸ ųoyn))%waUށh>HmHҬ$ק,-!pNAdTKHNb-sMtK *dD8Ϊ>4C|Qj!vpCN0ϋk_<%`Yg5TާIZ?ʦ/A88]a|~*2I:Z,|:-ψcZܫ`头Mdai#RxU_gըX^cʧюCιwA䤒 G9 G2JV2ex$ ֠9sIxE$G*W8 O?ǗxB;Y ۯw5LԔnMO ٠Z>Q$hVg]7Չ @ q&Lf|r@~vy8Z1gF= :a:,?4Q7 j $`dDy^Cؒ5-+5X-,}, ֫<uth([8XٳQqͅ)%#1dl1#|^r2w~sz-]JyU3E7=-3GluƷ6F܄St#&qJ{qҐQIK6 c_2R/#cS-4+q~{T(^rcnoxv=ô'Qԏ결d2L pL!a7)/$|3 e pV⌒S 1b]R0bu_LfT~S#[R'ћ<OTp +$Xsef"aGFfH &:"Hn_M1G>r .m|o#=רzɝ>m?)˛tuӒJ%p>E͕*qɩ]/!).7Bpx)#(i7OBekbm_zJG7.75*}kQٛW6Z Vy&mU1s/,3d+!e^wyjw7gXə0YkgKk?%n `;`IY#y% ̼ >.,穕6^˙̲<ɷ~1cʺzOTfkSe+ZH3LYr Jd3d.G"|8\R|RGwxau1hX~ݨf=-(5#]Z;?2dɉZ.nEƟB&d$e(l303ne4;h^2!)4TU+X/7-tkF_^{4zAѰQIo,!$|m) G^aHiWԾ:tPz*>e'هD:6xʓFHe᥈$H$!Z[!kJ$N4od|a pelF>+(GeΑ`3^E H,cF}sdY(%hBTiԫ B!Jcߩ @n5w&&3kGu''v/|T*"ZTTGXQ{22iXhiyo1yuxx, Qc 3v{7h&۾8Q7c. WΌs.DL\N^ZY9->PrP3&2Lsj9_oЧާ|s.~"E">=8Qm@@~zl2ZVT~t*\UXa]v ]n\v:cSZ"c|uz k_QTTTTFzyTR,$51T` JL͜@MuZ)*hi*/X)퉱, ,AwqHP`OT벖p!aVL)hp*5.0ad83Ҋ^mgÙ@hN9LiOo9XtgȻܱ-A&'23FOanFnU m~f.vxpFLɅn⣥&\vm SUy=_G EQmTM 1!Ӱ ܩqNb~N(ZxϹ,f`fAb&3DJvnz*:5Ճl*5{lH7A|)-᷎yRלn"bR0|bVli޿آZZZfRaM "q/$d%1- BV !jrw( l@oYSlv,0RL4n:r\rJF-|Qbԕ^>0%X-:[uĮޖJ9᫁NW L/by|U&&l Ti`3Z.M"jH{yDF򕼖ȸxVu 3C]+dkl" dY&І`]nAWN\4\5#%+DL,<%֋q21)“3"#'vk5o/jwwVzŸOOB f~$PY'"p'"p'"J}q+\"_]vb:2pa6G.|\fVn|MU2IA&V$q9 Wڻ!?'MoCkΊƸ`[z_ɋfy?2尺I$BDD30LI/]/1{lzDk:VEgtI9]SFM{~#% c@1LƺQ8`Ҵh#kJU^B*ޑ`lب{*Ŷj<1dccDp z;zDPzv "MiKxh5\HFG1>ZuUz쨍|<ͻ@鐶Hz0vX$l>av5#mX%}H?eɞoLݳhytHC!"_AG7 )jjY.}}wwz>=ҐR\Cbj3ds/틦E채%}l9PkAg4Omd_idK@($֒ġH(^PJ~}eHW!alLAJln>׼.ܭo1Ҭƭy}IBFqM"ᴘшwqBk݈FDvw-()03! V {&ioٯޅc)"p'"p'"p^S,t1 JlQ͏eς-MٴۧdsdҵMh*15K[=&+LAǂJk2 aO-/OVikU:?ԝru%hM\ĉqdGyOike$L h}w_5r,5~A$~wpq 'e2B6") >7Z|lrXkJ>EhW칎 [C_%IBקWgAْb]j3 sY"]ŏ g$+D)Yqh[VylhvQZB:.jRp9`=,9Rr.ZTmqJvdgC9|u0.U^ʜ z;LqrUN֋MR~Hr]jsn( P/ [2PB)+TlmukmdE)+1vS_4P,l7bR;hN2CiyxSY"`;w6%]_2E,v:1yb ITl(J&Y[mEnJ?`-Q&҇#dpj#oo?hLP5*3_HMv: d dr [^ g9L'2!.8_`Vj씤tIupC&R-3&/eаMSxy8Dbz0#H}Q'eA4v-K,G[IBьєKI{nϪkcӈHq.3+BФNSg͜g[Mkےωf"έft"/(8Jr@Jq}#E0+BwDe.8;EԈ*8.$Xvx͓6Yb IM #SXd 4#ۡђe>8NrW![|O)W? R~||"*E b ~][C2%PCZF\RF14n:-jNEGY_Mh7תIV @t?tde³&" #I/9ćOYV6|cn֖E1N:1^ʽ6;̮Q^JSy[qYB.JUQM<נ9SФѩe^Qޚ2YF%cϖRR[y08Yʹnϫ?"Xdm;86 K[ePeZM6a-a8JqcO8E<"p'"p'"p(tݽGr)C: w#m"kq!̏*LzVr"Nn5"ΛL85A8<`wfmR]v۵Ew]3FxO"&z&'[L)F:!q()Xҵ )xc<}jf?*NJ:sDL5Y/^mJqwɈac!6?29R`{'QggUՑ= f= C2mT!=' iHJ3J^o}Skݭ⢤EI$6 a=bӯluBijt!s u\y^Zyuwr$QYINXZ6xffh/cYr{Qa9aQNCZ*):fGyƥQK5 ELGV܏\*DCb)S zիT:֥8^S4GUncڡT;? ǟq> zeImfкeBA0'r.l<5"0D[dlDPB >'.6P|"c_E|6"Zqp12$X#GG(:(Cn2:Zr# "$Ubew5L!2lw$؎Ih'9~vT*|UMVmNF9?$ej;@a/b/WK~TUuzA- d]/ 5ǐ8uNeYs '"3L"ޓffUVTD5OAn[T\!?;ǹd,s"Pk%ڊ%Z(9 `i85 |eu5[a;?̳TҔ&M\ X?R{]/Q#ϩY0ddM MF5- jE^*DЬy H<d{ asۧ%3juPhӇɁ2 |U|q )J2a?7zc'v$JJ Ff.?{s:YyڜP5*"v[J[mF[~ ӥ?z '+_d𢽜" ũt~֒Dvױ[."%c""]/ 0I'#֣f>un!LWqM۷R0 ])V װdW_&?uYZj7UN"3qBnbcrq˾?v+2{qyRljj^WzQ g<$Ylq+uAls(9d넾-oRNq-,gۑ7VwS,L z֡\ltqP+ɌX8Er\"Y"ڷW1+NS{#VK;Z!s8ط8 V βQK9@}iltҴ$U||zSWU^꾺yenDۤExV$fI( dO_CpD/!htUwlcݛ[6o\kVq5:NGCêdzU~.u\]Է}&3gA?% k6a,Ӥ8fICtA0E2mu6S亣w׺wmq4:ZkYX,Ď,kH= 8GB"(y LUR>r r4YFce"Cul@o22O!hR\"p)oQƷpc*5 RܦVlZpk@;9ڶ\=MQֆ6"d;$K*dU;gקdIC%e/Z*(nuZ%9P}sr#{G6R=#%0,N8DN8D@oٯޅc)"p'"p'"p_u,5V/M':RF/w3?)>LgˌUTYݞtZP쳷=b]&\ ucr:@9;LăH㢢+xaHD/e%59tc𷘼>oSl3hQ&1YYII)?O"~2#>IHD1taGW#pc0) bbGMvCre 6hk^\OEivFRu#y }få-dŸeky)V1 N0JRc JSa)N<<0c>ps'R '>sG sXv.(]TL8Ӑv'jB6-Wwbb˙,Gd1E2Ig U6$Gx]a {Va6 a<6x-eF3KmW,e^lLaCSu_vO}K:`r"3YH,"IeKR,~-\"v\fǞ!0gU7 EV+yHrLhg)D1fvEQ^јpC{*JSjJyTa['soM- H# (0jGd2Bi_.1Nd f.# ~*B'\0 i Stmg/?Ii>ѹJie#|8FEĈvq5ȒEpa.Nyt ą-RۻĊ6 ua)cy"qVإ{RD`Q{ShAWM/av2z3]VغӮu%y-+TdMX]Y}y'_dϳJF w2[^YbZjktiV=Q[ZN̅hbuȲFtvJ#sSmޚUtvnsY%{ &%,Q B^~F9 |mJQ~=vfݱrM˳7=Cv~gUEu[p5Mez~~i>,$Z$"ְlGZ.-X]i=wST䞘~ $,sҏ':IK6]u~M5iW'"p)oQƷpڽ+Tޞ6U!3IKB*M`(HxФ|Yg 3_Sr1`!t:9i݆,|vx@q#3.ZYxnn~l mHyp ;T 9%LD^%%DjZɩ&0Co#N8DN8DQfzw"p'"p;ډd'[7iXD5\[4=ZE&3zjY3h*}K1IYۦُgOz^@tw|\ݱ]Ȏ=*:#!iI8DXoIhi@5F.3V@m:ᗔ' l9e.zH‰d /KSfI֩+fHe$ih"pIu)JGJZKnPEaDt`h ["HIJYaѭiA`3IkpP燊xE_H:_E\ʪ&b?TQ%;l׿|> 91 $fdy# JEwz8? =΢ *S bKB֟")Ƃ&G߇A%5 pڡ˻&&/oj?_̼!G&LK/=B' su K HVVjkYCtӧB!7nV+eecYAFH.*LҕGRa^WCZ mXQ9[ML&bO&'ĝN"W\TS9RUx9>gla^χUB<`+0H2a5RJ ɇ 2@ !y[̺c!1iNQ<_(#nE?o-o23@ts1rIYʌndK`wGjQ ^y efz~N&,?>׷T͗Ƶ"pN1ᄢpJqXL9EEy|̭E.f6p9t^-8ihg0S1Y>+F+ Rsp]$K$Tc0PR"K"%K-SpFhe G д\-wyX~IB x̋ơQp%H1Ia !,9Mz5LrR">#v/J lpCmM9vO2Kdv-L25,4[G#N][dHLMG[{_0-kOa?(T mRj9-ϕ4|I<. _;GML~fYp%sgNtAdfZ"V$wRly- oIo,|Uoc"ei1̜S!OCΓREP>CTL8+TVrhKD[Kn4g\USjmzgY7&z?hrj@Cils5Yfe[\lg@%,6HW\;t+͠ rE$5Ukyz PM-w!Z`WH"(jh@{I~J\h ^=- [ːQ-J0_K#y^▯Ci5MFjhw ip,^h%[#w.r>> kJZUiSBj 9SћSOM5|٦sGv=-%h[f:N%`m^3x450|2i'5jYi~φZy<0%>hsx9Xqr 3ܱqԮЎcSJg*ju!3f2 /;&m]uWbj@XӰ [ FxF^"q^܁ɊHG:&B_+9WDoD*1q؍FfG9[%2JWТ(M -G[24/7*sV>lVzRdvW!%?Y(cyYu Zkm/ܰ 0}ևͭudZ},r`3Ʌ~&nڣ Cbfd W_bctsE b$4Cݗ4)nZ",w0 GQu+ptX.Tv֌؆L]Em3sPzdMCOLP$PGW%68"[`*DEeq 5ht4+d&Y[HgfVxB2AB#)Q/1ߧw8mG]ߣ&(*ᬈ9IQFn>q!$GWXuIN:V[||伥+ngZ]F$ؐFN8E>Nvۥ{Am4٠nI]䢪mMJ|?~Q!0%U^٨}ͳu%-'4&8p1:Kؽ4:4}{gّENO Ԩ;lvy~GE(LFܘK ~V5^ѝoHQ7 PldjZe)Uʵ\sYgF^jAtۋ4< V;hh)y8 uς.{:W[py%p}U¡}Ezg)'68=tyƄY mצnwS7'm ;a>8r q Yd2ǟ$Y'ҟvk dGI$y81`;EX#-9#!ڔ!iUxg"k--XR [Qa)),-c-><ǧcQ=_W[ȁ(Ďa ;uhbIe>ߛm/+VrE=N8DN8D@oٯޅc(^֤o~( Whl=nٜ%hDE!PG μUj(6iuBZ#}# sIʰxZs㟝i V}~"J}*' N/8ֻS*Xϓ|<|(dNo) OO9LJ=8a_7|~p}uUkb/•"'>\SOo8~r)"m:fOfǶR}XeOޅM8aXJKʕ+(V<~Zs{+?֍?0n׌loA:Kݗ7A&K*;<>5iDWW\z?^vǺdzmg٭m!OvnbQ$GC #ü':"ؗQ}}t޻J37CL n)noMlbgIe<>IDZnXٴ>PmR۫͹^s[ްԲ*O]p\q069C㲶r]p:NSxx\zNbBEMxx.4>%"CnIofsO+iظE;Y]"bP4.AI`vl)r7'Vm20t]6ߦ"-xth++>3`%f @q"TüB8f$r]IV;SjY3c 54nN21!8^QAĪ^Fdr仈LZᎮx! 22ӆU⯛O|:2*+WXK cx뱟g" 2%-R%\RUS N9"Tפ"xMj,UL2f)N`-;' oʯ2,fQfrvfk}ըkuȮG[;%3fRYHV ed*}b_._d3sDs |i,O-IzFv Iu%8[qah9szG'U~֓+JskDĶ֣ 5'eLhdV$,LCg (KM68U3ٌ_lU#HH7/UK}K}zt–\ly2zr| >=!pVRg+>LE8jkIZDJ= _Dp32|'Le%F)l6y[s9m_Ђ*\m}-h3u{S>QD d> -6n=H%F~(w&_@jurH&A}tIenųqJ=!!532賚 E\3∆Y}þ#t{=`73bKi.W =9 S$ʳ´_ Z=/3/zGo wf&/dezԿʹ2>>8o? Y+?p_mE_fs{'dj-U+1/39f@c Q3ba(ԃbmF2RCyW3 x,OjL/SARQč`=8SN4!3K "YO$z 6"iJ0WjҔ(/LO2,erO*R01a9EU|= {VN$ Ѕ -`WyMueaIў3p8&]):q;I蝉iyAUzuF8 3|)weۧ:HnbWjw TS. {>S&'Jg-=x{ !Ĺܬ酧mG^5:&o-? xa3TG'01L49Km}+]RKeR]sޝ112WaUiRjɎ:>? ȡ0ocKnK‘W1or]b&^gוLP9N""QLq S$$LALgl_\ eAV;A{\rHx?cEθ4=@Vp82|"bhw=ߵ3w:&$HoĪI7UǑD܅b=5Jbs@/?<3ysU}XR|ۇ:x!wu,Xn]ZWZFI k%"Ls8܄"v"{3v~YWlxuONc*c畟~Q;5Ykx8_/uQQ G"Ӕyb!Rg8JRD)8Vs{Y)y.ϋlNv(+ Om6~\xXǧb*;+~߽cYzW=vlY&l/jttmB#\7 RKvS@r$33鋛 F%MHZ5KfU8 e2if`fdu(yF%$^Oz5kS8DN8DN8DQfzw;fqܻ۫)VcrM:bF&LwX1>K\mXJ#Dn q*u4Kj^JV"$\DC.#.L*ù+ʑy,(+O}\?bѠk-1ZӱP"Hi:S},iҒ%pwʓ+'ų G~OA;Fu V< nPEi 5d֥8LxҘa-%jgi^OYhw;6)Xf}J<ˎ6'էYŮ> 5n(V;F-L %,5aK8ۊF?^Md?߉mT N{[!.*1v|T`K5m\F)B gڸؤbas%ME4 w;m.g#@1T*LxiL*Ɇ2{ҘHM Y_|+_9Fus(158Ǐ2*eKǞg [$]M">5ǚ<5mRmYE-'5Xo*Nt A?g[z`g\XM %x:rHAlL_xV[s:\w ^1_CW'nk|^ְg*V||r͟HSH׾\cxc/ȍ{g>#_}kkǵNGiƣtXrHQLa7}|_e'|PӽAa&L٧>Dua̔RCnIghV|!O:+s]$Qr90qY>7.7Rݘq|VjgJWoWٯ.:7MKY rL1E.t.q=Ә1n""/,O3='`9u٦hRې25jڠb^͂^qcLk$ U`)c 0e40J$Im-$ctǼOVWֵ+9}fk{)s_p:xQ y[e^sxsso[;mkJՅJQ-lo]I.7mUkǶ`⬑#f8VJ4Ea,ǥ_eKiL?s^ bx9s@NHX2QȲ7HnkmyC:.Q)FJ?:!Vco; Anqgmn3U1jsIݛQT5u-F=4/)MgRpR<0sE +[ѵV+gvX$Θ#CӁYapLjRzCVMGa)£0lh܀!6v&,]gV붴k{i%N @Lc  Da54 ,$a]Pr ZSqK@($eۜ66ECsRH',d /qbYF'g<6JD$ |B@n `6,U-Oȷ}_{ L2Ke)KE2zDD$t5tQ"Ŋ*pao94\Z9V16|<|/dM"Jb X1[6:D!> ֌ B^8EտOwV)`n.)C߫bd|rnäX"e9y\]TTTNQ||AĺvU0R ,D!`,ws3!aDL˨fUN;#;&R:6^b'd.@gg>2v]pơ-"9Gl=jtiZ:s u1ݲcؙv+O8{i7l~<E& BH@pgмfR8;1g~@Dj]Dґ&Aq;W)I! Mel)eci+"I'}bבp;*D>[7Sh\ȩ>M8ZE`FlWu{Q`dmEWG[HrA.kFŶTEwo?X˯ޭc՝W˴єOR:!.r@+d4s{eSgjjΧWjS6JE/hB6:7Yֳ֩HC'&g#㏊c\轇o [:7tD16$$˯XQrud.ufkyDI";7}ZA ZJߔZE2R豣۬jȇ, -J2_|?lͶ|꾸uhfZnٕX@*܈Ʀu(]KҖ0]xDXȧ*<.~ ԑEzj8%х!9 F!HmvJLjhbf㬝GlpSi9Hݞk#>VOf^?_>a,:NKQӷ6ewY K+GQ.$Yh/A c54ıV܁Gl _:#r;vnH ,]ws+kƕQ}/a1I|@y(ckZG 9Wi~2咡ćNҔƄ9 Tie'yq*s<"hTTk\l#I roeLy֩ ?nyPOGCMTv^2 NTzǾS7ne8qgz{WxM51Vö* : !2b#E.by b 3Q P#&4"J %`0䬒iC~UyԼ'˟7>:xmBvר&``,]v]~jR;r/Ecl}v*їA!G ,cBXԯf &g؅av.@6rmYJ[qI199TDNݢFNU&J)N&#+*S5#('L<&KwHV];!*糶tX vDuikȈh `2%Xi%CSrگ|tsŢGNUP&8bx^:nGCpUp҅0źLa ;Ds!Ew'W랟uҏ˗ֵMSؔr3)Dr+7bMJrHAfKDZOuI .գd%ז+Vr4#dy>d7aKZU-} (^]dI4chE݆UbZrR㌫¼9މo~;l:CO9&(Yt4>ֺdJak5:la<MM 1^|ٝMn gõ Dk_O$W3_C`ԇ#,e>}0-0=}Ћ"kz֛}[&wA+8҃Ҽi;{M7ό+cUi.Iv,742[JǙ gZ{ܳenm'1nx@g(ׅM:>rH'<,%{*o/SX'E]-~m63aM'q z0X8vu5ͻ~j;"g"ĭ4CDD%86\yk Ѯ x/]b/q.ebP#YomcRұZ=!#,mOeqmHœnU&kd:ǝq‘¾dʟ|\}\"aq-۸EWho^9M%sNҦX+XZh a$k.R?lgitOCSS3uxd3Bv.`fU TS]|pNWYmaڗe(_upLWaX6MȦnp5K~fmi>-g箅KԃQq(F ;{3-)ȝ(v}*r4"N^Y,@T#gH6#y"{sQG8!׍M4'ZY}3Hq)d- ǏsTEjfPɻr.~{Nh;?ۺe6kzU@ X x&a."&g:o\/'X0J۵ Jg ¼3><8S;}_E{$$|8@pgvV!XCIe8e-]ߝY^TU鿩'mF,!';԰{ܪLdvc` b-l0ŌWsuԴ=o]jvZzEĖ:*"Hh,`XXZġ}`o]R$JZHrOwȟ|I}8eM_e>hQ>oQSEav0W* ֽYfʿC׵>!ESo5"!2B1eYeΥRSˁy'_\kE: 51rB"`o0>r+Ȯ|2?hp֬x(g(8q|q*Nn%3~B6abrw-U, 0m-˿,-~F9By^%̘Mٙxs5qXiSSYdA^̤{y/"~qx^|17?UD^msrǞlUVtr&gK.|Ëa9ʣ3 LLzq,uN*ٶ;Cgnնl6:Ry9fYk֕^1 VBI-*S!p4fӥYԨZpϒAJ8]-u =r!rc0 3e؍#!;vvն"6WtExIU„ոV7Ί6HmH[:1d-IӑiuMT"<К3ߤR8Il{n9E:sJiG _J͗ ?VAe"p'"p'"p)oQƷpc'"p'"p'"p 7BsnN8EOٴߘnjlmZA,ժf6htEZly[LXp^i酲?Y_6fCr)v4E؉/bhx絕6nR'L>+>vÞMv?U^(.׶4NnԶozu>$!=Gc2@0̑Bv,>\!oo 9j rb)PϏ"2=L9JS"џ{ "bmoORm)p5b zִЫ1^f$NqvK_*d$kw yK'gɌ,Z7*1nE J)ň11rKez7Sx>2ESRC"'aA/3'ftGy\5,&<_qr*>uU]&T:L3u=,|G7G3B. 9n>e8#+ǰNG Yakd5CJ.]9m wk[^ƅ ,dRRzz4*b)i!cqy7{b_"z7S?Y )}XN*=Lq#HDK^7Mh[Rjᩴg O6# ? u^zFR{L)Zkڐh! ͏`B8]+aV[v}w{Y)luk_&Em 7nw\ajlw]WG]GqQ2Zy; eSTH}Jrf`f u6m@_f͘< 8ӔfyYYPP;G3#al4Ry+)}/j~~}-(κ `;taY0galXe~E:WoWٯ.:bŚzT'`aSꛟXlp1ȵ8!zk}Ҥ5l1I"ȯ%ӟ"V{zoǽl(vX 36F~Nȷ,vSrfR(\H*ESa$glIm.Ntb̾Їj 9ɏpn ]: |UG1r>IxNdN=m{2/]&'lckk%#l$X@:2:֔e .@z.xٴk}"]G [jSJo&qgz_..y}6j}8# ěm..Y^嘊UpnXNz֜30S^$ܐ 5 #}W\R)Dko^jFڄu[ڏHۜ'7(F"ܓLa.8śRvl0/e+~mT(5XtgOV7C,\Ҟ{?*Cs/oe7зeMcQAMQI;Hؔ_Np{gQ\r7= )ƻ#yw`8a8.%Wc0`!GO8Kn<%< }2B}By80#f昃`r+l$=]+c'!+y_owv\`G_"b̕c'65j uܥX/M WŰX|dž+1CnwOڭG\gM G+DCQ'7?CJc:Τ}N7 ;s#waYmKل+dMx?9Аw/E4P&#[Ipcg[^Ut44 .򌁁_.+v ?=e"p'"p'"p)oQƷpc'"p'"p'"p 7BsnNURA3JrjPm4I ı6Xŷ?\%",C%K.I e<"Go!hlgӽ -jײ7\ƃ օ%*h=C[҃UJT6M(=wOP5257y4FĬLFG ~DSLoZτ=r,c+w)&5A?O*=>ZNV>gfޡ&5ͶLQT.z/Yv^6َ2;f욇ֹE==3Ջ`ny )z͹l.śc[ (WL)?5 CE'oti-͢cw{65ԇQ5~κbǷ5ua4Kٺ捩OT`Iqd6"7"p ;@fNDkC(Rv{fnhrHA疬+]?*Uch"uᨭ W/ZvǩұakܕIבQ1v:ζDT\3`t8e>q+ж}v ]f 01oǃXVv= nb54$}αNe`1c^ZC#Fo#Tvn z8]XOb1~*P :Q^Hagv[ǚ=%[1ru[8{q 5PU )vرVĚ)ʾUȰ.3m`=Ҝab c0ڊGw1m_]WSixO?uDkL\JMb~Q3ز2Aӣ 8hE)(loZټ?=>Ph䣊FG'wkl?лXڳu.H9zv>^Aҡ2Dt54#U'[bM:DLu$Al'C/Q eTJ :z͵oH阮6#캸b=TdQĄi_׌e xcKZnyk_<Hp۫wUn7 H"bB'"K5#AK4> Fg- j$.ر=|êU*#AY朓;^7[geWSOLX]י7h*J0@_<:1v. /O,IW3ݙUdvtn_f0٫C(r 9An>̪*s~ˇ",{A}Zܺ^djk iO\j":j.ѥ6{+?wj:zj p;vǺ^o{TSGO``BAqɄ&]G |NvRN‡Q$m{Ý}AbQ2,(LT yYb3@>LJT[L$90!kKCӫWYhzmpO1K,rqC'1|Ó>{ԝY=G`zqީdfş^ |1uEqXFB:lSH Ӝfv# {7xO=ͧ}$q)f@Nk|O2H?BzժW'"p'"p'ҟvk<"p'"p'"p'}~+6KDNh }Zg;rPm FES. .J˰vz5(;tq{knV1>)s0 #zb{7Y$Krog@m־{-xpHn7b…arG=⌌rEd-CqQz;T ]46fpng۞bQY-Ef()| _A)cNk'"pvyqjEa{Xv׬o-ʲ:V/:+nKСH5T5xAUiԨWؙ g}Tw[w8trs)mjh"3?'"[5ej {Ux^hCJeJnl~Nz YYka R^*gHE*Bb(.#Z}$"m2+x"}VQY~_Xٵ7!p2Ѧ,X}5(Pm;QGC^g&RPJeFEG.VH}EJ^x`Mr#(z%9C'30l pݓ7!u_M>EMd0́, v'EI)*`+%Lw+CВD2!eqٓ/zz.;nB3vh^_ ڰlS*]" Tjz H$$ym#V g忧gĽ8_=mFi [;׆mR2G`6v[WuEݱjw0F|YK=/x.*, _YGG"sJ ^6E8S.I$,Bᅶ&f疜'QvF46:eERO.~6`?3[XR[BAP, N}O~G߹!jH;V@lת4jgS u;so;rr4J9_`tzFa cbs_kZrF6Dߒ*/Қż]Q{\u5z^rW~ {>H)xrm { 3D)yr:}c_c/,b,ǭRlU4 S17q7Є Yt,[9%[ _\(;o|NEג]>!Bs~XÆfa(x^gȏgnMɨk:mm40G%d@O ~~c&K^OOGIP5 DC<ʼnn.^q}RǏt>K7c9SYE?p_mE_fs{'PŇ[~TTLNE?jL͕Ddl`Яyl}r,btǎq¯g9ǎ$/DŽTuS#լ-+KgvF]$Xhm)lYIS^mPX^0E{_.sC\jՃ/ȇ**2kaReR iM$h5n6\ԢbHEd,( jf1n>q"2!,^k/L.",6WW:R=u֯ja3qQh+5)~z &ґTZOa:JHlP%EJSح1Ll~x\"ZcH5`~?Q{!AzabFK{ň{fJD@gYy?2#r%x,>ӎ s&j!h#sx٩1(m!!d3~夞@:*y 1p1<\D ~Uwk;LٛLޝ^m)6И  9g &js$a nl*c6!3&ép㍱Ϩ[ya~Rsh6,ػJV[id/`s(SˣSEjW𢲳N8DN8DN8E[VE1N8DN8DN8EkX9p_'"p'"p'"Nsvjʘ[UiC!JK!e!-B݌e~q|mX^98P.֕%m(Rsxsqrj?Z~͊m[jpAFU% @P10*a,`o}:O=D9 ?½&/~,8mGg y=F o)%4uHyS~{hhSb4\*mrZi >IU8dg8=@-(hݛ8VNK$J5KdSt~ 7 \^YlxuOg! #͛>>i콛**g uT&zzu ;!JLtЀDS1l`f#Tl?+/go^aW.#Z/FSEt=tfcP^:H [1g Jq0ٌ:1M'0v&:fӷEetC*NrJuEbܵJM-C6. YQFQQxUJ{f5<,M8p'|cS%mg[ÞBV˚s~Y_G/>O6*j5ȉ;cQ=ѝ"6Z"FPG a֞'Q&%[vS)CVK==dG5$"BatolD{'/uTݚ5uZ>l\pFv ~,@5;=dz DtO #=+a.󶳣n¬ d~ 4 BSĻ~Nٻ[iC}¸z0!oQr:iYL a`雞io/Z ݧutFQ1,iu"\ȟ%x*-f}3ygz軏GkP>JlJa8Wh߭c=!w'7>*v Mx1MRsJ݀ޮ'X8t uK&_n5y\?Vk?J~tHNv+{]q]k@v(::Sbq {.趷~)ܥ9Z?IJW/_٫<j/O=DK+?0qfO_٫<j/O=DK+?0qfO_٫<j/O=DK+?0qfO_٫<YIv54n1Z[29q05<ۥȵs*FpU0;DW?"p'"p'"p :`\P6z/2.걌ʕgD?p/Q?CwD?p/Q?CwD?p/Q?CwD?p/Q?CwD?p/Q?CwD?p/Q?Cweqa1hEFg}(fmR^p?_<"p'"p'"p'"p*yt=R_cݫ(\m8p3#Nyd%B kvK=#8Q!ֈZЁ3N%] {r3E"*x ۙT:i2o7xdF7),) c"_6^`MlFۣ/p#&3rpAnc MPrω:Jn#GPQ`JV*>,[a JV[eXN*RST2j[l; v9jcى; tuY~6im~~|~%qj Ɣ1"i n6sFHHJRǧgx+_foޑi=FҌ9P`dOq n돃e LN(cYj&0,Cιc fKQ|}&@^6U> z&T];ѿt4E49q9VHGz&{50j*rP92@g@H|gku.@ 5ـqx~:ׇ`(M4[VEMlw)lKc6g_KUo;llL>Ͻn "+~~02Gc 6$kJ}Y$Eva KA]Oܾ}yw*!ѕFH3):(H ̔. YqS eH%,BEֳO&,7}F|e=S^Xv6&h90B i'T] 5o?4޿MPۖIh56-Ts.3 v3_ڇ mwr#kϿhiØbxlBӛe ! ^Ƈ)s]_]@@G[. #{ ˌ(\ #lSUGTB<[;}eeihtZ4Qv9~.G6}՟To?qLJ~5?"k(gNtAdy^8E% ʕ%)T+81c*Vsc"!flqMץ硏Bb%# m\aňx.qam9I^F-7Zm%.:06ت/,,S-Zᴫ+Z+8"bf"geMJ2@WhO մXOΕ%X.:>SتV)6|i*VK&EbTL#Zi% 7VלHER6-G \2;=Pn4D,$ 3-_darMC̡YZ˘IN8DN8DN8DN8Ddx BCPڲX̒+8ʐ*8/w/'ɺ_`#Ou߼G&x!>M~B "|8D7] ,pnX?w/'ɺ_`#Ou߼G&x!}GAz\;b7y2<R<~6xEp'"p'"p'"p*y:5לyja .ǰqyZo(^⒟*|8E֋zFHʦ*S2fYuĉ +'`n&S%]eQM* e\y?\"M#uҶA=zeHUKr,|-g "ԈW%Cu-]6!X  ['8<88FUX#3-Վ++NYoH |c͐j!%}7r9 ?֯E>=_8yH3zkDm&,Xg_N9](ǨTi'KoZ]#ɲd?3!5ĺ: ( Ub\C2>\;SJVsRJ9!0SS)Ƙ 'E;. $Gӣz_5źu5a^{41 _I#&<IeRVi~Is[J}$6#L%(_9qcXr}-xFS\:VlﱙV])V%</|^Ɲɤӱm6*ei-yc䏏^՗hqgdiSnB'.zS Nܼ)>ɜ;]툵o7_z򧋓Bt>,yvYܕI_Z4 I.&pox6yiX ,JOWfS _~ ?C9 ;Տ ~/T&EMO|NJ[4 geس0&zNG(.I%22CE9ei_b'Cԕ%,TT̩"SIhVҘ Jƹ쫮6QӉ&.<1`ۧۀ&`Wߝ<b%E'u]F[PԋLJaԃE 7rֿ=6 ijrWsQ}-bZ`V+",2<ƥX)N۵RUBPѵg|2)_~\˭ľ{qz wW: ip 9>`=41 J > muG"_ώ}>ǎ~ ׎|1x|^e~.}}="+']3`4×ԺѽűĬvq#?-,"< }~%9PmjG΂.z{i:箺eik5Zu/Z–ԝc, mewjrd-_Nc d\%BqȲJm|%Źm\Y[Tncmtړ[r.9k>1Sͭ{cIFZU "Ewp,uSjNtYX͡?KoGlWl^rb )8JtyBBdgM}Zۺw\t.#jP&VuF'`·׺Kr3e1RnZsJXp&aHogﴚ^[&~mhE]){ZbYuMX$Obg]kcBQ Xϴ\$|䶧EnWS Gc6Ɠi^oF v{:z۝}-u?:vFBPSL~ ܙ^(C*ɸdKk膱ڛvk`6V[W;znZtVb*c\c|I*VjjtCo=Vʺ=+95uwĊ"}q}JNmlhJ{Gߕԉ}]寚o)n] ~uָD8Ki'7DxEpW>0Y=-LW}MOf۩[P{:mw$P:|" G%d@ fȳ[gU#ih-;p7WFh`ח鸰wDlcj(J=WDiz,3p]Yu՟jvF*>̙bݺ|d[D"d"8DN8DN8DN8DNR]髤}&)٫[B9LIze1ߍ&r1'S0umQ GvGm@`;9%в>EԐVg>r|mmύ>LJ/g;Iٿ⾧=L]naֻ"VcvfF`'xKSNCjSN6p BbN+4BUzj6hFЛI3e)JB?GK_;u8c1Ixcdž1/@H0q>F6dz_:O:1߯_6s|/5_j {V,u@ 4yxϻnN`~w3)?5nv}uPb(als\õ+~: x0'+a_SRs~İﴪƨ\e)Seqc>~/o;GT=__S}_"|#=+NGh}dj9V&@k# |;M'Ǧ2HakSdղJ(5Iz3&?Tyec!08bXű:y'1E64ͯhSdTckUyf+l#-IdmC==fYU[$bZap9TrN-HbNM;᯦z9P5.5!<rGO #QϮ/8u߱h[K޷IAH:"Bh磾 a.^mcKKxc p~+O;VZ5Y5Y9|5e\ryCaBbvQNG1Wbv#&]RFRBVץi J5bgB-Ъ[p (@RS°ZH=:#xk֮[klmneA-4feq&aIK40am^)t>8D]r7kj.nκ uS:uv*(̜PyprGfG?Vu[>v uzɬ~U:wQB1cc1ƬVX  tD(nMv5Ac]x Gw Y.eZ>4' EznFVE2}^im[Q0݅;߮ sN5hÆӫ| (‡J{ !oEJ{U{Jޛ˲5¬i>H(:cDvU+Nel)6K"U+POƔlA| ڻ>]ZF#R6Yv[}|՝v#YOB=ʢHXH2iWQ͠3F^)PU޲!AguR}OҚRX:qrڞ>Q X" A`vJ} ?d :k0ס6v< {:1}z//_lSbϵG|e4ƈ#p'"p'"p'"p'"p'"pW`GTF|`LlǠb!|I2AF|i _^GA^V]]_tEb+l60ژʋ{Ljl~r%c2E^tټ|mn~Gzhlm6~ш?@kǾtdD{ˑlݞu;ibHuC{/ZSjeZino9wraDZ80a6"5kt67%Q`Mf#FHCƪ82pU;b>-mxXʛ^Eo/ 9i^c)m١V19"'rTf79󼅣\rΫLi+ٚs&4=aْCLm]b6v*<5S*(\4p1*aUjgzfi7 pj @RvS6ߪC( f6,4CrXE[O%*\Sz. zuU4piƛ]bV8x <@,Y-7}=`d pmBuJõY^b^ j!%8@f+!M̳|jXG_w "KӍh)ުuڔ4mf*dY]p%C]$!̩,%0e"p'"p'"p'"p'"p'wet$<-*}CQ6Ǥv5 V )7WN [N3jt25`vf!y=nU{6aT]!%l|ۺK>vם`녻eZ> wo. H {dG6JuptSzRr!IH4F1To}U쎱AIi|$#bvfI+] (Mn~y<\eȺ@:n7R.7!gjVۆC{I׻SnHlѤ$F?AH[{>tڛmH/}ǦErnX|-1٪oJO-6HplLk[3t݁)ru'gY B݃ӽߠ'Ki[vEPBic0E$cǂS%)1c11DN8D_batik-1.9.orig/documentation-sources/resources/images/apache-xml-graphics.jpg0000644000175000017500000001210013063003371027054 0ustar mans0954mans0954JFIFHHC      """"""""""C  ! !!! !!!!!!!!"""""""""""""""3= !1"#2AQaqB3Rr4$5Cbc.!1AQ"a23RBq ?*>#)9ߩQSsU2m=O2b_WrTf#R~N*M#I3y5]Kwj"5MO*3jۃ&CRt ˲r-Cs7^5~33(Qr88' qGC-:MUt%J%)I)jSwdsyٗwI^e B}1ܢS'MHj$KtE]Y6[ TTK;AucS+g!Um~ߓy(J\ ]NaϐT%:26u$hۢmp`0 2Ym~\ZZ:beo]f\k+l\lYS0r_ 6I#vߋR'Kn~x6t<]sn+Jks5w%[qZhbr4ȆS$RWN-RPǃׄ PSq`pA` ~nK͍Uhm벡'y-S&#)`U<іM2ko`yYrꎊyMԞ̕3]yePlju> 6.Y."[)xeOk_3!ƻ; omtcsBȴJ5Eʒc79 \-bY-.3΄^eIH*-)X.A_JyZȏK/hm |k_LQ:j0qzPb=_Y+}|uux!gMkkqY(`mVo#6y)aI#yL.VNJG'Rm~Mt6zYEY2+~LK&w_"1P@v}A S}IS-  06$4HmBM0zVew1JǠɘ 8.+."hqWI\We Uŗ鎋U*hj}UND5Ea`dDx~GZ$0_ 9|ܩqEvT́8DD""]pFCg:Hgl*5@d*S",y(CR E踪piQ CoOT.E1ܷVIZ6HDМQUG-\Bvec"]..? ?MFMp)<|A$k=(*S`®1.v~aԉdbŎewaק_db>Js/6k.A˴f)I҉8DUAQ6DZݳrx4 @M]ZJވ?_q㡨M6 jDDD/zzo/L;#a(SJnk2_%cjGz\gRx&~F>5Yוw7%z쒒":DQ7,i4S:*Z7SYJBwQCllq# ~ SmqZP7O~2EwtEu[ȏ l~n:?#񲛴9uFɱ FD}*u3C-}վ詎ǀfQRoK%AuY-vUY]QQW:MٗpLrEtLrp8*v.M ;)ebpd<9Ou7~bV =厹 I*S"(xliTu/f|WԣtqUAEK)|hU.aUP glI];/vʾܳ⣉K&~yMz{CIui4G(>*3keSiUHϲZQaHh.`^{zMM{e^!P%㍺֖ܻkw0u6PEzHY煙o9ѩf";iu8#rX0DD ;*o/4&By/$jtߚ#nDTfi&@h(+no}'(%p.PsQ?1щ1S@ACFwM\6UW<ĵh^z-v:RVՍ"B5[N5tuZYBBR8,0DcLwÞ)qT 7Qx]H( eQ `5BvPTvTmﰯLF$Tho !U˨D ُ$v[' SR[1_7F>[ŠO~{`@ Eu[4S;іrat#堛tq_y48 lS:3٧6Ves %Ǐ̄ȺWe[* GieFZ4.3yl$Zx~IiHΊj2ȪDW4["E>ЮeaЩXST_oKĴRTꘚԙSz[ȶ\I\tھG)0Sn-*t(Dėt֓%qR@{o|vn8*G([,)KLrJ*<*ϒΒU4c} tjT0oa,GYE8Ӧ .n /u{O~~$֙mu/VMx j}K1 L~TmTj7m!6}ߖKu=q#qS~@lz;纩]>1&E9qP^5lU4n"&NV *!DBkl {ĂOtObӻ*7 L)y$˦ B8ҶޡKuV: >:16 V^z``8X>V0 `0p batik-1.9.orig/documentation-sources/resources/images/svgviewerPreferences.png0000644000175000017500000013201113063003374027455 0ustar mans0954mans0954PNG  IHDRfr pHYs  tIME!T IDATxw`llz!!JZ]Db OŮ@J{ $!o)$ɶnvCHE;sϝ;! A$d̝;l>YbF ?|oEښ H( AZ"C}ْ)j OS:)-f&9xJd\*[vMpɥ1iYMNv._=Kvn6fl.E΃#Wu =K/A":݂]AA9v\vݾ7~,q}Ģ_>Nr>Nd4+l7._fpv-5c#V-Jɥ ~IEjy[*@݊Qkt$+0;nf䂚}lMW_}q\ٱۂ7CG{ʚ~o|!P3ӏrܑ;Q44W}}kZ׵Ǐ'!EqCVXYe&ztQX"80m;{<s[#?nϼkசg`{w_ _|hYT&l6_slz?pY+͐g3z7̛؂b &vOzOXȔo ~Z<ὲYN ٿzN-xL387Ӄ|6ĩsA_8v=1ֆOӯY=S;+;޵"{?G{ƉkA÷I?=مK9oEȨkLos}I({g -Znnꢉ߿s d\{k̹82 HkE"jP13#oHށ祏O@Mk<ΡSfH-Dd>r᎗Gl.~'6^K-KS\o /Xe {2y[=?{sg BEV?>^B lO4f?Rc }qin)w ֻ<,3-^Eik ndn UN/9s~?-Ɵʼh(~3ŒO^ֲKЩJQ0GdJ8DzYVy:ʁ>xMֽ?O:޿ Ml@ ޓ@씁Lw/2_zC9߯2\H&4Cttɔtۯ챝xR{^i;N;xtELIi~S@@ҰW>zGQSM|:_1}cK$OED7/U;bY^f<鯙{&@~Og [8F8W](Ĺ H6g ud;<3`AHi'4E'u{@ʵ<0b4hJb>Ajӟcf0=W{L Ńko @޼5 ``t/r+H dNKpbwP+ɸt+On?R.2^io^B,}ٲY\८)o{Gͻm漲7|Լfswmq[ߖ}ٰa/mYRhevPn&]2x qߌ1'@ \{_|JM 褪IPG]`{Nx(A/>|y ޹@NmA+ƍ it8ɔ'_A6E3L.CAP2]#5AB q9@̋~!z}BZsnމ HE( pw`jO dvh G¤( m AA# (( Jf6s۷oC'{B潴5¼KbS4w*F-)MkPTY݂RV$m۶Ic)f ;_O㪲^ʿm۶Ç6L*Ý&g-/ItႈU[^M)% nuQt;&@5[Xy AŲN̎1B<زe긞W_K\ ݪ߲eȑ#G!!>)/ymTbb ݛL}i{g`3fӦM1H 6lذ~h8z HX j m0شi2t`k6/d^Z7nl6N}/z-KL_V<O4MC0~bKKKdEQG/,,bcc+**N{KzuR֩cGۻWf p8! auڵ+Q2=K.C !F:t<nK8VRͩ\:.xwx~Rt6D:E)Gaa_}1{Q#8X'd( XW/qI{?2fcREoWy/'ByV0***^stOdzxSZVT^XaaammmTTE9YɔB>d 7JKˊ:޽{i &h)"ۚvt&۫q)BW|x'JJw}ŧjj- 6o{1!m qȮ-<<"E\`{bU3` iE]z 3䮲MQ^QT4fAAA]]^gY8azh<{,&J{IM&Ӟ\uɩI#޽{^=i @!Q(E%JAEՔ:^O E!(z+sˋ$wBlTqݡ2z}'Cje2XKW,X0|Og8gŹ )//j`۶-ӦMiZ25c V5???***""BP(A39k0JpޠoAAhy)xzAۧ_8GWSiih͟?_nY*67|7JKK9 Z;}_y뭷K)g$(VhL&SmmmllNk㸂!Z.] gϞRLMM+GQ/vneYFS[[ ɨW2ݨhK£Z6/q}fS@((xǎݧKxEnt|>Vd5uVL@BS@SXr|Q ٫W/;!$:'"ZNHzjה3gS? 7HӴJ EQʚXZP(ƛOHH"uSNR̲2&M&\/E%S-ZU%d.]JJZ>,ұ+*5@A * R(F>i)]q U0g}8Q*5H 8Cu&;*ΖVcǎwڑ  cJJJ:uwO2~bGjܫjf[@[O=oVY>+슡a ~.qZ4ےS cjG jg,jBQ  .˽{Ͼ?͞5WxU e^nmQB޺wBtĉ]3PuRREQ}R.~n=$Sg*JtpDEE aiy<题-/(`0@DDEQ555R<+LTdObc9<~;:EP" Vu)P{U\Nq2%+V*T4)@/P))4/v{Is):QSXvKx5ޘf7<6y߮>&u5 VS<_~6Wjjl6]ݻgd=tdffEUW UQz5WZ%xr4,)BUUUշoֱ2{Iw.+ϸ$9)Z ºjv.xPoK_=MQ5׮?ϿXW[ O= ncvNJ7n|^WңGZN%}$ T*-\O+O9b{RM-KXXX,gN%=KfBNU<&ynХ\-ET gz}+ይNT xA PgqT EѢ#Gr3y pYM{%)aj: -.lTo08Ovߠp/g^Jz͵S{7Xw=^Β< hں:inӯԜV:PnΖ[cV+.eYm(n 7k4!dS+LLjB@wN5)uhDd7SE:t5YPzϞ=^Ń<E* N +8X2xmd~g"䛎X[ښ 7 :$66n홙NN"7̝E(ZZZ'՗h-KDDMuuu DDDDDDTVVBX(JK2`}ۖa#Xy"%Ү?(!>19^ZX?=Udn `~o!=SǏ,xԩSY}>ûjeePJRZcPY(KdC5LWV]g͸٩gɃ?w->#5?|XX͛tI P4MKs|Ì"!VWW;m|J+F#qqqZV 2NWE%DӴާy)PZZ.vCO%&w K-q8AbE PÔOJ tN߼+ 3f@P,^7\֭약PؚAܘ %Mkl*++@3 ]$N;>YYʼnrR DJyAպn"sS:Zf9&&`0pّӦ.~kW7 %3++*թD4 U PU*=ӧo{&81ƀLf#SB|Mm @a9d4Z,V 0hV(S|cY`0kYz*ۅE^ fIHHt68e- c'<ϛf)ABR,N!% #22zhR2o\HL5 E'x<9/lӾL0ׇtI;Ç}d]sٻwa>X]wBH>wr/VpFbcyN`V&?h#B$k}`L;RM0Zl@x>22B^ -ݔn6 `EQ 1 RS_ĝl;dʿɘBHeeއ83EK!nˇq%-UUUeeeUU5Z\0.MWLB8BJeD M.y= {78%" K-!ǙL&Atr)/h4wEO=tp\VjSr IDATeGr'e]}NՍa;vn9PG_G:%nOޙA%RzD4:rޙk׭|V)]t?}dbDgp1#&&Ft[)));+k#'=ljB+]DEQfYDGG,+vc:dzB݊<ϒ?8h44C+kP m|P("""uBjxx4pUW]ݵK7e[oMkI@:]xLL9bԈ#m6[]]F16jHӴ^MJJwWBqqZh4\T*FcٔJRQL?P挴>#Z>.`M2H%ѣWFFѣJѰ,;l0W_BL:]w| e|O!h4J&ngYVLa F`yaoDJAZ$uf2qC+A9 ?DOAΐK4@ Ek[%B3>lGm̎%)dK8ݯ gΜ9T6Zm2[҉EO#y>N'"ެL_OW)b'q)AI}]cXikmKDCvh}raDJNYx1"][ALDGG2|$ZA+]솸 EL=KqnY#ҌӼn봘Sv~Y<A<۷d~y~E%NAQfӑ+7F}/g$tnZh=> H iW ޿#Pn()G2Z~|I;cNsa; [O+Vmذahe"mOkUaPĉsnF@;wמ:%gA\4^(LK6gpϾXgG<)LB16X n\3yyy Bdߗ)B:wAvJ&JHyaF߿n4{O{b H{Ldfggc'sADlIQԁ<0`wܻv3@AD d4Mׯ(Jز?Z Jv&wHV)ͦ{sc&N,K%%gv>tEQ*p]jr¤]:jTAn8q"Y&e8qf(4hݻŐݻwxSs2K% ]1BWӠo 8]\}Cr6E]`=$Dm3r J <,11$''\q+L7_F|zQEXJ-y2W?vVFOG2EU11wWR**BV$" Eo;X^YFa4XWs{\\[r{nסƨ~n^ëoJ<}+oF][`^cOcS4(w- Vھ\P_&f2#ߪu[OT՚QPZbhQ Möj;K%b4"zk!*v Z޶r;JV?ayoWmtA%sEZkLrbT.siRa^/? +Tn.|8-/qKz}k[8-}7A%r`l ìegKJ*9MfX,V^ Rp2X4%.x *z5maZNK uu6uF!Kwjе/sHqouKW-jdLh&"#ӐqleEEy̡~jƽGN/IIRVIJG_E:8ݞ:îAǘFk6Vg)u)f f}-w zzAo[xl}yY޿R{-O2 -Zén"WZTԾ:lsXWt6 -NT\?9(.mjOT@ۘ}E%kemZη/_1]~\jÆ ׯJ*|QO|n|b 21fV;[[[[ndDA òŗi1IG$^Zp%ۯyoA ﯭvowpj%_CΖ;L0Z^Ғ߭_[@|gYQ2}b@x)0N$swV+-6fӾ^%fJ H;CD4TevfX,zӁ [J9JA =5TEGwj 8MA"LL?iZVp_?, z.5VtJg"iD_&Jf`0j> AEDioJlL=T HA_ tl+sժUxuAZ̙3ڵd/0 HKo:d@nnSH⛥R/ Bñ'@ @AhK⤄f|nLOWӭ/SzHV&lbd;kd_=ph3^]Fo%'^e/\i^nGZōj4>I 87z1VdH<Ƒٛ*)?S]Rv,]Svum e^}?IAe܁2VoLҤ!e6eFSғ/Smbݗ), dj>:xK'YdwTrcҠI?h24` igM}N|\[妛/* }]Z'w&ubK?{Y3B,X{C -W۸ EQ!Lfjti !ٗԹ:[ze?L+xt2 fS4hM"|d=2(>g+xX/o.^}м/]_f kܓM ӦVO$BcNL)>$SK"kwt=hkmGA,  ,zV,Kky>撄xYy<{mgk8MSH,0+385H'!iF2!t^dz\g6dSM{"iRڦq\O&_9g+"n%Cn8KO ^ıT>{'BKWlV;)wxFAs=zj.zo+3PleAb-$I$xQMohk" eRiI&f3!Ӿ/PTQrw:pS)pTbJ^%tIk ʟi0}4nK|KDR >dvs]we<yv(DX*WuL3GyܸqwBbz0 0 bI>= 41AWbkbg_ \f] ͐O̎z_gox/9 XV'y^T˚ pb}kLy/ggA& -p" H}۽8a6XBT*J$Nb +{ {a>Uk@b:o+  QEE/E+Sfvp8XeY8}6^mlF8ıt|Z)&,{f 3y#">Ytu`U/=Wy:҅}y0{dɤ~L~SrvQ| /KYй!ryr@o y4i_dOx;qU͗,ynr n+ybc 7I''ot;_y|AjOc9iChb"\Nr>Tn:%l*>ܬ~C߁۲Ҹ4nˎ?"mg} 6U?N2E\.RjVj:FVT*R).w 1 \ Gq(q;LA"`ܸq-9u'E5Q2A7&hexAzI3VoVF-$4#Yb! )>. dCė_~٩ċ%r N? V&J&1G-kenAA+A+A%ɱ{0&.a@uYC%OK._l Al3BhE&%yG-V5#nGF&F%"ګIYf;NyKjqc2SuKA:dvp^8C} ^S<t2̱6aX+U;EXd9TEbڨΆ>\7za3VE$4sQ 'TmV)Hw=Ju|ŧ_{+uaBG*EѼwު?Sb0-Iџ[p#CϞ3f\"߹ySI7M\5U5VC2XR `4U KLvU{7S[$c9_dkDMfAQ4sa~dQmuYV vMa{duu8# EEE[nU**+˲Æ k k̟gLr P2eߣ&OʨjE *4^*qXqq=]SvUuNVt0JhZZeGYS]g GM8bZ1}y r-(1Z{אgK)z6nWGG:'śm*KU ;+}dZCCl }̘1aaaJb:tu%o4QQa4]~=Eӱ߯:xq￀WKi6ɡΝ&́ JP@R(jJ=xHMY3:)9!]5^Wjί,CD2)6=r>G:PTn 7hJiPv:MSj d=G-)qqFj"ZرC|u PT`Vgɹ㎺eXBի{r2"B]-UԱp IDAT]y z5Tq1]TDCI 1 J%Q o]+0D\!4M h$b(w0##sB~UŐ a MQ"k-e-6WיJ+ iy 8C (ƮZj-/-[.V"O~LV)[oVkリCc22z_PW4~GtutE aXaU/*ܻa]rlu*a (wi}unni V€fajQ(hb(UpXQQCQɹ:[nϹm@Ү$9Jq 8n Y9hйs/fW^IѴc 5]zׇv^]rZrz-l6Vɓ ުs<svۺOƤQQ^P*56[gxt׭G??5cuz nL\>b2hK' :'R Z+_\˞,L5b_3'mg_g  he6ңGSN0999cO~դ#ÇbkQ4 3N+*J03 rhbLӪ&EuyWUՔ+OW; .<ϫT*veI3 *KkM618%: Xڹ: {dёSy^c P4 _?9. zLaAP2իW=JKK+++)(*;;[PjtM1FvV_N#7Ϊ7TMݛy IK|gϥ6ďW+̸rTߑq/x+q<`z=@ VNH/rcS''VBԬʊTM:ۊ-evl auQ);v잞`WhB Q,,2QYݼر3E!PU] jrwkuϾ3=z$0 D2Mj:))p֏x }+ʧZ(*"""22RZmwJ@qqرcIII߶~`2xGm` 3fУG[L*[dPOy?bN 3|TbH>Rh iLZdM&xԘ|g3nd0JdNB@vڹGA `]uem~QyiN`q B2aF \iW١$*l Xc;$z^(_7 ǔiZj&$~cG E#ynSeK2XVn8,{c {@s رs{+ j2v뒒4g*Zf{[:]ljKR0NU\:0tq]&<1JUV8dgAx5FI7A* 4Vj | (nLBP(RSS:=+0 yFȁG1y0ͽKXHݜ9֯vSO%]uRR='|UDT:&*apljׇi -EqeMj(._CNp,Rt 4ZVR`!싈jջwґƭl΋t]`3ku4LŦ&VVVFFF| %Xjtpk,,Q ++B8^`YJ(lN ȅ ֫ 5*J& 4MLQXx":ymI j_i =FGFjEh4:~n=͙O>~}vt5{Tˎ>f7P:GժT SQJFH#_6*LlsΞ=MNf~)Ԩ"k;E(O){G-ʪZUU*|PԴZ!i@ TVQ2j%S[Sw<2.1QX^p|N[wVv;Wg4)8jB#q B2a(eǍDB(>xz)1?l0nD'MDTN?Lכ/4dN ˔Est%Jيz.СG?<`}/68 (&L6lZ,˞={ 44w&!jygYsXár8tGO+yOg0Zuj6Y{6UZ!YVP(('fdtIg 3.V&d(̄BIQ00$4MkaE!<\Ѱ,+>?ܗ_RSee3g  \rZʛn/\쳭s̑t~{@aaʖV,A6d8we%ngfL&j6.i+++[MxƎvVX^kٚ:sJBx {WRR\n Y^WxB,Vhet?T:rr2P2Hfp:Bf !DRL4ahօRVJRXz?T:UEɭL@;azHہ#Gw߭IL uAصsk+">tTPTQfxՊX/?~,99522jڵuQKv$qȑZBDGGT*aVk5w?nNM.˯,ݴZrew9t`GGE[:i([/wC~ASnz(<:XC49 m(ULD4o ;RVySf*(I}⊊'͚yUk&d0V&B V6cOyyVy cD2=Qk-6#`0222rrr8STVwϙp89q s~:;ァ9R9z^Rum /@SZ#q+Vt;ЫW061Eht 13RPfA1]Щ`3Ք,=Tm:b1AmծJ# }Azn_h|55va|jbQ2uaaaa e9*qu×||̤2DJk8^;N"OM  E9P /(zyg|rөȑpT HN†PS]ӓvgv~`S1[v z޵ޒMK^ ݵmA.mڶ[6Ft/ `eQ 7ϯaeeEUU|e@ PYYrxҕ!_OP(KkT̝˶mkۥ8sڴZk|8.-pY{찖F<pYq0s]IӤF&Lرcy睷wm۶޽K/s8pX,gJ\`01PUU_UUmYPYYѻG+0_@;]`0Dy}–M޸/y[7"ӬfnZ4o g_ѣi܀PO$S}q:1`hތ1v!phyY9r8h۶:'YmO>k-3;bgO^2ƦL"KƘs7x[yW\Ygs8 gwNy[?(QUUC/rN;m޼yrڵK)^clΝ~mEEPH$p8=f͚>}BG"&wmጅ#1Ey"Ҳޒ;uh1 85rw2 vN={SNVG;wR謳r:{QUV3Cl;{nhh 2:r+ΘH 4TpUv;j]293glMDeDe=LѐqZYy:,Y:H$Ү]]v9v]9VR,Ta)*F͛7_~}FvZ n޴H͏29e✢P$\ny\4[N횻lOۚ5a7A%5+Fc֭[6(\YgG\0 4]D}EEGtؔ^%%M9旕+Á뭝;yݍȷT^~8-iSkռc'6)}A;KkE~bӗ9}tft饗*PIc&զuj3W *@ٚ4A9f[i U(v(@}U.LW* u$27oց7.9S:&Nt,ELk4n!~L9 ] aq4ݸnu^g["IkQ\~D4m4O/nkpKtgMX!KN5xȐ!ʦf|~|.ʇׄHeP}`ef{#7-ьGiƦ)J(M]&ŖŠڲf- L>Hk|D4,Q jA5-xdC]WO&|6e&e?} Tmdn\{x$3M1M!SJYT9I?kq[rOE\9GэVuƺ5+u2J94O&kOf/..2dr|>yyy^\.t:c1Bfnsg&O& |p4ii˲L @2lΆ̟?ꄡCT<$D7ߠZg)))A9x*sL2Bu3'F7m冧\LR{oz dgߜj__ %7Q IDATR9^ cTzNKe PG!n ;f~^jUSI4%t:ʱ Nc?WV&dvP-n_䑈۷#Ÿ64$Ö i+S ʡ&'T-mAUD`deWLܹрӧv.=䣏W݃!Z)}yӝxciqoQfWjhz N+3u Ʉm%A5!GYg5bݾ=^qEС+VN S!FJ.g7xv74Lj>zP24έ̄lGuԦ*[4nh VHflܘByz9 Ç{t<v6iJTZŇĦg}"ngO9l3 pMNk|)7LX8_ڠI<\FL04!5Z^jӆ9<qq?Z^_$ȵ4ftamv6QՃc<#kYXuqYhD&̈́y W?>nG" l֍ֵMKZrvt@2k嚢fNTg!]Oq[x !u4JYqъ E+*j>,i,>-OT=<"'dXý%">iy",'0(AvI[tGj&[\V.̗eS񆕙%VfԸ*{:{L 4hP 4nŎ(g7y3\ﻏJJJ2=AKfL; X7=vڠ HG^qʇ)sĥH&%i21H0i"5ei i&MAdH4UY iJLd;scj,xv.v-vjBKJY3`azn{Zm 6 d5eufTjYԓ8 醬Jk']1>1;y[Nthywܢ/ȸܳG, $juƓwD} ִQ>> dF/Go…;Sԍ'{@:y{"3S,־lwXb~2lpҁX̼Qv AIaţkO O/$~KZu];v6cY_9&Æum&M#FtJQ+N:*$KiY 2M2/wO/Vz4_zޅ2!cSf3ϛBHM#dΏhҪt3G ➛FJS[ iL_p5о/3^(!8!ZkZ:b=J(!:f:x/zߢi34L$(Jy':uj=ѣGgCO1$v* $ҰXIT YoG9'OEă k5mĕC%E@2Q ۅ{V& 0-LnhVΝ;?P($5{9t2k #*eCKJp K. Bv ]pm\[Ϟﯿ::ˤUNH-ߥK*YU$~?;=XaaafKQƔp;!ѬHc٘=zԩ:lӦM;haX B^I?w%q~qK\IK'WIϨfi^cTtQI@`BO9IFDMIS*fv}4d$xi Vf~ן.C^sEW֧n!Sk?LA'iK)Vf)--z;v?١^M&ӌt)hAO?gYPPl_҃W+rd$SϕW^r6m h^C>HFMPc⋓Sc\uqtIة eNNqτ -[6l0?Dv~3g<ئ\YDNjk(+31Zl9rH)ykхY^01VfV$`e2`m$`a@Ip@r|Y2*e`eG&di($S c)9%_&[Vf׮ 6ظDUDcԷo_"Zjk)xEUK* ^2͵3їD6fg+K&@2-py*D 2(T:3T*ob gi1l[ۣ\R4r?D&f&Z߾}j"P1gaJB@%Sd{ "*"Fԕ b!׶BT+BVZ"2i.%*=ܮNSV"N}@22DZnL@Nϵٓ,K^gUspy0\P$Z"P8NiS5k5S8HfI^j Ԧp*PMlf|;q؎Y`MG6-r $5׸#z,1K0"*g-R;m]OBab½ |n_EdkzL՗ dЭѣGĊJpjVf\9XV& @6aOg%E@2H&Pd/[7YYrǖ7j㏸ l ɬuvG%v%KlhcV /PU#⭈#UDyJ9(+)3&_yoڹXkOxx҂Ee) 7&vqFn#ZϨ/ыD۲#X=E=$MߎEcrS$3%i駅[Q#}8`y(!j@ar;tL#>/ڱ5<'\Cc*B;V%WQ8J%:RE BQRʫ" uqGƍcqF;VtJ#c`3f1' LS)UO5`PD"N&&@2,gQ=.DzAb/3zhE,L-Us3O@$yf֧*a5ULH&L=j- H& /縗 RѣG_:ALZJ|D"Dۈ"e )dg$ShѕD#*&7>5u@v2hQ =DwYоSHX`e2Dˈ MGtћD[!ҕ­6SHBۭ$F2 !N$jDd{ݮWQ*ş;?KYH1xRd!Y1[A?"QO$jIѯ 襵h-gH絳%5T ))Q1D ZA:Qibiؗ";bBHaI r1vD͉m{:L# 9 &JrD2h/є.b*s̆5sze<YMT`L-lZ\tڣ~5~PzOjRkq tf-ϾY܄e Xt%Rk]ƭ7\qdf0\pe6vb<$H& @$PH&2L H&*.H& B( dFT?t|@2S1"ˈ>! 1"UR[$J&_.S>w9 @2 HfDsN! }Z2 7ΆGD-UhADJ Dˉ$FOԉh.U+P$:|p"S ~s>"*_0Od D^iD!{VFBjk'q!Si.FE3/Ehɬ9""jCԇh-DD3uVcOh[Mf^qD4enAtZ2m%"<&Hd4~0&e 4~& $3IWuKvOnBt|"orU :O*[kӘx&)N"Q#)_1H&(l,frw+SK$r-#@TRbR?Cܒ$zw.`%_E I&nLKDEDG !=]kzh $ޚVKD ?N!*!H%G KhKlf4q d:m!ZA44y YA^D}姠 ۷T o J^?db* W$ʈDjK͊Ѭ) &L$.Ft(y?&&$93-^B2LϛB@2=7F!T( @2H&rl1V3;nKqD1yLk_^NMl)7$R{eL(evCGhڴb'ϼL}Yd'f*̴h?E æh)n?_"W:1b-6OI Vf%YnCT u)$!uXiG`|lܑ;@YoKe}e"~Zu).Ri^dQ/ č:&EQ `WZ̈́jB/%:fӥ=H3#-d[RkqjC [4]oV֏M/Ig%ĽښP$vH ݲ&r @2Bܥ លF R Wiڴ) P$g S u1;tPl @V2H& dL @2H& dL @2H&(ߓi)^irgA ꧕I{hی6--,겤Hknmj7Y[}Ica*kz+^*>uhk*.:眙bͳۉ)͉E{!v2"3 /-Ǚ$Doگ 6PJYkĒhA%jQtP`s sF7[ݣ֬hױ+ȺigE:-'J7d͚_\\3tLRNY_d$@2ŐOH&XLLZ"dO(E>!lHQ$)LKf_'i'W #8~L<ߙg1A5NrRW ̒$rG2)JSr+\ T.DS̴e >-3/Eh T>(b,0Kd@: GxZRC-&+.>73O5oS2)Fk I2i9J  JW>1&^d̰4Nf̺LH'(OY Q* (EK/CT>J~2 {%3CޝK/{W1]tSSG1ׂB2 $ޚVdLA 4mŬ?[n< L3d$@2(|B2ʄddH&@ L:>7d=7F>1X0@1f*k `eL EX W5gϮ? (Kc="P$Sg_J%,?@!Sթf`p8`e `0XUUDFhsιf9 LwwDgߡ^zqXyIۋ~8ϓ:>s94 F9pyX<] Z)8}`?5Ϧh/p{rۅ[܎i%yKK=i I}rI9k[Ƿ\Hx@lscrsɮqhH)3mGpr},H.fX$9וjekp&\5 SIc;rTIÜcO`3- 1!ҌvhLdk^\Ƅ屒И5,7c J֚nd52cdETޫ"FcQLQ5fR3x<(p8X\|y>l<$8O\en13KĒ[YLnN8[[ʫ,=mH,j5sIS<5*̭Fjr"qCJ¡K'r2LdM6q08 3i~xCUޥ{v;ߟs0*&x<Q;]vLh4rTSRD"d<<w:ŭ /[ekĭhk)!2R2kә:LJɫ-6 G2XT&\(Y15A Ά,&{*x.y,םKIGV[x\2I3fj u%3t`ruJ\Oʹƣq/¹bnl.+6LV )D))uѬlzKv:%fnQ2YYs*NM^:̼.+ũ`U]Ei/:33c v[3M9^RxG~~~J8DU%tZʒňYι:RLնUiq@jc>WLp&he_2̀q}^Yd~PUSK3c]oNS4q[RVƥR2Vf, {OfG{\zF5eKɗ` .CdTD&/(`_ʲ^ү 볪 2MH^>rg!-L+7$LEIHl0-fPsLT)梘:%a3[LtVrm4@eh,e)3eܖ]C4~>ujӬ˅uEP%8~XD*ipjv5[|0CۈɦS/u;5eh]0f&Q]1^K[(RI MF2.$ө rPDlL4@-_#y\QSB6Vff%7(Igz&ⳔZےvtԸ4:5ISJ&KN򑱉9/}祡;׸KN#h-ڹ7RoJt%Wws⌳!jK)WI{9҅-&&d2Z7xf,BLq璍쥰{ &fee}r5%ca#,d10SIIgz̦)ζEcČJ5+I3QczaYJeZ-aO$6ZÌM)5H+p"B0Zt f d8XÂR;Ķ^5q\ѾҾdU%iWBTsRSܓZ<0H;vUI2ӑ6Zifb5&$֖>&%45j \t}.48/-6gNyI&#,,'_rm_V+Mëfe g%3Ծd|H1HCcsiX'x2IvQ))Bd1' Œ eK:!tc vNWKRV zi bܴd5Ed&~_^uZKb_L+X):6R[sJ2kaIk&-Ia(f璬]da?֦4u2FrUh&_Fq5Kݚ+ }} KLSurܖ[U"i7+~#%W%^NieGJNMDs;oLQ~sa%С'zY^ |o=dc x.'{Vo5şFXK2]9ruhߎm[g7nhoڝRz㏏?=zMn~)nܸ'H$gV~r{kǚ4%W~Y\cl)%wUZ)t9fؾc1jZ1ec?ϻ.K^Tt?W_|ޱ}$+cnK2pI{.5`ْ˗"GL%$`ر]kZ {5i7l mڴyϽ{;?oܸqJ`qq1$4,,LQNySK*TMIgSN|m}gݷk~"z}ڟM 3e#wUim]젡}wla/Vs7_c;0]hLpĘjlO,-ܖ{b))e5Nq;2&ɧ]֌Tg^Rm/ŕcw3ʛ,dʘC6 ǪMKh4濼}]>zߗ- [_K<)[?cƴO?i5Y$IX\4P\Hԫ^\}͜&߳ɝnڹh,ŝ\cI.ɖ傹+LzkIt KꄖaNI]MY#}jb]&^x,W1]fKX8?OSzܻgY {2$/dX ;>={^~ehVfy2S7:@ōU2yk~޻) S:T:@DhH DJbz=CW.Hi9:ݵ;>^&Ϯ NWCD>W=Ҳm3` ߡ͛S:XZY^)uy9r.)zCDtI<#G|3  XtÞx=zvݸ~~t^pY}{UUu*'>EPln'p)?f GCyA 懝;|Rݺwχ?סcwh`1L'!CG8_o%d֔<6Z*^5+^|mW\N"Z0ߍ{0{,byޙ\sOW?zo9qLǶ׻~LYQB{Y=kg" #|W:72yhEO˾zE㈨]a+%=g_ڣMU)x}S&駾S]F'<4ok|2{>DtuWD%|۶_'O{p\'M! {λ~5k~{J//glߡ /sϝ9{ZAAرF^Zϻ\S KF*_{/BLw8p 7 [k|>aÆ_G=m4($~3/3c/Ԯ@R2Y$p#<^r>m+vcz@F~,'~Ɵty-WRz (6iҨ)'?W<>qwA%rjDymp4;ڷuj86S={[n 7x[6tu:thŕogQϻv? Hf}j_ܿ6_ӝE3ܧ+ӧu*WC_Wu@E܊?GC)Cw}9\E jѪn{e/>[1n1Y:ME~yjk'CC4zJߜܢUᷫ7pI \f/oWÁ(Sw_#`0TeR4> CG#@HcoR^^(źy|?|oF۽*\v>jȬiEEKTE/3,e_uWE*Y0oџV9.]cC\wcԻoP4ʿ@8p UeKz=.=bQYYIS~s4:唓9?%3#F#F\ةSիYd (oy6]OҺM'UȻ>^;v;<1'|ꩧ={Tpxرf@2빙??[|ܭѹƘؐӘ)3S|tww[4/U;r隣5 }%߮kPيm[w͟Ӏ-?or֍zY']̄7#ᰒ>g8;Yr]o*"zmG?];N lW[2s|Q29mLֲus5¾R%<R[l1ER-8q/Ioݲt6{MՐŋ͜:w3:gւ-уO=g=z4p_;s}I)[FnSD<#_,\yEBDoV82goxKƪe6m|Z{W_?s1ŚnnSlIDATqÆ qTaÆ k׮`z[4EL ,퍌%{s7XM?؈{z@l-E\\?:ֶe3Сc:NgPK.].'4=d^mG.6fSu6<'{dy^yɇQޣۥ]2~@ȑr@|jsE"`m~%O?ϩb:Iw}:e:RWI>:_{ T8&LXx8Z'>2U5O>|Gf@2뽕Y-LT9z!ӳp<[ȤޢSsRrW |nfz%/sܺigf GfO[[[Ѥw>#r>zCnt'm$% 04'~؋}f]>YRQ^>SNx1dͷ?-FS?tqHs{]ڬyy+sf~&MЄ,j?mQf޻ٻw0a͏7uM L;w;gߟ~H5oI~"VJ*͊DC/"zc啯AePӖ^&T*epoGm$Ev- ;+zɁ:Mn򫮿P >Zs>ݞ~ߍ{ a*R(y` |$e`H۴Qaގ>|oͿZS+5I"eb@P7<])\7R$P/1zjX<V!Dpg.7:uTݼyǫ.U7p8s/hDDzvɓ9_7S䮻+={,++r4X?iKO=.W{nH#1d&&d5x8Iٵ_Ͽ9k?(~p巫{1ѻM \"˜.Iز}y÷'Z93bެ!}x\W_|u)!x__dž5E Μ>o,ygW֮pmUmݲ/zUX~qX&y_Xdؐ+ڨYC[R¿_nާE/>xxԲ+7l-꭮TwϞ<قgL5bإMoLa">M>;o%셎k>|uUD / jO>䥗^J dڵb;w~! VYfE^g[_e̘1sK7ExʩY# FY:q0qr.\"D4펩%Է^oЩD͊KU?U߳{--/.Z Ͽ{[/=.15S4~-ymIA|irMYK ?-ZfgΉrbcwl߽rCysN;8^{@\YBeуϗ WY>\Æ[lo2]'u󔓜.=^miim 8#XbWGij3N [rg{sU+W ڷ]X<_5:yoÊUK{:eecf<|%oYY[n%vΙqWztsk$ʱ;~ߴiӦM o醶kO㩣}gG#R7Rrw0P*1;V<Ԩ^tˤj-[BݾXvq`Lj{K.E=I;>MƥLzـx.{˕y O_d\"`om{Iqw&;΍Q$=ָ4ȤmTJ˞]ʑ2YIn%Y%ݞĒ4[ۻ;%%`\^ݡKnE O?=6!ml[bKK;+Le˰GuM"T^@M`oJgO1&yh$+'^$)3VRnZk*T]1ZۖjN ǐ82dcΥv$-g8nشy9@)LZӠRyjkP1zŤ<)xZO+#Th\̯TUsCOSb^t4%'ӧ/mٰl.RIdnZeO8CJ28h%\/hU[2=>ҦJF91rc1VE^"Y0ngk]0y:R*U3,Ke'(Ж1飭%>dB/h;Vi*qȞL%T}zZ[eKVҴӛۖ +SPes4).wrןoD M;ckDzll0I'JVe*<`_8X*k[Sߕl[1R c12c^2/>-F2DBm ,i^Yr}!V-גChXK /ȼ,#U-W`pHL_O% .sbXw9QON1Ջgbo Y}fq8&2VFkra2C-OضT}w0asd'oX޹C0gcX2/!|}雜nڦ0Ro"LYRj bZ+5hD#ʰG繪>R%Vu.y@e]YP=?KJS2+'` oe+{TuA<\:/%Ͽ')~[XTfkE֦u܂GNuj/ê6zXţ-Vb;y\z>8J0/w{?x@y昣_ VM%椭L@Rz_O&l2,5/*BAfm)gcHfu.y@esHnmhIR.Lg^U^:E&`5°TEh"nYoH%VCïc,Sv#orIJ S㶄R%sTͶToX2/H/p1߲\I93y  eLTYIGj)j6ro=ƣG-U\R f;j[:r^"y1YqChǚvU|XǞ{0ٜPn$ [ay,Xږؖ*UbEWWb\ռd^޿?rB̒޼yE!2뺿"){QDHFW?ݕ~@:2%p$B!2B!B=W_tww7q7[!e&VW@YSZw#doAX@<;ퟶvYO: !2Z+e&#V!Դ5m|$8W@bzM1)3v3!2/ >'elsOBy0c{!Dy^Igw:o?r=Ċ"2nN›ɝ_za!!LBd"Bd"Bz^-7HI.!Y~Lb@$@("Bיe}BdVϿrGBI.޿tݪIENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerThumbnail.png0000644000175000017500000005743313063003367027157 0ustar mans0954mans0954PNG  IHDRQb pHYs  tIMEY>T IDATxwߒne_ #9f) t_JiRJ[h-Y%iB2HI.{'g[d[پד{[>>~G h,\`3AzspN UƠ|3q0 IC̥igN)&\S^VUcd5+39픶u.i-ViauqKxX*pv4&ɣ7hhj; %K7{Ip0wT;:_ƶ?1KUg4 <[o<UphW^jGOYe\ȗ36#lؑ^1 ΞVǤ/nv-Mh󳿜K?zr(m0{0"[-+ǯM9w<>#\2whѢ,e)s=I!7cZ^'%+ߘJtņO+vGiKI/\iD%<̩r|uyDTnޗg${ox_MYV?W.5|~mGK՞p`]u Q\{sin>QID|kMGz<"?4>a*Ѷ2,Ͷ7)Dۗe_CWo{|ȹeM~ )?/v[Nn]D;0 W|&onK9A/rrAy)DtlrM3gWr/?|Rys/Y؟6=v;o~erDfD1]Hlݤ}s3//ű;gQ;mi8mjLO іM`mufuҕC{- Kn8%W_/]7x<…MuQnN۳ƤFi>"e*aԏޜsf׾;a!3q!I_rsZg4q C̸+{йeM{L-'KhP^ό;.Ԓ_;^&v - )zgUx.~}?~oN5]vռ8ge5qsZljl;T^6dPfo":WL%b^Y]gOߞʉVQ~9.׶Teֽ-:[V7ql+Ԏ=s@O/EEDy7@/sґ{I3Pl*sT f]5ǟTwg?xqĒ޹|Xpb֏|G~wŧW8ޝ*+&w/nsk޼|ɎQɲ=n'trMDDy|f9ܚR\_뮿__!7ϯ:ԝ/u9O'M!nIp`${w 5Ix\ .lwĐ?NͿ_4cMO a/|ޞ[ešyɉCxb7ffOHޏkӦM_OsXJz܌4m1FDEٳ1~.{yq*O|o{ow}a?<%:Ů=OOzEgvs@D{nGR@AAAPd)T p?qq3s-^T_ j]}TD6҇}vzo^rr2N&eNň2r\WUQT _{q:089 Puj.c7e "~saԋ9yY'*hڴi^ץ=쁇MRMw .kOz!Չz:ujQQjNEEE.+ֹڵᄡDwk-JЎOg2^C\T.2v.S,e9Ƴd]8o]^0&j _۠*0}GD<^ynO[[[#.-[ȯH~ NjI0UD+йpݯpw .lekHw3gEoJۼysRRu;Nz߈RW]0vPG}#ua;ZjQ-ZTVTXV|o&IE%6 x8We L]]+T T "@վDxDauQڌ駟 / \ՆgXbpmvjJ߿w"!F$q Q^vBjb~n. F(^ aUF?xzig+}RȲLRXXHDׯiaaB"f&J+t!iii/4. GOcY_|q)fsLLh/ 644$''3 qAO>ݧOwyyo+*rrr/-+cH$0D IÇ ww-C}rh끊#z0sX|ef߶4GB6*Ua_?Hz@ӧE@ŋ]KGxIH3m[#a+0LNNNff$͠aT1..n;՗ qqqqMMMgΜնޣZe۳bb{ʙ:yZ}}IJ(@: D`(-+w5Jj{Zo2$ f.51f2Uơ*f_+\U9ҧ~*Q>/~G-l\4[zzߤ}ꘘ"ھh[XO?~k is%'''&& A8$8369c%%%MMMgyWFkEQmnn>w\^^5fKbjjf$M4ٳ\ eZ0L{6lxeUy||=zaߩ }%QYH5(K2gVEs2V7h\GyDɞ(kq.OK/TQQYK?sϏd jX, iii'pGIIfSZ߾} gΜQh4˧5JWen[,"ٳn fooX,U=bbbN>aw8FΈ 1,# "0/fdf9z##?R=fO8Cx>2^VsMv(=ն J ٳ!0aϿaիWѼy,+7!AIHHy>--l6 ?Dˌ333}JBʒ第)qqܹfg%Ε/R<j[Qm߾}+bbb㯘QX]]u&I$AXb222>lD^Gߟi3u@^G8(C~n¯{⟇ܳX8H zh#~,//կ~5 'wo|t@N(/Ryyߍ/(Y yV\eeezzzPZ(,&''ld' \ÀK?叜@MMMJJQ"%&ɶ $%%1 S[[+I_ER]]jSS.\8~豥O'rhx"u6Xv$J'0o5şқ]9!2iw^9UVV&>)-/cǎnjر$)0 3r(IJ.[Y}Uzd2I ܒ䄄8 |T*ך=+I6!!!!!y`0hBjJCz3rOk-+a 9GD17N=w7,̅+t<;FSYΉZwUԔ{:O_wuUn|kIyv'e^j. z"0 ?r nLL$@ &ASQoTRV쀈hLKK }d]BJ<ODm|ZwffeGiyuuIcmM\\OEVL1q=*7-.XPԍ7~GZٳDK^ԕ}n墐1TcYmZd`L񻷾>@"Rt ro\Q"j[ML41--}ǎCGIq䊂tt^wǍ:_$axohh0ͽ{A*F2[Ȳlcc 555(viѨ}-7n ϋ&OQƋRQ% tLXX;ZQ96_ǨVEɰ!q7޻njxT z!&&.T'ma^5n"/w*sE .\oGİ,+;~`l6O2Nڕ455<6( W*J1[ANJJRoрN?ݳ|zz!HF$0$ 1"#M$"J7:xG87;~Y UiD3d;ۃ- Mc@5!pѰR1"H"ÈiI$bD""o7( ѨIkZ/Ա:뻯/+~֎12e o-}і9̨ogDj榦6>X5 uc޽{ɺ 7<^̬Zn>l1[V"x>))EEQQ$(2K']?\1 #Bcc#q999&\jAU,T#0XSS#s862gm6WBmmmeeemmíNŔ-\4(pLsAm0tq[0$^9czյ8xF ʲgC?6o4++o2GO<+7\]J2dW_}յkW"8yxvV͖*euIJF#{J}.y'1 S]]mXO c &ji_6...''gak=}3^3Ej76;B{NVޙ̔A}3ze%&Ę|59ty^ äS g_ t[~lzq]:Fg^rQx({Q'Jrc[v&]j677'&&k]999VګWD"Ŷf:w =+ճB\\\srrhmmii_a1W cn,{j\uo>c8,[Sg䒒so>rE2qLSc}IOݍ/\@g;QxR[^쭠l쥗m6={JUd!77W~y~4%$$Heb6U_ ôX,qZ fٜ$W>OHL&Cm2M, &S l8꽐ʊw{?qoى*9֑ __C=ݍ '}/޸bU2-^6u)ӬVkcckjjZmmmLYKKKɑzIJ,0kElX,RZřL&bZFh_}ZUU)g<$C KUp8Nt{_OT%zyX/>UqErwSO`4nɓ{(?77ܵLyDdXL&SJJJ޽Ahoo~J b >dOB0LR{8Ac p X@u}rv;yҔmbΞmno\6%?egǏƌZ.Aw FqѣGRI R*=R ..:WKV}u O?.kk>Y5fmm)_rKPcMXr _')8u(,뢈͈PO SNfE&I 6GbJ|V60g'pH3G./aE1^=\qp""6#fĊUm&X5XwA=xVu';gnT8/.`)ET2*4,HN0׍QYϋtsgGRmSvAdKkW"I]~Ə}x3 a_)));%^hnV" (jy^t P"ڸ#G%HgǤ1O~v6WVmԧLTlz)9Ia7M}/?^l.].p6inMTFñ^{`ּ6T7MDt  IDAT']1sk;boP"αty\E--u7C?GB?q7;vߒM~*>$o;hদ&w3H aN?!tںVc&"uE(6mƌR[nK6 p O~J vL|> 'N8qbn T=Hy[$rTЋGI>=v̸&AryP @ɖGw|5ݏ-OZ\5:d-%"#ۣ <%N>- ?VZ堕MHXEk>YCKԋe7 bGm'ΪU"cϨl(!OPtLEX8%_r,\[gVNtr^媵W˪mZ^ z^T=-<`gJR & 0O,c4LFCِ7aXOaCrIQNt+Qh;vK8Wo71rDˉWՆjYK GI> #\P.{w?].{nљK,OT."\y]jE=mR9~ixgvN ڍE6x">:r9W3~X،>HHİ`+mYI4C|\Lv2ӥdyffZ<׊ A6a!zкU]wZ֝(U=l`ʍw-f켠lV?[U5 ;O:aY엟!=\_;q0aDQPVamkNOfܶq aRQET΢q^ kkh7ͿxϹUk7t [\O2yjFFFuu0Ml|F}x3󼭹aҤ73= [XZa8FGV7xh>״Qy`n "M\7SzrrUUUDqlC5z>\eUݙMgk6Z[[䦷,F cs;ȅG/4iƝvkhQ0 ls V]BᬗlRkW_Bi _7C2mp˿n\Fwʤ$XN3 _^ْ [O4f}fG655}$%L?ɥ(|_~^/H0΄0s(nuJ8 G 9IQ~GrPM/|v"wZeMK.~ 4ÑػcبI89JS?[ U;;w:7}iȵMMMϷ=V=st)#0y^G.qLόO:dhnnq8~aݵjM~k_NBOgNf^-u{K|Q/ ^zXvӦMϝlV|dԄ]6s6nohhj׵F 8 'M?InZ[[[[[[kk/TT`  &W  2dpz-D(Ajl6=zdQlyv Rfbƈ{|-Vmhr̛c i>B@\[ -?G%uMwh -5 HD-,]+UvߝlQbGϏ} ZJzzj%8 ,@v/_|rwo+MF9]mg>v&ySMQ't!x4װNw]ˢ[,w+G֑}joOU=Q9'jĶ@]#\(qNu)A7qH D53jG ckݘzzQ\\<|ɫ+֬ݴir+Yxů]@AZjxT#@ jT P-t _>)!u-(D$\rt߰ zgOSNq@TѮׯ_ `ίy_k+}Zz.yWϾpk_e߂ h9jג]n\%Pu)Cf {%Դ$]JpPmºWRy.? F@lɛ==kPmd dUyK z]JS/-,-?F |d_SLt7U"jKLRei.AԥO*b[6j^n-?՝'*oZuoFQ!c2k`pr3<@T 2@jT P-BzieD4oZUq[]H ]5HYTP ycTWYKM}TE@QFQ*%x0*1P.&~|iFC`҃AUЇ @"@Shr^඘Fp:A{V . 6J,–WB+Ҿ9-a q:am%$t1 A jT P-ZP-Jaaj냷`j} ,~m⥅)kSoUFvtK;LS~[XX("J:3+7'5U\Х]JViRe.5HU_U dpsP+h2*-@QRP&Qޢ6( $g}J;D s j,X;3#N^_Cl[s.pR"#=C~aݵkWĪ7@rutvΖtNx'"a'NQ-q%((zߎ{euud%#Y]E )..@I5>@Jj[ 7 Z\36™91ʦoP @j3?SMYEϽW~%/&ՆEϽ!K: 7/ޤ?_x)^gQmǼ\vu@=/EEz*WIuǂ )x s\JDvMrz-< s\JDa=+8c[Zht/x6(9j@E J"zZ _% s7[ p18"5\]'{?mӢP@/N$( $"hK y8T+݄JPo $QlذԙSf0`,Ζ}lotʨk}|ΟrSIsM^~%)m(WB*KS{}ҟr<8 ڐFeG74 ᒺġmEZjzvvt>uG^˔^MUx=Qί@TIQ v|>CrzǍ*2G\b#STz9V-,,tPW5꭯gU+j)W+ƦLp6oh5z4Uk{Ta%>•[Ĺ ( [D fmvn6r=SbeYQzJ 9uWydp5r8[|G1)$b4PS|JYTӼA"#\ZD /FSb~?^nޔ{vþxVl~cD()aZΩSuVil'̷f_g/V@W$Yy/ܹP-ڄK^Xu%Zd$΅jAA8a%F,\/_ɼ È%jArLxvبIhg!"UK>3pʶP-BjioppNUa]ae]e[tV*EQzlͳL긌1 {Ӌ**fS$ɲ7i:A,r'eYAĶP-5G6'RI̺δye% q Q-S^޼ja6LgbDng}*<̟}悂F5jJ8NV㔿HH2!4…jA4ijWY"}nQ@͌(6t.*WYrZٳ:+@ͩSu+VjowXZe\Xd|ϋaM]­/O`9c&޿#7O6*kZm6nw8yA3ՂȎg}ϊKoy2{ P^b=D??z g%nwTNz~FB~UyGvDt`Srr0+UAN)!mhb[D Yy/UWor<m%Eֳmy/օ{ gӯ}r}4oVb/s1׋6mܬkWj,T- AN ԑUeZloRn>q}en}/>?h;Y+/>EyUʞ3Ǹ|}՛..[c޾(ϽlnmA-͆mԲw_8~K۾u}牲ͬg" 3(9ǟclՈsV~ m Ղy#|NƱ6:.ՂHgW> p?qqBQj"T kn,jA7lh߮Ӿ5D3Ñ $ГGc.@T @.2@T P-@Z:ʠc. (\rjt̅jzv1jԨ#FxADOv8 hii!L  p[ @innA~kZ?}t @T >ܹsܸq3f̐{5Zt#11V+?8 jЍÇ?FIDATj+ ^@9eTБ+V0n>!"_yᇽv׮]8f $E=9|$E&L1@֮]KDἑEWa1gϞajRo+߯:QNNN8oUv̝;w.qh4fcX&@V[/Z ;Dk& 0S LjO䎹ԩ;:.;cj~xˏ;t8"j# Qu5kl|g&f ^FL&n<VjEə3VVyux&[b[<%6l͖;iӦQFcn7gW:ppVҥ55m8x8vQlXQWW6ٰPmSmŊC𬖼x /f̘1c ٰVmCCҥqƳ#Y".z³1 gxVZ 45><%o0`(xlꐟ2(U@$ 2оl;ɨ =AJA=2ZJg ճ+V۳]Zg٥K^}դ3vSxŒR`<!<.P-l7,%|qq燄ǛrE#rXȹs Ƴ65}³QjmmmUv̕=gY(+Wܳj7g+V9R} YC<{㌉nqјȄj[[oꘫgj[ZLD&!nجx6lHU+=Gyx6Zy'P lV"gΞ j!C,]̙3kݳvώ]^Bڦ&.n Q|**Z>!0!uP7gΝ;bbbf̘cnu5k0$z($6 gAxҏ髚'555=[R'v(D6֎<۝6lX}}'D g6Zus$vDzegnM||m݆zx/O;"ˆg b8qӢ2L#~Y".Qd9 7g,.\hܼevϪg5b2q,lDu1U{[AƞZً⥥8N]yr {kkyxvSoҦo)%2vK֌hV;x(xSSSSSSCD xnTώyX]]i)g̙^9rHh,8X^.fgg &l4ZL&d1Fe9XeaU[[˶RN^^ *2g;%YVafxx?ʱl,jt˝l555 U-Xc hdF5q,DZ 2YUۻQ-@N<`RRR$!!fĈ>-{̙޽{?N:%ݻ'Nq\ogO(77ĉ%%%eeee ԩS333Ϟ=[PP"gCCn?{l~VnKHH7 SN]pa߾}>ݳjkk;p@[[(ȑ#ٳv]?|١ .JAh)0??e%JwfϞ_!^{jJUU1+W¢ z`P-ZjZ tA%@ ""* P-@ZjT ZP-@jT P-Zj@jtK ""#2ZZГRz%;""yϧݻ#} 80Ǝ%:rΟ'Q-C}=}X -\H  N>bndZ2 C3-_NH >Ѝ7ҬYߺS[L+s@T  xUhJ5ޕyW48vbs׾ 0o;&1j8[gI)ct)8M6 ~mRHྜྷ.g'r"`41LoE\$0,r,I,Ǒ Ȓu lC#>QHUk0Dʡ#˲1 DzIJGcPT dWȒX Ua'BZc/U10?[)eYD5pA:dZ !2]pѳ,kED9 yV/&.ĶFaBzLI )q[eY8Jl++ }`UTT( l6{(WDz"UWTErCYJ QYQX㸋,0 Y!mȴq&"chOJe9²3ʁl[wL'jjjoy>3yᰇ<23OluUđU)hβ,'/0< rBZ"2,%.0L12]0 8@8#FVҳL(sH D_1+Dllv\]rH˱H$rA)ð YczEFE!9'2EJٶ`4LR:HS%mP8 Y=.UFIٴ3+ $*n96Dj2ň%y!%,Y"pvؖ E=0hRhAYij_t-KDRTKdLx, j8c4:?Jߔv;g0[/f"Z wyij:Vz˒R踹)=>Q"՚LA f<˧Xߨ N`kT+󔺒:7?@ f`/ٖEVH70Ul4Z!XQ-gMHgږa83)6<mmY"A-Ð1öDnØS2qlE \R({I4j#³bcPA(B]Q3nbWn`Uq|fIF!(r,kT>h#e܌6B l(l+m0nucYVg pulF_y&XгPmD Pضړn],Ä;T9>i2E8,2<ϲ,'C \:'Dij!-]꼠Ge\V7'rulnF]ՌA'gCe[)ijǢس9@wPm8~ **:ն=gg5A1,Ty".a$ٖ0 x6 /"? GC<p,x6:AT&E{B,LfeP-@~  WxQ-Y|lfqx`,@< ijz\mx,gQ-@< "!!3,gՂ ƳbZ)\믿5lڴi8VտP)lZjT P-ZP-@ yQ 7 N-E-Zpju-H T P-Zj@QEE /PXXأGdXrssΝ[ol6 0 Bt^});rE9r0 k~7ldKKKW\y}w֭8ؠ yz㏯[N:Eڊ 2Gpjnzw<|M{{((644^+(--k;#n'ظq|VVV.]_~/~3TT#:yz8'$w}_6mdcΜ9_}wҲdo%իsrrꫯȧhzzlْ?GuUmQQu]fHDWƑ!bɒ%}Cu9Onnŋ^@Um||<m߾ ٢(677;yf)3g޽{穩y駇nXb{qnHI(n# o @#2)BGYտ"VDd/ ]^h:^\s߯G;g|<3sFWXQTTX۷ogϞ]n]ppe\Մ|pNNΪUT;s̹s kkkw5w\uw{}^Jww5kwAnvnmm7ye4+˛WׯkСC"QVV[Է}{|edd544XdcH:=՘e\@??&μuVCvv6Wpuvԝw*W6j{zzbcchѢ:fBCCO8gMZ[[/_."z(ohhl6!>>^Uᘘϟ?l_-/""}}}czWyyuuuj5k׮DaZ=m/ZջtGÇ&)11BB""!!!zIII"ϟqqq"JΟ?/"Gqn"RRRBB&iҥKE׆N;ޱ3WVV35j ;W j.\RRn8t܀?ޮNDsqzF===N"aGԺ?L&cgf0;ui/ ))))))ewwwss7jjj.jK^x!"Ɏ>e``@lnnV׋]}V{yuuu~zYWWד'O>}""jL`pBZ{|0;wTWW{"ς 顈 y*x׋Ȩ+׏%O>ݼyspppbbbvvŋcf4)1QݻEq̨ᨆNSR'pݻwWkhhHMM'>~xƍMMMsٹs}]2<իW.O|@@իW?~)}L "ǎ .|޽{.]IHH;M {Lk8p@DN<sJ7mڤn Ȗ-[Tɶmp|P֭[>>>jU6Ǐl>|pZ'??%44TcOMuUuUm(l\CbƭwܳxbC&}## <Ȅ$B"fZ,~ވ$,!i$HԸε385e2Zw֊!P(A3x{(g/ ֺٜZnyMtY4AsVdTTǕGOx'{hL JwD$Df? g!?t`IDo/[\K شD@]1 ӹaÆ4{sذa?Qhw CK(@p $w$ C'BA?캷;y_)\~x bĤnIo :i@Bق5_UQ,z;:#>~sSg΄o?X=y~ܭΕNXPh_Y4v!:߾E/vا2uk7KP}0f E;Fqf#oO۞üO]vɳg65+90yNKkG׼_LD4pW#*T*Q,]@[N!uao/ "bMGE+jr͚Zsœᇳ*C~pM?W}{D$!DTm߾YDz֖ߙ=]gv~O33wܖ K鲱z4IۡW4RRUUVzthhf{3TuwO'| qtUɹpҳԚ[KK>LJ+~[6t_]޳k܆l/E}gMxx "|SWZqK;hך+])h6[x TY޴/ɣO?dDD';zrހ~{m><~{𺏲^Q<<}cG7O>rG'"p7I۞IwN@xj+doӭcm_޷c};ƼpS#V_|rÇ=1qn!"q[{ 4 մFPAa^;05j1Y+3sQQUտ.ݺ_?<}oږh"Z9+tǩD9Yu񢫧$Z=un̪{tS=?;Z ?/.;~]=y o}G+~|w9?7h']1PDyg5?>w5]T {'D;?=^܄䉅k=]9_7t@{7r3=/r{)F{g5=5)mY~oBgsCєۅhE_t0D;袋-eiSei6"wNDDoM(D4ꔶDTկ 6QIhd߶DTiۯ{K(u39:'ӿXQ"4eʚ*[_}mhiEĻ_2ꉓK&W9Y wop|qe!>zcV2miDDT4?zB"+zzO%cq븃EtOtQd3?-îo]|ŒDm7邕\te黗xޱ2ּ{ Ο^~b1q gg񉟈U3YQ/N#]{3DDw"Uc;Z}ji<{w>AD{gsu3??(|]0e㚞}k&o㟌8lM=<>xw,DGqUob}ۯl_*%¾-} >s워Mv7_|ϗ%K,^8$kaܥm I&da}ꯂ# >ڕL(ov᥺׼ SBl=ߥi$Pw5 o4p0 ӟu?/,0 ߲BxBӒ\P_6lXLGr'Bh4H(sNhB${gSHBM1Igee! MAb !uh 0|u!΃H@dX!!TBԔ_b;̋׬Ya͚5hfeEOg,s#a[T3n4QV@ի0懙ܸ\z GݮjژaC6j䏩I#y>hCh)WkmiSI gt_$'5yTjȷQ (եQ@So%݄xZJotV/(L8p&ǨD(p4%`=/Gc,a^a!0aWmX{ũ_\RrAt+Ԏ/-SO=Umʕ:w c'Q1MIw\ h N--N/!D<K!b)H%7KwoKUaPHot_~ۤ>^{iժ՝w9/,69 3?c{cjcݻWk7n.?ɉE_3(YYYUUUvjܸqVVp6t[{ 3k[7oeddÇ5-B4kLӱ洴h{E*dV%T'}*hj}g366mz?OIzg`<|*\jۧ(.&(Y-fVֶ{;ګ'Ln_unlѼE9+&^>m"i >?߇z&]DTQQ[DԵK/. ΝDKiaB)5 krIc&'XI)>ܴif͚i.%%%'{;yQ3Ib&qln|ssP{ƃRSLH=zܵkWfj֝R)QQ§wLOdia&yO~+]Ckwz>;ۆO#2C- ?E_5h8 1~˯?+}+ү9mƩ4ܝ}D֯7oݫOԳKWA"mpYTSSA"JIM{cϿ}ڵpŗ~.]ƢKs\饥zbHfrL#IfjڄUmUFX

>p[&{}})==#%%%meW0e3M=B"|#;\~۹sƍXc7"|>=fYU-..򅞇ዢB3>jNNNzzF 8l}M1%%%j͚53OBApCں㷝,JF^X4Q?-7qѢE=znX؅,TۣC).AD7).:B?_p~Q|RUYՓ؈Y1䔴UᮘEyyѣG[hѤI'4Y&$e5&TUUUTTTVVj.jԨQk}oqP/LF[ pݍ/PUѣzn;%%,##aq50qϽuސe֍زQUU7ntW_}qMNYYUUUFn)hӦM7?׿LؤSHbҐRJ)9rDJٱcdz5s+0%5e/Npq9E"U-8%Qy.~ݷfATG5Ӭ/.z}ee_`oGɉtf ivK͛kvd2 35vV9! _zQEs2(q~!DEEѣGۧM]B\.͛_{ͤw 0 yy#G=zmj7_lܤ}Oj׮ݜ缴|'gy[6<_λήw{qk'999ݺu_zUH)<.mڴfFWSRR&q C I&ڠfZZZjjIȅGMKKk޼ժ1!htMλ.,#T#6D֏7tݙ!Zv7n9;޳SU5?sg^5jIA :uUTT;|pEEEyy&u4j(;;;77WL{ zn !G@$J>/555--M$:)))iiih#Ax+ɜo&ƼD瞵4)ڵ[.'6x׉0`@&Mxuf>kʌh{1}~&#^]SRRR7o޾}{)eeeՄr4m{ݕq;IBh#))) )>kFh5 ! #G ,E6WkG5|킈놥 +5۷oیf\H7hs4^C'7lIZWBh#G92Z褾T#G2o޼w?v-}t:{;vA0uTӵ~1'c6܎icq@ $&sm?|fi. 1w\b̘1FGQgO-ٯZ&?QfEWLvn $c-x_PE[6ٷ7ѓsgN==F ˤj&36>3{tƸ^Ϻ⼛gϾQ?~a.x:FxdB * ~%HD̦h&O[&dB 0dHL߸7"Ifg]PMos m/Z5AX:dK5/,(>S'@MVXUv,dDWrPdr'XPiQiFFJ h{]ka\-B] -={Ѣt4V$FԖJ)ywcЉKӯ<E? |%lq-4bWb@|_)Æ яLeeeZ>WY^m6jԨ@'& Fl^ǣg`.-ùd2ܤjϝ 0!0ZݞV 2L=a$G=n[ ]<X69a0ЩKLݯg+V_oEDeKPBMތsg2?0-k9:a谠A Tp˟ķRfX4ϡ jBX^^^qʪ*ϧ"EhgckK+%[U%_|,JO!YNu}m4o#;zr"C<輳>^y餃IEwiGDE;ըX {4@ *HDɦzf |>m(i+ &F-7k}efU5/8"ڶHl>"j!W׿svάvSImYgŴoF/[{_VvŨ.tD^W;`99hH5Y˗2[_‰e?%i!'wO} سJP/npkԉVVVn}hP54FQ%(TrSORsB対|ܲm >CDED4qD}.ց>fKN@*:BϧCM]! bBZmsm*wJʵsPL1O\?oW [|90yqD[{t?7EDK[N}rO<^zu"SA2k#"R:EF}gZE$N"[d[\Bh2UPs4i!5gwO~znOw#V:"R4k[zX~_P)kTZa4MB-N mWU5 Bh:4@*i#±=.h.j&=o^йw U aV_['Mx 0'ͳ}>~ v 񤧧y<)D(JJJJJJ @ @!!nb­Pyf-)h3qnWskAG3C&wMb"_zH 7&>^null]+s8w`{o2dh,[ WM ^L6`%d!ܱ}}ްYB4NOiܦ;T>u2Kү}:244m/'")pCxYlT^-$I_CVnqB]K?ZMח.봓;ުMv8%?M:͟] DrŰ9Fe+بvѧ}V$<=~o.ٴK(On#N9~۞ïq7RN+Fu#"f2A^hn! -Q² ojc|AZ5oڼI)]oHJ lBtmӎ"t ۠R!$!mpOT w^>wMT\vuXF_-nj+Ϣ a} -qM[S&_O9'{4@w\rMj7}%K6l#"T^:Ac/hя8ѣG7⮧7)$*!<㷞6"r $eHxe&mxzU7DD9~fR]քsS&gԼ@R2h5{ *HTG'T=n%T!.Й!I!Rͬ n 1Bwo|`9$ "fUEл=&D$%IuM"R(>)w]PFWU=t`yv|)O6.?Z)x'=FjX[aroŔ3F& ed gŠ"J)ab0 ^U0p_M>ѯs[_Ӝ{3m*Ua)BD*3BǗ<Rj "X "iJUcGy6, dYShr8Oun,,B◽G= ?AUJѥW_Kɞ1rtu$XeRTP,b yɫO8^ٰKK?16xeU "$ ļאPrۮqA6mL!$v ƛ3] @92HaL_tb" "j!=~m⫝7Ķ s+ʻK~>P\ c|;q '7ٯF8e/ *)j` Ѻ"&B`AGd52xu$5}im|.^:BssOQ"YB1ϫ^0y[i /Q7ϻn[U0V!eB)B0 d^~P8/Ɖ{4sE(J˼ ,:65A7|ͻ W7IzBR`,59V׶yFEC&o b53#E*R;Vx4CA]Y y֭ʒUa؎^_[|Rb$m&E{ b"ACni&ع]IDc&̟;YU*kUB~YŬn~Ijc3SB7WW.)ʳOi޻sN6Yzn|yokZ4ֱef˥q/V^klz:lj I%DQl^b&*y0[s/?oiƯa# o ʲSF}>rWMU;q/L]FH Rze$\6 V0ʶel;IH\8fO!Ҿ57Z a "cר a:;Mum@ڔW}ʔK^fqnP"l;'aXm V2MW&KL(Щ;p\t(]K ),~v,"I$)Ts!PN]l_%pZ{BZG(.?a-ֱ%=I=[:%f{MIu2;ya N8T *߯*%PXR~]*"V\>%Qi؏4VږRBPSOUUa?80 hi /!HJ I:^g8!Y>ٟCw ~oܸq9^'&`H2z|Dnn !WA$]ٶ .KD/<11d#>μ8BEE(lJ!al6Ba"Kc9F9-$SXOдF-sIFol}m m/G&kV _D!4m}Is'j85/>L" dGoPJ7,H8fjP.u96f(B hu҅L=|%Du{hQ(0:͛;w.J@Ho3ӈ3dm9{?F5zh'BXQ!&vF?͛'$20A!@ "l<>=THdGID'_L:gc/feeױN$)󏙉c2pӓTYJ7L<>:颳YE!DMN[`,0/OlAX>I.RY!&r3i(Y@_~ YN:u}K*)}.rΘr ݷU%!Da)rycO?~vs>_r a^~HʤY Y(,>"% hB~z"ZjO&%A%e^hНѺ"&B`A56l`z$`ɚ,^2T#ĂEzƊUK̖Ga&R:G1kQ !E )B nذHoKֲ@,ecZoBPJyUeيCBlٲOKz[PZ V[V 1wCJDBpP3k.Am%k*PY2eQ%DԦMEQa !,B'ڶ`@->BK*HT "fj+Z9H]"~*P;M0@!3hU[0C $lboie ݊pɀ}ha@%_%0QHP!\f5>S)j;By00CE;l0ym/uGJ6ZƟ1N5kVUUz6.Ey٧HYx{6!٫%kY&Pm>W"':@BHDB~uK.9rnf J)}>U^ڙA,9L#@B Ç+:ԷoՄTU=x`EeUnD3o޼1cƼʳa.'E)63CB;i@b"><#GSR.שOQrgllV?Im@}B/qdUUET&PNQnymЎa;w]PVڴiuV jH- >QG @85)>!xugy62@' 7 (N[`,0/OlA`6&=H!ffͬ FdyBxH2 RX3]RaEHsK%uƔ[辚e!mm:5 l|bGX,BذHʤ>N BBa#"y‹ŸSse˳ % &?%A%Շl ֭ߠ1% *b3ɞX@6 -(٠%kƂ<\{P  !V33<M3< $H!E!X b_5At5>R0((D@c;`$P$EZB5äo5V,/TjHԍZ:4^۔[G ݊pJjfK.aww,X H1BAMtQ ̟?޼y *-WURV][@HM8uaXFd‘:At|:6&x,.Xe;Lu?FZfQ2a웼@>Pƨd ;4@=BKQ+-dr"Iɂխu JBAj7],܀'(Y@ @LΝ;w߮_PQ-~v% qr @# D6!*808N[`,0/OlAx? IDATN$)cG7I.R`&H%7*ft}% ™SOORdf)B^~?b""̂}LTXR\RI1/2m8Dd@ Qqqq ameu$XeRHy BBa#"yPoHkڽݨ80!^TR}y u7(DL$tI nk,A|J6Љ"kG",_3LP  !V33<M3< $H!E!X~%j|F|80tˁjb8nhU*w-t}d#)Xs4t! IB/ Lb"Q)I!Z}e8VGc6.OŒ[>|& {K+*t+%CP@m+t49> %|vRƷ((-0%D"c {FƲ RasH{my @DUpF L/ݲ2jsK >%khSq+_T"4Y~&屽#,7n˦'eK G C;zBRjћq?~$Q3 IdAPDIPdB{;TcAu , (jSwEhY&'M3Es@ $R-fsG 5/ZFKIs$hBw% fJ:,paP&=H!ffͬ FdyBxH2 RX3]RaEHsK%uƔ[h.G%QN5ahmeu$XeRHy BBa#"yޖY&,K6>*ޯ%A%Շl8)֭ߠ1% *oey܄3d:;~,Yl)hhs  !V33<M3< $H!E!XhpQ(ѻ]mh qJ6YoȠ9}g50,ˁЪ3NZ[(4muRD7f/*¨#I%է|OALB0JVތu0^@goie#\nE$2F_cX:&@CED4t@59 ɛ4RE*7qi>x%BZKGkI [l yh(nEd5aJY8nVݖm\PGPk-hdV}7rX $>p'zR&wA^>)B,H*kPDB{0n nXP/ANނ 4q$z.yuE/ @bn V#ԁ:5#4:ז@r a:w% fJ:,-g҃!I!Rͬ Ʀ, B# !"",HaAۧtI!E.Sni'Aw6[϶护d /!HJs 5(Y@P:5]h`*i0 Vێdhc~hmwf ZhH@|ih^0լBU!,:Qe?kO(j QeS$l<]DvDU .VXJH6&& 1BQBv8"RB k5 '!`3;d7B.r>upiK̂EfQu(YЉ{0Q Nzp"3)D*U8ı>fyojB 41¼~^!~Ѳ(% b"Q)IZLDd-4` @ b5C#[Z)(H]JdDd-ϑ'CcqAҐxH!tbk"E"c К$1)YN4QFo" 0m4h @=–2AVuD8FHO'|bAafj%iFw/0 K 0 `&E pܬ-m.@~ɚJв4#qV6-(hB4ApI##dr"IɂR!4dhcu , !_G!ar\'$&1#؄ *D9 CP0c'}ޘY}B70tq *B4r0^;mBYìaeF2F^TR}XO͆h I!]R>nF+LD+E%n9^ @] qA1kQ !E )BEI=ƖtҩCGE#50{m@ ,˜rT@#n*E3vQS'"d c\!e/!qU>싖(I%է|D3 Ձmzֻb}To]śDd#^I#zwbVYvJTIQ{TW&8*P x"\B"c L3)4!ylËurA 0jcQV>bF6FHO'})B,H?(j"Lr 7`4,Bx5@L,$qk4*$I`E b!t`@Yq1% aXcu!D8A"Ll' $wM8!025]Inġ8+++?'61N~~>2U7UB#tdYbXG1B a]+PB1B!#a /Z9uI7wH\! #9"01Bna#G@} XubEgBIg4 ]榥Miy+C&LD+gr7~5ݥ]k.NKMԍUG0KcsH%*u0"m#6<s.:Bfub&řbiH`@] a"5#缕Prc>3mqbəz\{jV_j^M[&7%(!5^$PrӋ^x"$"%-4!|z!x<|{ͧs͹1毽}8~9\;V=b=B4')-ٟkYm_p8Y0|^qDBMy^_DxgVL÷mp8xۏr^G>7M>Ip"箟}aW'gC~"/p8"d7p8V&{Еp8No#dFG8^8p8N"dg /Kñ:>~~eƊ> E#䌿,{cñ"?l&uhWI:ǩ༉kH<~9e8gExşp"܆OרI~G%Ép"tp8DxyL~=lZgϞ?xby}}F_qsExN/xHe-Hp8nL{ފInSŜ/bPS8ڲyfdqvDQX3=ԭc;3i O%q;-ǰ֙k>̈/k^B(‰I:BiMbu=[aX.?줬ą 7c!O=^|W̧}"'mӥ'-OX+֟˅'p΂ Bxſx^u&aGo3 ΢^]nqR'2VpW4~~A]V;e?lL^ OZ'Uw$f]:I??SQ'PGh*? G5:v\ZGx kiaFpfWIñ5ٸl'YF xP.l}SՍLK[TmKl(M-y\ xNdp:3;l0ݵqjtss8\nn>qy>Gp8"|ۏmѬ=eqD *I%t:?Ap8=аcqw~s~plO']~tȇ>p8uA{ :c"ep8J|&=uh#XP 6p8mo\k(]u:c"p8Dx!14p8", Xo#䪛"u8QEpUp8DxN^xp8'oF[$t8b"|oP#t85wԲϙcEȩz__{'|@|0Y+!#t89\L'yC8'B?S"\#ML:Ա"lyuI+#܂#t8NQ.)Ա<d8/%\x^2_7_x0~ңZTݸKZ.LkN~GW p8\zzy꒧srgoa\s8w?gǟ%OC}{n~Vጉ=yG=WIBK™k}~?BBu\s87F[?4Oܸ)\YȃWBouΌ&<O/ݿq? XrH+uv.|^=Qy!ħE@7t'HeeukΌ_ώ$; p8?g˅OLճ?).~'~ʊ6؏t=p8%YYc>&p"\?W'{Dg|"É3u,%[5|'@v:Lh"?c1n6sIiԴiv_p8:nMN&%g2Ȁ_I|ԱM9X2X^QWZ Q& Zq5:uۦOnj{I9 loQѸSfV3Z';"CPܟFٵJ32n%KU؋g*eɢrJ oA v!v]\C HO iH Ad; d T L.DM4~%B''!,!!w<`J!BY<ъ/W`8eO`8'r~/Z8UgS+hLBtQ@ð 3p9sctp I]7.ahƃ fMEՠgpyyyuuՓ_Pr[=4:*ͣG̈# )*‰pz'Iz  W3a.\pI ]C'3Š @#$s#Ĭ?b՝$23{3GL/4TOàF/ t먽B|Oc0D~PD:rCJ7~< YE la e7jtfظ@H?9[t,& Ǔ qC,٫U0)r;"l& ;[q°~E`!38 Q0G-ʙ(MGl62yE]WBPC-V5thn`?¸l="PdB3?JR!ĊHGԓM||u3át+gPAׅ>r"P"JoBUN nȳ2MB߃# aÎA2B` v!\X8TAI#k mX@VHaZMRNbBA €cbtHJ44PDQՂBC|ɣǏzRvO~zk##wL] Gt HUP2;^4Q;XPDHd5_xr{WeV0)"j|ɓ$()#Rz)SULEl0= ED/LhI@R"oXɋ>!xwv؂8>%Qk6cxux"xuuɓǏDxqqD." {"̜^Da+ eNcXhƀF.r@þ^hefKGj%]f+P`9Rq`Sc$0i *&˗L@wdPO X0PՅ=d|g`Tvh0nrs Ù*Cj78zj3R*"r?a#8Qbm`!N&׃ q$D>|Ǐ\]]vO:mDq#Չہlg:S&@ W~{a_A,7X>*EٶT4M)V@j䪚+H JI ^3p!M`5(4 G52Ix4#FM%! ?t49yVe& XAL"%z7gjT3DӣNҌG]nJct4|#%YKYR-ӿC#:C/jGM;̈́2gf X+  vr@)YB4)?M)#,[vZ*Hr13AA Uɴ1WQ_ 94L|(Sy7gIR&'LKBt6F r@CH?4{a& GP"+hrѲ'EzQ8.d/}7?ADױK_li'(ib涖`)Hui*PӺOa͒XP3 SaD[Rj2zR+JiNu3_h$YB)kL=06/U)N L=.H#!@cef:ܶVIa^GSmw 3 nb<dbZtԚ)T͓WWW?~!^aR(BIˊj7)'d0ɰ#%CG.Т] $ Jvo0do(*h c3BCBxUwFG`_I ^&DHH%]?fțFsc!vCʎOpaLAG[`hhlKy0fl+⤩M}QwI0Q1,Dj"Y4Ǝt$Ǥ}9A vL>'B>tZ]ftu^Pj}!ؑ3y1+ ."@6?O?U#͚ PJAe%d`,Nd JZmG+_h*l"rG*퉚bseFYhB9z6i۲cHq,^Ekʡ|ʬr2ƞ*3ay"*-\^^>|YƉpSj ZYa#9 ^e KAosMF%9jϐUM%hˁǾ(LJ~GQENC0C$1i9F|L5uI)Z1oH jcq_HLkHDZiCq +!q5z:caN=QFZ&©S(rO![Q;jQGj Y|܌&)jCj*%,5M7VVTZ]6?ٳ[c[4~%PJs5J%*(B7Hmji:1i\$W4vS`A feay&20V!-lԂ8*m=؍D8)R"Y(HIJϥ<5DZ,| (1ql^T}cdr(Ђ6OgM|_fA5XǏ>rdt2I%efqihlS5WA!}qh gHZI#rmȶYY؞5mm}ZvhDMaƻuzPZUTͶ z՝:10] BU+&7f&QUHj|bj.3E!@k& im&7XD꙱Lof7*ra<W9]ݰdlpG8S2r9a>m3Uoi{FL頙فAMP8SC_2Q8'@j} !MM2Or5H|Ԃ^"WQ20dfž`H8*]Y=i@OKEH}ۛʂ둞o҂]UYPh0Ϭca[%LIG[şR_AmBRP2QہfecA %7h JZ,(sJNA $I*mR*-%) `Z5(K95kBr)& I0:c c !~܏--9Nkuil*+N{k,9`'?] w@hΈ)\/cHP7G۩mTUʩ1SXP߀ȂJC&L#Dw`,Y0t (E)tdлI.`*$-=OFޟ-6+*I@ylP!cTV ȚƨV#E 9+ahӜ]c-ѱZD%h&cns2yX3"(+퉖j r0Kzr "lֈj*6̂yt[) ~ V  A,1x=`aZ%mۋR+k*Yw!P4X7c B4豂{"x\8kCD15Ȗ(Po[!-6(e;b6`A\1(ϯ̗YVeYPEoͬAe!էYvi ])dqD'x-2l[y2 &jh XBmע_=*vnS UPM-L 1GpQawŴ2 N-QYcgh)NX2 ffX´LkPl BN7|)`CO ]eEEDj֔jml7[(P+)@ɰ)8ҋvL[dAYPrf)(`E` Rk"C۰|E0Ә'jhp$o~K1\Œ֭U=g_c^CJƁc:3¡#9"K_;MA V# "6FDQe,&b7DiG5VOL72`6y>mmAQylAw6( tV[V?mK@+b`ͬ;=.z7̂Pd/$k9q+\|I0 LQ6E:Lp=Q0[D,D )mS*k7 R^b,tp>VCvZttf%Qh bF5!'ͭA9ݠhy:h=Y IJL\6gzǩ0K6-@f[R #3lSP;fXX* fJɠ,}YfTL/hr9L|ŸFh6=rp7+Eg5T^JWS E@M U19Y,¡; 'ĚѸ}ň(&jYnVٰߐ5Q)jI %5^8xopz Z8w/T-F[b-bդZ,(;6fUFw 3d4_!cӭy,Ҟ=od*7Dh(Qɯ=9?jfYQs"l+ áLb4I.#) 5u2h/XntTzmZS` 6=F<(z@(ÂlL.f(`  ")n뙂0Rc łMfȂ$n: n` |NB\O^"8=EBuNޗ{BįsbgIC((P'A6gq + C1F)(bjrL?Nf݈(&j5K̛hPtoZRdOl(5Aq3Ax=E! =(zvWGZl)yl#E6p[ ;%ŠS+ǔ&(YP;%f,WjM߬A3;ZNj&{ _O7D8#%3X3S=Q4 PYv`9 /@wh%ZAH-OX0;ƙED0],MDx*S,eE)u58ԚLnAgAW3|ګ2dۈ*N=bRllZ,w-L*DNS'dA`{ǂy(Sq"M#a5;d K "n0Lr="oM^6n%Y!qN FAaEL6B@rW f 蝦Ω&|Z:"D Yw̍5Hu2aln 4 zz=&n ³Wdmc_!P)V% eb;GM&'łʽo[N/"|YY,`>_=Eqs"|=ñ2z eMsU ggUtp{ 2vQ(LSpRj 2  y,z7<^eAh,8ʂHY2J?'&5[-gOcS?K S fVbeiPL0(I($4mh>3DmVEwY}Ԕ%(9F[Ym3 9ݠ) "K֠8\絈ԉ\B~%U?4h7@X ̥@,ˋrSP L9m f `zVSJ2Ia5BjKgduDL9BbUX ~V⟅u Dk@( jL_x/@IDATH@YC:b2 2bDtI5R2R5%AVR?xj Bt֦xS4ݦE-:9vyRFע@̷#r^ by*1TScYʛĝa3!* {j *Nfdl#'Mo~k kLƹMGZ|RW=؁PԚh:=ZrZ $Pk`hyzD%MTb%^7D`2DH͐5dH ΂עiSKۤa hJYYhRpkR`byL552 3 6 uLVq b2 *44rkȦn R+zPԉ0i!WTɯ .(@(فͱPsgC+@;#,=S#J+,s:z7Q$:X+Gƙݨ7b BL7AQ'lHrwN`>=Xv(a6@eĠ\#n#}6iupi BN +5K v,XN~Y Ɨ}9 z#mc`vٜ?,^nϖthh_AuShm+"&B,2J^X(BeSáJ2(> ZY0=")aU%~)K4w-|L/AF`V5[00N7XLu"\S]`SaP2PS 3bP6 y1z84h u3Yܚ!X0 McALfA@ PV5(c gxa_n:(Gk,yEY(vjP .CQ띖bAe76QӲHdS&/XTJAA:Dv נ, X UdnLh.‚V|-/f✂g 6TXИޱA,5蝵S蓿?[*V~fri):/ ZejP#aTlj ;br*;h XRi5ii՚KBYB,ۈ'D$<<q3k0D֠R9cc6DN ɯʼimL03b07)FĴb+CԘT%If>sYXPyʤ4&M]dR A%`[G@A_嘌ц'-@reZ?@(*ՁB82A{B+rP+Q읆2 ڧAu RyX/" J by`D Zt΂iw̄'>e7B ,H@c®I1b9uk BIA[cA52D#:ʂy"(XXpgDpкU#1Z5mhVv";;s¡(Hf@c45Ωh:5:YۊB2)%hh0$ 258B6[A=()E7lA֢М,S _~  yYՁhNA#(y'T ł7ɂ0XPJXaAٷq| 8AƜkd &ԭAG#j 霹9q#ӘO#" 6FA vJ|s@%J[N)XE)2 L+Ɉ(eb d`[4rkб)@gW\.c_V?Ta`ML81T(zF v 6sQ͋Ak)VU"ہB8¡Fn A,ڧa툨:f̒A +6{!YFH@Z`@XhfsjQSj^ RC['5w,%h)'Tɏ $ +@،гW?Ta VX8ǵ+P `*@ [fąa TT_Ok58͘KWX $HP%rZZ-ޗ.KgBOr UUw7 %rQAƣxun!C`M@ &[Q$|6%UvB@ .b:8"""33Ӥ7ՌT諌ډ#"5te@ ߟf^xK2 Ed%,5eC>ϹQk!!G٣@Btl\=O%3zhjtR&Δ.PW  }v;Nϒ} #=(t[I/=86r|p:ĻoI w}W#tC6~kw_M勤P)>w/<|S>Pe^)l]PY#^AVc#Y/ * G|ƀ/]v;Rq_VEMu¯]4'wOP0/ Ԙ^584,-xz@nQ* ($ (-\\QKjܽ0طܿiofbh|2I_gV;>xOqK~U;fdL)Ygc~yM"(yP~u< +}f}4~3A~k339u??.Pv_> ?f_F;z!]>;3noGȞt3>MO21i [G"~ޟ(jjo%?~LK7;I^Ku~k`[9JGvxo<W_a>7Άogv`ӏo|]!x3P0,zFjkÁuB9yL}J3Eygu7\ õcs"/ӡw??޴ա9$G54~ӺqІyWW;gW9l1^85[ǠW{xp9}G-*H[tC7x]c] #֭1S w{//x-Η{WCph\o0]Byxloo~wo|>Qt$qkb>tlo#Pq9>·_PtVMagÜ5ka ܿ4-.y؇?L=Xo 3mV@ɦHCx~o :LTȝK[c^I׿ԉ7:\uP~q %{&3e.E>īk5b\-?eV?/a^O[?5y0tigN^0ޓΞS䃈p6% .7v‘p箇vf#3AϮl?0,Z^z?LTېo{3_a~p.$د@!U`㣮P7ec@wxr(@nӸY&ppwx-߼m@JmoCt!o숻T%O=WI$/NkXWڹ{Wl#HZo@N' ’: Ylߩ۩NŮ^6#oԘ8оĻENez؜iSGN>*Q+ԃ&tqx^ ѣxuV5FmY\`сJ8,}<^_]<Sp1t7tWyϭb$ty@i%qLE[.}u뽸F(s`@X_ŭ^R yݗ`h?8^_wbާ3\tssVZpsmQS-P㟭uV]pMj5YFa[{{KQNvv鿁+Kz<(aڤIjAOsאWhǜaΫU;{Gؼ>T]w>heP˷BMYjNƒ}I[08r%2~6C*?/o:]"=q`Jw}cUPhhc(!#_t=eO3 7|1\>(`woDשּX|…7\[ƭזzuf9gl1ߪ){ᚾ+Wpb:}ǣ׿G_p3OlB׆{vAUwG[ "&m@ s{GO^nFKV/>umpycby;ќАUűu'GYZx,ɳ%ŴnqZ Q㠶tZֵ0IsJf'4[*?4ĤjulQo0/HXa h}\jPYϟ?<ݾ)`LT9Q8q*I)ʀ-jd 44j7&Z*5f@= 0 ?ܹsj}Io5?w܀ :b;w7xЌ/Y]I ꇮzЮvI_N061V1hՓci1=WI1[QeO% 6֕2̕@Z]/pCvvy0=iYb1Ƭ찰0umjҺT{MO0:3e7UqȤE _z0K|'-#R=oYYYJy]F>\b^&U"X^{k ڕ`<&d  szJRI*Y,zoHШW%~?q\0Y5<;zIDkW8t)U)D{.r(l+\VVV2rtbmIƢ( yRI`LGA(\;aUsQ|ّf)lGO,|ꮒ$dIP4Ocع+O?*y@X칛6=s,Q{QˌHGFv̈لf!=tWWWl,3$aCDb * ڷor())uppP(AhllC]]]qqjkتX,TK``ɣ䩯7 @$Ex٣r] ߜߤ^/y?4) ʎ xNv %mhο?5񬳀۹gI2J ]s O>mjjrssioG3QAbg;drTA4|Gseg˃7Ԥy{v!!!aT'ՕԊVz:hgg99碣DZX,i׽٠D8;;;998VNP>6pragF%%%uuu*JuT*)J<<ߩ}{ /y.잙t-Ν:P\ X]jo\[۟WXlW^<^s(hTPt xWnM5;W=uƷU7n Q [E3~Ċ 6_~٣ٽkJjh]&I-avvv|>_*ԈD"{{{Ar8T*ՖtɤiCP(|><==@rESϯ|\޽"AQ`,")J›ߩ,RpO6o'Fţ's$*ܥ' %ÃJU -bXҤHRu\ㅶJ%mZGvvvQUU+P@;pmǷСkWzvU{ӊ' ]=z\X:v@'|ܯ'=>z_c"vW+cuV*I3{V:yHbDžG(%L5 caaسJ`a&< prrb,B}[0`9 ( ͢?&JhW}S %ufX/\~1I$E8>p`rX'z8..S㬯#EQ6-&b***h]iU \eeMZoX,\./++'%^2RQY%:e{ɓ'...*{{{0PaӧOiѧ(WUUu:RaX.vwv'.q`x7J,<=p^S~<-kN\qtǮxԞ_#Lkv'$"ڼ;e|:"=p0 cYv0,6, ºĘm_.q+--ussx*ceJNXl H`Mal6o{g^'H4q҈q\6VW[}ɲf xEQf+t֭'x]j ^-R˾=C^3I̐Zurёflc6U:Kcmm-899a&HTq*JǍ wiuΞ_>pؔq*0F]a:,sX1=x/5{G_Wg{wCx@M(I)wȥm;tғE%Y!)$lba,P ]8kڶP(Vqp. Omɹ$)%dD?4rqHRI7 )?۬얤kgPRʦ;P~iqgwioa~1eT'3e>V,&_Xz`]]<p٩Sgd*k^8~|14vvvZ9}Zԇg$YWW׮];PHdTaޞ J1('3Qn+QbѣgYY[xt멦& #ԍ{NܧOz/3,2UEIRixl.Zav֍`?>WHnBA7JkOU)gVxu^CV7Re,[7ObŪښjX?$d /"bGSkݬkj4c՟ ^p8" @!UV* eCC/R1,nbquS%Aq٤Iv\'Vک-Ɏ^^E[f1|)md*EQT&A)\ X@€<,<ʩԧNO>fο[?r멛j$IABme 3ys8$IY1~S"_qޝ7˾VHf~PqXr*NFу"z%0uKJg!+9- V)&ٍ=vWVVv=.f/fsʣfjkkU&Ŧ1*@AƵ$۴%LdhB`,|GG'i]mϼ=|FXzw8~eG&%I5)Hݤ o=j]y=]8cY8slc1 RRJEbr|sD]q(YyoWc]pQ`+g/#:%UrTz=93/{Vn, [+~3n^s?Y[ovppJ$)PҪF6)ZΞfߍ|mbIx MTu X#>}l~oD=zh6r)žO^}ۢ|Y0LTxΝ;4 AF6&eqrrbX$I:99999=yp8S1j&=Gυ ,iT>6W( Þ|=} ?+ZEP]* npuMOy'ħܓy5:0-qouɯ"FRy͡p.c\Q( c*JEY.'=Ү];e-soKEeuAdo˥x\i¢տ IDAT=ߖ7}jr̼\ `aY!Ω#IAP8%'*Icy_v;;{Sg32q DyO}/=EIÇ locXoa/_"rEuu\N^ˮGNT٩wՍP'AVSST*iP(TcֳU wns*pT&E@a=%.9{Av 0< 8U5M"'*HCqAXTj}LV"HG붬OÂ#Œ2q6EQIPJ" 0hlldcSMr |"nx+.QTVHIa 峛2~EEw&xkWќSN3>7R U7UIz"#X"1hj"6qp`ضv'=0(j_(RI>SX(i|RIiOyX__߾}{GGG 4&qi$gEK{\\.dMMML&Hܤ(BqRӦ%(0(0ʿ|uBuߜEa|OV O9y㤼]W'"w#(,ap@#@9^N=o~~~`ϠnH؜X_R`;3P655dt7KkG,"6MZzJ7P$ER J ).b;7ͼpBIoFL# u&,G=>|(rVPv\L ̻-jc<>xLrH$^uHX<3BZWb͇,"ڝKtU(555;w6ՒEU qssdA(RSQ*qr VBsuuu?*g&-=WYS(ɲoۉaXCGG&BA^}YXsQUYc)t ~=Y00RTP(976_,Ě.ry<˥H28n;v|?JL&#IŅba ]><7\*m.n˗/ >apFXYR E^x$$%S( ](veCCHj͸"4*$J py2 (P$JPBQE*Ii3kjjS&saIl6ÃZBU]DK)۷oOQԓ'OM ;_|174tV.@xieeӧ73-=SZ (LZBua׮!ꭐ.zw'&V() H9sz~vO1QCCVN7P6{uӂ TJψ#i_j]]]Y6o\OC$I"Oox<:|Ko|ĵZQ;_]s7<3b{XݛAjmZ%{<>i'~3.>wv[T^.oߞvZ)pԗQ#BL_QL$aVUUEcuV&yyya#g?o7vŇ}덟d@k~<w'>\Sߝ\t$vr6)H6ȯ*x aN:gg_Y,=q$`܋G~mE*|>l6Wz{{{z.vgIN(c&wX&r62f?ڰ%˸\n{Aic_Tr\+oq)񫵪N2}ޏ;1 HN<;oQ#߽t&NVJg`NRL?nܸ^[+<(BË4lP w7cUd2T*urrruu5o֖=<x۾'ދ6&'őd֊)4d@~Ry^nxN:>rx;a#*:(lΝ >lQػg?E?>Ztuu~>I9Տ^@RrIر#-ͰSMёv.|0绸( #D(ҏQ'd\Q]sԗ@(J%5o/p8ڗT~"Ձl6`*c]"hE=&=UFݗOQYu571ǻ MY9<* Z5qq''gC?+P֧Օ >?*k>RܧQvP(v_ $E38^C3id@d2Ymm-dX,HAψsVm ԗzWGأW4e\.ϗdE[HֱjU}ށ6u!PZPamRNhJ TkXq>1L#J6ȐkѭT٭gbzKT9y5?nv "$$];)9]cCb_hc]shזKΝI~(|>=evl+ߗE#IR?j̪ǟWkU.Sev֌rttAAAAAA6JtW -6-WnuH[Vj /e˖ڜU#*f+&z6[޽{ T-ٴ@ ڄU@ ȪE ZT#aʤUR\a-vouv*׎Yj/ G@ Vڕ R[]]j@ @ 6GUb},c]<~w>o4(j$j%Φ1m~Vퟗ>KIKH-9_\ݣױX>i%@&IjUz5бSaPPZ9@NŭQRZ![TjVF ȪTj1 믿tݻM7F /DzzsWqL$9l,7{v١+9Ej/^#_ ੔8s|:񪥍E%/^+ɽvWr#tVATT-V3//>gtHxUYCev%Jր6`wKoUPvA6^^^o$ٗ瘈޽:TK޾ :#&߳+> Z^i.f7,=7CРk |w|mU6ZeH-aݺuk߹w_\ԩȽA(/rqh.JJI-Kc [uVrY`5ZB~7 UվPC;vj[OkKUwbj*f _{z_ i$teckdb,kԳJO7>֐ڡɳ+KFH 8p\]}{zR+j:}?Go3z,1 U7O6[hP0՟Ʀ묞\4*]gLMȼaj hdLi{UfdU[bMm=@F^nU4c (տStݯSCl\󚤺JÃGOKEvT/ozYnlk?6TRa:w#6)} dETJw/`IŚZ5/񬩙a @85*jF#YYr6t;q$?A=;,8NFwWyf-rیz2fF_A|}5O÷:7.^6F a1j"탪gZ9l 5p6Yà ʕ1Cj*jvZ`_kŽ:φŋp!0^"823uN;v 5;I-E-(իu] ؼAN=Ts42=>8JO%&&  KF1B2.e@DkQ.ڭ[a3=x~i!cVٚr̞ 3gmPjaBkZz<685ч@ ښUh:8tYnTkL,/3цVajg11[> h[I-?Ө9A&{&YD{+C mMjsBy9pKcNJpZ¾Tرc[Z]p@a!a O6C mDjʽ[t daYiӘO>1*\!* 22P3E ڐBtc`ȶ+'D8z""`~(, EImZkUvnk26tǛ=m`SJKK#""T  ZF[aLC(/( h|=qԹL2bXT2euKV"Hu-@XQjBֹ⌷iV1ܒH` $|8xo.ر̓{UUUZEEE+V@Qj[+1RSRKa:~aշ/ömmcla:996l׬R8zԄjD"8xЀJd/Ε+ag z@ǬP( К*"ⲲP!l@`5`4fYYtV"P'N;`+`9ϦFŋmh/8DKm+'9 kDGCN %b^\=Lv6د"زant,'<<|[i&T?ZܒZ>wuB3@ %p/1:k$EE0e 0z@͛ǒgddd=u0((ZUfaT֬۷ JKo_謊!"Zo͂X,޼y3u֡AXir/a "DFbիc8 I :ڨqapLχQ '5hK;zhaa!Ιpr8%[}ѪI R)TU?AHЧ@P00}:Cn.\be[:w 1akn.eC376nyP޽{kߴi֭[G"ٳرcX++ z6=4B"""N>qP xJիW'%%I|>˖-kmXZW>}~VÇ۳gOyyyPPȑ#Og>z$Dp$ |'.?uV$h=Z UU eܹRK/Fd=ztzfdUVfTm\ s sgTWS7S!!STr2Hv| 0*%ńz>9e(e( @|}} 7ol ݩV ._<<<9 0{60~|jVd1UUU{Q7KxJ^E"Qzzzppv۷}-Sji 7O * pdFX^$+ tlEl,0e kb69hن0֭Gf2 "##9"xy. ))) &2 HjpfφWz~lf*ps抋uN ȋ0O>D`QQQjj*ٳG{tP(ܺu+sח1;v=z=CN̘QQ:7mqLfqطұkڂ#Gh_z5A>f_.ӞKիQm#Xi۷w(,ԙD;<"B%K۱s!???555WkcooӧM(2mرcG>cW'Im99{-8 gО C2fe_'fԩa.]jI,bɰaLr[ .طϢ\ zqhm>c ?`ޑL_!G6HjSE'mۻ<멇S" չ?96mO.0biJǃQ ..@[s"L(-h[Ía\ ))p80da,ސ6.((p8V~HH$mS`b#GdtJFr"m xzBz:C{B7,1m.mugZD_Y"""222ZtihhhL?32jIKۿ#`Μ9-ю@1>m3 "vj-\G,TWM6i,PPP0p@Re2CCC̰BTCө=MB2ydFV* Hj[˗ʕ0v,蘀*hB!9Җ*`林4**JϺ-~~~ SLٲe-_)?11TRRIm blؼթmZΩ3IFxʔ)}J2lѢEÇXg`ҥ.'DNtttǐԶ Nm &mUďi: /3MKK۾}򈈈kj˖D"1Í8l+W25-ARw1y2BmM9`foEmV3 KKKGgCLu>7zذa,億[/ @n.kB|< V-.aab ؿAU0s&j?e:t^E]SUUdBYsaLl֘5k=zT{T:gΜ#GXks ?\|(.r <=-amaqJ(vz5s̛6X/EW: ,0;u]o>"?F DݸAmL͜Iy{S8N TH5s&u+u"1jJͷcnZRR(ն `Y>q5\mJJJ̳"E"QJJ%Ir/߽\ϛq0qի&v2l5l%R8NS PGPQflNlLvA|>0v,ìYPRd yER۬O *ض@m:0D"0l֭W6㓟qo޽879y>>@۸vpLF v|`b墝0  hh̙3g`ٳGbm۶17O0e3w!<ܢHjohmuXcޱcz'O>.Jw/75ur {`VGMImKU)SZ\ŋ5-D6=$%%%%%JL&>|-f^-^qM6Y;$1O5(88]G El.YK% +uCNN] Rt~;ꋈbyYUII110dȆ/&''geed.&^m;v,޵=(-7 eAAuyBf֬Y;wf$Bش v1NBRXdվR$xz"5H. &\zWgۭLxx8Tci<}F޽A"tɁٳQC@Rmf&,Zn@H$:x`JJu ;jNRQ_2L1ۡ{w;َt))n#BP<#}%ѵ nܸ1fO__߃2"d"fuFݱz+=HLl˻j mAVm_I5?~<%%Ec1H]ȤRillfG}>}Zkd׭3 XM=@RmtXH2% MĜ]O .ԵL^^^f1i$D5w ΅˗C-Fj|>̞+oVVmVPP-[ڷo|r+5'`~Xab>>@VmTLXP3h"[b|~ddA?QDp6̜tIm[% `RXVkZhqʔ)L5dAftsHܸK m[j.^テEPch9RWD"Jŋoׯm؀|gOL>$غՇ>$InnnyyyUUL&"߿epK.1N5j--15U|Ԁ8y E ա99s ȧG=yd^^^ii) ( {ɓ' Z!k׮|SV,?A"Wyfr 4B!Cv6Ł2rssSTT[["ddd;;;0*K-۷Oc ի 0gDEp2YZq˃@DjjCCCׯ_o* ߻wÇZ\/]{vvv^^^,#`<۶mӵ[bLL]d;v@P^/… hbʂ*;+ҥK]]]ǎkNZZr%-͡V*,,gX l5'Ftt tI"+-Xa>4,63 "jTtVZef-^8]rݷo_=bs٪cܛV!02poo~;fho߮A$$$DDD|ΝVҮ]t ؽ{Zݣ !* vaf1@ >` kU-#ݲcƌ08Ljǎ+VPI/~zck׮MnEȑ#-Zq `*!+ Bn*ömp0-lyA,GFF}o1X:(((33d׮]ӧOY Æ KNN.))7o.oUUUF|wq13RYEIB(ŲZY_ebYb]Knu"[MM~fqn3M!q̹7yy_ atzmt gj_VvΝ;7o trrر^\\\6mڱcI&ؾK.31fÆ \C򉉉ӧOS'ioY˗{/iiƍ u+I%g0$I? D<7\nسIQQц Mh(ʑ#G>x@x<\W3339_o|'2f3FXrf2O7>QY tR???b՚`f~ŋ/^2{k&{4ˏ;ֱc/R J]v^pZe"@9::rzEeVZ=|@yrss[p!WӧmJ%+8w[zʀ8pWNm۶;"/$ q:.ݘ1cLelllBBBf͚Uvҙj_v0a«+&MX⪰֏<3\b޾ f]v- ޶mۏfA={E8} DDHk 0_j`РA!!!͹sX=߇k=**ʼj׮]vY@+O?ի# F"co'44-Otr ̣ml,5 s.ꍳ&ein׮ZVTYYYnŋ;883=< l Ǝu~}nN0* m;s^wvڕ^oU{eoL###Z;vرc&HjԾi3DF Ϲ@ܹӌ]6666mC ;wlt{+˗ HII5j2`W/"#An>IDPKĥ]AL ص LPk֬3BR|eڶ >KڱcǐN з/?IDo@l,Pa ?g>M=w\vVNuԉ=V>ʬ dkk$LJJʤIڷotRJ)Soˉs  ^^uq~oٚy͛7}駟2G27o4}w_~Br|Ν6lKKK[lܹsu:ܹ`\Ə'?R"F!6 juΚ#G 0xΝ`Y|ÉZӫ,]Tn{"_ 7XQ^^?I ̽DD Us'Y`Z/p_dyV'M9ecch"|R0ed j{?3LWbbW@QR8GFYz͝;s4M{חm ۡ׮]իΜ9S &n闗g._BjjYdt1K4ckc~D~D\6690f Hg{pZ8VW6m3#c*ãFܼy3{i\~aqkΎ}ׁnʙ)GD*Eb^^6l={//6|C2dy^gΜ(Bq.]駟ܹc4;鰰Ç3% +AooKر`<@ Ծ?@NTw}׼ܴiѤX777\0T]v6euJai3fؼy)i׮]9'Ot fK_q eGywZ @:y$k[8YfAyxxƢ|e&Lpx2&MFVj̜EDPK$$ СL"p׵p1WM;w4az->HFxæM8K7^*++)5䫯nQ.!AXDD5srF*M رc&9sܗCa />>4Q*u,jt&(3]}YrrrPP-f͚n eWPA3ܼE^v@.p_*++^zQZM={6\9s=]ǡyάzG-vΝ#ÔJRiZP\<>Tݻwޝ!zQ0iZ,i8x  !!`:? ^a'e?#cfBB8;w - !q@Ӵ^Gt %^>K^gNw4Ms jt; gg'O0P[/BQQX))`pXLh|%̕JhVWW gӽ GHUXLӴT*J%g-q 4|W(e㶶+J <Κm0s&48*. 9tٳ]XD'd2D*dJ3f`cAXںgBzz46mor I$NNK} gϞ={dff.d"J$T ?` T*J jVZkenڴ)5u3;89 @]lnݺgfo10v,*}8LnChr] rjFm۸A+Vػw/dg Kc!+rT*2L.I$mT3g̙3v-X;~^ ||ĉ`P^3k޽`.evz8RiII M(`SVidflLL cԋ]EW 'BdJr R}> #`, $ǨcVV>355UR;]S@TA#ʭ)@QQQjj) zTf'dSEӴZԨ eoο~=)%%B<,e@B.Ī} b۶A׮e8?Lq1v 'w]G;"o)P3Ί{zOOODbIIINNNmڴ0I뫪5p,~f؛h''''''?} +`ub;dрi Z1-&}Kecƌc$&K`F|| 738p ):*P@b"HHw8Ю __BXHԔVUUݺuK,wɨJӴ[YY L&CQΖUUUt:QG}5|6==ҥKegţq1[ B*BZ4 7׿< n|p逃ˁ#h|[8rAq1i@.ɤ:LjPk4 kI=zh4ظ;*ZmNNZfEkUѫWǴl ڶΔ=[7x> Ț4`0W.dR&) D/9P@VJj1w<`g6gVpp{(((())8}m(Hh_^SSSXXX\\ܢE WWWMrՙ999ds_}:î] ''m[V$vGI YN pM[4G.K%RXk qK./Dm߾]V>|Æ TSSjќ(kkkKR__Ǐ&:;; ))I&ڵ{w T*(JXiiipLYhB"_-m=2777޽{ɹO;TJ P]!,67e/A7`[lJRD͐[T)UVZ\W V0-+++/_<`~e߾}O8liiiyyJiZєt:<#eW_&%%vةIηo{Dww*0rt %Ze.-l18F- N@zDDG)Xee%nB Ǐ߼y3%Cyyy<*//dAC^g7|IbQQQ˖-?~O"q(J,cD-8aPXDQ"RA[h ~LQQJ$=z/. ΰ 9 uӧOnj&K+rN Ж:0le,A-QPK,--;t`NNN;w}6웋Ӗ&c9vG(}!ss[3U+9;=f%W&-~q8m[lCZ"N΢$۶mk4`ӧЍm9)V[2nUUQwRqqTe%եˈCWVںݳg3 M`he_ܘE{'%"z=04  0KHMMU(NNNR(ݺu+--eіQ 9%,3ѨV~>KݸA98PTΔ%6x19+`.a1g/@PKDJ 5EV-}жMOOo֬\\\~F1=igddC<~ .]RSNENNoF[+-B`F8aٳP0y`QD0^<|s[D]v7n dNڢ5-Drqಙŀ;)۔{avv6>EQ@%&R11ZMR={RƣV٣Ofp+ VNN#%"zm2jVWWjd2Ʃp!jiii4 iii8Oe2L#G>|Ç ,?5EJ,M!)6^)XDmbشî)^SKPKDpUYYɨz$2 555*e˖FH$wwwXS`I8IMAKVXqEܹܬY3nݢΞb_?Q^"bx PnvFٜtr=3YZ"tlβYA 6iĔ ݽœ]p\rwE/ʨQ"Ra e4z-Ԝ }M#_vkEXZ"+I[6%t:]~~X,V(FommP<'̼|}}gnQ^b me[F-YS2q(l]VEEx,ʃ`Kfffyy9-^|E=zΝpSbd;=lH`|6)eLAG#^ j@3"I\ *\F,tʧO:;>>Q~_p͌3nJ{8-ͦGZr8vi Qk>{T~A1겲2uL @hȈRmM(naaѮ]{‰L"~,Jd绷lIϘ!ru.9͈3W`Ԁ59A-kl*''6\9sr5`ggWVV.Z- o0233>NchD[~~"??Z.Yv-FYp!cе5:rh4r竺ۃlVWW(J,--[l#'Oddd@G.gE-6,,e>WJPKD3Wzhj4’,r2ř mڶm+|$b155999JKcrŝ:=RR)VM@0z&myJPKDzQ>BcVLZJ {fqQ뫫섏JP(N'HPWAtK"D5V9ˎ5153MpvV-B>B .VTTT*-,,F$y{{_~֭[(DEZbWWTJ3WD"G4}|5n A-q # .a 2ܵ2L8zp(yE1T*ɤR)+ZZ&w xI*d",Z잀^!a!U}V+++}޻@}D9;Sr U de2,]cp",A-k0#4rdE"NCbspom۲2B!Q,:lk͛G)/TY`drN@.gɾU%%"zV-xZ|< і"/SF~)oa7b+,-sV8x!,A-QC1iz= dani˜-PZZ (|xMd-5=QAfR[oDOD9 x"q'9&.@l߂oYզhZ#ţGn߾=e7hשĪ%""zY-i 30f5 G2<<<99yhf͚?~VE|I Q"%"z՜E<a3d*3\UB#7KNN>sLyy9MѮFm۶񉋋C{4K}LDD Γ1XZHFnv}*ONJJ‡T*Յ #F|` 4Rz $5B >o<999<<00wuGGs>HRٿp|}d gDň^Uc3ʵ#Gh$-M}D&7n\2zvvv]tAzdUKDٶG7`q]^ҢQZE** Li(,MNN>HwwRτ0JCPKDD:i XV0qxbtt4M_77DiZ!maI7%"%"j<-|84TOX*cxɓ'Fk+J[[ۂ<mwtj-[tR{O>|ׯ)ݳ j$ ;k0ݻפId"ФEuMǖ@qP\\|…K. 6iիi'w/T| z-233]]];7iDPk41KIFMDDo(*11@^23%;vѣ`UhKGzA!2j8hyHjl A}םA^`Taw0x_#s j.a!bn޼YPP/&H,-n"  pv,hZV3#äeӶ +C;`0@X^2.teeex}n(''Cl'Le8gq[1Hn[ZZUVV8.Y6v!1.guvJZ"6SVVX1+.HRYFp<<믃bu:]ii\.V`h4%%%* ϻe4{^)Voѱ݌Ӗ5ŋǏoҤ }x Ě{fee1gԳϸeCoYAjz^Ѩj@MMMEEEaaaaa!4C>ZYF(u6::%%%޽{жm;::>|޽{ a>J,s8x1FINW]]VjZD4MCcotIbBV*jvh3~'%"jEz?ݭ[7gggU\\|ҥ˗/WWW7ղe۠riVܒep+ZfaZ}ba(vAWiFm7o_p j^`HlLL̮]4 b׮]vL&$3ׁx޼YVVV."[, z+)n( w 8jq6п\UU7sseA-Q=+&&&::ݮ...SL XZPt邚5 uvuv@V-\ϲMZ>:Cn WAAA,~<0׌VQa@h9]\Z""s"Êlݺ̙32]ĉÎQgK9ˠ ! ȤeqlkJXdq!V-Z9::*Jm}qi4 hBZXXd2R)J@`ᰄ-ՎɈx/~׻w}vmw*+~i!2 ,ȶE(GFrگV,..x3*_iiiW^d-[lݺ=1!|JJJ U ]666͛7ǜ0Z:Cd.A-s1ƯD"… r9h'C CxHk:u#7`ِK2Yx,a t*@t2`r괴&Mۿ;vvv|l0Ϣf7D"KKK)4 VWQ:m._ܹs|^٭Eû+/_FTjW㭭9{9SjeghD`\ >ȂܢjFO/C0799-ZYXX,J+: BѬY3J0ww%%z~ҥtm ,wwwGX{oMٳgO0!22JKK(Ev#G;w0^9sLaDZKaUUUeeebp`el}pZ׫T|kkMZXX*++z=zH +++2|g:f5Dʕ+׮]KHHHHH6e-??h#-hm^pdfJy6 IDATf&Y`5 > P:;;O6 %sss&6\ёf XeU%ix-uNNNfffuu@$EP\\\TTH8gBEfm_ju:ݒ%K~'O}ڿdˀ\\\vߤ$*"BSYYQޡCu|[n`{{{9 _FFc5kViCZJz}?al1e> =y$++3hE| iǃ #ϸYTvtV/C;B^ zؙ`Sx4Gf2r*++k֬Y;v8t萀tR6۴i0jt|^6o_}j;Nxb駟 /H.]]%IIӧ)WWLԊD"v?`B?ر#mڴ{eӞŅ&,Lzh@s"kk1Y]Ǡף!''ɓ'0j b-nj arr]']˳a%lmme2YnnNrp Mg!jLx 5W\:t(Znӧ_~V._#oܸѣG={rnɓp⣏>Zn]6msz5JsAK;VT=ztҥ?w%''^յ+KEDt(gx譹K.'c Bi]2ދlC-ԃEmD~~BԜfTCb4Bbzُ=jȤŝ  ̦mP8Еqtt4ZJ 4*IR0 tX,55qiӦW_}ŸXr|Ȑ!C Yl.]ZQQQTT4bĈk׮9997e)R 42'?cs&`ڵ0sw'Olڴ)ߴiɓ'テa0JQH : a?P(w$8aUy %---9G|v;&;4I$T QTUUYY B 2Rm|o| DX JR{{{ӯL&˫`綡[Vm?~<^ǎ۴i#lϙ34hPvvv^^ޘ1c\ 'zFhdjٲeVVV˖-3[hpc޽NٳrVܹsL 0DϞgμZkk[SGZZZ:;;3`Dg֭9iw vM@Ɗ퍌s:_MIvGU7555''0fq1R%nj֨-hb[[[/M*O͈3Jۆ_5!!`ggi"=zTUU]zuϞ=&LD޽љ111@~\]]srr_~]X #-`!5jԹspJddwbQ"[n RRR܄ OszPԞ=ԇRQQo0H#pLYF!ơӇ ꔳ35p&;̋][Vc0I(ZmYY%hBΚB[nj49s&!!!##C4meeտ>LTNOO={ӧE";'=_ףZYK,?>5F.c:6NcǎgFDDL{;vѣ^iiï\s 2uTixH~huh22L/V{NN#kG}ݩS%%%M4/t(XXY ; Eyzz9r=rhJ[OSQԘ1իT۶@cW(!@~~~vv6YܘEcZl EpF#tf͚^F"ۗTWW [ƻ0m97W988Ν; Ghq{>|?FӪU|իWi&K2dǖ2bĈp.ӥKGmѣrƍ'O6___رcҤI۟~i٫W7o_zzz j-Z@++Ad$8v \<=woЪUP[PPX9&&Fk;A?\*8 I9{e6lmPeeex.r ]!wpΚ;ŗ€c˸A3BѴiSSma_5RHiI^|U*|p])SL,g"wKO?tƍ0;}, ͛7훘pqBm۶/["888///"ul4٪Uhõm۶0h>#sl2ǦM; <NHz5{nݸQ8)''-[ ¡$ݼ<*, 9CP{Yѣ)V}緦Ç008,!01l4yYƺՠ`u{>~AMWWW_p񢢢bݺuױcǸ8PVVc<{'zeONju콰Vupp ),,_m߾fƢ֭[CUTTK>tPw}3DGi0}4ӧ[nMKKgB#d2daarBPh#.)v_8p@qbtÇ3/%vM*QQAGGӋ}Ю߾->sF$ 篱Cy1O>,^Go1"]Dd<Lc ϷG222LP(lllju3KS̾4"##֢fϞ 8sYZZ-R tpӧ/244N?jѢɓwޥKGƺ3fؼy3~Iaښ5kgJJk]p>VaI7цp e-ZѣѣNWs'ݺoo 4oNu\]ۧ 8vcS>yyJnׯSwWRI <i$+q7VWW,B-n();_+̰N!JU\\ܶm[[zl|P+Qi&N>Vd^iψ@2]h1j_@ ;@n.U]^U5ݣhy;wf[[mh`5Ϥ9zܞ}hȔ^g+݂ ʞ7cUWW[XXgD-[ 0~R.afj\mjj[.]pAK5%BxFRkUIXFڱc`6lX@@?Μ4\_8E*UG(R ڶ}1^WÆ [~Tx f=dP:Yr0LZ>΂W&Fc3 ܻVU*ygeeռy e~#gLGǏGDDdgg'$$c8Gɥ| rrr`? #{|vLl-ׯ߉'QQQ?Bll,0;-WW?O>aݽ{ݻ+Wtuu7oԩS+Zwvvwqq⤪Qq8L,(\/c<|s蟓d0rX]F3ЎP?`h iٲezz:-S-ڗBPPcX,vuuڵk~:v~^^^6** NtԩW^۳g޽{cbbfGMvǏsz3jw 0.` h ƫ@oA\=He@+βxpb73TZZZUUeiiicӊ `Կ$w ҥ+cÿ{},YbhS{lRtɓ'O.**:{ӧ/]#'~GTi31 (xd`O|0h4tz]&-êe,x ܃baa!|0M4*))jxtNCgunԎ;UT17o|~%͛aڻkМQ5m??rڵk Qݯ x^ŋ/^t2 3\z3*Laa!j`ޅqrpq*<9|'kkkNǨhT597i&>_xe_޿-ZV,X cœm wemiZƍN +^/**b1lF#gѫK'b ov B;g7O9?`Ŋ/PRRd"g &PV&33s_^05jزe `p_,]ˣed.CϸQl3IՖp6`$dkxPm%녶x9Nd2yAxSVVVrVTœt./*֮]3njG#i43ݻ? z͛{&6mzСz #Csm۶ V[`{Nڦ^_|Ke|1l|,gll:^ V9kNR(Q@2y .x儬iӦZ Yp_~}ǎaFS(lΜ9(ܹseee3fpqqYdٳgq4ٳg,Y2k֬ >qD71c8pa;w,^-(`1@\\\Νtd/[ֲ֭ltX%7T*e@WvV%kh4ވs|ew/m&~khZKDtfP06g9ZzϩSPX_k#Fp.qԦѣ5zx |k׮>?]lٲK pUv p q)Ad!F*[Պ)NEEEb<=ѓx^eÆ6jE"QӦMrrrΝ;'¨6'N<9~7D"Q؉s(z WNks皸Sll;ZnqzgSpp0L!ckɒ%;vHѣG\\g闋m2 YQs}%@& |y )(bp:B}$qՀɁڻw~wݺuS(bXPt-((ԩS>>|8 w=zٷo߿kСVVVp=zX~.\5kV@@f͚uܹ/;puoߞ={v=őd_~͛77I&[nǏ[Y7r fgFa`{pFq>n7P_u-̦X,6ZJ&j0}z^rÁ@~go89@|vO w*-T .a蜕J >.eWt p.VwO"&MFs󣢢j5\.?s̸q޻Ec'#ikLe MZDXF$,4ZM; z#8kŒ|)ׯ_.^ ,7j ۤI͛gee!?/n> _-#/r֌' ipAV.R2Df pjl5F0GQb,tHXC,J<7#ps6D_Vc~8&6r8JeJJ gՉ:mk4={|nnn4M-Z3f۶m&^ӧO7F*ZXXk͚54]fRR8p+++M9@kkkXfk'͛|uQD@8~+5E֭iXQyQFtG3*=)\޽{| SSSMnV'6m|ǽ{jjj9_o>22Rx##F6lXhhhIIV?ە+W駟\\\v IDAT…2V[QQq…;vLHHXWM8qРA(++B޿_`m۶mڴ ,* ב g hJKKM֢E B1vؒ8ذa-[d/ߧO}O2 W:t[VC\r„ f*6+|QC7q-#slݺ=ztYY/0aBm>دO*>@]9{B9ۙ3gΞ=یAwܸqw*--mРA|&9s<ئMF7_\S mܚ0a¯vɓ'ON:q8xkoٳ;}4ءC*M6uss`~zQQGٳg={v޽NجA)--!ٚSޏyQ|r81eʔ\Ʒf͂r;uemQsNOO׿}||JJJv/\_o+**֭[' .^ 8 `믿r:vRVVf0JJJ6m }'| |'h׮]c`bѣŽsiӦj_llȑ#WRްaБ#G~ݻC'?|N8qDR 9sftt%ƍgϞ;ۇۭ[3go/]}So9MZv0@8۸պukI***RT*ܹ͛7bz ob>d2ŋw믿4 nSNJ򫯾Bi p~TӧO/Л(EQƍkݺT*MMMe@nnry۶mg q&L\:t(¢_~wdgg>w/F1m$ݻoׯghzq2oӧÉ,M;v̓lwӧ322΁5=<<Ν wŹQFM4I`111~nݺ5gh%jg~'Bqqwwwt/}6a7Kd?^Q׮]۵kl7#| kZ];;>!#ӡ1!\AAA 4uż,9.n@8۸_322F/~ׯ l} H$ڵ+"u\\ `NNN'O}89r$<߃wȐ!^:RM>>h̘1  ;;;tI7]vS>\|0zhȔqM6 t 2_RSS=7tVӧ|dBO$8 !0`;z%_HKK۽{7JE!xa-7xkաCϜ9?0Vb[t\&ރ `8sM9XW ރVVVAXqy)`L8q׮] .OHH'''ϟ[7ŋҦM~b,k.''QFmٲ%,,,##A/qYGF)ξ5kV ?ϠA zqd2Ç[l)J׮]gug?yyٗ򺺺^xA.dddԻwGuN!9H#߯?p@AAyȿF΁F~$8???aXT;wzѷ;88PZj"oIY@1˫##_" /B==Jרí[n666:V(ğ@ ^h+zKLgϞZt޽{?^{vvc[ BEq{bbbΝuqUt`Jj_Rb3c R`߾}1СCdaMYq0`2y q0[) V___VVߥK&cǎVVVO<)//&, f:h-rssݻ3Q*;wo$Wӈ[(===qqddfm5|{,&5)Xs̹y&TbΚ5o޹sVjjq: l$O>|PJcc=zLR\嚘2444ܻw/--JogUZzzu"?̛7׮][WWWa&5 Ù3gO.tEqE P-EMHHٳgnj)Hͧ z+v,@D]Pښ2Dֽ{w6I ānϋ< Zݻ[QQAQڳRdF$g~t针UKdCܹsInmmyx R,ӻwﰰ0b;bggwi{{{/]꫍7Ju2GGxJ9 ؤ[`6V[L: hҞi``PRR#t)w^ 3K5u0V  dt)Q0ڠ:عs'Q+Vƍ;m4+++333gg^ɓSRR|||q<<<Μ95c p+++ёլY7n42axڨ߀,@st\6L;wܽ{W'EuȈ\a} ͗]&)J2;; dtVh*7VIaM8---55}?ZYa@8@>F B022իWn4'_GT*Y_ԷФۤ6//dLƞΣ޿'NpssHa`v*"&&kYa9&=A}E\hyÖF~;ήݻ7H622rOdűPv~g-{B8AUNy˫ץ}ZZZڭ[^zVtБ}z_-qܼJ6:M2N<~B_Vrss*6͑,߱RKzz]Y#7]İ˰rP( >|8`޽{1xu hpL8|MG{RŠ D=xվy?LY,Щ[tKBVPP`gg׭[v9fddTUU`⟕I+3Vm]HYoYmt>,hAh '%}^Pߺu_յ:;;& no-V!/)wUXʫTQD,h;j˪Ϫ oܥ=222ӧO޽ ~-))aA]Tge٦N|jZb"t΢4"h;j rד|+++[[ݻwI6^[ɓ'7oAh::+ "^o -YQd;+t)fffw޽O>mέ.***++cм2odm~?ذd6֊l W:. : Z]myh8 t+++=zt̬UvCCCUUÇKJJd 1  i}dĈ_}K/-O}}o)/\TƳgϞzCCÑ#GxyyWwܶm?ihh8bĈ '/%$$899iZ4h+i+FQBUWW444DR(.....~qmmJ+RźSUʥ ?'fX B --?sNqq'T*۷mCkի~(wvv@PnttQ"Zy/VZś`ddnݺ5kH='L[?~3gXZZJEȔKtjZ8lq[--tKuCБ}Z@X^"ZZZkKPPP_^^Nɳ8&BTgEfPeO , ㉟Vmtt_TTAEШJ :*,]puu%4DOff;3uX"88844TJv߾}6C3rH ]vֺ:k zzz^~J v c&&&522'@HsdH'=м[WWGđʟAtҩS'sss@τMi#kӧd~3h='o<Ǡ0@&@N%5= 5@jȋ: znk׮M6NӧOw}wرǏ'jjj\~)o޼>rHF駟;Sm۶}I]j9ΝkiiYZZG~uֽqqqd.3gRܼysffO<-:[Uvoo޽{5-WTkPjEKҡReʔG͙3իodNBdt=??{•666JJE^9;xp%PGGG"X>N̊mWjO޽UWWgiiٷo<'| P1]oy6lCCClllbbݻwI_ב#GbуY&""B__ƍf2H&Y򊯯履~q\@@ZjW7YpBUU~nƌ3wٳg7zzAAAW^144ttt:u%K)i\UΝ; gǓɓ'yԩ]r8B!J}zРA#G-Zī!OJJ" G֬\\\&''KnK #Hi&7ovuu%ŧN>|XXX 8NNNP(.^_sGf<%o 0{lJ@jm|zDjcbbf̘!.cV"!nK,Q UZZKpY婤JQZQUSj߼`gk%5,zfi'裏zAlĉ ?<<|ԩS-Ѕҁ2kg}D2^Բo¤PNY [;ZIE)y?|pɍzÇ ԭ[7'2ݻ{EAFҬeDKX~֬Y=z7ߜ5>Djkjjؗ71Ua04Iگ+4udW.qض TʆEm~-˫7l@x*8&tLMMIJ899=z E-??ݺu+V 7xٴiӒ%Kx:k``п9s|ͼ塁T1JTT59xbG rqq/^t7ޏ3Yٍ̔JO?%RF?{~ٓB 8ѦU^UU%V3aC>… +++⢣_N[$/˗/Sכиz*2p@77C:88/nY]k3֯_qܡC|}}5p=zJfllYZZq˗/gggN>uVZ$cd<*ב3dȐFpD(+q;ȿD~:auecرcTgٌcQN#A-PQcܜn֭ٳw;s eYc鄓'd9s椤9FPBcTܹo߾~|׮]jͧSN?p@VVVFF?i@uxa;4@/pTqܰa?8-Jzj[S+'dWf\>`K،}Hmjj={d< Yz5rV`&ҥK7mD-@{{{aCoKaժUD>h+wϟ'j[QQ|_|7""*B}WX3:tpiO$|rpȑ':uJ}ڵk^^^< 矓_nI-'' j\-Ç~H^ w^JKK7l0add$,JEi}]@rh) .]NLz-oڧR^m==kn߾]\]]y鹺U:Nr}CϜ93}tW)zb2ryњR2xర08س[l?^=`kk{5aZj۶mر㣏>j\\\"##{ /[klr04٪|2uDgJlXjƲbyf9muQGf2ݻwXXL^ӧ 婉9'...((ЧO;v$&&jݞ?!Y2m~MVVVRuvvMUZ[~gR"(-qw$; #Dg ๰j\V5fyxJ* '%%oMNNV( xW}Ǹ 6\|xb<صk׹sRSS /|GQd&Ν;KVNT__o߾9s755۷ šٷ794㫪^x%:/ȸuVBBBlllLLLTTTdddttK_q޽ҊںzJE&kh-رcR?EPPo-[&uwܡdhpbŋTQQ[o~k׮2'}v333'!!A{T<뗑!{챰ɾFƣGxM;Կ8nͼIKK}IСC4Z94khh;1EN:gZQA˻h;HoϞ=ڴiСCĻgϞSN ?XSS3{l2ŋ|R<|ޢ|2sL\N{E~+W$#BL. ݔ3e)kժU˖-#dK.]n|572fn݄+ؕ?8q;w4n8y;]}CVR@$&\w޽{I~x7n$%%fff>^l";߿lΝ-Q{&$$tۅJw &[QQǎj{{{b*_>j`߿ɓ'dG9'4okoȴR1PǪ.¾}0xáGB#QU{g͚%Az]6?~~ѣGG9~UK=\[a*|V5okoȷ|G^MaEˆAvda͚52QW'xzD޺ufΜ9E%?a{s%>t[PAP6Q5|---… ;xxxBYYoɓ'h$otbccC_4 $@{kjjH/YTHvvaÄa̙2JN36oȷ1>|x)IW9QQQ8@ ɖ>Tl;Yaɫehhi?޿Ϊ#CR||| [hzBSuV[?ҷcruIh 7vvvΝswwaקy{{/YDJhHUK^\-uڊVi#ٷ䑠_~e+++Wc ?wܝ;wo;bAAA...:,K.uuumG}hCJ,Y+_)zccc2w˗Ӿ[QQӓ[~=Y8p +ki곤IMG|| % [5WM㷍`llYZZq˗/gggN>uUVteҿ%ۦAׯ7ӷB,,,HyTTTJR/jlٲ,̝;755~饗g: tkKdd!**Jf7^ůA::tiQkW87NU[hkS1Z5{ҥK_}w%ݝ<ڹsIkɋڇNlt\"""x0`5k3#33 }eCbeF씷4f2igϞ%'?i$&B0a7c<R6nܨo1cYطoT`CȂc3iY={Hmqqqpp0Y>}z[zIT 544l/}hۉ$!fܡCH|auuuY/^,n]t^'?~|bfWb777hh07Z LJ7j%ROV::b E=ɝ})%%ϏIފA^^޽[k˗#۶mի(do5441cƜ;w߶mk{;FߟWn-H(ݦͰpqq9y$ J299>[9~jn ,ln]ye-*/-B-Z$))I'//:9sFe2&>>>^իEիw#.2}C+4Kj111t`LM]Bmm-Rv^8p '&e ٝ>}ޞ+|khhظqԬ|vܹS4DrJl @V7mhh6mnO<ٶmoaeeEj8-<<\^CI}[Qio),,qrr233#qrrv _+АHj֬YBֿÇׯW̌^{-[HUjRАrJggg҆&&&^l}H.뾡n VvbБ$WVjXs@@jR ZZ H-H-@jRUIDAT R ZZ H-H-@jR R Z H-@j@jR R Z H-@j@jR ZZ H-H-@j@jR ZZ H-H-@jR R ZZ H-H-@jR R Z H-@j@jR R Z H-@j@jR ZZ H- H-@j@jR R Z !ÇQ@R`VjKKK"[8LlRZZDKJ]nIK-q>>>h&DKH-F1ⱦLqeV =mm P+cղ7J*%m?=괆 -Xm5e;骎>TJ?̕mZ](QeQPLT/.-ϑKBgo1P_AFVVnVrIoWܱrGt"BEACgU+wkl>|j^nRȋЮx\-:ЊI+3nm%-ZJp$Gޖ$s&ʥpYl  nٲВhI\ ¼LvВhI\ -bծ[ C:io IENDB`batik-1.9.orig/documentation-sources/resources/images/svgviewerAOI.png0000644000175000017500000021164413063003374025636 0ustar mans0954mans0954PNG  IHDR/Zqi֛\R+zy)qՎ@''QX; 7TNiMθY_r7}L~1zl>@-GN)BJj+7 SE;5CB!uzl>2SD(7&^#$q/}uoH" +yn B<j=WTR}tIzn0|/S6}u3gX?~eR/;3cGQp>[7xţMۼ?S< wa=qN&qAwm }`[4~Jv̬V VN~FB沙bMH{ΐr3"Ϡ]AŶL==Ըi_BFZ+>#aBEOZVvu[d:'*:ܹM{):Fb_񛷏e/< kRjBDDQ֔J$j">'׶eaԓg|&NSFo>o= [\My%E> rOG킷}mw'ꄌ9kΎyf99cǯ=a~/7򡵋7@+k[x9ht5 f%-16 퇉多'c%+'km%\:zȋ!QvsơSk.d+fN"#Ϯ]R<=Zt4 wȦ5o3'ΞNyOG8{*Eo>0jzƨo?wy[Ynx4g;>{̾;{Dpwf\=<jHm >.ߞ622NFNeпm Efo~_Q<`5.N/dȯ-$q7G eoW^wா5.n{ސ{Č%!:a #SSk5k]x:qpD*tؕ|}<ڧ7^Iҷ/1Gk,{^Q^)'odzs[ _7p1Νj>yI$жћ j-|O~}|欄E/ ˔)'żB̍1{4z->z3/ܼ5 6_$j'n+-Z{/hꃇҋxARM-Co"ϱ̙9oH7d+g!zD7:q ex&>n Qс0:-$$\uQ\ON&'K;KwV5V5RODr¨Ovz.>s5ETRlmk-Z6"k/M}$gmYoU2u둵ow1_i]̉13cx79q̌1 /&u_@dބkƎ}EQw -2v\I}o2?b?JJ'c&Ncˇ@uӎ5@oU__{W]eF暃"[;w̐o"5PmztQMnhq0ôKF3_fԇ(k}e"Xw^v[ |e؆!K?O_zuIG~ՃKm]K C(=Rm9v^!=e4~74osPRij]T3|r򌕵hE M2lHK~}R2Շ<_Ǫ AOfoñiR4׮ZHSWkhAA|kA 9@1QqA2ALVkB   AAжFAAA=jKDDYikE޴"""LTo6$ /]#edaD"lAĒ918y]޽?{\lp~q]9i|.jËӐ<7- Hcֆ2-G]mxs?hKKoNZ79]u#:1Zj֨z0/4AZZ g&$$$$$M$1rqM-瓍=0/ #3uV"I)֕k8je{zؐBof@,P`ku^A||56"׊?>>>**޴ Fodu4cHx ։\ב;tb'62cн[AH8ۺ1[ԫ1[ZǩK]@JiJ@yjgU2i5JV⢣&&{gjuUVYh6O 'Xjm* 5 M [DGGGGG7dʓsdYiɹs&ܹsuB+u)3gכ+[LtFȯv@^{֒ނVt'#[#=zѣxzǦ7oLM-Q3` G#aFa-&a <]ԋZ wҳgϳgrD<߾;=}SB r`#EBo#EO1i38{,?glgAگM  EH5bE  Ho  h[# j  78  h[# j  78  h[/|^F,f*&>u-jb6bⳉ h[CI_RXLmA Sh M@ (]whX !EY5WI-/KUֳMD~Fh4zK- Qjm$7n_0va?eee{2I͆a@PWTe+mxupWhZ n]#^Y0G嵭E/O~}sAAү:5oE,q{5i9;;wo T*BH$ sتU+l:h[gffZF4i'Z"%7sVAŞ Wibo#rK\Ešr՜50{5u~=fP 5x\.oL3(33cǍSib!E}ד&NP4n3;;O>'EQ? O?5駟:;;?|ڂW_>=b7KKKRL&Ϩ YRRHQV)//lk5rS5?G .d( (x<"NGu V#XڹԼ WzIJRWT3JWbdϖDBf;GFmBZWTTTWWj''ƹyyXb/)y("`wsn47V-JKK {kY5k~bj փقm]xI}(B֟((((ήE7(--SF" P&g[SAyy?))`kg壈*..lӦM!aBaH$ɭk⧁_^xTQj\IERa [`긋&.>h/mfjC~Y|c⠏ B5 غݩOyS%QFQ;eɹߝe¼L/0D xʃ+BڹUj3UHϻ|5իVWw$;{˽&E6+LOOVkX?TN~D,*F(`|]"8Ut%(,4勝M̀7n\~.:t4CXSO>wr*t3dɒŋqwm߾eٸqoɩwIjMQL&)///))qvvmdFPTlR$4lXcRT_`Z)))///T)^T&an3G;LvF)"P0EQ M\oܼy捠 gDJT*}?Bçʪ9O_ǝ^a:uzT0X$i<+,϶tjB%j-0qkLɾs玖F*괴4oooZNƞxgrvs @M3 BEh ,u~3CMpuJC^ZM3ऺibbQg.9r@ zQ%i~QqqT*D 4|Ա7i*==/l'mvif(HӲ[l#_P2 @v2땫|[Zܶp0Qekm[\9,ʇbo#j)xDn^5@+1=}i1FqwV$=8@h5G%ߡ2 h_V|ѩhB֭D!hDB;QZ^ @Diy VW3kom} {Ia#zeQȿ\uJlx\yyyY42??Ū5wL**;;ёntfŎTsL=zɉSb2V)j޼9EQlbccSPPB4 vrttwppzcih-$ `A=]D JEP-ir8Q`#hhbu?WR` ⓷ (B EEi}WT"H&eff[a4%V(iH# 0ERBQB!SLرfA֎;nKCٕ!UVZ{2;;ˌe999v+O#޺uϓ't eKP(()iZo߱~۶mg^|)H$dvFF\. Bycc69fuZ.Rppp(iHd11ziڵk޾^;whB̨g(nJ7?Y2BjXoXadLZ˨M++ hl;U*jhF`Jp ek^7QՃ;b@ah@$F @31]cX [&jGGG_uX$6'V ]+*" Кj[!6UP C3 cM7nBJJ;޻3N}8O"UӄJ>qS[8h`lZ7aD]c;eJٻoOYY<~J%gs@mm^_A߯y#b޺ud ah>=mӯC'k޲mdX,vvvnqyl4]YYɎoUVVev*bvsw/**5l1ɚ,-|dgggA$^ndW{:-{OπZC$B#PTBVk՚J5%$@%}\ L5MqFp"ס}Ŀ4rw'ah(T1N~9**ڌ}#F,fbMm" !׮]wnqWsIKbA |];W LKA,֜T}%v1)&+ ^}eث 3???o1wlm۶k@(nvY(dRn0٤شiNmv<+Z\Ҩjff666rCyYiw fB0oD$`;JtsP4CՌT,V3~yOK?]#_4K9+PB@$$B)@hB C,2x" *\l-Dڴn{۩ԌJMps\UVлWߓ'ɛcWKUّA^"KoF۾}8%vEf5tfAQ]_~lZoڲs\AzM&-`Iq3gû9;$&&˻X5 Cǻnذ.44Um`EQ4MHR___kYxk`YAii)0=bW~b1J5҄lkV*z0>"WqxÌ E=vV*W֥mkBD{%e[@faʪ;8ee5] Oˡ IDATԄZ8 C"ZL(&"@,$"h  4MQYYԬY3vRF'SdUݿX)wt֜;wz1^Pk_ om @bvZj  * )(%M\,l%ٚ]^Ǝ~c~RpXʲkܠ.xFRT|V4"K^L?r):(۱`47oޜ,Ji*5i^]|UJ E Pk6XCfP )PkV%RKezzs?s4aFo9D.vY}>=ZNyTZ}(b!ZC  Թ7niJEQgUU łH] tzZ_B毊7hccc;m;S)zgoo36{@*aR"ZZ,PHuG 9 n3AzFELH]jBاC$6fd2`V2-ZnbL+9}H$*JTVWW.JΎ!x?^< 59Տ"@(b "R+c],'P-g>*,{ɛL~)̣ M'ku4T"tujd41"I0( $䇻vqEYvl5jλP(d֊Y3V3;&FZ~`T&0 r@XXXEEŲL<5)))cU3yi[;~&XB 0++Dr'$H$"" +)?W0(SM%1wYP\\ܮ][w7bOQUVV #@ VKJJrt]л~̀]/nnnJRѨJ%4MWTTpD"DRYYikk5TZR5oXTTp1:y.PTM3CGx@QTeӡZCsGw׎=, ;aPHչ=]oifUZ-;t땯JKK#cMUW [kkc/H$T*H$6TD͊c J$)JakRejpa[{bWw"sifRwnoozͪos…Ȉ~;N. ,BHP`PbRFOxal"!J5aeUJ/;#'l6x')F!@6RR h7w"f;6P`.f,(aRPP($y¯Wk)hт#vKׁ>ZRZ#Me$0??JkkBhU։a˾IQ[qzv)ۻiBQ P3Da˫wz_ ؈,8zk^1CfD"oYv`GF/<߹2IWv\є3 ӲeA/ aʦy󌏟aa15<~SwT*Jew tjTSگk۲j_7URׂDgwcG˳RͽŚcG'^8Fiղ{==,x򩨨PT-Z`-Sbe~nO5ӿLQTAA`]T+JL~y>mk;;;Bk&̛R w㪷ʚ H4O7-]}2IQkJե[_NNNB'ն솣hX#MK[nP(VVVTTEQb'WGj@ (#J3#섿rQjB$UjB(;?7);'Y` AJN϶Ҷ%b)S,D"z3c_"ڲh|Zavgw ֤[Cӯ6˜gT*+**,mqaUUU .$o7{yC|||ؿ訞Ҡ˩WzFZ~'jCmfQ#j6Bebt1|I9lݺ-7D"aӓ74HŒr9;ncc#JzEUTT899j6FAZ+H͛7g[[#"H$C[5D窡i&T llebX+KR;;;nάB!܌Gsfhgy.^*B|6~q#"f0"aig%e+6p7e2 Lhܜ{w4uЗ[lV>"|8H"#G)RvުLTVUUz,윝 'UxmSֳ)LSxkv%Rdl'AmWH,e9+;B~}4 vE" w!6)'@71܇X2߶L+J6c9>lKJzńNjkסm={q&Z!72d˖5 y#ogH8992 S]]͎E!D"v73F2SbKn p͸{q$iZuS}`ݫelbl`BF.2$$$$$JjUM6Ykymk+pV#MA~½{J`5b1`1D&.hDAAAAAE E./J@ָAR؈eX# ×eX UzͼX# $*j]TT5  M \  ϔm/gɚX 4O4Z'υd"94,۳^={A8{;o3#વFR.$ϞI-Zs00D9v1B+DZܿ_(B:?B<==*y@F ի|y#|=^n{la+WxՌīGDXo$'NX6gFaaaɬKrrYx|Zczٰ^I-5uq $}̻CR|cB5BEy:kGnnn.]ϫ}:u-*wdr7(䯫Yy!ӬBX`vd FhYh o1kZӨȳERu֭/ʩ '٣R͸'bT_V4CɸȆ(1Oֺּ ]ۈFdJ,I"[ȭť]/B _0^O8ϺO<xr78_׵3L_h n8BHYÙۺu@>UY6S2rZZ{;*7Y5ETŚT.V nL(cncnzpGc^Gc>QWƶY7E+.*(Pٹ*J@1B&Nwop+{wó%ƫl1g>]{-?j^ȤMv- qdLS{c@1P^IhUBC*if_op553zk8qnhZ~8S׌V;u$v [H@N1/QVUy8dX [2fzmxe20|A< 1uTĀ𫗒@ӎum͊ٳ> vwBF2~P.PT\4+*'<.gV^U;"̞ KHbf]/,AFK["8v1쉃1Gv˶퟼=oνGO>}) 2[#?_p%]"E ߗ UjeUZ]RRL]TAD~akmM]hAgCܸ7wY;aK{CJTVib*嫓.ܚ4ȿJ(JRY1< kKHSW!]-Nх.\!wviL*W*9^|ӡy(+**$ 5 σmj4q5,aZ]]]T*++++++ ^9DPT8A''wL& ~ 򌂶5՚E HRTڬY3`;8XŊZfdb?w s8o<j]xF]ApUgOJ@#T&$ 45pAA)ѣX# '&&&;ZwV HCزe VbYp$AA5ۚ7F1B/9ASA;8   Z# 5   Z# 5   j  5   j  5   j  5 Z# j  5 Z# j  5 Z# j   Z#<=/7kL"4kW_=z({zCkԩSÇ% EQE5k,>>@rT4K,1;,?i~Pw0ak 6wE~gDbkk;|p]o<ߘ?lmm뗚j|qp46oެP(8`Ϙ1c6nܺuСC;d9rDP$&&B]]]={LOOgz9r} *gϞ#GH(х  Ell,!$99YP_܀2BHAAAΝKJJzjPP!~8p`ZZ!?8p`]UBX,f?h޸qcǎ)Ƒp9P[n 9Š%Gll,' rW={{7o;jX9u떮`] Ŷm /Çk ѣGw^3ӻw;vp?wِ.^]v p__v}֨^x7npeZ~Oqǭz{(oqm|9筛+V[n]AA;}…cDzs|}vݹa(f)2oY\\;-!!Nݽ{YbժURtժUҥKB޻=uUBݻw#""nJgׄ f[7{lZM={Ef[UBHpp ksykW!sĉaÆrP(̽4-((/ܸ7byjv bqPPaY|T*J%$$bV&YrssB!^xW;ccc_^^^ܖpcƌ&k׮ n~97yj]WqX۷T*e/:?3p-Tk䙃J~R\v/&&(2Aхk9lö;=}4?5 Z# 4)dッ]QsD1ם#MWEN^7Ľ]A`aͺ#iքƹ֨df@As;Ɨd#z J@_}4Z&j بj-fsj  $< ¹pm-IFgws'V+.zV uROrF$bnZjop5֨d;oʍ T0rνGߐPUUUZRM4EEgVF3)3OћNagwx͸̊D>7 ]<7Du*bœE"X,f?NWk G̰ɔ3Kr;pcȝz3O9Ǻo),+O<όFFE/l6;6n2N$lOMW?l);q[/xe{u߽oc(hpoM+eۅC2Z-X# 2N;u / e3ŚE!{giDA+^ۚUkVP#4豽l>Sd5nZQ>)֊OHXyѓVݭg]wn@^ -W#dKyšTAFP!!lpcSkHĎ{ӲR [H8byMtD%JERKPGҫ+]E=c3 >NG+ ?/yP?LƝkWg/r螺̉S6WI<$L<+T_ Rɪ57F17k}=Mq81=pPLE4rw [];FMUG?.}2"s! fzgOٗogSn] 0+T'Gz@ͼ5 -ǥsFF) о׻h ??' 7 %u?%$]7npfv1 4~jշ{rOq=Y3!zZ$qլJ5߰~b a#ýfKY'nHQ@GmeQ?h퓥zK825 䍌Q/W2u3tkF?6۹Y-'t;sSd6zSA/ߜd2~WQ;x{ܒF y楚6F5 7Ӎ1mFdT"Q>p]i[hK_K/J7{gT<Ǯ3g>朾!qׯɆQp!_z -6DE訶pZFxrm?O8~, h\l/)w[yX8Z wsKo@? >1$#Q?kK5_UkѶFL6js/o[v">}@rY%x^Yf}_EEϜ33?x/{bš_'~5dl_ K,MfXgY.Py"cש5_7)>{#{t"=k? |x0d]78PUwUfn9-bȓUfݷ}>L}a;$v Pb15mVҺ#]_Ye`g$ZݫW (~2Mak2 iO{lxNwY;ԱT( qƿs/\e<}TthcF}ic*bb@p8'kbbbd^fc[[ۂaWS[Bu66 V/]g|uQf(EgNEu?box]mZ3aa(.M<~|#񻌝>}ԩS&v5#UeРA[1vvv2L&IRD"B!ֈ]JT[|l{c@nO9pA{OKoH(-;hj}m۶XoFRm3VZ]#Bk+2*4E˰AL#-IV|ѧOoH(]ZJ?)~z߾}7nׯĉγR%[̾m8^A_jh^I־]<3AiMKoܸ[QQgΜ7o^ffŋR=:VXs f,WNMMܹFa>}`oooZ5p&@^0~ ǺA,țmmoo &.. 33uϥKahoc [W?ZzyyyyڝԩSZb{{/d.>?rX.^ yQPA![SSS+V^wշH$rvv.((`N5'D7~ֈв%$&BA8;GAPkT*Je:M<^ߦM\-X-V~"м9ŋxjAA_Z|׮]J;Ο?u &|.\5L>}aĈZw@j*t?Q FRTkAmu֑#Gj4ٳgDǯ_?ܸqx;?{EE\tMLP4,Jb_5(iBjbd5y4)-jMJJRJ TLLbI+,|8:˲/χ3眙9>?ǑI`0:L rLf&$$+iZeuouaa!9cyf^vf -oڒķ%tnv}R`UV` 'mۖ{mc)t:[0z4lYYTBy90 $&ʕyy0mt ;.Tz}BBµkH\ZmYκeŪFnD*{̸÷ܓ|XIrjrk%iZN-"t'ׯ_T*-SqS`bcaش hrr`D 퀒X -HIqzN:uTNeFtڦygR'?3"9yS>6CɁc3VZtʭJ+NZ% ""%Cl[a3ZX!C/.++?RRRH7AT?P(6mK,jPZ PW7Wzy˃Lχ|((IDFp6ܾ ;w5a40@dؽ+aZpΝ;>#⣭d=zѣc{W_暈 AhP(\Qį?#FS\\v)SkO>gNvf} x쌼ց_PPIjy4 K#63!8j(͓8!^>U6O$|?ige7xn͞p`?zǭjСC322lbIT*=#5 `Ϟ=4M3AAAׯؽQa,pxώh M[~=,_~w߅U@.\O,RRRҬȱT*]t)i+z-HMM6AW(NYKJjѣG=~F[`x_U$9jy\qd8YgpnՅ xh`i!E:nZXYYY```ppٳg-O81;;22` !=,+ MvVu}``V]~}rrrJJڵk.]J0L```yyytttnn.رc?W,Vg˖-g^`ڵk;s%G`2f̘~?OA¹?~xE"X,JRݝd2D"Hhj111Z6..n6V7{?;!qm!- k,1w[( 7m4mڴ}eee4m配Es|СC-[]k[i)lLsz벲2۷='V#wHؼEHQ~'۟Hgފvg͟?,22JիW_hQRRRRRnSӑ^^7BTT m yq݂00{6h0k/^jժ,B{nމ˖-#xon*jk֬IHH8}4 zh\bu~kMqmZeP޺ ?Nf+<bZ>HTnݺRl2|0y䨨(I}]vvkRSS b Fup /b1 vb"țV^EED7n剉k֬Ynzm+WTF<#|}Ar& o߾}V+JBi5, _Uロd0.]jiGܹsƌJwߝ2eJQQ_̙_zvT󂝜 pr.פբjg͚\TTb3ڂ h޶m_z=䓝6R jLCA:muVFSPP0nܸiޛ6mJLL/F޺uW\i0CC؇!9پ1l܉̙[\\q[ )**R³bcA*m뭿1c_Om Z*8p`ʔ)'Nܼy37l`%<ǎlu|cݼ1l;`F( yP(vICBBo>q%KY^/_|`ٳAee6s4,,/|\w A1]oM4؎z~ԩ mTk[yZm)))Yfرc=</////oX[tiQQQNN r((s- qA:Zޱcرc8`s8- -nl㊞L:nb Nm۶Çt#F̘1"pڴi˖-۵kױcǦNZRRRPP}WDhhhNNNffB/JI+oj hp\RMf5`kѶY$&BA~-\0###''gٲe HJJ{N<뭷9vc\jժUV/[=z+[H; ̶&(={DDDL8qd]Na í*((1 =yyG}޿ŋ+ ]zxd9VppCȜ2\[ *_:fOamo[/'ňlWo__={%$$0 0Q `00L^7͝5kVttYH6/KRz{{**j…cǎwN0R0'%=>f ĬZ`ah(Մ(Pa1|feeDEE-ؘKӑnpb%痕'999KLII @4((t6N '9&7œ9Omǭq>fGRkRgO{ݷ$>K JX A Νk9;55lƌD‡ EEEģ*MsOXR)J}4nD\C0r`YGnq3S@q=b8(ʹ񷫷eaTZ׳䑨al暦i~)Qk Y\RV.3?,^ ii[RjtTO&,YBT([nol2b~yaaZ^|T._~D%|vVav,vk$>wzl6f@ ĸ(-JV=wrǭ~Jݰ:=[kx IDATR*.F8Ba.oܸaCuV!%En;#Őy y{ +WSHBHLL6lX\\Ocǎq͟??|ii%K<=f9r$i)6+O6m(qT*1" f,0I,7IެW;_:u⦮dRC5jP/ZxwNo|#9arYK_wY<~P /^hM3[?"G1fDB?0=ZV߹6~{y/i2$EQ^_oB^uRyV0jZm)U=Aw;z'lH$2L$ s玗WE, .4P=uޞJ{nKOO///gz}zznT0w늊ڹsٳ322wwԩ[-RT;zygӧ=z㚟_O8qk8㼼!B5ZFݯO$wh5]^)V1G8ҏ]iy/z93 j]]]]WWg2[]~[74kwnhjw^N~eϛ@U>;ӁȉTkuI>>> v(zhwjEwU,Z|reed׊ԽBݽՂMÃJDɓNMٿ?ȝh%<<<337 Ν[vŋ}}{{XпcY)@r8>J /88#MWiiaì_/ߪ{Lf@'rw./Z\ԧo,n{\W2ɿ qhWTTu޽=?^pj=%8`dK5Uo4/ƴ%cipuvfӞic֭kx↮:uQI\umm)ȑSN@7 JemmK<==iT!G(D"X6pྗ/_"Rm6- $rl69sss.]իK/,QVl^o_}Æ 3lذ̂z ;3R#jUkX"zv#GDVWW_xqLvנ D,ӻA!7njr;'؁gݨc9PЫǐ~sԚ1R<≰>K5zuY/e)$u#IҚK.u+d/E#"zZ[RtX$ FV(`yaNR:~>ٳg <]~:1U/^liO^5k֬^9l_adٶ矟ͫoWԚ(L&Jz;wJ[|hZ`` MfRE"Q޽uG"rRmvL&TzɁj|%K}|gQWպ@=v1ꪤR鍛.^2…RÄ8 (ű%X3׭ooV*ПE(%<_ZUkvvבK>~ݯܪ5ٰ~"Z`6i_^i~dpGO\1<`X,}L<ݻ~6fdZdF"L^zDoܤj?#̲p'@@qf[)yڰ5uu6u%m/+6ॺ>X(jo`ڴg_{$(|-NT*% M-if'~JT___>7Gu%^o)դ6A vl&k 6]f̨*/feT *&JN!!`5ׯd2wi7PV8e92L@ѴP&u!B tm}⏊jw DIQ9K~==Mǵ vʴLF˜>f3뀍rƙx|Dl̚_{J@EQwke5jFaOOO7Ld… z:4dNE"[wp0P@F1*uBF]̭耘:~l뒒GteYci=1ǬXFhѢ ?w>9`kqWh4.&ׯ_'"{5ƍ>>>.chz\."}-!]n\YM[ny{{J nnnPUUE(BAQTEEi7p'JZmϞ=;ZwxR4(K.N$VTh$R b -\)oԯ:-t `0 ?864a̲CrHӴL&+//޽I c6SBa,@+tFBQP wjx-{'c&b!UUy{}W^q`k8`ޣ %pW}a$~~~E <败Z##q=,t@-T,˗/{yyyxxBP44[T𨬬OOOt:liuCch[b6DGw_Wþ ~c@o3`!5eT!}R x >~W>=˭=*D$d̬9㛾WOz[K/"hX5 2@@ ̚XF-ɮ_n2L%"Z,j͙k F@`fY9\ oj4P,kfY։7KJJ8sGg ^ze/W]Lf\W3ʢu8wt|nV{/lǗ0g&81DݬvVUUU{~+&"뗷/Scj0[&nI䤳[NgYK.{ڝ;w\qNC͍afã4zF+Z^UQU umrwȰ nOs^;5[NsfŲBb̜ 8A,z0Gs*a@ t:djVe8pիW=%ħGuuFb 7<qn/re21.ΊۺW,[0n\3t1,{rߩW4+xaˏ/rg`7m,{mx7Yl3dO?~Dp]wqk[[/];jT?ad"rNU$qz >̍k QrD$5By3~АNx_Կ;%D@,M7yJoܸѻwi_av#WBP&UVV͊ͪ&?Xn9ݒdLFFL&|m=]?~q#'_SBhPHS!pflXF~4-jkk=<fyMN\`ݻQQ=oxtq,T{T k ooWG{D4g2sVOk_[%\u\s3xGw;O#F͚"ney,zzzzzz޺u%aD",(TkđtrLFQj:yfGQԽw#sH?'I)F|$OB[^{.}k،f|QP3#ѥ}GGƆN6vt3o~ O>BӴP$8e83ñ  )Qs6^F#EQdgmm-jq Wּmb9 d'{/kׂ߿`p'n|;feqJUt$"Z$n b!uu: N|#{ex;&8[iҤ8rblfe2Y}`.2]zxxpv19du5F`0Ց3Aӹ[6\y 5H G~/}WVQwဣ8(#b p̩Oqn8 `HV͕ۂUE1a=xJyrݼ fg1ޣ#N \o8o^]]u .R/d\$x](ӥ j\P* vי/ެ8`Yșr,  ,,:_LwAB7~ܤyvvu2ȺXAB\KdbJ.&TE Ѝ rSf <33u 4N{~ݻ5LI_UUSS+G@""7d2ݹsãO>͵JkMҽ{wVf01L555f_b6i555nnn̶)fm(hT(n߾=¯ۙ]Ú4{pQyJLfsÞy5EQ5Ɓ==/nV>/%#窮i^ ]ݔ of7[5L"地uUVVHT]iAf7\,bD"9UMz"JϞ=I]+ ˲E5xf[xzp.?h4FDDM$%=q |4gnɬO wHА£GϷz1TD,g0VXUk0{˧k#"FHs/~w+mda8]" ̲ 7qkf9@::hR&QŲleeP(- KY?vqܭ[H0@췫h4***nܸQQ{Ck+pzX?oeLS ?4fhՌ!}Mf@`b9auo>"HEA}?ad{jjjhr*XKV'>UGzP]<3 Y |2&+WUU͟`ojeY%1q⤇Lrw䎼6[D+ϰQ##GF2 dܪ`0=JϏ$M%WXau,Vd+<}X,JI#imT抇 ЍP0 ;Maɇd酸Y)!ݼ;[g*Bv`:!WGi4s &)y~|o0Lp/~q\l$O{}M^Ӝkӧ˲uuu/,CiZ*o$3wv^ƷX,&X姛/3A|BZU|K)خ4cJRT.viAwww|!6%H{l/]p #feΦ,;s?b1b6a6l3+]&550,.^X.w?Hl;ZݵkBv"wqssZ=jԨW! HTw}0˖-H$:wٲe׸X;5umٲh4,YdҤIoZU|GAB{Tk{~+;waݳgOTvZrrرa,]̞x&)&&?8pgϞz:tժ1D'O G%œocǎUWW=iyU+F< B[2& &io߾*|זaVO׮]]f9,X`޽׿2v۷o@ Qڮ]~鬬1cƸ}&Ls SvH)u IDAT}ꩧaӏ?eZ]]}w#>>>Fh[@%x?&0v„ 555G{RSS'Md4;߻3JAۖjݫWSN-^xҤI 4=},2 3o<~7xE@@@ff-ck|8a̘1ٓ&MΟ' ;%~ A)Lr|VS[urrrzz:˲YYYȑ#r`xg|Wa^uoooe_z饆v׿EZZZLḼ[-Zb >F/>^^^_|9yQH4bWS[Q!83':|-U.4dԯ$$$@ovۙ+a,Ap?~xxJd=wwwr AA9yAdM,AZĖoSSS/_`NIRCڼܞ0D9r~9QԬK:,lأ3.+A칳sO6=2lg0ш2{Ftt7g(l%g'Pkz ApHfm9nmXRRq0o| +Jnӧ9BμK|G={Ǝۈ_3YƧ Z͙p¥K.^xҥ˗/_|=ʕ+m# sʭҶt1?GFFVUU}999wwvK,INN$''^^^SL9<$$$L4HNNdY6))_w{(ָ5>6wt7g| ̙3ЀSJ jM2ŘT*]zqxʼnwvd/,cj LH2]W&,kPZ'W됐ޙl- H糭;Zo]e.X}/_>\>e;;#}@ Lm uZ p7dkKO^y`2"!uۭ~t6T>|09_RjҜ9s|gDe[Att˗[/ ٹ~S5-----fIOw\_ĈEj3T>~tH`Ϯnm}m\.<6lF2n8{MŸqH?,,Ϣ"rIHxl^ˇtOẜ:%斀m [&ogҒsU+İMwiX\#C<#vd7v~nk8ww{R3W~,qfUOVHQhM 5|&_MsU.QksSk4 EQÚIQCjy*{LЬQ`}bCfύlsזu_k\y~\ʶC֏6M!+2)d꾍_dg7 Q?aV7j$wMBwoF6oVK oWR'4VgV8iZ.V]c,CA@hZ,$t=(܇(ӗ\Kld=ڼR׭N:f&xZU@6m<16k~m$U!_I ͽc%`m&{el^@Ro"8`Uڍ<y=Wr6QΜ-Cm`@ɥ[#=ݻqp@ (x=^Z% ;&"Wk%l5iٴ2,Wk"yfpgx5sJ#mVВux7yyl o;q=sfPx>^;w,^WjPԈ Bmy'EZh3JiY)3܄[Q s =>^x޽ILf߷9-|s~vm[V 9"|dnݴZH$bNo0\"4FMR9C>WL^ۏ4*hN\M>>n; uoB8-{0fO* 5PE;wCҍˮW^^uc4PSSӧ.9K[ Jiy@~FBڌ*ZongN[x_}7ٹĂu`mf!8|*&/ž\|l]ܵ_Q6Cz\ۯ!>[ZF5ߜڪrC׫g#$?m=' 6m^"žΐ [9_eW-F&Ǐ[lrz6dsF _/o*{^=399RpАgNSXȋ[ub!sq˲9ο~&~^{B6x>>p[w 6kkYUUuF6JYfmšcŶ3ZtW)ثSnv3vW_/NW/Y9ǏiZ$bT*JɁL&H$&8onKbz;yB/4 u:ӝ;wnVnWs4ņʰZX4d(8݌F!tw~ꑏ=ʲHߟs(62:##Qt\ ZP(HpiwͅQW1T{iu҇N_HD"1.yZFb15 FF9F d3 555555:u-u9`\]oo_+ɄB! 9脶5N1kZХK =ddbYRKRL&pkA:Z5ãgs*>kA{Sn6 =:ZzV Ր% m(" H{{‘B@i9 W/Z#|ðAZ[# H{UjZ,dATkAAPAiC[,dATkAAPAAFATkAA:ZRV AAATkAAPq)p+ j  5    ]/qZ#V< uKΓxޱIʍ  GAF;V 5 Z#( 5 6 j`#  6 5 Z#( 5 6 6 Hg"|X4&EAFڗHŒ ҙNhO# H;jFAFڣTc9 Z#KFAiR Z#FѼFAFAUܼ֝@AFگ`c! t'AAPAAFATkAAPAAFATkAAPAAATkAAPAAATkAAPAAATΈz= jݞ`j/Y^^ b  ^(*TX @.4²AAP]Yp, X6 u . 3 ش  :J((AAPے`|}!2 xATVA((+M鐐?O>޽Xx IK^ &F~@f?L4 yy0X +Ȁ `0R;JJr23ATkWlp9o:̞mm1K𾓯gX j`ƌgVH(,>&Cp0hGGC@sAqā/'.?y[!7 ASR R)RݓQQ Byux8~Ə$ AAжv r9NwQ ; : ӛ!mmPT(`0B:(4 *]"E ?RR (VN7sl@  ֍P^j54C|0 Cp0B3`6=@|ixFF3zRRiӦ88OAj5@P6{!3,Ҿش  ظ22`Ӧvv;@Ĕٳǿ# j]^yyҠ1!!yyP\ W*ar(.T*mٳjJUajΝSq! 5dd\f9e ̘ѮN:tZ߳gTN>]Ѩ @iWp֮覻N4ݜMB-8YYY?xyyy>}AtΆBHN E吘ii`0tgSZ w9-={O2`0@ffi ?_TT_ ȃlAAk̓=zPThsxRTPP0{쒒$a^}O?TV!Z2Юp__ߌNq~b, A,V;9ӛma'%%T Z=s)Sc/ +  (P(ZYfr\)۷Tڵk{j H۫5s:52CӐܼ.-[ddd(;v;wn "++kj[a1 hȟeeek׮e?`LɁHsUCT;v4jG^^{5,A:Zgg\qqnFIII 6YN>YZZ:vؒKȄÇiѣG4a 3`:յ M2a„>t0<Ê+7ł ҙz6h]d ;=U!]f͊鈖[2uѣGO8<666n.yy&@||{qx0 t`5 HUtom,vFFcZXXK,ZJ[n 7ܸ;vH0!#`ƌv1zSO=uc5XM 9:- (ͭFʲRh͚5jV izΝ6lN㍰{&@i)ǷH6oj͸lK/--jAΦA|ӜD((+=efd 9hbbb.\hht;''gРAEEE!!!3ftƍo(A5ƍ._T`0ӌ7[ZJLLܽ{O<ӯ_Ç{yy۷|͚5AAA!!!Z 6aڴiVZ-L e3@Fbǎ7؏!\u H'Qk"ՉQ 5غu^{aM6ԛ}e__)S ?_\n#G42z|K YCHH{iOP6 jMƪTg+T*(.~gg5JV0 aÆ˗/={Nh"RT* Ö-[U3g=Vӏ>`0$&&Λ7>} /P]] 6N+VhHwmN(#4N?cǰBAu%(^}22@.{A0 !>hР'Oe3ⴴ99EVGDDat:PCC?>T*ز찰0Fû[bR|~'4Mo޼O>oyyXR݈]9)-4HJ0aa)+Y@m`Է '&$$,[L*M37ohѢ첲23\* _QZgr]wf琝m[ӷ!:/GJ3fɱ]QRRV}}}w9uTB+0 n: nuSDbu\S~zml=""`ƦMg>&N h[ +WNݱC]UE i|y?[j L<)JR___r`Ž5)* ,˃ի!9=Av>Rt۾O? C;J 6lJ ? ~d %Z` yXhmA@P={6//OV[N7s玧'խZ6l't[kA͛QA{iz„ lf͚Kmt:71d'۶/^o Z#Gqqq,*TBd$'ܹEEPT,[Əh|A\ַnzP:& V(`<3dž}>֬iP}AF:EEEyyyǏj4Mϙ3GRmoIIil\o' ˗0mPVYY0cjtlNII)((>>5U54#3'\g/ `4/XĒRRיv/Ko>po˖-e6BK"ZQZyf,A⬬,Ǘ:vq73]֭[TԚM0{|=<*ӵ {uq+Wƿby6..+&&=r-OuIIIW_}i%Hjj*W@l2MNy:QQQlYYgXr+{&jee^+. @.GG10Hxn Hs=׿]f?**w߽xbII o[u>S///;˶Z;|ޝ;wڮouwmmm?'|l6/_˭¯zEEEWWWii??[Gm)((`ͯjIII֏>dD63KFΚ.K䚫í}jZYc.j؛eeḀZ qvO[aaa_}d͚5+Yʕ++W=d峎-CBB[?򚜜09964vw߿uT|# 86XS liP#??es=}|;7/Z$b>v̝54 '}t}׮µZDG d-Nsׯon+l̐?}VZ,^xbX,۷ {ڵkVX,-{/3g'l޼y7l״&]vTlz}CCl׋0L `юgY9z99\"ؽ{eWe>rfTWWbWAZ@vv6饗9,O~%=?ώ3딖._; <+1quuu|>vN8rȖ-[_}۷?˖-{ꩧrss:ujŊ=uT~^b0Oj\T%TŚTa@FD{أjp~͈[\v6:Isrr=hdD94'%%XlcI,nqObWWW;_'44TR,H:**7|oQ([鍍ji)Z(* ζ` 6\ub1ΝPHg!f}}}Ϝ9#$֖\W;}Qb ///>WZjժ[oyp-\rʕ<; q3(..f7,v}k\alX {cC@TBf(RqY`0 9$NLLXby5q3 q=&޵kSfUE;WUY`mk"6{MMػ X99*TOex$80jl,AλqVWZbiFTrP̉kK @rr2W5ô2w^Ɣ_~K%f g+LAi)ҐRttɇ,F7ccd,LF^Z-q9g=~bA+e6K8#s|m1LfӒXHU688XTT4oAV T)bbaa΢jokl֮ƍظk`2lڄav/A274o&Zۆcȑ#G{9֨Y!&&[< lذ[?z뭵k׮[޲nA.;5s|vkc65cHLLqLW 333lJ*3m=r#>S'EF~! !:~~8zy[wt}1_O=۷gx,˧~cٲeCCC_~-[ZjDrիW+>hٲe'OꫯɌ fzfٲe} />z`lm$jN>%O:` ʅBw'ٳ1ˆ]zu_P]N*vAc#e|(00YRRY<9c|>gvkhv`QQQ?>bYWj7o ㏭[`ĕlZkp_#sI$N`p/***PQ秖jAAjiJ{Z֧O|`՚ZMNN߿Z6c̟T?{aT*Jew vk65YC^tn. nJJJ9jFFFx`-'_e%ZZ004E&ٳhlDTf\|>ڊ PX8utV#(WV#6NRonwXfb/?_l۶-))鮻ήf}!cvdկ&"ZWW/__vh&''Esr<ٱcGuu5222<㵵}O 8u j5 =";z?7@*Žy<#=z=FFp?nIBlAl,F##8p7+TUU:.?x`}}1'Na*)bq\\Ν;%!l /3AyvF\BۓVm:.ONNv>^EOOO,Gt%ɆYS^Z ՘d~d8~g7mmm\ũ:&&iahƣ"<S,vPLR)ٌDp?//E+Ey$\W?}}}x sO :::':::ݘILLdkooX06==/P\ 7dzT*qrx{_df?F#j6DJ #HNRv_E"cVgQ '`0 lM_ٹsZ3=?4:12{X, 6ˌ6uuuaaacne 1z2]15v!==HHNb|9ΟGU!L ={MV(Dx81:/c lMM\oyѣ.Iuh(pl]&Rt&3$&&uȑ#o +~{졏Ԛy z9YguS5okkvedddZA @k+ΟG[oRFCX99K@YEZR*ݱ39TbZx;vޣ;0hhhq=l̳5ƍFŚe0ky!JY nշ. vz:ΜAw7zA--=4R lSYɬ#I\ ]$++roIh֫vͺСCn׼'W9ixq?ooBb+@F3@;:>/|cO J[7twllHZ74ׅJѸrb99ӟ+zikkKGAm-ΞٹCs&<QXݓVx>l„ܹ탷v Ҝt s|7 51'zLIAA򲲲iA@t:TO?=~Juҥ)ն`m-FGb&8=:h@VADjvQVeyz:z LƚjV200ћ\"(_t͗h.ڤք')//z_ߟ򲩩XZu ɄatvB&c"WPv?:;ֆC9л X8E1<<~}}`pqGk `2%*H$1gBؼID&x<>Q[[{…tJ;w.x<uiijEEuZBs3҅9GE9<<"# @u5S>>P0C_))c왙Kރgƽt: }eDDDww];sбGlԚEBaccǹל!2;l2k4X-44`&,!;gBA` 5"w0Z-wX {>b&< '&&vS(׳^|}}Y72AĬw.#Ҭ,W*y<^cc#k>008Ӄ7RxtxDF"? )LJ ;g"2s:fg<}Y,^{񩊊 'ĻvrDX,OԚm](J֎UZ6%%ŕd2\nr9RRP*[A 8uj0>yUUrN7J=X'juWWȈrt.o#ol5k AjMxoooR6kkJEE]l>r|}!=}`cxR)1Fy3CCi |Vceu.sϐʺNii)}ڤ͈;;;Y'\x[02Qւ-_055HK5We3j?ɤ'XMz'xb puv Rkd25#R4//q T/ZRS1:II)M;ptv@nb!!`S7}i.p)ǓE# ##ò0r4H(lt$,((powdfRJ%t:6wjjP^6hDCd$R$BDFFXb͚5{5~H$va:[Zs.{ZrW]]]XXh=zԉTD6|lW*fs]vsh`el {@ڵ ñcQU˗GUڶZ֛ , iEŽD"+k vN+aۻW4MԳg&&&dVܚazX, buHIڵP(p4~|(/GLb%&pص 2bȐZSb[&)77׿ߏnΞxtw#7w~wشDl tDEEqAظsySNd===\&tSQ^^]ezX08,_0 (.P*QRt1dHIIIqQXk>_vhtpnEǏ/{~pO?t=_Ǖ/Ͷ6jdDzFC[><$&b$%%f'deeqY.bxx)[F΍`梫k%tub"r&:::LU9 oFwE$Icc#Sv RR.Kn6Ԛp{*X,vTך]raHcN0 YYYIIIXv=:@V,h2\8cOKtv_p_? RkbZ&--mڵiiiiii bڵ Bq߾bi vJ|5N).Btv~-444lڴr)=`Ŭ&gGwY@[ld2 ܬ1...授)pڔa.Jߏ뭬e2.nwnj bxxس7b8&&!q|||`` j^ ::p $&l_Ծ<jRkbmllm>D 'ءp:B ØMqAXZF5+6;v`=8rj=>q(s') / 'f J%Z"DF|&2Ϟ=etӾ9]/\98rJ #=ԞԚT*=b@xJJ-eD"Qggg[[D"t!k)lvkf ~~P( 9Q7TRk$OS@ rmRtv"7{A\211ܹs\Of9))ɳg\Xu(+OTUQa'59Z[[/\PXX\]aIIٳghz~ "IUU`T*mkk;1#""3|{yll,??S_nhtAi{;JKaNSRk&\xJrqFFq;ܳg~NCGq1fFH8& zA R}a@G,xAgg'W|k IDATYYY2|~DDM\l݊瑙IRMjMj5rĠƵ*PPZJ0m,ƕDw+477VX!jqJJAjMccDy9**~y_1:ÇQTD$&&+h4&$$x${tt92rU۷Кu$t% -9J%a4>gƑ^o0fX,DD2{>}tldd$66wE]]={R 51#+ HLcQ 0"#/^ot:HT(d{,99y~6imm`m300wޙdʂшfL4Nʞ=@k+I"D(D?OZ\sY99֭8sԚdea(c vo/ƐOłiR]]=]/Z:栴[nY~5k\v'-v,KBBt3ZZ(,T2Rkb>TR`Biɽ5k( M[X`=$$d޽djooxt#>>)^zƙNǏu(51oB?^*R r9<wk4=A&:##Kqhߞ#;;()pOCߤC"^Bx섏"#/w}ĉlSS`[,|\>66G!r%=z~|8roRkbAʹ|>Lx:8E?eSKKKYYOVuu+ܕNZO@ 8+**[h`^A&JEZstMA46"+ !!^) NDW,GDD#L>떟%%%exxף[׼x~~R~ HKш~i #5jv1Lッ\PRTT^t5==Q¨K.ڵ+:77bdeeMם`0_Bfxx؇-IZVgff6qxNs||ܳMec&jݍz%&bSX(8zth48p ((( ''ݱPl6]VPL9-9MJ&T*(%Νd]g`` %%ų]<C輽1SNSUUUǹ&=:ۍ+A, ccHJ猿81---f~~޽{N])c몪*ADD7s"GDVnǏs&&bڂ=< r9g>{tt4)))ɮZ;O޼y+)))w"3îDBJԤA,jjkQSh xr###Ntٳ\)ldJ2]^߷oߔ;[p^-s533BqɄ :~dgG3A,zQ_x\Q'aWtږ6$JۉjT8@^l?ɳbM%&&*JGb)j5~ZĈR"p[\iaaass`BKlth4 ^-QryW(r|ʆ]j5BB @4oxRk >R)T*9͎hܿ?Wvelڬ]:ɭV[sCCC~~~---qv{;f&&b"`xz=r8VS[[sw5??߱m3+i ;ᰢwDJ255:iii6mڳg'҂ 46&I X0] &_d}Qnew]]]]]׳/BXu{=w5e暚`Zl%?Db"HI 55xyDFbd .""";Zqo!,//OQX&"{qbEnC޵kWoo-&GzzTݏ &bn䠴t:|0ݻwwf9--5GL(T1aەD3ϼ̕{7g h?RvBZ䉈(::\;\qqqM\!??u<ןCBCCTXHH~}}}a[xKZaaʉھ>L;vwZTqqjbn0rvx:5PfɤhjZ.++ &:;Q\h{Qa,ex.#ˑdRip^[[:Em2"##%:α<00g2RbbbB XSHx3Hdg_7af=ӧe"X\tn:7Wpppkkcxpp]X_e4]iaP(jΚ0p@Z{VkXb¾YE>O +(kfJ$iYLkEEET*'4wrd3L{u~3 wJRMj=Wa rw|NGߜijNO9hmEg'JK͎LLLbiSk;SkjjΝ;;e:3b)--q| nN[s(b1ϷX,:I۝K?@n.}$* g ) ɷߞkϕ#ɸDΕ:&&f5BP(:v̼}}}%D"nwgg\.!HMMݶm[pp0sj:ji?uZ Z`2FFFZm#ÔY,T:_ %n:>>Fu5`'` f0rP+<Ͻ<;;;Mm[ZZZZZH$2 Nwx`P 9z/ %%%--aC\N^^,BBB6;/:fggJr&I:j2 %[y<_ 䌏8gf}W+xm^^Neee7n,**b5ݜptnڼeݍuVd2 $//~6s`0 >>>.&ƺ,yc̴k.JUQQQ^^><<\XXh4:~___``\._~}llVpz#O͏~۽V ʀ5kDFFEGG3nڴ_%**R:44wR32VAsss9Z9puSSsrrryRRҔhDPe;^m6ƪjLk.Tӓ;Y`/[BCCOva``Op%m1'{8Zv>?-|~gg'k}6nRR|apʠ2##d2EEE֖DvG jՌ|FIKK<<<\SSOxGgBCH鄇0K ̰%bx&'';w.55ud1>_!'GRŋႡPii)T7;;dxx&uV f933z3N9(s;Y&0Yհj @$577?~ݎ˗Vn^u_2O@')|`bHv4zk::08A OZ,xۓ{1fF'3-va3>q>>{9{T*Wgs{X̗*=j5xVNg ,f\YBCىBjbZCK ,$&N?g}W6551ˍFB˳vmiiyχ@hhJ:sLhh:BmF?Ē'.O |Cn1{]]`f5-- P3g0_P~ƈ8и|9/##cӦMr|ƍ}}}:uuu"ܱ\u:y5&hllLն'%%1 bXR`t??!|2S"x$%Gq\xxG "#oL\^o_IH;𙘘555LBJFFv3>k׮]fMWWל <<\:q1LMM ڸq#SAj2Ւ 1<q{ߓ8Gv:FO猏#'r9nŹsR@{z02lL /^}~ܹ]vx<ɤP( 111*t:TWeWS.3ǎsNE^RedTl۶ϫTjkNə?f+v BdeD"ǒ*^om gMlFK [^Pdfχdcccb<11њP(&&&솠 P{;z Wvr钒cB5cjoo-MQa5JENN(pì [|B=88X.OLLy* ˎ;lyhOcf(L>444.8tMM(\"(}TK5L44dBJJؘJmإr`Ng[v ˕سo'.\6:N. %&&⾾`B011Q1w##ho ||~ߍ%]!888//l6'$$DFFNLLڵbA#H***{nHT[[? !ף3`}7`WgϢjVcdz;{ƶmu]]]޽w:.22h4VbXnFY \{JNo(++hkk| ?ا B!`~PUUURRb6jooo/Y.K.]t>>˨6mBHF}U@` p8wX\]փjQax<<7lDՆi4Df$ 4 ̬?6TPWo~P<,~cx5.Pqqq%%%F1!!7 7$?֐05GfbbrֈEZ .`Vwe{LK,{;tMLLףX'N`N?={fe vp#l|R2LZ6""9F7!%V3 #L.ZV(vłtu!* moGƤRiMM Ȩ3Xs<<> VFd$10獵XM4510|bZ<͛qJY[mQHs0a75!1"rrr#""z{{moQd lnnGYY E_] bgOPPP#.n.OW&îM D|dB񈏇CCxm<C$ cԏ<(m'=z=j> ##z=LJ2MM)f+WSFwvv;v%!!g]t8qii8wv[V[oq|!{d~Zm09I'AĢSy8W턢Luu4\׮A1Z`-A 7M벷7HAj=m>.2npZRԴ eo~AK__څ>tS:)B% f^ݟx?d2w08>[" (5 G^Aq==uJ! gR)&&>R)lolF#&>9 {KFgtΝ fA1Oyk  & Ԛ  H  & Ԛ  H  & Rk  H  & Rk  H  & Rk  Zd^^@ ~_Z}7|~OO{{\l_&yyy;/_^fAz޽.SVVrJ׿U,1uuuX[nO> /\r?ydNNεo[  Z^^^Vzg"Ԟu0 r:ݻy<m۶+WFGG[R\nU*ukv`d~֭4Ϳ˿LNNիΜ9jժOVۭLA7~_z%Ft]l2&Zzwy<=ܳk.ombsw^|n Db ;vx7rHHH'|ڭLAGqofHHSoVKKZꫯ%k֬]a͚5W\aʕ+v:D@@+VXWrvog2|l63 ׭[o mr$|۷lb]hX<۷oomme}b|,b),,ܾ}y]v݈֮F@ މ |͛7DA,f/ґ#G%?O'xg?ٱc_ŬSZZ|;C(xuzkڵ֭{뭷[N|\7_ݚ@~gA{99w}#SO=?144teu<駟2fg&Yghh/ܲe SK-H>zjBG-[ɓ_}½<991>>l>2Za6ӟz`lm$SN8A,1p*22QXQ>G3WիW||G̒0 ZY֏W; > =>'1/ܿyyyVVjFcT?{q|GRT*l&kS# fckJl63c_/b۶mIIIwuWvvv]]u5 l'կ~OfV{Ǘ/_/xMMM]]]vx  y7 *м5A!/3 XZA5AAAAjMA5AAAAjMA5AAZAAjMA5AAZAAjMA5AAZ|b/c|ןy晰n{yyvmr<;;ޚtqS~ivv yG&&&\_a1}e˾eʅ\xZjתUryYY'||w&ߟy?0A^|yժU!>}ڳX@# ONII9wܾ}1LNN׋/ힺzC oҥK>^;|wqK/]zطo_YYYQQ ?~ܹsW)((_8ydrr2j `Ŋt ZĒoY(pԩ>JJJz{{k׮]v믿-))f9s̃>x)m0{1V{ڵoV \ai~e /^˳~ʗ_~yڵijj~ eee/^{pww7[VVVzyyJB^{wXwsNAAA&&b111_Xzumm ˣVZŬ󣢢/^XUUu뭷/lr%2pС 6X|+,2Xw@UUw?OjuZZ3|z꧟~OӦMۋ_vmiia.W@믟g]:{w"cڵYvUP[[[W^m5kf+*yyf?GGG^299i KKKLlOAx_L]wݥT*wJ7|[nﶶ'9%{XT% wSK5QSyb0ОABQ)I*5%S45BłRꐁ(m=3a8Gv=3{k Ѯ]W:t(//OѥKkcZnݱcG!ĕ+W4?P7]R|All/_~ Hkܽ{wC &֫W/$$$))|gX0߿>z|IOOO^f!CZ*??QgVV֠A===۶mk1ʅw}Tm͛GFF~o㱕ﱱAAA}s999vUF?ܷo_q^zo(%%E. >܎>srY ejժ!l7n3fLtttץu rrv:om_rtO>:4BFs-^X`r. -VZ֭'hvښ5kjժ%ϕ]0_c2++W_˲e|u۷7~x0 .9m۶5i$558///..Ȗc8}\С} Μ9c/q;ܴ@MMho޵kW^䦈K?Y] P\\ϚAMWpu&M4oB1ފ}fziyԩ򾵱c,*͛^xA]Yfhhݻ??ҾҥK-:G0`<ڬݺu[bŢE>L筼߾}{!DGm#\aA 3ֹ2\EuxxǃMh={ܹsW^qZWPPjn#Gp 6ȅcǪwf{yy͙3AZR17h|k˖-e=:l٢b>ƍ .]yQFw܊c;5ZseÇeoAǎ-[fg̘!' ػwc:5LLWڪsν{B$&&kZbbbĈm=qDojvN:Xi 8: /qmdffi޼y' ^ :%-SQnmli̘1ra֭YJ;yGB~C^8ѣd/ԯ_ҤIכܹsмΝ;1@0!Ě5k~ᐐkђ. .$%%M>>w_f}ZZZTTOQԩ3p˗oٲ%;;ێKݏݥKpѣrQXV%*evֆY;駟ԈzuYZuZAZCk֬ 0bŋg;GFF5JssÆ .]ZRCU薖f͚2 W1\8wnj>Z=zjB4gi 8WW$$$9R3mYBܹsrƍgϞe˖;wnӦM&L0Ţ"G.|vh4ۨ[2WMLu6XH{5~Zld!v.pP5j6lX|||fffFFFTT:? I_LL\NOO0`@ L+z nvZj%8˖-5nܸ^j/^-2Ύb;\ !ZnmXO6!.]5P54j_W];K.v-NӧO/WHOO5kMm_B*]⨭D:. Rvm9VDnҞn޼)=h4Λ7aXׯw-==ƨ ö۴iS]֯˗ܾsN.\ js2NNN?\>|2d\5j7?|dqvqրc  ݺuKNNqx7xCfR}8SNRsj6¢U;ܹsM4QSZlH:uٳGv^^^xx?B0%%%228q7>-zOiɒ%r955e˖/V/KOO3gN۶m#C|}}JU\c„ r03gZnj*YrssW^ݺuk9˔)Slybf3]o>8 gO=zT ˃h,**s*PMVb߿ kښm;;v6|ITvvF-Z8-2/..={vUVvvvYK,)X[4s !FY Ry^={v@@@tttLLŋWXaÆ[>|ɓW^ h[yw,֌3FN9uIJJRÛl߾SmdK9z5kdgu.YԩSު.{ !"##t~ CW\`f2\rvv^dOSB,_n%.z{̙I&yxx8;;hbO~UΝ;9rW^iiim=<<|}}Gcǎ>}DFFʝ8A#444++k߾}'N vqqqqq 8q={^y'P2Fp=zP~Çڵرcw.*ڛo>e?cƌLiC111jv.].GRjvr~jժwW".v¼JqƐy^tgѣ`pqqquuuwwwww nnnnnn`0жё5  i i T!wޝ9s&8 Y;J++8qD˖-90PyUN80Pƴ尧q T!qk[suT*h8;;inmq%Kky2}b&h'Ndgg oo]>իW/%;w\n]JJ͛7 CV 0v5jիW ꫂWW{ܸq%޽{׮]cǎ7ovСw/NJ999Vڷo߉'䟬]vƍi~묬I&ܹɩiӦ{3g{衇Lʕ ݻqqq))){y󦓓ӣ>ڱcAnK0/sx -RϞJ oƢ;wV 68xVHLLvZff 罽n~V 6ԪUK=kժo>R۷ŗ?#z/Zk֭{qϽsȑ#-~:rJ///k{ĺq5M <ؖSoɒ%B8MA !ϟ9oV%sZ̴nKݰXJC ?:Ξ=; :::&&f+V۰a֭[SRR>|ɌWoj[~n[k|UV?7n3ڵkZYz?CEEE+Wٳg~4/,((4hP^^_׿UG.}MKKW}o>]6`x| /_nm9OZaС[l~ JKK:u… udaaa?SddNɼK?k?JnݺBM\c_֭0L>}sΧN*K)11 ߹xTjVNBn#/ܪX2_9TUo/8lFѣG;v(}}}g̘ѻwoOO}v[w7hNL/Қ5k͚5;~_+QVVVƍo߾-1cFe>|x+W;O8Ҭ{IDATwS3fرc}}}_}UDD𘘘SZB4idƌ^۴i_|#^}U'O9sݻE꫚ݼyСC岏ϬYWyy]xQnMLLInҤ|о}{^xɩR訟j՚?~~dONNNrrYdRN2e:Tj s7n O~v=z WWWwwwwwwOOOOOO///f0 *حF2VI+zZnBe˖okBƍwݺu;p"00pϞ=I}Fl?߿>/4iaÆΝ9#[ 6kNa4l!D޽\]]Mw8{7~n\\ѣ5۹s/Bv~>{۶m4{˖ `^^^*SzwIKKkڴf7|ӪU+!?*TuCHkLkƄ2;vh13f8p"##c޽ׯ{ʕ.\ yT ՇtRk7N.\tI,f].;vLiΝ2f'$$hZѼyiӦx;p@6Ci6%''ϭQƦMɫW駟?Jvvvrro=jԨ{B˗/˅ omٲelՕV7PZ5j6o,LI3f\غufSڵewb|MAA!C1cT\|Լyskw꼕޽\(,,lھ}:[WWJUCM۶m Ǐ׌7Vj֬.Z..; y T #HkΜ9#zi +--|Ad, :4,,L}}}uF`U .$%%M#####C&&&Wјw+W8q˥َT l^K.:/|U8Y:xgΜyf h֬YWư,{ݠJkt ڳgŕ/o`IL1+(((WiӦm۪SutQ<W\䢻y\2Uݼ::ÿ8;|||v=bĈ~A$---**gƌcǎxʥnT yTTZk@.kZ~ւД]lQ^7mڴQF~Zo4Uǧu]t 4=\899ݓ/s?l:t萑G_СCowŰ?:n mi)7yb[EEEe<˨B >ڝ3ѣtܸq㐐VZ5oG}U^,,,浍kcqahhhhhhnnnJJΝ; u׸b ,019'kcŪgkam4ϓشtbcĉ2=LlƍrdrҲ}R՘9` 쨸9UѩkYfrAnjΨ5j6lX|||fffFFFTTwݺuϽpĴ6^l+am-a9݌L~(!!ٳo.G궨KZ8x`EѣGsjժUVG*_-%%EsUNF^u|pдV9VQ]^mc˗XmΝ2uyͦB]vU{1_W㼬6ͫOӧ\Xzv?cP쪧\Z' !}YGkזU][iPU1MmI_&H,FnV4#,{ns1sssSj1rcrssg1/\*_|Epy/SfԼQQQQBK.זlg 2d-g8#ϟ?4-lW 4(??ӪԪUF[G-j*`~ONQjk[]ȭyz(1)FԝOڲeŋgee5si۶|s=g榗g999mڴI^qܶmۊ+J{` Vs6iD3W^4 ϗqqq:uJII._/!tҵkr; 99ɧ. !>z>|];L]nܸdK.'Č'q`"""|}}=<<5jǎ}􉌌;'%%UD Ϝ93333""M6~ھ l1a„̹s>...ݻw_~*TKcccϜ93i$???Ynnn-Z?~ӧ}mBS7ʥ^x5T{µx6r%i)dM*Wj&k, ׭ mk>_l[,E^}Ri`pi]ODjXƌ8[@Z55 i i Hk@Z@Z5  i i Hk@Z@Z5  i i Hk@Z@Z5  i HkHk@Z@Z5  i HkHk@Z@Z55  i HkHk@Z@Z55  i HkHk@Z55 i i HkHk@Z55 i i HkHk@Z55 i i Hk@Z@Z:E}7n Cͥ(&&&77$}#Ojl)""B$)I !Ƅ@Z6[ !٣RSYֿFؾҰ+b%֨ɤRƄÞpy[YknSy5CGꜯmk?/X|t T>z UVq%(IJ/J+Cy&e@IU0!W E&M5J0g *:5jcHkX6(PN&U& lzv}ݻw޾}n޼yM|Bh4Ŧ'ܷhM M`.(!l0d999BؖgT?3mְJ҄`(**,FPbZilkIU5,T&VQjKqq,p*ƶj(adTThZ?ȕ$4ضkWWWM`_&񧚤Xi? 5Ch[@mka2 \Ze`[l^R4\]]e˕w-**iX`15eZF kh0TZ]n)**imm48i ;/]L5=ᰵXu :5觵}\K\@3jUqqZFuf:HkeZukzaJ`B899i~ [4jLZ4 -̧LaJX.+QM6X'XӅ?MSI2e*x6](1Z <45?Chjء^IENDB`batik-1.9.orig/documentation-sources/resources/images/group-logo.svg0000644000175000017500000033306513063003367025375 0ustar mans0954mans0954 The Apache™ XML Graphics Project <?xml version <!DOCTYPE http://xmlgraphics.apache.org/ batik-1.9.orig/documentation-sources/resources/images/svgviewerDefaultRegular.png0000644000175000017500000042017413063003367030136 0ustar mans0954mans0954PNG  IHDR{ksRGBgAMA a cHRMz&u0`:pQ<IDATx^XTٶ5 {ι'ts9T$*s΢ Q@ETT0cΝ>{ڱ֮].wڵ(1s?7 8V Pqsc+X@```n8upcluvqc+`P|5\!?rɂ?>]?!|>_z_ ͽ-}lXx/6vo_aq@et | Awᣞ!{B? X 쳾? +ˁ+BXՠUW7 Y0%`Vֵzz@ ۍ&~ `smA:O0i{W; 0mWi{NG5#{&`O`oYfGbD0y} =30?fXv`[pw#j-ZI}=TW5$ TkWS=p] ,_-\TJ87|s.LZx|K0犨vF{f]l8Ej(N}uxb(ʩv}=:MiV, <\jZ-}ټ@jŻZj9W9jv~ucu \ aat4j7oah`j bbϝ_C@p` l+9T;d]_J\FZW P--G- r6[QB U]$")Pc8A++H %TKn2e]S)Pjawg"W3ip8 5ep GF°gZTU5kwz;_g_†N1jtT; 06$nn0Pq.'5՚tP-bE c;@nQ-ZG+-lՊpl!" `7f®`%vlE8Cq2_J5jiN J\' /;DZ?'bBaScڮN!&VjTjeTKs;--Gڂ:2 \K9yıu46~c.Mr|)/qG-́ Q9ϒG$X^WNDdAQYl}),>ҲL$ 7&3{UG$AUP.MLy_>y@S}qwDe1@&Fċ989)b`?3(uX 3 ~4ZGBe XCjFƳ_E6כ hq3kNv17Ѓ痴n"q3{caK눛q8f^F MJBShfl- (&{1Sm\i{0r IduPj_2Hc._2ߘ+0);Sq3G܌Á`OHߗޗ`SZ5$8AuPm#SmSձ5K/1n wD;_Ie9sc+XP 28DZpcXU7 8V R7 8V 8F 8c+XP_7 8V R ͱpcl%u#HX|aɅ gV;ߔ|؟H{\?Sk4@qovT >ĊÃgWDƋk{a oUTr9s R3|p% DgxP)&<&ykI.>p_^ߝk}*;/JxZ]-YڊHK׻A?'qctnz6?^4KnjXޅ1Ft]9}7gJ;!Jk~7rXPڟn<,o'Ve|]ֆm=Lo5+FxКk"o\5+is߿O듬Jp[bJ0 f@,gcȷ`a}4ׁpK˱Vg 7x_p+((ؖUE~ss_Xz%/>}fo||A@PT]\xhwNT=QuDԢ^OpO4gW`C/50\~ؽBbg~}ŧR{"| O/[}}B` ໺[dnyEUlL(tcosf>ƄjuYNooo)r K`x`iݴi[lc޽{~fI={!k g@3nZO.\&g[xԩSp7j}|یoׯ_Bس;@ ?PXX7_NIK4{)OU~ťsv76pX\őۙN_O+} lr?rᲅx[/ynǩXR-B`Xpc\ƣYG&G񊬸x뻏|OpnݸylشlrJRȨ}72F|ť< zV̸e}R *YTuyra^I-0]ձgssY1e=|ӻ'n_N}K}SpIPt]9HTZRmVVo[f[u O%T#^2 5>1&+r !y>_VS<- v= 8|Izɋf̪<McA=\ҰHgdem]gbsK|Iݒ[yI8fe 8q1g# b%7;K n=33.#PK{+rT]yxK\kJ:s>p oDVTI|t1ͥՎ΍mU%ja? Gx4"ضςG,7]0aWK܀i@ST N ZA7B2 ?m@x삁j/7/976~?Ej퉊ٕngW9Y}7|%wSi08`wҾ̪o]q՛nߡUTuWJ_y|w8/d999fࡡo_~|͎x^Z'J}OZW $TK+$KnG llaclq as(|T{uw򫯟,zJKK2ZW0JA++/ݳ&\ŋ ?Gw`3WzFV E gWxQœD wX^m%L iZEؖ0eԨV.$!\ƛd<3Fy ~ ÒVUQ-з7 9tݻw|7eu?XzENN6<5ANHV$a'liYA8PJ%T +@Hxr%< ?p 0, .ѣjg͚|;8P޾++χ'׆'OAxSW=֥;ΉmxCTUKw _<\:cŗSrd F^B|\^kM;1rlOHB< $G?;9yy ,/\BV0!N1wXn,8. [}QK΅i||]ojpy+V_?Z^BŌj.p,5,6gU"Ά-Z-\byؤ36e<8;A{=p+cT;'8T q75.<Ϋj-呸<0raQrfr YXЄ=9Ш-3eڑߧ\ Ly'p'JHr]p:wTTodW+@$k-(g D,7e={:벫(Gd1 MMM۶m?γ\cKMrz[ZzD'_+<ضÓjn>X%A2SEioR;,/61e @?.8-<<цAN%j%$+qb&PD@ K|?]- |R>#T*ZUxۿߒ~N:v/CL5wbp V^Srd9TzQJqC^0?c9O=^I|RX ",bM%,bʑK(ߞ H;~KZU] ςWF~OJn-$< _Ѐ Y\gYFbzҖ#6B._?p!2:/6j:P-m ,o\*>DMCP ;P_pɵGK*pުDR ܽg8^33M`Lx_ǏKJLص7bמ݀ݻoߺzՊРC׭]E:/,l1V*b%Z-1'ZOjY 9.4'O+Z8 ^MBNv\ .\QYh;ܳwdx" 1^j ~Fc򖵏V-FSOzNh-¶7g;*ϳFDD?ew I ݛbxNɃrd[3z%r;*}(6 ܂背[PpcWV}_C%,%8`a333 ?kEk?_8g7}!u < aBm1 N[`_F ZxE ^!+q{[3? ƶwu0|O~܀&k^NBذ˿:~,cHx,.|ɟB  'yfgᦋg٩^i|2+܇G@},\n5}<6\9 L ͛7M=ڠa\;Yީ1r&7{=?$[]+c?TǛ\8˫71Uy%? 䇂>'RM1PZ_#o/_T=Nwi|`@n{SA'Nؗ9'ّ-;< m{[A%Jnd3+,AUG-M!H<'P8?|Zίmw A~A(2I6QɆc pp}Y86{} o 84f͚- ۸qcll,P0[c.61kUr%%7P+ҸRL||;_[%%{*$aȯoDQ"j+,>9a[s_`q nzтh OmeI"?& x6X)a[a9oDQfU}'قϭ1d <1_H+sSm> T8fc~~#m%UZ"#6tm7^7٘jiIUQuX 8VfWAfqc+XkW@jIqsc+XWA֯ pc̬*ՒKͱpc_U%2ͱpc_U| 8V RDwc+Xph֋038V0u|D+X }S-D wȲc+X;*T ʪFSlDŽv?oVm+X D-X }@7~ )#@j#?tod~s ja?KUgF>X } jfVd[ 5)SLX3?S|oӱ TkٛMɩID4 ٘Y1!O(|^{vǖl9۽q Xg9Vw~B7tS-Dp޽ʋ^ssJݸ}b⨳u7ɰe˖6!I<֟Z8M򕾣aJeTIވe/,[ $D˱ѲMa?!^?5_ ?iMTV⻟tC7Ղt@xFOH=uj݊ On]|.w~u|ÍC@j?fG1??fߝY{]_e%%8V{A4>,mgUy'=@fߧM B+Й]ǿ盷n^kxc煕/]^xQ{ߖ#yrR|P8zHagчc_P-+]lI~+WjS/^~f #Y@7B0߬4޾MX u ">ɷX){UU~{OM|7P-,ܖlJj'~f FSm= f2},/?pOAI6H^Ec,X ojx,-چ?H g[16%5x\3]sp'kO*.=֝We_`%ժj) S XCnBb,;4Mkwca9-ZK5F_WT4aT˓мl+ʰer;9hU<@7ՂP /Éc.zTz?·%7ZYr{YJfv~IKcZ]4r5Tqhɷr֦Tqǰ ſT\?KB:j _re5|hc<ƻϠVd[Y"B_uS-Pws{O*̮ٳoӧUY%WvA RO$ 4j{GPN<[DnY2 oD%-ɻV|y$o_(NSE%-7x*WW&*.:Jm͂ȩV򽖳X$'^%7Sēg/߸ z'#N^|rqE?4;9'\Q0`34_Y~|> f_9? ; ^'%={jaK U;o=z}"<~4$"0;uJ8{l'|TGג==%T[yj?~<'41"?c֩B%. g":%oS 7gxTX_ 5\~dtS-ŕW&upaVv|h1ˏfUmN,x_NA4A1DiT9q; XjZT{Q%asCbm:yh.N7xo<Z?u*@_}?\>a,~(! {= 2@wn.n._E]/mώ{:=oCpi<@7yӹ͛sڼ15F7fzݩ3[>-^1kS0&7{mRN_1cG}0򳿍a߆~!_}ׁu/>B?|O=jO:AuPjAC ֭=aKX~5"o/_^_<7xf|OƟ0?|ckwO>2~Ƈ7n]5޹lUgl`qxxxxxx`/5֕//ϟ1ϝ65֜2VN+O++˳eGƒ cq(Xj]|ca ;_[W+^.{vTѱνE:wP X܂g緯qm_ھʵ}K v+۶Ĺm1`N9mF(:ڤl0޿.T[6_jgT;AruPj^ZBm)HEZV{ k' 'Ve8yĐi8!j3V{@E݋JjAVVZՂPk/C+ժ h{hoZmSjn3?Y 1&qT{r j&&ci,hPm,Pm4piY jbe1*T(ٺ,rVViH6~c$~}# ޿f{xEcyXK2J 'UٜV (jc6XtȼVڽHidZ:ծ6&2&0&kiHEBHuWjgIZ$NRjm# `֡*(>qZC7Z-dУr ˗8 bj jb?*x}rLT{xQZDPPmPjSb1@YG .W-5,8TT*,f5le1j ZsPPP3,ZZ40NKTZeLP˙jDcT{2rZ-1T_T jP|Tix_Zdݻ jW冝!V0.5l|jZap0ժjP; jeZ26j|0eZlVT 6[jx܆ڗB_WWKJ j?-j> jMZKZWao[y.2j AjDпj_[D- joa@B-O7@ napP-mTS-/XZP-2Zp#--;-JK;ji@&"S- ZJ$Z"HTZN=8d8 vdWE=@IBbRmJzX`eX-Xn5j_jm+W`>Q@j5jY/Q^-VhB*l˫TZYV^m۷PX)VVk՚ZBX-Wky6E%< q|⁄g,pNVJjUB$51B7ڭl.Mֆ nA4Z.ojE;ZL\!ն0EKbjQ.8GchpV\p$EHg`@5IDSd(2jHLVoT+$ZӋTˇN/SX-* &\`WkðZUmZ V-ACUZ!jqXm7EyXjA@3ժh$y*ZKQ 89V3 @՚jZ4ʫUjѬa^&PX-W p^ePX)uZLyZ-@ตgXdMv-&,4a\%3TfKg)iH@xK6X4[  s^&,. b  Ϋe3dx$pA<+ڨs b8eā̈B-ਇjEM&KjɄKxG9Ւf8*qdZ2Q4~Fja5[D>BYFT 3GV+pTZ2 XrxRh9e177K% xHѴt#Ib*-?LL4xH1P~MSL?`*Fj^ ZYqzR]jKJ@h!dl9m, pd57s _C|)2o% {b p#{ᑽCM׫_ ]>s.jD^4jbR4XLA%wA ) 0| ŘZ V[ ,H$,gɸF.#"ₘs8չ@nTHMoTjqЌ%51jrR-GFSA6Q9oa9Q\)Ֆ8R-=ZP-p|tM.Z2NTf8ZCCQYZ2%ȷVk)բ`4&Kcl8,gE, Da2C,#u⪩01=rLQ+jb*-Z%w!h)T۸N&i}XF j x-j9ʅzZ\Z4VA5cp${IVK'(tP7k  `G$\ kZb{Sl]pI7p [L hh[vx9"oE(gO6r?FN/A_Lr`jb1,Oh8#٣TLγB8Z.p^ZJ(Ł%qqJ><̰3԰$8j 51qRY̢8kFT6RlO5c;E@p" eׅ0 H$ZE頮x@>촔zP*˨QZevH1T+i!|| ĕЕ;.Ij bUK?0ۿ/gf}GWrDOޖ $f/s :i7VM& żV N/dj ! =:X#DZ-rzqfDZ-#?W k=ޣK4Z+mZ%x9&oNZRnx,EĊ1dyg^FTݙjjzuřj/iS-1պ sۖb9F4e=L(, CwT˗ňVV@/o)Q-w TYvڋ\#"X+ YoEׅdTh5݆KKtj"ߌ =z,2̹jQ7BAOG^\Zkr@g hjbj`14[LbSxZjšTKPۗ @ZVV+L< qIrg{Bm)j)a*V l<x$ZgE >hZBOZ-a%ΔP3UxV,= B4-Y ZA X*ӊ>p7r3\`X1Χ̰ PkaMAbT1[j۾Ze2SeŬȕ՚tQmw]-ڄj?B,N崂\`Rfyg!@"m:@#mʌqA: ^gsMJ*N3r/V:LNJ6/yba 5Z\xP-0j 4FW.^@܁6HP# miv|D%]VkJPjm5?)jS;s d! V_@ jWai HYҪ@Y³\7ųVR 3ҦJ+$&.)m#ԺJbjPl*tz)N/{juղ A hJPUb> ו;N|V bC 6PO@-՞uQm+ |eY3{5#ȳff0PF.8>Xj2 T\";f2,d)܀K J+KKUZ4\h@$ Qjl,lL]/#vÙjqX+e 4ŀV Zw9Bm,bB0Ё8}C$aoƴ+d,WNŞY2Q YԤ@,eYܰ(;IFj<{\5*-Ԛp6eQd:eFsa =ŹFF:V- M&f[`#S’nw{h :pY3lsPЌb֌FBcgp=g͠:ؓ5fЬWZi.8+U ibYYh8 K9@I ҁ J<صK**f,D u 9|3.jԃ|F-0ڼPkӫV +W`JmRPl-,fſղբE*VSe刕ԻpɋfX!;1,E8+)hDTa/D]ʵ-Hi bt<(Aqj''N4FFZO!eaA?{;j_P[j\z7l_Z(8KUWx o ,Bɚ:|֌)nF5#HaTKdH"N+\@ghgi}Vv7D-VI:=`<cDk<amTTiMF$`W&+6)9KDwKh>y$NpK&њh@=/E5yD=~c9z@ۼdjK6 T ƒ$G{C9l8U hi q3ǒƒh?8!ڮ\ ZŮ\*l`1ZVA^m"Y"r.ZgqÂhJcAF{iUZS8ּs4Li<$Bm;GjTkuRz(K6Uժ pTZùBGi.8O\ր9S$Z &`rh>jAx% E(&rIDDl7$gd`k8Vy#- ^8KrVb4yqIbt@.@!8W->h Bm[rK0LthQ7TXiXK;ԒۨcQX-8|!j^~jo5U+wl?`+ݘ^THrVV+6m*$JPdUa%/E%4,iDg<% bgq<֤Rj鴢 p\Cڅ/n~P1~q #3pxqpܹF*њMjm+2j2Sb e<2+8 @cj!ZjVKQ-Y2 Z2UW@2b Y b6/ Ndf/pX +dI-ɚdY2$ΚZoy}V n]iH\8@҆kJ a0y =FK=mem[r-H?hN/M:GݰLF(MCf/j">z=&i(Az ]&*"`D>Еk{MY ] K&_T-?ȳRV-ir/-?CLmANmU=0u. 20BL4IWQ}A3v W2*6cZ!1T iUDgclCS-$բZq@`#|#ȯkRc +hB\1YSm&z+gq \ցXBi6܌4Y^VeW{ԃ娵}LƜYL㦊JbjLr4j=;{t3;E4ܦnT!a~\iKKT!tjFݐ-LIrh,y۷HʴTuC%0#nzMhZs*%#fnb\=h1fZrUv >X@ͥ5ՈZ[ FݠN8rz]sڽ4ܹ͛T˛pO):<+U@hT펄^94YY)&rSQ7o4D<+/<ˍhFZj$@K˩ 1ɸ 3JXi,Z1 Β~H1jIPֿ@͘_ f,H5gEe1:Q\1*fGuQ Բ/a^[Y_E",NV 2rўYѥ(P4(lgVIE54Le^:gs/K+I<@m&qm4TZI聢Kތ0av'쎠hT5:A3ncZ&6-f^B-tg'S7TE/bP^F|ӸMB͝^k5ih +} b3{LV_PzB7f/F>ܡUPc4Yn,~ xv!@ia^ڑZ& bǁIcmՂV5jV(&5 Kd рM7okqj-׃!hi/a܅Ǐ y/-4CaFtZ;܃&VmiK.ۜH1/S(W*VťPN/lFXTL,Զ[ UT>*v +%!YMcL0ZyOAJxV#dzB)L&r aPܰ@W-10.'rG<ˤm tZ*Ll(ٔj{CAE4V&fbbSj!T Bm=' EZ7F"2 ڤfJA3(kbIfj_0Fkvpiw KT̥ʼn/-;qbЃyݩH}*oŤ)m^X=PsH@M'VT *PT+VTkQ7ЕΟ0Q2nUa^|S*<+q20:qm -5J bl&4 u"ZTR- QyAojIMT+_`Z[@XX"T`@Bf V@fES%YEYȬ]BUhDM@4{|q6xщ/\O leԃm V;֯+r22)6 eܴ"98(  Fƨ6Ӝ;lTKLАzjMb5ӕ8U 䊺rYBr\bzVɒ,TYAaOUhq~Jծ5$^ZJ+o[zZY¿ 8P3 V ~Bn^`kGZ:H1MU5ZPͰ'S-IC@թLo/G-Z bSv$1jMe16VZkbK\\d8eY9K$OGTgE:X9߀&ٸ 4:8w]:X4C ^8N<0yi*m/üDzЌZ@Pۈ-|Hf^d ŵȒjQIfL@jjY *s+O F)ɒY"Zdz .Zg:[na8V9 yi*-!l:WKfZLMjbfH74#Zq0Q<*\~Ip0-Կ@ͼ9GA^zmPpVV"H@-A -NBZlq,h+8hq ug_z+gdg$qDkV: tҹK &v4?>‚ j 6N47K?%׎snT^4$G%GZ686ՎʦZ4cr qXaIne=0RS+iJIb:jA=|^1r.E3,du.ó|)Yq)˔$ZyxX0j8XG8$ժ< Gؒj<1 ,Bmcj95GP P- 51.ђjMTK(P@ 9$Ej,Mrh+Ȳ6(|F5}V ݷI6ˌ(#Q좕$/I~/*oP=x)Bzv bjk4N/%u媴Jܨ䦙Zr^%W~o:`OTIfō%QR-ˤ&abU.S ׻hYA%i ʝq,Aƈu0*@YR Xvia&jK bÍ(YfelNkLoJмpͫUNW,GcPB-j2jA/(j!o^PeZVKLTKVE$Y>O$ٲK "MVRQ qV.NY4`\7 YZYh,Z\DkV:Gڨ\{@=f:ۼ`D.Vwv"sL-h͖\-+-97*fFNo#+meL|*fU)^^\KdI7iO,]Ϣ h>wO? B-)iaKKvVY4 |VqYhgrKȢ2t hwwiIJ6\ԉK16J˚NZٌ Vk͹Q'fVgK.HHfsc>m\&N?=g9LTªrz d +^E |L#c j´%Z:VF2:LF%X7N*~;T҂tjy[<1.83>Б~@jbbjא\CITM,Lܵ [w2ՒHCPk=A3_Pdz#`=qGA-)?u'I+U(C+1rR, 8 CZ.@`"lHp^M 0|]JڅI6W݅$ZPr*ɝC?[rQW@rDu}Ƿ "*F(rz.Mgnl" SXjW k,-Β&!GY0R)(N2Rx6l,0VlҾ܂j P+Rim^!n\.V#e7]:Q(ԾR51V~>Sb A3oYap@I M`qz)ˌӋU@`!Vư$+M Yܡ@Q(훍gKa -+a5?QgmҾ̂e Nkq̠,"6Y Z51/YTKjSGۂDK jNLe1V2rF_iX,5YaVeV͊]&@f"hD_q@/Nu!VHKdY7t qъ]MI:J[$W (͸Lꁵn9aΨX䨵L'rmZB΋M\5\R+kU5~yK8>76H?U@PdR4r.W $B HayYVe'YZg 0g]D/Hk}ς/=^Ղ15/T" `զZ16Z騵akLm.pY~`G%,@I!4Ķũ+ rj!\@ 4\2+ LYon醀 EY!@Rk\qF41 OrwdN*/KMQR?V8jqLm4rCn'6\dXZҒku sn6VB&>+'X—d5}@j<+؜gKaD;<'VG@,bF9@="fPۍ3rxw&f6Pkynabyb1TG7ھ&&͐ZtЌ(hFQkZHcV '",'* TJ%i"/2!7,fY T,yЁ$Zk ^vPix92@>LLQ}RZ<1DZ) JmUH֒!;ьPk%W+@OZmG&P9Un5ѫ6Y%%Y'C"0M%M YIx<ˬҶ Zfm,pJmq|ZcP;yFxj)֏nTK "^GpYnjIML%"V@83X%@+ bM֔f ڊ5gDjD] i(賂VjhGD2oFɎ[+eF&Zռ5x9߼!r Z&㄰ {dpF8> "'Xo8Pra+ Av!h\@@ڬ)pVH]j,Οp}bYh,\5.l^w}U41%J%*vZz3y! VؼP+ Y)r*~%IvbsY[ߒ+sCLoV@rbW)VPcYɲLQ |%FZY5f^Z^vA̖T˩3Z)9iQ+`، :8jcG#?7sa ktG="h &Uh4@"&Jd Hp`)Scł`i|"'b@ۊ8+ Y?K dY>+ -=Ɔm8K]j̶iZvZ ~6WDUrxVHUF=eA f'B$  ;^ĸ[Ρ,5BKJvbeP $51_n!ڢyAgLэ^0g*UԀ+V$ 0F ,I% AY5рԅt Kn>+XhqaLcl@eh"45(ټA:PRD"4@zSiZ=jBhb٦ PِPkIvVL`}:0QyJĭD+(xs Y,-β,"[ ,h{iJpzČP+?F&jMY8p4 \)}0C.V2lAz'jELqh^qQKQTXSN'51V%V6Ú,X TAj/0+hd6eYSjtT<܀qq}]D_Zf%ڗ!XmЃ&y(;qN9m8abqJZ.2 .Q̆BDӋN<֒%ZVAL Jq^V F/d3E0+xm,IÂH] Ng͖l-JհҾr1q炾Ib(e\TvZQ vZ+8j)()QThBRfB4j-}7.PDI >>-e@ 5\Ւ:Ȭ@ qDX XjT,-Y,̚`kQEJ,NGd H}AUX4}@.1:L]:0jzRt(=z@ټڃ $ SLB 7fdԚ>PLz?!7-Sr7O8j 4rD%6goQ@0Cbb \J.v)0V YϬZ{?̔ ho ُg-h4Ҿm *\Z/jOI, \[u憉!5/ԶDv鸙mZK $H0YHc2 ZQFB퀏Qab:KK=GB-9OutPcZRXBa A$a\EisVU0|+Y=$ZKkUZ{tv;kz@'fiLӶyqYR'Eab+Z 8|sЏY\%QىH;O̲w?u`X=У՚'Sm1j\rz`XAf—6J3 ĶYF^U(<ͳ³vhmw`_}TZ2sD̈F t7A51 N}YB-Dp!W<1'?xF~Z^{398+W"ЈU_9+S Pd/&+ #צYF0r\b۬h"",B,]CETEkV:e^V  ?X_ {f<^U=h('3jj$r\Oʨ/?eN([=;䒒Պ8SEXUDky5ΐyb\K.ղ wUåbӫ:ÚYYK Y,+ 1OsV\k\>aHWJmf7Жm4%T,~w=j-n^P'ZcZbR( I",*';k*gv,G4P7dԓ?˘BK鳪٠{KִZ쥵8bzC <wML= ;a6(r 01Af"O#,Qo>~(;}`jȔ~\ V9w1,1, _Jj_*4ɚYY>&³/gYmJT+ @9V}b FUGH &o g@@@-ʨƹ b(L"f!u!;UV4jz̘bʁL`,%d68)V"`YV@k\01rgi;Qf͉Y]Jzpmb0UZgUVC<^ZvZKR͌6/Ҍk })6/Yp"4n˨mTVh#i=&rQ+r#jC;&T~&S}UU(aXA5#,20dYCA"16&[&VfJriQՔ0C#& 5P@KOA@%vZ\05/"f>hh݀0pPK6R҂XwYPiPK SfRyZV%k@0fI i @"*`5dZ_KhD%Yu;hYֹDe ~ҁ6UimN+JM$͸xyj{6y 5eԊab(Զyc=M#K8jm+ԂՃ]+ϭΰIVdH$Y=Xm<+MΔ1+گf'ₘrۂ-l{0=,piQk>̆ JShV>IvB-CV>PP/2c<0Q J+"@s^*bEB>YA.[,˚Qf%:g|0Z;Kֶ/kSM98VN ټXF+&}`V:bjo-*RG7 (0_@U8a$ _Jʬ ϳK 6WKuA W3R21UӲw.X1#d Zb62 NTRV2CG(8jm'JkbT+/XJr(a $Z%X(j_ &+ 0>Q 3 mV_KgwZ)د g۰ixrsACr.xFQ~\6/ 7J>x>B"QLZ@wU[[UaFWa)MVB85F'>𬭆AX<ݳTZm 1c;T{v~!A֢* sA= 3*$ )bD6o m4Y2LL2>u.lUN2Q-U%UʵWSLaK$KR@oI d X;gUY"J"6JX)4Jk^=И!F嶘qqSx)4~eB3ľD)U,E( QLMZa9-Բj{*!4ĪJ ҪU6%(cyVfJ{ک5̄ˈUZ傘zAfܸF~jx@|aN *n>=sALYPmTjA5e[!N&ƞQko Ʋ_(@V]%+qk)HXT,rBh#->Y%d0keY],>d} A#XzM7 "/yHw0B3I= gm mx#m!!zQ[=j(r\yFFjnb6Z]R 1(r(N$B{ZF Rd"n~XNaVƊ}Md_Q:0˳ia0A>UƧhZ>Q bgf)T<PuʄZ0ն &iTR%u-BK4 'ˏY*+0.eY[ehiCiJK-- b(% =P :i5ƈMIČ)N\Mgs%36G*-ƙh! 4ILC>!+7/Hɇ(htXeZozJ@WX_D S 8@<YhzYh5 Yf'[mDzUZf` D&qzՃ#S$6/o'XXd ȡ3k01V60hU Sp+!Y +ʊ^&Q. ^CK>@XEu+[_5LKkJضyo[=KALN9EdS@mڤf&"PGi@zZ,p}@Xg=Qۍdxh#> dR4վ;ЀgeTQdV`%JT֒nZ2k: ϲP-pVjܲ8ԩ B+@7jdn[@F6; bКkbP #lٴZ8u$$lPkPv߆B 5&-PZm$)3DeZZTվ J*",'`S +DZv( ,S t,Em t`kT*-pѴЃ7v3,LTleӶkwd0ަiBp"(ۼVIUP`' LĠȆlzLf2jEJhNAS[yzUcX؍X1eyO2D7^DX{S ‚DUI(65 Y\k̺Ke 1@$z/L:-@E=;slB6/[VSLe*'V.1ղڗf3qdzkgͪ8\{1IK*uOl^P艍b3z@-n"mG̠حׅ%ZbY1"G( j9ړ~wOeZ!dVXr ɯ>`kgAfv nmRҁTZZ4-RW.{vP=`!iI6WbheU/%>IbhsX=@]@wPȋe"V$D,&Y EFYo2U̪~jr^ZUV޶PoՈTZS 11dšz2F #vZ,Ԓ1bLq@-Je\$1,pv&E,p>VPR7OBČxFPۓTTT]}W5 D.2"("e[b vw5t`z !KyF'.i D&RmO#N\QdyߌkӾ &;-z PLؼ^X}-vR*0ˠT iR'Pcip+e͝'`U9,&A6VwKQieib%m |ָF;Jaj‘Z@NKĖv{wNK(u.(LSČ8 j!@1#jAeja[ ?u}O]G@ G`hhn#qԾj)T_S,P  g,Z.@{YwX:K 9K<0G*3E&rD]鴪͸z; ɥCͶ1Q=z]W96/=*͋h]mZkbF3 I'i\(LP ;jɎ :uPH,$Obn\m4ҁ%#mh@JK MJ2@׶/i͏cV E{(ꁆ͋A=qBkZ˦ZVVaVChM]^5۳3#0(̰0\|Ezpq_Mж:F|93HA2#>j1LlBi;Z &׈Iζ0Ԛ_r[ @['ZE=;TMZBF-> XUZ&߷`վ$z@I.`2r JʢA#볯DkS@TDbT'xQj淯qm/Ul#!fAdtZF;-z5~eE7ʩD>ũyqD=x]ڊ^du6YV - [5;7̚PZ0az%ͫpZ2-8SĨ,1NkK mSUT.-ĝ*- F聢k)2(fXqsC>;>z6/z p(ټ:iؼHjY;P=Uxfm閥Ϧu)JVf N<e +.n*k@FpYJ'4Tn7VNxiMvZʼnАpjNdb hPjZe$fnhQKi`;-m0Ϩ Tk ֶʀl2,qt?@%8k˜溁+]IvTi˥UҪ6z@{ME&pי"=^,vZs͸&WBͶm&WtV$&RЄ ?f\~\h6jMl$ʰ.8lr,,%/H*%Hsi#TZpüves̷ۖ-pC"rf<9􀞑gi b; ւj{|O$1es% y;-PjMZh-C|V2}] ⬍٦/Z((KS՘=極S'.BM 7pBʾr3a_UZatZ}͸Osu slPa#ԪۼK ԃ~ߜiWĨ鑬Wg-jXHR F'ìRiשҪ-4BA01/tZ%;-7 JBhjj'Ib*YlCZ("1TkQ͕+XAeL#9N8kczk٠{KL/N=aanϹur<~d}4Oқ%G,$SJavIe\Z4:Lqzr.-Qi=:]pXIY5ݻT{t^ѭҳGWJϞ^z{6x1,[էԫO'Bg"ހBg{,葿=\t=5k`n];fw̚G:93fOLo6ݡS?4C)'Ok4} SLi?]`rmc&jVƵ"rlcĿGKz|~n-@聗6*͸(e h"E IbS^}3]mP&ۡĉdz9}{;֩W̞3zmߴ)]NgR:~;Ƿ1-`ضlv ` |my\-c6ylM:l0=˜1֍nnT5#ۮvՈ+Z1务-7h2_RY7Bk7֖ҁi#kU&J4Ӎ>0>^ge3O=Pkr,0jmG jK- þX9dJSC8 y2y0 cϡ2gC~1'A q.Ю_ P @ǘ%0mV%0:VR [_{~"Ynuӵw]/rma \tgzuNH|ѳ.=1zu]žg}z{vQdk ^?&`TM꠱5A㫃'TLL R|jSBL1L6O* X0$`|¥c :7wiayCstc@6} 7n 8>,G10ch}h4!܆:02 qns`;ީiDOJ'`۽Fk{L띣[lb7 tOd}L1H: bݱPMp;Ӳt.YpBP$Fw.p1ƀZ^1bd,p] j- v4cd&̏i l鬎s: qKn.=\{_{eX۰O{_NSַtAoJ,!pQLҭx^];T4cH[D 惉%6@5 arzp5 ^ǧ:>R<6eִGS[ȜT$f`&HФ橀S-R&L:yJ$VISB)iF]%+u^T9<}t1>2|gNX<)NN:3!{|±I=G%<`x\<`fwV=F83Ĭ{f;gО98#D1w(硻rBs֠nsuF-lk'X7q]VrDamB bU[_D={,X_=X8{ C'19 a@g2~}K)A-fy1 K$]^ȗm&ٱv+HsfΙV3[SmcfZLJ*mJCSZNL SS}*eZiwH9٩kd;6(ch׈ Qpd#KY6h̬@Y!YkQ`#/s🙶tZ⩇|'LLpl?,eh0@4.\F ruľ-6f}c1}\Hncun 9gكyzMS{kpGu n6!CZ n8e}?_S/mw:ˣӿ܁m;IA ۼiN+j NiN$ Ƭ ".Z1CjӮV:!F20˚M0` X,t$ !Þ/С?1xЏA c@?qYvA0 =RVU:Xs`<,hiχK{>b{Y޷Žzy÷uߞz^]ʢ}z\xQݽ}qѻ^}z_k.\?6`ĹѵckO Rrzkf׮WaMnx^ua>w^{~X\ {n[}j6/Yѽr݂]V:. s*Z>(diASL |jSSNN;4=7x`S!Y9!NFX>d(B6 d ANYfLidMJhQI# =8o9bz# tP66Ŗ_mA\ǫ> }?0Qif\A8㽳(FP{u6nlK3 I`8J\HxtژUR/\C k"YİCɆ|$b<"zuݔ릾X?ņ7xFqs&'o-dzͳE4&'6΄<gsNyôOy^;gDM1Oa#Z> n`D@y퍠ɶf%Z@<Կz=p|pY}X.`I;K{kiߛK6,X}o+/ЫާWݢ_}^wޯ/t~e#jƜw>t|m+_X=: \.lvv;}v-PT\R/. bTBd=Av-=cIv->*6zs3_ڵds>6 lVrasN^1JW/8-׸83#wǩ9+N?ry޲4{`3F /ܻhϊBgv rz{Pޖe6-Y+=YpKF@CsR1R8$M  5P V,iB8'uwJgrP yqK95eݮcuM3g+t.dHA{| zt~ǣ:M_!xIx&;mԃM6/\YQ2ކ]=ۼZZ=`^i}",YRB~"E ;cXI5XCg y6|ֹgW>ҹj.y.έva޹br>r,N>&ܩ&lf5NE;D>Cz Dϥ h t8ñ-&\۾YY陹0+CVfA1 ZlbӬ[:v;<|{>?tΨE"}.|Ydzv.xvyϛgiOnOk'zOI rA~C`zh%n`Y@(_IF"@7XI@'}}qPGAz=k`PDQCc 7מ"&v1Q-7oav߇vWP=OF=p,4-1G@E;@wMB-d þ"^o2 x~ y\ȋP_ {\ L8>y,.@ebEϟwspr,"? krt&³:$Ze1.47>Og? 8xAC< pa#/q?ln;+]1qp VNb-+&4O>: lܵc:J!/<>xt]u'ԅM \jzu]그ordWvpSHՐfcoe:yۧn&Kp p*!'!;׳bw+i/U.qŃ.ĭ]{.fՀՀН5U1klX:akMҎ;Ϧ:q.uϹC{9D$NY2~ky즲%37w5  w8`V n\Dl; i=50u>_3}?ZCHkK bBNvԪiqW&6=`OEB-+վ5Pd+ ˂bxTqU łP|svn6z^}q뢺w.p)"Ҟˑ!_A/+@υ3\ z F\TXP˿nǒ~^sa /]rn3@ayT];$JAOaݶII$ iF:h;-Ȳs:i!wnys]tϝ=oA<޹r=y [8({iy>r}G7:oؼcs1NqsoL蓋F<= [8,kᰣóGfZ4&o1 2d+ܑñi*S#+" ;K㶗n)TcQNW 7T3q w&F%)N,IW]S 0d0Ŗ"Ĕ.I*J[xpwc|2b+n 9~١I˽ΏY<{© owi֌>S64[ ^xwȫ]v6*ji%Crz^z* RT+,1"퉊` `',1U&JHd-83/P^e^^Y}5v͵ů6]O|=qZa6]Kx9ĭz`ՈXxo0_`^v/l8n>\9vAE; hKFCEJzۺv+djW`mͶ*XZ g> $ _ b͛9]yڭiy}^8Ӌ_<*KǞ?`٤I2Ep:pJ^pMO,d%Ɲ{bǝX2Ē'X6D@aN#om w& !nsEj ٌs@Ɉ^OJE'Vs$\-ξRxJA֥G/p"6+xĹѕQ{ʒ"vYaW] #J&G_ ZyhB層)'RO>T;xeVREA8458)`D~vDdm zqRƒ bωZ8mۜGl9x>t]>}V-xwг{nޙm2$bBjvZDtALib$bALԹ2I% DeZ{N貕n'nH9;g+=[=̭H<)^ Z#M iՋ/6"sۋ;^؞>?_9/b_hq*=w?}ّO}~<Ϗ|~ḓ26?K[,eͳUÑ"Cҟ|s;Y?m)?q?c؈1t/&>n!- ݷ,.ZA`ߧAh2I'C >ъяV}z5pg>`[owo˽mno; lw p m-6lvik"̽q&[ܮl.+{^ Zonmu3kwN%?t(~ɱ+sU?:{٢ǵŏkK/A_9?:[aSrNћg2o7|dҵ섫\qx .Lr*Jn \;sz'nd(9y$JP}ĵ3ǮCu'/d%=U^=6N9}v`{]t/aݽ;{|o"ss›;6jycu6k[ݯnv;}gȀkCņ_;F򦆴73:ɃwN;q$ lޣ'ʞ\,Z_Rחjxi] ǵܯ<}pNYwnɼtCsSN^=v 50,ֆғ enroUߪ,]uvU"ȭ37O7roG/rh݆m2b+=lɌ$ F7bj;onӈ~fg}>M>ximbצxmZs`qsA%i^&mzTp=ÃrA2e` W,^ADd sV-Ȳ[/n_R;UW]?S7}bn}NNSw;vtY {T;`q&N+s*Y1d56x6.,mc[mamK+e[J7n^Tɧxw<άq/X㞿ֽ`GZu^| 6ٺpG@QDhIʲD4H:w$KGAnk^;[r|݌ELmU?m' XSx\meoVQ4jg_*8V.ż yG8g](8v0ԥˆ+gV].^Szlٍ0_@uɵʢK%u'/>vdFԊKSߝs6 [B3'/gfsFn6`^;o0~_-W;;Pv"ogm 6LjSEvZxz* 4ebXj!P ,;kKwQ6` o ,b XZ}-l(as",:(Aɱ'e?2|dyT~Qy 9`'p "=~[QsSw܀_r ɸ[Bvܳ` V8p̶J/Yڭpn3m;ߖc[>e)j`%sN2fk'Y9kȈ[/̷>jB=ub`Ni#f G P:X&6v}OFy@m[P}k?uPK% DF+ |,c "vㅌ\ȰEG\<{R]A"(:KI/#T/5 E\,z@/ \*8C/u%TpB8mms_}Qċc/ G^d b@}Y$&9!?G/9HL7HXIaF:>?zh֧賢(vw6xS }>k'V[+oƭ!~̓k6$ofG>Nvܝܤ>(? ,R .̨lUk +?`*]yR_bţeϕ<8W~u="wϕ[Mڵh۩v cڴкeV۷l֮WmgO/ؚGqU^.OO:|{9ֱaĺ!_ي~0h9H#uζ1ߌkR1N=@5ti o#J; p<5BidV?"F~ TZpB}e1!ʗٔ5H=ZB*"_*ORscX D V\j_?pGE~1/j8\J%:-41PE`ނ_vkN~Q0h"ĞgG?,u-T~9e>?EPlv+$lۏ(aQmO(|I4<7"$ BKӰaOF<^9)7xu.@x=}Hq'+$yrhÓ͏o{rd瓣dyrlQG=91ƣQE>螇Gv?nƎi[mvolV[Jq+c9x +AEC>+z,yʗ7/8Ys+\~\Wb /#uUΟc ɟ8ȼLA l"Vm :h{Ʋ>FGCZ>v>f3AixߏB{PiDKsJ bcĐ"!#4}_)bĔ:PS]up'psy@=(? _ƥl`Ymh&h H?vu\rͷW}{~uS߁y/|wwWk /נW}skx-xųO+rAx? {2αXq!=ځ5W![؎7y_rnj$L;{mzQҵйځb{zV[{mS[ mL>Zm YVr+ <x ,!G W3|VˤV~fU-gsU҅/kHp ]{x+_>r=%za k?o/sμo;}{AgykV뷜Z5ޜcZ7xcj74}rsm"K*N ɇ॥%YH}'6rZVVk& bE*D40ﲾ hMg@,nl32,H`:9賠'"Ε'#֝tr1;OȉI؟| '%.'5>'`NZbNZRN:Ag(ʭ=_yA/n}ڿ^]K9B]gלz^u!E H1g JO1K~Y;)O6b`'^O|_$.I'랤oyzd~un7IߜI8۲#ߖe}c8uʼnorT|ʓTeYOJ<.>[FǑٺ?Y3}{\ff-[`Ō33333333333s{/"e]XHJbTXXP8_0W7W-g˒f+Ri=_?T֪=LzDd0=۱dAQ?Yŝ@ P'dAl4fc_]{\H-l{uvi.x7r~Apzj tZהW mI$eyo:o'lGnoAʭҦ̦8T7 W[Kusutڂ)1-ӷju>]5ְYU== %˲5۲-=ϲY0\6_J[v9{%7` l$Dv*e.АCh. :*]]հ]; ^\TTܐ\TXPP6_:isU5Yu C=P9+5%=c01Nό5V :9~b`8;;-9!ʫ:ȾӬA;B)@2^C =Ȳ Qz=pvݎ5-y fOϙҞ3=gL{qM9OsFޓu(OA?F-5}>N4fR~xkl 4}:ƈZLgY "1.}\%e ;oX54 qҼdBkA36B.tmhwP脺[i:3/z$tfg y-#}>W,BzQC){?w߈F/}!p +_>)xwζ~??֪VW̓}j>US~ZCH1]pa?9Q8J?\ƗQ .D nQ[AmKa"#h,s8q0ԲߨCI"Pڠ٠ZTJW jD[%R; UUQecBP| T(=y;堧HR*@UèUjY]GY?詅t6ؼ#®+ֵ;ɧ7="]E #PZDt4 }- 틃KC/3ر ;Q;R9T6ـdwJ]kGPkT(4UC!VGlp"#= Y~/Y8?67:;4bavmqG`nk+)mKmLFkuazl<$053F,wn_դ P_RB}Q9Gg(y~;7%R[4BO:sw}Ϟ kyז qǚ6̅`irÌ 5h4nx]{zQ9'g4V{S*wUeo]RBg+#ې"iRyU-CXy=%6jQ:nn.tMu(e5ﶗzM r=;Hm v DL[udzloiKR[uk6))` pϚk^?ϚEJ 8GWW\EVV@d=)-/.G/Zl~jIjEZmZcxM[57޹-Ľd 'woSܽEqP2oZm\mX@aW{VVZWFcQKh,n,l-8 ptvmy[WR?7fM#Յ]qIȱ r,2s̈́:&zaJA0\90cJGN|]4†5=+;w,`-S[&7@s @/t ӡ>EuV5*O)?^w JW(8iNc1dWj~n2d=㸁 GY j ( @DH܃@H!h{Mc&Am\sX&I\PEAQ`Bm! *Nf@th S zݶIZ>oF-OG=8 Z̵5jt8j5&S&sVk[.[ݛcè3x 5\!wpdߐ֘TLBZVg?,Ĺ$eB.dkB[I0 n^Gs޾ֹޖٮvѾɑyh-/,n,//`k+:dyFg&c[WU۬в,wd;30}- e!n' 6{Q&+!: ~Z3^jS'\( 9) 8)Gzt:5j0Qgp[2uO.=$$Y(z[ WۂyS _ omstړpP׾{џkUF%V[E[|$J4(V *rUP&g4+l0~  e%D/-2 s(sə $6ZwCK6ȴ5mfz4I꾪R`Czxki0xyLo0h0uݧh.j<9S-GHZ֗7P"W? M1ۆlĵ0ѥ85Xy{qV.d#⋤qǜeۚsێoYt] DYa0c1z'G74mk+AɪC-?uDw/pRȺہ&dڶA{ݪҨLϭx(Pݍ` Lm6e6<6 P.Ni4QU}6@767Tց@U CG0փ׃E$Tk=Tp6!t͵/jꮆFFƘY$ڭ&;{f"6\U} {R-4;5395991 %P79>=K,ld࢝mY\g6v)|[6>8;6ʇ 3r[a s-Gjj堛nb`*k$/ sumD(<  A*~J|><^rn,.09 KGf-}C{zYs*N+QRo|#Ծ̑1i5mK;xE{H: [e(jԪ<`njI\0ZkvCSDQe۫Q4nr_w vi ɶEUXWn$pAF3F*mZKX5[6|d%l-l+b+b/ RrrJ*M xvwv#htxjvxj~3^im3h06 ꌰv yv2k` ziCF4,#й<kP,0= Y+C8h;9070Cpu$Kå?-̭V` v 8a{sV4@jg'F{;;ێ줺P\? OHK03#@}y=9?]Y@G[G[KKSSS]CMMU,8sVSg&BL|t:0U%OsMeIbNAƷ׾%9.|zs xB#9^ǟmsbܣnqIq I[W"wGVTZQC;/q(w'MC騅u+#kS-l ٶ~zUAK̐dXp ^nONWHuk1IűmŴUq_Xv:Su:u||@17'&6 ӛ3[K^궄_z F%llmUj,$0v@#1h@^[љؚy}*"=B]K }mss<-<-2= w 7tW4gh"m,5bU Bt YXpS=0`p]:DPUQ!@ ]2j7sȐNr1KKt>ce MQ% BQjxnE Hjmw5,A]Oj@rj|TFO556V'oFoongo8n%!6|3Ij1i&$jV ҙJ幕V n෕O>A(@6ց! BpBI,2P^Eh_o/vu#Hgw' -."^`DXCIڙZɢ| b[0݅/{Gv]_Y9hcxFJ0A0ޚhHpPע` @\\_l_,oLOtWTg$K(3#@Mq_Ua/>7Ngq;k~4f|[e'̝o0/@j!&v^~#KeCbF XKjM=ٽK{h Pժk44 24N2a68Ya0Z: V.B.ֈd#/r5Κ-I̋hI0 &X|0(hǁ8Ay=}S|SGi6=`8#p䀠ь}2GBFBh;6>hv d g#0;t8;l8;|87b$/j v(a4eu6ȝmڥe !:S=Oΰe(@UKP8>xڴ<WnnWU?FgfAL%<06ܢE׷7@ V@hiam~y#s#]`#5 "Ӷ4017̄ʔ҄В࢘(Hp0;;++##-=%916:,(Z/\;HGWCCYY^NZ\՘AZR Ǘ%^F)r_ >GL 'riIŸxבb\h6R ]܃?gGRny=JQjaaLX hZm^^]J-({Y~30z#,mQdNxz P`@}m_5؏y/&x mMA Br:>1q6| z(Ɓ EqO'L'&a$"i1Q8^0^Ob8a8a $ɚ)A+ c vkS PER S[+Pk]^@Pb'`ڍ__uOw.XՖpt[3A@@he467mLJ >IRޚҮvܢԺ줚̄ꌸ؊Ҥ 18!8>(.068?:0/7+#%!&"$J/T@SSEEA^!/6' 2ykR}wrlvcvw~;g,/MD>CQvIvivyvevUvMNmNmv}N}vCNcNc66NSܝvZlmEDp`9 hlj6fsfKfkf{fg&$n7n -f078W)Q&8aIsYEhvo]:N!^zeO`ru={鴸{5Apy=,Z9$az;P c+s;ˑԎu,=; cۘ**vbÑ!a * AA^ᄊDL^vf#KŻw;$:v_| bDtaTT?bb||lr8Y ᯞڭFb~5fvl{qjwyvouq!yVI-GTwV: *jIDATD7@%A7ַ|}O>sƣGSYK-x( )/H-,~y>Z`aj 9ln ovFН u[ 獕 e}5%=E=0,ř QՉa%>!n^6V7L-J( 8K [RQ1zzUQť&; 02i{k|o FtZԞW~[٣WJWѐ\NB {ìw"t?!]0 JraL !FKMeKx4~0 ۲IT~nii}Oc60%-% $$AZ[-af&&m.8 =}m-C퍃͵͵}M5}ս = U@W]Egmygui{Uq[EakYAsqncAf]njufbEjLi|xaT`NOF[cUa0/plioJQ^~%f |tcboO}}įFʥEѭӾ4Ÿ{p܃d֣{Zn Qj̿uR; t?пp&&&+󗦆Q(+;|,e(a  cG@a2@aJv` Z A"{`zкXmAv}`Pa@@|-¥Z{M~dYN 0`a6WP@9Q;HX%Y<1 8=ڽ/~~zY]Y'HmaI /{Dv,n l@@REX\]6,:7j;50>27:8375;=51> :ķeyholkZ@V ٭(l)m,̪INO(ORaɞqf{k˻[q 0rҨ?Pxz[1 w~8.~zS,,AR-) ?F=]=}ry|wz/@c Ö˖ ׶vNN4@؁ab%Q09f7tAR-L"??H}[o_ yf@#YnswcKgWdӐ n҅s`NWۅBp+2UF; no{ogoT0ٷ LKL!38CGܝNL¶owؙ88`f]]F+~kO+";/` I$kW좪Y${[:m{mK-h&H $yB]gq% EWQjpť%xXJC5-E :AFϬNLL-M-L,@W0`lh~tpnd__qHmlL@Cj ѕq!B,&8R+P[/e!Wi.{$4Fՠ RKA/a.$bt_Ǔcڣi%^JKHޭyPFBHfXQtU,쪃UMdK-7|C˯gǡHܭ=>X`+8 4Z`roK`K,FI_}K ˯Eb2-ESS[$!b ʨPz?S@!1? @ǂDG 0,3;?E4 C6Tg!u9/ DU0~Gֶؽ<n-TtOO1;v@cpͭMۅ^$n@Fנ'd݂ N/!`rqzblo8>'*5$>,?/l{Psm?}%wU {~| ZT dK<(r4﹮|~ s` | b܃jPG=꯯iz@BNlx3,e=i1?cjQ }sU6ޥ$H-'''DP*:51OZL`Y1IDX8ys[n~Ӑÿ4@9T?]b`?[QZ ) WO>. /1bKYn.n^7hbv-U0b9P f } Ľw}ޝn߾{[7ܼqF^z/]tsWΝdadn`.(/d)v6 y.;n$ԢH)Tj@3{cwcӾԾazc?n,"x@U{[NfaX }1։&NP [V eP}7sꍲ0^? |m_^{] 3PWV_tU.)Ȼ?H/~!%,8-u~eG#w*ҨGTZGq~}X_ZjjqOj!FbW RKGGGwO`Bv-{-(D_0) e?;Z֖vƿIxl$$H6/%H%Jڋ_Uj{0$X]jZ9K! HAJ;zdhsܗe3,ccgn !2&n#HoJ˟RjP>kzpd{_ 鴸B-ٱ n_@{5.$0 ٱͩu O0mQ*+dk5`Z( dG{PϊD  Ŀq<M٫pcOuz{+ .pGO^7 I 9'a EF3rwvLNLG?է?lSamg ,f#g"^j ݳ}xc( 5:C6=/\9^DjO@[a1M6B "c`B(*HyG8T:OU=X_0V@px*'7%ĺJ-f W/K-~ H---ՔtS+Sbcs2 p<}bV7+agaRiiõ kJm222PIƿFTtdO+s?!vBVV[D$ ES)))WjqJ~+RJPŪ_by}7ߗՃbR }r}Sba ,fI #͟^SĤ&׾ČZܥ}{pl.f! FMZ2Cj_IzGN{'toǫ=9-#]C-!kfl%[-ظܑS?|Hөq%LGBCpk}T߅ M7ɽ5ċt` N[+"j$`?b[OOI,i (+hKN) pOr5 2VԔu2gZ2O=(xGq\ģ?#.-z Ӣ}H`N~8֪D/?bc^c;3:AKS[䴉K?dT-MlےZ* !t [zk+K sӪ #2\\­  U=4eE9 x5X+ݕz|U[x}qKZ.A{w?{H-OR[4v7b |YfVVIk/VZii +EDP 8/#I-Ksp }cI@z DGI0DQik5<Xd#90ەԚkGfnWnI ?2@!ŝH;y'+j)J\]2{߀ԁ䜐ړjAjI=FN ~5] 6=464`0j5d-sBM'J\CnԂ{gԞS@2ȓu kMMjۛڿW[0Irvw~š?FS4&]07fkU~՟R{/|?bvwwʕ+dkj Nv77TwXjlqd`[U 0.Cyے⅛~vgg?e82jr:- y/ 1Z»:5":wl#=АHaF i^e=s>m%.iִoO}[&B/b1.ӂu`_]jɦGRJgR "[ZZ{g/^" :D=$ &&29Wjc26'}qscLs9Q[Swa.V@̨Ԇb]emEx FwSóR~药~F!=K.!1x0q_gb!'de_նb*~=0[,c83x Te oxzz(?2؟J纂$(tWk_׫'&xi^^dEj~:~2ՒVd{s0 DdC%  )>S!.ZU7^F7~݃s0"_`Qѷ2\R%˭iߖub/M 'L${XVj=Gń[R!VZJz)h#IE3W !_="$XyKp=%8,i'{;Gܺ4/X`S-2(j%eǨD ^}p*x~+AZbG\#M'Հ{H1iF& 0sӁUl[v+Pm+Lo;r;g > bbsK۸c } QMO}V[ h ٵWs#v"yWꊞtZccc*/]4=977 0`MYP[mn5u|E\Q:)g4PtZ Nַ>;*q=/d`KM5y/ 1<wi1dZ4! #M gK LvVO(8QXo~Vv%ZrJ旗eN_ض8 wLJz&a.L2,j/HoHʅ DjJB@btP@(7tZaR{5bqi ct?N@?p<={|2]R>*%S)sJqZ-zCQ« X[^a@,l=mxxSS ???eeeR-5f=zb3pܯ+k[,***}.-s=nm)o+ʩH* NƉ(>/:cWE x\Z4柴x.47q5-3bGiqWC [3!=-7mIKY|bks…*mbjOdoMZ @3dI߿ y_X7/'v%o7I-IgRSS7#PB\bme}iauvzq|tfom9?:%ZV( jU(din?1s^Lg?H[ZaoiM ]oj?l 8{mr 0jߢ ӟ; p 'Q }ff~^E U[0wY>9^b a ]V'?J1/rK/m M:}26_576\_U^Ÿ*r|Yyi i2xB%*q鰁mM9^M܃soܫ}?y=#X ^jm Ka%GLg!K0ޕBikk;=,I-Qdq(8kWjӽmRK2j{';[(D-fRQ4 jܶLfܨ& R{JIJK^ ]_.Gb Lqf xcp໼>,vȫEE@Qa!"++ V|00Ν;]oHMx྾^$G :R(bZ77yh$8z;=vܫZHE>)cp3  Ȓ{Uz 277V7g&PF-Qye&DžbFmQ*Ua| i/ 9 teE-?# 9^{7Z՞Ծ"?C['m*X /'ҫk.^ .G?~,vpvT~>9 BW=2MR '|%E0j{R,h'66֑+̆3%1!An6DV3jiS+3܇22(X]ڷ вCePp,m ~>q,wzo:ea˫j-0wp[W+Xq*).@Ee488t%׏f+P~>Otj:v~"V[a7 DEԁEh$ !^վӫr#˯ rgga.| 6 +S 3]zv4e%U'ye{AH@-)O16 ~:C60joR_xbMH.-6~gU⾦5IİC+W? \Zp@}ԾY@)i]V>ug6i5/yG:*)@' r #^-n#OB[9',Y `@j>"<3aȁA9}k;e%vEoPj--,xUjG +*iL ) AA-EC-ۨY;?p{?lw0=xl!F/pcIA*)ҭ㨞9*$TܯTx\Fΐ\NW0~4Umn&y\^qOt%21ȈlGl1tk pkDV&v[W[jQ\<x-p[2&wB@{ j_2' :-8:%„ =_]Ee1k #~& V*EA Nq4 ͋`i+-.lM/=xRR'҂#>"U ?%`iH*1GLsU%d[QtMb\t#wUUO"/y8ji=vBR`/9rvx߫6:$+6FX)HH @n}@,!mbsy+K.J4&'&187!8L#PGSIQRވR 5HD%ps˟Ÿx%.+p5-q8핸iQ ct/ִv%8]/Fy=,}gX qU o‚"-;@lLTZ=F:z!Aaܢ%)ep6Z\t{ ή-4wu{ߴ%w,p y s+ cóy057694/),B+XOKEIJш=5 /Pȍo~{3r]b: <;/fR 7jyol.Yo/[\37ǔړqTK@,a֦G7(IpHm}}=y_42" oh PZRJƗ,.:1 9d|EZ̥^[Z[F.AW9Ebj7vNBjq +KC8o#l{UkxB2<2Ff5Ңo` vxceXHmW67R{.( LX\XZlh(nϬJ- wKp SvV1`dVdx Eu]"~zK,2/KG[ 2`OspiQq]w'&[j layX^+ydjaUv%{c}%&{6,Ϋ}9d ` ͘c&vi:Yj f> `i+D5 hYؒ{U;6Hw/<BWoصu]yYIUa>YI&暸] i<'TpI;?]<?.-AK\ZR{߿oM/=8@V=^zlT ی<*]{#{S{scZRd¶S:J~Ca1bAׂĤIvvv'!o=#0qDgAjIjc v)șW ^-*Ua D]\Tcе$#dc~}jf];:4=s߇ξ*pŦ/xľ^Zb-Yj 3H 5vblvo}  kKbò"meleLD9tU~`5/|G`P~ ҾlՀriAg+?vº!5#uzųuuuW oٗ ߭ꤝβ27pKA6w"O$c^7x{`Ԃ]<<"VNȁ{` (:ZlYWdxcZ. Ρ:-d [j!@bq;*6:kzpㅻЀX/%f+IgaRkⴙUSӘQW;Ҿ7ٷ77Jfo}8 K k'Te~@d :4KW?^-4*K#z[ Hgg@j9زRV$=4/Ad_Ղx/ g5w Lt7Vd֥ŕŅx{;jk˺+ ۉs 0s^t0g Fm1E%X 3 ӄy _ (ke9Z./gWq`av lcYW}&qI8  ?)#8C*m.ȮNK(!;!4X]CVVDSA 9uoC; =Jܷ_79^_AD_{x+q/=X_D=i[^5j0lBRb2,u.bqisu|w/EǺ|t$tM~ \gp0%ڢ4MJ-=<6$?3.8TO[MQVTQJ G=ߕ.~vSs3-~h%.ԒޥŻkUKIj+ .Lla A:;5?y&ڂc jKfu,ZٹI{>R[<>Fv=uTFk$#u8<<%LqY?0_̧ԧ>>,'Ҿyq 8ɥERKjmgș/;G7=7l;кĺFFFFfvI6{5dmw8wI_VDH|u3S{pde^me.닟W 6g6gF7G66 OľmW'}rf sv삙1>Cӣ^'>yzXtkvmz ~`= |mߓ%HU^WQVД^[akgj%(b#e*Dzmǃ7b/ 5$ߞ~,C*5#`Ep\w[Tߌ5Huڂڢmk*wF;~^GNX1?9̎s -*Bc*=ޘ\& )$Hp#KCkvDv Dv|`eyo $ʚ@^=KK CZ k_sȨh,dA0c$'%_!ҶfLjKzyhj˹*Jp 2qP1W) WOݥ=b}xmsXqifOj?*5R&q;eV(QUWԛ4Jyv[8 $]6V?ګQv N/\m"L &>M u9*k:SX"-\[YYꞇ##} cCKwӫCv|hat`~wngvksgkz{fwvΙ]ĂUX_[^ hk? c\pp}2KIKȗBWbt^D`{u7"3$]GGů~N'Oص-~hw'/{pP K q _C7i$Z'jt,\khvVj2퉴ON1Sy- ]K'~:^8u ўՑUX:VH*| i j^|6³g,0\R?64һ8Խ012s]s < 67'H<.}SS=m$ۆwN͎ 9Z-MY^Z&17 e8 2BB0~w쐀'جĨT_\jVc){ ws\;7~/ZҾ%-\5=-tNw2ƴkf K ,!ٵ֛i[9>]K;ʶ{kw=K)Ȫt B:0TOuv vuLL ̎΍Z:w a!j9=k]km`P 8]XwZnN塮Łž" ??ع0ܳ8ֿDfЅTj@7PLijsU %ᰶ RrBoO>,.,+98*0;= PMmyW綒e>¿O)):ۥ=%xtK>R+]AV5:9GԷ^})&3RbR{,G.-&KjwsCo9 #5< ٵ>] !Lw#d=v3m+w d4z*y l2kΥ qy!~qsҞّ3Ch$2d;Fv+hn/j-jj́a.c6}&mKߨhhh.h-Kak}k{{o'# a1 ;Yղ2U./xƢ9(9i(@+@}lc,xAF2:9cLwlxntpöd2ܑK}W.V0=WWUENL̀^2=Ykb=/~짌?L/pu`P}w0{ћҾK{~K])V|5!F,]kdz$Hp}NYW&kGnYl&;lfxlommզ0<ffc`dbfa<+^=;")&ndjhYWQ/ 5!^(_l7f Dd91g>s6m:y*q"~#-ڜLDeC?̙Yef6&>g ?'?\!i|,D>6f^V&^F#mIyc#Y#åi8eCYCÕ9ø J?cfa⁕83>8Xy9|\I|_dC'³twڱ֚"#Z;V70Ko \$T ^Nce0=-aɌ@$N: k26 @?V Eth~Olgt{TKxEyee%i}EɽI= ݹq]8y ]I݅=E=%eY}Uy5 e#͕cpu}cvsvw@ ,a,(Zcp]`uaynOIfgQzGAJ{^bkNBKv\sfLFcV\SNBsnbK^RKAjkqf{YNgUAOmI_C@c`+pG:ƺZ{c9'[ǻZFjk*{kKkJ::*1;HMiW]yw}eOcUoSM_s][`{PgpWpwHoX_X_8nj/-Cm ho&:t ut tvuuNoV;Q2u j,֎ŮF\sW 5 $_X2Uo?)]g +\2aۈ qzLaZJ gkrg*3R'& brGB9dDx8X έ7ޣ7ѫ/ů?-?#t 7~)$ sݍ }-KC]=-3).~Bb2PFR&!*cjOū0VP UH0}().a=$]3¶VO67Tq0klWVtGfdGFD{ZX+NzD[Fd{Vt{vL{n|g~bWqZOifoenMXCM#-cm:E"(/NqqףecsH#𬁪.PXPR\^"RCkpCkSR#ӣ3b[J;+ As!t6V?h#uDym{Ҝ⬖f얒⎚κPƚھPLNLF4"44Tw7Tuu@Ёv*;:ꮆjmjnniimmmkÀDkS/mis@aI" e2+3Kc³Ag! 鴶~SuT5gQa* 11;ܹ~4}I'?|BL\Z(XxߚsG:|H.~[j/5CìRѬ<]5cXdYX[Ě!@e=Dk#6u+{+?p &nե8rhwQN4Lnt&@9/ 0R3Ip~2,Ո^K] QV^6[5) %!?BZjjjJ2Ⲝ궜鳒\RZZV֐Kh.\o+]olj=XFhHppP;a0Ծ>pZ-kfخ554v׭tծt,wT-U,.6-C:sd&MBE_Ax^|efH ϛ葂ıҔJXgOMA-IɁi홠1]yufڼ"g2o:)ê Ԯμ֬挨HՔݔӔۜ 8)i%Yeݕ@b=,,Vmř--iMi@^J"PX(l*ʂuSIgsY^KY~Ky)l(o.ky-nb9)UȖ&FƆAmw$ҒtLW_]CQ鹍4 1hS0=-(Ę׬>g: zz.hLi]ڗ|!=7 eL4v-4CPEY_D^L[ON?`m{ {(=`$+t47bS`&O \ٺ|h\S<\QVsJ|xJςELϟE>iSɓ%IE=F P%vꉰ+҄; arZNV&ghlnޕݓЛ`~PqHyXeXuDmD}dCTS,Zp*Pr8<҉aB4 נNUHU#Udge %$*==%5)ڣ!ҵ>ܥ.̩&ġ&Ⱦ*ж'Ȯ2ġ*ı*̩:ܵ:ҽ&ڳ6ί>11%9-%# 5'֎”N""O\-%eǷf47$TEzV89Z{[z["||m B\K"b*BS"jҢj3b^hIjM kS򱝼d8ސP[]ϪJ ) * ,/+-)ɏ-+/ , * )I+I /M,K*O)ψLJNIHMMmMv2| LHHA1PUQ]0`J # # SbScKJK3J˳˲Sʁ,DYfrOO(N/JgGĄfE&xCDgmMt՜ riD%tXU=xNuK*ldg>{ w=_I}i ^S?%*isa?ӥ|j؝r(dZkjKS Qm1!=v}Ќ&}ڇ:k.ɖ$"3:'TOCou 'UYp21@Xp\8&lQx~4לѬБ_X ĻǺAO;@VWfWF'GzX\c`lfԁ nwOzp_V@^`Aʳ*~3Z:!sQs1s Is)s^s EQK%1KeKIK)i55]$RTXXXPP4_8W̖͖` c HGNELOMdge'\P *#ìzB-Σ+F:;&&mf!a6N] ^=~OIU|Z`_ZPoz0dD8(0 z:_j/*OJJw wr"垆@IiEeuU]ucmKm[]g}W}w}OC_cB@c"| p>֧6ګ:ң:½*ܭ2Թ<ة,ȡ4о$߶ϺǪצ>m   `MZVQU]S[[W_P_π(H0O$ny.9YNYHىd;a8gdggxdzeDDFF{ Sǃ<R\}=\#)^ *@MAQF*qYp뀙BuE./r s@4?ϥ}x.K\Z4;En?]O>AmhGD<~xksi1ǝp2RrOfDjjBjJwȴ]uXsYO 1D[h"47g47/`3?p\P^8l8I0xeN+<$tqF~F^X9Y^4WBZj R(Y @Eyo9O9Y7YWMjMzCnKa[qGeiLLLlLll||||NB^BABabqbI,BIBi</b抢 #g#fg¦sCI 2I)#I# nC N}aV!=A&F~z0R<[=5[<0HuLsB:8&^ 0&:2<4Xj UpӐvRVH.'곇 wAg]ypAU.u[K_\'t?~JڗjҢ__0b4 e`5 }iϼ/M&'q,xR[I[&s\BQғ UZXXEt,Em$daX u 0l0gԊs@Ļ"!c0i ` Ļ+:1Z"{#zmz¬ 6|XÂK `+]g-Qk!Vc&Ze"Xi,PaW[S][j[f$Pf,Xf*Za.Va-Ui+[XZY[cgdbf+vDNX%v&!IHnHQGk{k{K[KK3Ԁplu b_b_d[h]`U`YoYg^ B/cBt/r,W/UͳVʵṞ2400J'"f*nȦYgX*fX)gڨf٩g9j8{xxx#290%H^NfZRb\ltdDxXXXxxDdtl|bJzVN^~AQqI ڢS5Iv6Nr4LOՍՉ֊ҌT4W0U 3QB #`c`U6U 6S   ՏՏ377r0r4F8E:Ea[PkPK` mX`jôZSu_X0R14 TsiZYY["` |-}utF5XtyWvbv_voZԚ]Tle%,טTVWVqppj XX0ًu9 xK K̞[JVT)T9*W;ոkzyփ7Y66ٷD8D8D:!"hpjsh kBmm--jk̪}S**oJoc$˨TMUYQAV%F)R>L&T:D2H<@,yHHp2FHhXDdTlBrjZ&(fVvmt3@[mSTS,͕L%bģuGjDh c  khh=Փ 30V2Q2U危PT@XkYk6Z ԈT6W2U0V 3V5etu$%4%|5%|D4Ľ5%$|te|dF*&&j:ScU?#?Ce}%o}E/=OyO9wmYw-W@SECYCYC p҄}i'Mqi9k;*))+ \ T*.zκJN:Z*VJ|z Bl| 촲c|$e uwiOtZ{p,.x4d'n^*ɥ=҂Q{\};[q?Y3|7O##j rV,W,YVVm9WQ횳КȪؚ䚏,ODTYV0d, B!ڄck@[['Xo8Ό#aA5GĘѦ&QƫF++a!:ZKK,(.z+,x{HϹJ̹::M LMLYLZqOZrM 8',8-ƭǭym9JɎy(y)kMNOMONFOFZNFYMLؒql#"F#,G-FĞCMCL Á@D/tykwyiuyivzwu]RB\tp4XK4X[֚ԘT#a[zsyxDdL\bRRJj |׸h.D*lJJ,% L f dge`k:@`Pph|0ǃL&,e3-3-,XwgT2,SL>T.D&X:` /&ĘB$F><X ] WV5W4ԗԖU@^su㛶ᙶ⚲䜴`0g0cGasYpZrZZ 8<qqqTQ   1 1 1 1 6 224 RT9DZjrrRrbB|4][ ;f 755166DTV"x*y0)7-72c2rSr3rsrK + + + Yr2J-K,%$ M E sstxy35599S1RTْ1TؒTٓ8q55ytuan <@,H"_tP"P" 0L6O+#-h EQja*P%%`% E % % E@E%@X_   N`p !!)! B>^J|4F(GNB$V!떡Z=v f]g[o*6pMzh-d#Tt3B/BuWi±ð%4`f#@xXp316q4,a/b-d)Qg*Ve(R+i rQR-8[IUM"me\U\ug!WtN37e(f.7_}  י  a56_, VrT谕ki31+U:CާMIDRR`yBbSE(Y)X6,jNeة6j6*Vyr,eY0>/ȫ(m[On }pEN?@A -h,GPG]7,`e 3nb@ V̭#.ui1DZl{ZGl{hDC|3UsU UX`Î[ ܫ|,, f+ | !8!W_a]&* HYdpgfmyglxf%6g4X&MM312ҏ<ӣգt1ttih 0 2 2  r s X XX X  ؉ ؊ۉ?wGb؉>jlGmfmf||-&@3`dۈ``UQw^V !U,Z*4*4TJUOaJO h+=WWSfSaTԘVyꬹ9,Y,j,,*ҕҕRRdidh㥨%J<))1}"(#G? B mpipXcnl͈/Ce3!D1D!X>H.Pi8sԾ(/'=(R`>vr| IB/D(D [jAj{ ;Aj[*~5Ċ҂9#3t· Y=0``AaNaNFǎP#]G8rB<|O+=3=G\p߳qz` PPXs#),9=,Xn>m0epC6p bpS ;L5F* p[@[-yr4dJ="EyYs w~/&`΂Ȳ1C[K#Y,SxjPgWjYK2oȥ=4= }9wiQxJ7іvT_* 2HS|PzRLnE` &#`2D+PgʉЗJkOKibeb$+HP ?e(rK#y?[^,ۙoe7qoiׁT@T[)"SD<*v7U^ăTITGiR2dQӦc)#0\" JA0 x?H;|yoxn} }s˓'O޻wі}O>{ߝ&aBvׅ3ulj#mlY>f53’œ#USƫLW͘>n)M3feer˔ -clx so2]gψcKU+Z5ѠQBsY2l؎2@{PH{UH9rO0_y|QE) .Hϋc=8YypNy@).!h `(. =$mKys[9n~S,.pk _ѝYhq@u'Ў7xҢ6u<@@ʥ]Zp?~UE率G cPU} (Y, W!\$+S#@_e8ND|2ejtejF;XIByJܣG21J'"q/[.u_dEn mE*tHD$ ]CHq#Yfȭd)&M,~?E"Y"Ea Ȯed)ORdeSdaU U"'C }E@e0{w ̇T5Vxnq]ẆMUO;;U7k8–+M7 ptqiGi= ekKV-,p L:Ft._.1^6fbapŀesŀ>e=^ѣKwI)B%-4ΫSSyrN9Y@1%ʳJg)(P|^<@yNCC ҏK?<'EqVC8SS"·Bn!nwۧnSd,#8<oBpl׾ao.x$xzs 8DutjPobMk1kYE+{yJg\ZWjz 8O /<^4|dDlLse][ƴdb%˲%`ź|xHĒuE }-XYΪJn!$H $$d&s$ I aC @<Ȩ(⌊*"N(* -w]߿k}ϩSԩSN{g=o;揷zQ/-GkUG:(`v=׈5BjQ?ӫ+~z^_Zܵ5?w;' =wpo<'7cS?q͏n:Jճ7Bk~uÚgd}#w᪾{^}wd}EַM+C?dˈKW>uʯnZ˿rAP_Hԗ.:KOY9(8ԟLePK?}'YĹ>q'SI(8oQ>q{=c9|> aA}%N]^YY'u}"waE8y;NZɋ:yZ [SyP'A=X ku¢_tq ^w{u@wQ{횹{ۑso[3V8\ÁY!RBf\|&ԅg^pYBʕ4<gmoE~qٕ@E]zr2C]Gt/] KD=jo{ u~ߑmY߂P7.X,/|}T=%/;ܸX\a9$YųE}jâoX9~Vg\g.4OP?yO.q;mGOu>n);eN~<*}'^YY#}wzxQ:n;qu쬷;cg>x̷zѢ|fq 7~:bEM{uiwzw&Cнn?ddݺj׬rS^mU+'rWu37-{pt݁=p5W?Je5.[:&\"jMqq3}ƟxŻhsT-6,wւqg.~>ngy5wS nή:y'=ĽǮ-Ycu1š]u]:rP1 vѐ m5OG2f~,&VJ- QU|+J:@:՗YJK~a.#gRr[(deE9ebKPOhNBcjǥёSB}X:]5乏 2dKs1Ȫ&MBdYP XSB,%UZf ʥi9 K藑{@¤!vR1SZ<9r*Q j9W<tMI+ivT7)pdn9Q˄]lP:YA)[$o¦}'(D KƟ%OA6.2o?@s:(PẹRhPlQkg9j(, eʨQ+#㴝:Z'تP"kDp.% "T 1q"^iP&Ht ϭCT.-BtV"ZY: l"ZCi1v<5U:k)-B DJ eY%08 ꣱\7fj)-B h%R[8ϬX `%\-cg{@2YdE{eX`2I B2[ Up$4P 7|V E[H-[$ugFԱMn~' ՊϒVپA[BvJ-Oi:1ޑ+;X[hb W'ȕ6 J;tN YK-y ٦ k[^,CV{rdִt$Ѕ/l&槳 .ۓbmh+D#ZtL Z 0&u QjGiv4'6;p*,찭FK(#cvv}]YJ@ٶXPX ťl3YF.*%KxB;%`Ҏ.aŽhGW=L]7M]n M]ݢ[viwviwvu r:@>EƠЁ5xYt` D\JVc5aUMi2tUjML\^P &Ya[^$lE60BK5 q϶ŀɆY$ۊRn˶ &6p㳢$vM٦.5|  Ъ񁎸hYuiU7뭴q6J `mFjR[~rym15iMa`̶&ܧN(pxp,Y1p2C zNpNFlBBKl 膍 @L7Y)!RUeCdVja!EQ`CbCAc#Vd!P",yD&1MfqbI" t"bԥx6dlr:1"k3}25Ra}hcX2[e; ^] Kt^ZCiUR[#8֨npyHa ٘-/DlrX6șEDԬc cZr ~8?tIʁ %YE "Eq-h8Zh huMma--2BT7,J'(J/Q1C(+zZ~ۋ"KIEAADc@WkVtxp0[E 0L!@2FXbCP8ld4.@kiQ1Ӑd۹Ԗ2lM]xi ET{k`i &ʟm `$ַЖhDF#ZapYm\K$:1n}却vXq갂1\p b'ܲZaM(VUٿ%_XX[  Aؼv/7X, 3bE6lxflx*mkV5pX˚>!,iֳm%@e:zgkxkllmdւ(ـ5u >kV$exQXdeRR;lԺ0ъ\E\a1,Il(#m~oCl?'%v$%p:Pvۭ*b\RT,-q5\vW^X2Uk!\ *,K[V4DV0*Ye0oixfK,+55 la2VgNlʁ\v`v5iuњ9.Gk7ň6A򷝦l"1ҺntJgͦ[: [Eq#1)-YVJ"E|mi(ЮV7056Xs4%`@F[}VGZ5 FYB\3+9l+hCq,n+V2nGt:"m-o5k'5.!mwt )-VgHib) >*Mie5zjN^e+XaKcW"]z5ͺey,hٍp"4v/RYC yVԾ$vSzZgM7ʑ`uOS ڮ dnDy31!Z*X(߰Agʴ0eealAY7Lzi%IB+ Hڲ$c%1k [Xk^hY&@VZb#y<kFi# 8 Р}_.]\tl#b0=^o%% 0}Y p p"Z Fzp֘9KgP sa4O2[Z7 ,BBBsņZ.씲M: kBM6D3|t'%l[4;D$|˒IūT(m`RBY1Et5&kmu@^ Va5E],e}ìj%Rcل\p 4:`2֠ j>zY gMhHa,&Ѫ mAEK!Z~FläUn khG.-X(Liy+ uSrEzX&]Q7L5ĆUH"ur@de0 5`T(i}ܯ.`~5sŲM[,Md mH 82+D;C^^.a`o!9`7/Lʡ[ ͳpw$V{n Bӷu4HqhدSKy=>}kQS0|h]bo/ӷԦqle {Cn1]b; DR8n/ ^W|6wPn&1P@@ҙ˒rʨig!aVXukR^Ck,2;UBcE5AA"Rcx2+FnXyQv/ڥ% 2!/DYgm(냵Y=v# m6jQVf0N%{Fg2f9h99@69 p.Zfg߫{T_ջWuBAٕ0ia+ɰhX@Ŕ B=+#OrCEɪ揬eݲ1Hv&n0u,l."7NF(@$eЭKD - = @MpVꠒB hs.Zh[=vq{rd%#^j]k[H62IFxom(mnM*60x)t0x+r Pr hܡJH2UU;ZRݭByWӅ9l[Mv:#X6* ),IN(Dޮ0܀XflBfWXNfvܺ0/{gR;k Vƈv٪67e7,^l7LH١J- LINu۸@& @@ B) d :(C [%Q[ lvL6/2a<4 7GW 7k>Zn A dޘhYn`#haw]0. j>EH_XNG,v1@ъ輹sYFb e[B7tˤDK6dp(h/4CNJZnp2/b\P H*8oH+R@[+Pau+GcCOfz_"˒0 j8LIgcM09%,Q|Ζ[h0 fTYXo>}Eѭ0&s D[ںVԡxŞ;-7uđO)s $8;O,[Df=l&+)C d71G}G}xK qUDLu6nQ:M+=ѢL1eaPqrF9YցYH1- 6 K3 HaJj.Zr4$!Gn. og{eȪ%ciSA2@~`]MNEbY/+ ,\pAY̦fmlg#,]7 H,70܀9^;jَ<8g\:bKA!MV#Z:(5Ҋ1hP%[vl]@XxÐS+VF"k/@tT)l9}OaE}զ/[ @^U}4Y:̀rdflΒ !6:+Ds:pT MƟVp%:kR.֏F1h˲FyAL+؁{Úw` ND0ZR6B$iE5B ,/\Á!=>KQض!ORõX#QA6sBlZ59St57@tv7zoZݧSslf͸֮0# #rv,Fd6x)J  $O?dWzªYښWv.T}׺aU. 0ɺyN,l̪ p6NO(Y,>:[`6M d+,:"I;IπV@x`an~wviXm"mH k~FHk¿CiAgkL\;˪BA]} \%'_m@9 La"?,iDXҶ%@A!+l-4廻%aA+2k-* MYn򡈈ςyVg y(@g鈃x8B[c횰 dNnXu-hIJiwWWсip/hY܁S-eN@Y1UJJ*`֘*ai+jm5W?46TبخW<0*}%gerfm^)O[]vX`0cEPH8;2Ϣ!q30M&E,іѶ:;H[+#b`A,@1 ؁pp./R.+[WIQMnQW[nC-2n 7T %!la1Bx6 BW-lSbw46RC/=htJ8[jKu(6"K_6JQy6gRMl)LGd]QAI@iB(H,Hm]}mAH *r:@N%Ci mrХiE[heYXг;lBiլm3# 5q&uXj!"˺ fPLܯ뭓8=8 Wl @ؼeX߲{h\a \\-[O RQ^lbֶ4 Y/2uC2QEwшz8:hShZheQ l`0HGj"tPhM6:h ^-V!ViadJ4 z*$kzUե ^&Tڊ][@cBU%%# ) x0yfHo'Yr<*>8g98[f&|˟kz>X\Lq^XYsvla͔YX^>lѺDZuma ƍPvoUKàW&o+-C-ce(#Y00i?[XrP(1.,m2)fV Ұ8 oSl(t"A[jP6twu */Z LHaS46jy_%@3"[4Ԙ00ݽ*2gEl6ồ:mU167huDjE) -mu юoE:B h?놁Ίå|7LHVR+[f74c%HuMbK(Aέ(6bPilYA]L0k]Abax b"2m]T,3u 6܀fgaFf "J ]2!Lӷ56 QIyhMAme2 F{ewigtvS-U{bJK*TG˛,n!l@`9.o+K6Y"Dv>bU=)j.yUeMpd6+:`Ǥl Fg謷2Q2%:[b2coNlư8ڬqNCɁF&72a@iTU!@ЎTEH MQWz5eHk[4Xwy[oja}V2@5Q 0(0`UpqVT,4H;BՔ8Do]M4qͳ% ۬*d^gqYNZr&R m. fMnh͢Eq:64PZ5k ^ KmJ7R=k$VXmn])ym K:dY &|M ztA&8͢X % WYg2ˆ#1\Ԡm5MAe]I8Yjc n t(f R֮d vs)j@@)CbYBˢ@:jmA.)Q$RZq-z̪HR",\%]T{AXUI1KtƩry)zuBdaak6Op_a ;gi8'( ~ :+^`6ϑ l[U[h>pU -!u#v3˔}::`iˌq7 VuÔΖJٔe/bYhμr rh,( ̐Xi4oY1VKdM>k.EN r?r&*L@,Mh,l7hVtD-P:WL{!Ml緄eRhtDcELߚZ֠N$qtPhjup;2LxoMJEi+J,m%@Jik246%b.Uc"`YJaȦ_dg g:`t{ 2]ٛLgQժ]YOg=L `Zkuv^kOn-c"Voʬ:@30Z&FڸV'u}!@ <+4~eӟ0 ,a=2:PC`+dӸ L,"D5 چiy*5ng/TKšq7Z7vYD ֮UrKfsbDuwYp|1ʸTj;#Ujg)kR[cyųxZ/6t1! 5 òE nŋ~, g&X*y֙gBZgMȷu~5cy:[ ׅVmy*:H%wHvNSQ˛vœ,1bձWD,XXG VHciZ@6XB[ObDz- ڠt&f7Km3 ʠ g! ^'N%"M]Ϯ4|v \gy>GRшe&&vdht@: M,0DytP/ +ZfS\7Vj$Nm%ìªZIm+N gCflȢlt+ٸAi1Y{4QYX8@&tVfc웪ᬷ1 :{$0ϒ>Y:MlAkc:f ˔щvQzrAn ZAiUpbE"- ;~7rVF+wi \YڒkBVء69llAY4>EVY,ݲ1%Ab 8+R@GW] `,7Y?{YvpJY4bz6Nmk튧o'8-h9 : ɢڹ8Z.&ATO+H j֚jx7MKy4db,˵/blfuvَºhqU,PPE"Z)ce0&¿U+LE2֞g+^ވj! aq*1kdl>BeA [ Jppsq! \xW;b`/gmvgYh@PpVѺl@ `ra͇y={9^+mgm*Z$V/u;laNUWqACD[f miIuzZ%ڪ[[5hsX?7V+l tȲ ,ȒS a;d4sp%fm9YmA'~E?? &}# ]EwV=@g&ưrD!]4exqCQW/!o;:V[FNUj u e1xWpfX+?vaUqL1" R46vƬ2LY,۔ٹpKA[k6o`L a5t JU΢ٺ|7#գQ r[hˬ]avюӷǹ\GYt0tPqCfVXfM]Rz goz.:Rޣ+l!'_لaA 4d{& )Lt #V;j Y?PehyDf[aR laH˝g+P F[\51cU.WG| #WM]Q `UOBd½2,D$(8d o듥leqSVpA`* ) EpvID L]zz͘go<(g劇+U-xŲbD{lfK3i-5pOSh]&借 W9mݵ&@ݥgp\6tAp梘"tAv% VVL U-Rm[.?Xym@6!.#5D}X6am"Kf1 /NçjjGMm#mڠ&70f`;`6I9vz+Dю~[tEViVd?0Yp Xr<E@u-Wpߑwc`;@cp' vzU1%>8w g\pj:P0Y&a0r%A}A8k笌Ѹ- 8DoV$"Fpv 7pK"|VϚe*^ YxX.6HGv ڊd-]ce$fmyui;|%MՐ k+ɭ\%]WEقh͢H|5huQY2 U1&X^g& ͦ}7 #.!ڪL XgDk(pU gu1-W-)n˖ARW c"m8,J5Q, < P`[ rUũ.YeWfibɐYն 4H;g`Yݻcͳq$q>o1|6Nv̥#.颵1`(& q.AI^cSh-Jmh7,-EL19UjX*[rMik~؎)o"ImBn,e d>͠m`Xg E[)d\czH}0:Cp`n:&u?,șH9Dڍ8VgVĝ| K4TšhEqQLYցlmE7WdqeTfox^zUXe8@ˆ%h yȢZ'[ ,K x, m Yd^쬆d"be b>-^ҶΒ|ڕFO1Qp diTLLGl"ZrM"D0zMٶTӼtzZVsvWbByC"+XT 8 ;d+Ą*[ ,-\քj۬q lp6o06d%ҾQ8֦dhKZaŁ2%.2D(F Z:4ƈVgewIB`J-yxr">H+%+re!kdqس~L |( <-jd} eYDyvNoSs~=h`6 `I8KNƛYm l(Xͳ֧܀^n`e-A|@b!M61MA^7sJJi4;$\X}y]i&fʵ@^(gFYvjEJ(xf92q 8s9K_`z#Hg&"Ģ0&C~{)]a|+i S 6΢A1M~\̕0% ձڬ;h^bfk~Mk(AdeAADc$ b$<.AVST8+6^Dzb5!Yے`ϷjBl* n@=5{I{\lgՂqzK6t Kp좰XBD}тzrі!bwW'b;`4)fmՁWhm%[  +T66ƂvYd ,Klcd7f@xf2+:`x^lͳ`KX`=Vg4*~˔U5`k5A6SFftVXъtЭV^B>uQidz@IɄ[8 @17G`ZbSXҶc4-JX]p  +ȕ!o!edu4(s6gd7 ׁBd ysMy`-ɘY9P sYn hd$:cE# /! @TdIY %,Y<,S^:rkQS9DKx ,[1+@XL6vq!i,[2eKD`26EgYɟ"7#h˸[v( ˪S0nFK9g4 :+ :8VgOI1%zV2JȆԔ1`5 ymL#-/1Y"[>vYz*y++sln p8lg!:-,N8 Dl.P%uq*SfJڞj1-M#2ZYbaK9,c5 eeO6dI B rX4$^A[ H685L6`? YgEȬ*gg9,q0Ao!ShEa ]:@Y#EM0VrLqiomAũB:R5PRnsURyZN^mTWX.-$m#.*L%Sa"K1ـr1x^WΤ}gFb-I9u֛VZ+"`3#1 ,͌]AufW"*^4 ORLb!J׀fX[@ ^/ϹU ng%4L| b`ܲ4m6eK`֐Y ۹CF"yVmBpց7j>{ւqPFmgO H,FZh{x'q Ԯ0w؈roɀDhV˱%v՛K3enwAT2}?Bƭ*,a-Vb |y ,ȫRe;]E w-]YIfD1dwqlHf+;`7.m08gɵ` ۴ΒE) &EȴY* 9 m" D۶8m-mݱ7h_]憿% z1^`b&UWDh8BaI0lVŢ4ְughlMc٫[DkhHtqs_ۂaVH|\pĎ[W#l*y8@GjbZv49eT?[oV,q &659rhwg-{dAbMyF"B7lũzL '@Xik AB^ VHEYYW"k"e0bE6-mb2[Yt΢݋&]xZq)J>6fEdk_I>P/e)bS v2@e,;\{['b>pAgr4H h@Yn-lg>̳B=lWVYqRS:dJ R"_0.B[DKOߎ4V(4#8D;tv1.Fum1JI(@,ZUYauȵJ[W -UX4}@*,;`.R̚d,KA;o$!-0VW[Ϭ9Xf3 ϯ2˗Ns>zY8&|7RK1VނCtO9( :  Jgi@Ƀ<պ8Ҡ.Ou/\:|KJiR;cp^| |Öm@Al8opA2 آp-֥xd6\!9̳sL6Ș*ͳ}gm (>KD] æ=LPQTq.1S DN#fGV֝j 1+*Uh!X[V+yF0Q^A 6'X,\M@Q 5o[厇K'@^զ`B9wLn<&`لp@gm·4c0.7!aꃱ:GٚŠn#:MsREKu|e\K&-VR63f`lÒE%H?PlHcCV0 'k\Da#/7h0)ƳЀ5aPMa XS׸9l Z_׬1nkC.KYX 턑g^B]±kEWha͸4Gg\􅋶RR2+jުg mE|Xrm._^-P̂JGʰ&yoy9lLfTo:pv:du|8b &`![g ,Ei2Rgp/&t a);զhRDZ2 `",  jZ5 8:x Xl1@ HPؘ@3Y &{h2wq;imAf; jRɳKʇnEý -gjD]4V[ET[߉ua +ªZhZ^;QJMY/^l6W.ƙ:wΊLBV眍ଧl R:Ȭ2P)$A2:[bJ߹iVmd^6B.چRC*x]GV@4uEX&kTQҶVd]voXeم4R gSd65kkleB8&py6> ϊh_Rs.7ـ.E|6q`%HGBB[Dkm }`BP>@Buj:%thOpѢ4 Z򚇰ЁImJw8?=P+Lw: !D0[Vˎ'`8K6@ v` SgyY;=M*Z: O+Ti[VmITϖ¦J 4`^#8B !,ʡ؄mK*yĿ"el*/inRQXr1pYl: uX9hqVN܂dfͳϒh%Yo5v ߚ5ZhGEa:(֞^Va 64PklR@,V0֮gі(f,ԓ,RUS^þ*)l׋dy"1aLά\ RcړY0&Yz!صc pV%|9 J4aM0\t6(XrS=Цg.چVQ[V/)sڴ&v*[@ۼUb"ꜰ5@)cےX?@#h3oYVLXm`qAlūcl$D ҞY7g۹A`EYg!3ɳDDԕFκ hˆZmO9¨DFJ[q%օԖd*ITU)J+#I% pU ˻([dX(,^O [2}()2&4'a@gl760b8R: P"#SgR,ŭfv wG7Ջ?.mqWLk[ +xWg},KW0CaIW,bP{@>d\\/;_۞i%\ qFt\lKhP%Ad |VHPRh-ӓےEa.!"@ (l>kgD[\T25DT_B[q3Ʀ6մb^-E6ޱضU虥lu1uΖg;p.6 qmVgmwᨂ52[`]a[a^V[u7+}-jT=Z*i%xk0| |K,S!!r@ g&U`p-?_ dĬ-EAGoYb.lԕYZ# W Ydegn)UZSDkc#uP@ NOU+aEծAVu1ie]%4֍!Y싈/,!K.`ф8 _ Mw\wx1kP` @g€ى3}ʹ/Uȧ bTAM+ VX'>Unź ʕX XȀ`#> lMrXVMg% t4N3Y!.wC$Bf)b }t=\A VC"]AYSWvv@qShGZf or)*`AraRZ\q_;U蟍Aa4b_0S֮8~'"WNj3Iԝ&$յ|U%D[_cyP53b+66ƒ D Z^-EVDwG>%xلT Β w;gF*YrHj :}C%GՒvTNSTu;f,]6^ Q[FD1į̰`[bYol*d}V],\l%ܲAl4`vըæ- Z0~8ogCn`gE" gU ?pt4b%̌jk: vuی6r0vdOR[%FzVUT֐WUX5k2VUӥ TeBaR-x OD.IJ^sN0 i09clr852ɳ#ʐoHAl~H!g7KuVL+ VXJiP"de~Pcg\ V*RWM|{VI+A`I?A^@P&(h-4xǗ[37}qlM <ID 7kY gg9.pc i%|VَY5z p ^0ВZѦЦ-rЁ^+fu{T ˫V%kj5%A"P,5X=PXvP+4Q>4;x])}G$ lHf :`8@'TFl5Mplv )6C.öU"[ &i2vxjhZ=):FAl;ok G h/=ٹĹ!BJ8M%M]UYmBs J\GUt 0 AYmZ[.@{`z\H^#[~WIK!^66}ᩄ(\L%m48'a߱Y2AF"M|zL|7 }d7=Prb.9ϪIi0pIƚ1XQu{-*al(64m!Y NzpV 2pr)-+"rv.7e S B44-J%ͳ<7~0zo7(v5HGNm֮sImVL 5@XikU/vWas@6zu^d oBd0l%;,*UgW@朳=`hKYN|!#AA^7 RIjb UXٍA.| OB҈qk I  b@M0ppAJeK$6.&A \5'RYCh-`Q0u|Vod8Yؽ5ms fcjxeM\~$Q $5kyksuVaS4w@ViS 5"k=j- l01̺W,B8;c`Pec g%m.DF)!2{-:;T}ǣ ΖZ,\ʲjK^ǥ,V\AB0_̀l8&Kz|G[K9 8,b30o:| 3%ɬ>A?&3r"2[6k@ihRj65 7(ʟ%|]u|8n֮ZFI L hQ~*NXjkڊG %V'os5VXJc\śd%`\y4}_ȶ9J X<iMS^z?X_鬘5ZU,ot jyhZ_AU=UU"P%( ijK]ɺՀlu2bDal"1-aL-ιkxjC](ppqu= o1РRQ<˚g^s|v4φ.xW"}]jĄ,q@,3 bK\-5d~tT1qȥܠQ Iͨ*[K~%5C`6W^a,TbK-5x@6Z1f$oEy{i lQ̌'p 8 l7tv9WQKnY󢾍ڈΖ*lZx[U;M+J`~[\`~JrDVaX5"ఒQlLc; ly>•fv65"b Pb %S75E ږbhP9b :gC^ɟ, vjٝK kWmm&鈅S eR+c ܻYziYV^ukt K%ĉ0XaF@6 -o% g'Y, n {gvjuv:9@Jg+dQ M&+ERkhMjj1X HůU<{-!2(0XHDK do5eݲ wXVG 2q b`炙mG gZ8@  g15CH>Kp13PǬZ2я8Go4kWCVF=qOa$Yk?_J+C`9E0ӕQX7}@ &FK-z LmJْi/+wΦᬧلo>DFp/继ٳgPte/--ᖻXJވ#{<mB aAڭ(K5l _&Yw6$~0ˏbì!hL`ΐ6{*9e͐Y6v9Z0M]PDE!;k˄yomE" 2"Ay[ JKdG m^Y\ťW[KIuJ5 tۺ+,9}Q@0 {,m)2)E`Yqd dޭ-tR4`8gyuTgÈ(-\gKx)Hmvxom4IRLΘfZ0SʳEbڈIvfn?QM?E/m኷~A$9VDARvpֶ#РgpԅBgDT,wZ?vKݒγ!6EzZ6֎kg6~ˋ܎nWzD'y#SDA2u YI0 'ȵ`46l< :;y԰ɣ><6,q%*pբTBXp)fZ6AGcCV C, MT!..&\\eA-e\ᖚhrtu4Ud(u{8 10=-6|XQk?"hulw BgKGHԝNMujRX Wb!aCQlRa=˴B -%z_eXyG0z6A#;`60yd^Yb<쨭 |7 tD6!2XgwN:+=:yo `f{Wo((^:?.3̭\g4Ƙ2-焭@)krcML4@ccl dCl&pٲBf'Mr-Ų( ֆk/fudvŽjЖsqJA#8k $-|v؛K^q{z%g%|VlJV3L?ȁP/q>@IjlZ[cF^ /IĖ+lu^|@L_pV$af, L4wV5&0 ;aLVg!nyaӪێ|\Su \se,Vk*L 1 fz灍O` " %hQ,;J_m\ f$ xl ,뭥AF.aerfrau(\c;W%4u58@YCr]c8t+lg>[†xYڒ#gS-PiIi(J=,9a%WJo`t5RXƲ-/Nd`Q8e 6%ڊe /"k B-lEd6M(LdY&֠9[<˘g3 7c rem1VYOtUoe^c{h[HpJضr4ae R6ãcTAqa1HL^8 Gfk6KlYFY>*\kZn\öl.bnшì}@ѩCBURҢĔ0%qL[þVKy!,9l24kyE@64vVdzB2+EigE,O5hN͙g \\{`rBuќBOg=.ڦ1NUQU%\h8*X xC! @^S5&]ߡ[ఌgG4C .Β =sXe_[˖osx!Sv.qpfm; rp0@29+̳dnZ rNLgVmuAx-ZB"\bZ7R25- UzYjm& +AQ,-hyEWlc,˵43[Jf9,8ull笷RHm`dz:[~GI/ۛPƠMC]Fk)X@L]x+iB6 ( Q, 24+hdy\Jv˚A,kU}.DAE{fC2ٹpv. D2g!r8kZ[C! Q!2*y6k /hwqli[,Vƒ{xbܥV +kXo 7\:VjPh͗ )m|,[ "llBV^v 5pB! Y"묀ςK{z|\NZ$Ғ5Q *aR+g`U+"J^:Jg@b?Cjפ&vy%Qg^- +.1kr#W!^4Uv.?m 4ekCq(Co b[4|]JmP&iRRIEXj䁄ݭ~UPKWC6 dQdS |+f@ l7l.yȐC ֍>ȞΖRkY$uZTZ`--)Z-)LL\\rA Ĺ@rXԀܢi4Xm O6VY ,oMxd4(م`l:lnvkm*r?ȟu/۬ImJfD@$$ka)m]Kȫ5pPGf X c# ۇ"HbaLȑYbXhg==im*.F-$-!i&]Vl:p@[ Pp(9D Z%<[DRˍҪN#I#L9VXi^0{fY2ٹ ZY6'ϲ.Kkh>KٜΖ:jd@49U/LHjHZF 6; ZnO_MX X'@6\^pp_7:%Xfuf92;a=ꀱhf7^Hf{{s vB!LN= 1*[`#d0t@gK{QbZp՟b PՇ늘(ogpR1' *eض"˛XA]|dmyȹnYe@e bm ;טg=xfC, .EQUDĄyv$Y2@ȫ,L]_-Y"c$0MTQ׳bWV kJ[sVXZ^;mh8'h"[JPf:`69w2M01NxhH5BlF4UxUڟ!#, PBd Vƈ 5ZbkhIPX>-I8Х6znb.pVVaYq% h/W9ܤp)Y۾d3ϪdTY>kM.} =AVk 6%Vr)0)"gk^U3jLxͲ״:5 ,%PXz!hfȫ*N@ٵōȒXM%INd ͠.4hlm69ܽJ5 jٸ )([٬n6x@~7¦1HjU22Wet51zW  BҶsK:TYdlK UJb1BfmA2i mi&l14b |,XgiSW(X *젗~ [WK4zR=rՓm4Ԋ)!SZlw@^6M':]%]BfDvѠJp1}*mQQ-2 NBd[dogbBOg nѩvp޸5Yߐ 5Q/JR4r,%9aڮ`Z-ⰂXXZP l}Lld߃APnYzY9hs8KfU bh7bn; dZiꜣK34 g7(3ui_n-᳂ʥ56SgJm[L kNLQ۪HUia-hU"lbK k#Iӕ&,)bWQ)lMXL R/3KY#fs:;kx5=vY8Ǿ _[1s}g좩42{ÅҡM_Ư[ӏQeg^qe$@HUzy^%Xv¨g|y믙7uh"Źs:x];GXr u>\|u~G*,].9ɻ-xOh5/>3/t5{NCYG׈˂zqmjz!ؐ]I8ςpl;z۰SG u5zZ`u{t=v fSO_r>KJ-(ŋWX1rH21@>|$ءfV{ `IDATEچ)f~ezJT;4xah+WO^q .>ƏKbwEk7uKmWwԻ{%Sf|o h|mox,pȮ\$$?_</~S秿oyC] ?x?}w>l 2-x߼o+.z5{G~_wዾ{kMW]}W|o~?/?mne#ƃ/y9Wٓa+짿wpܚ 5DŽ ^xK/'>. 6^f?#ێ~=w {W\ &O6f8ͅkoSݒ%KGu~~-JGI+KO_Bv'n.ڂy^]%CZ2V*p+ʀŐVo\`}Uvp>?{_W_P|0o?9'Nsw_  tBkNEh 1x׃_{5_{J;=d#?C@3;q+Cm@f`Z嗢2}R;r=sko#>\tޕ߭2#NJ8_}i8x?Q }Zu'-mAjėh)@} eRKdkTS T"aV*nՃWykx%'J= Km=eZbknh͗(hy-pʟg(Mh?O R{w R',z<^Xʀ6~0!a}$7Z;/]u?9goѳ?~_OΛb6΋XM-m|3U.O^6oCWd Z _ՎT‡w Ͼ^y]f~ƱS_ɇ_4/,o pwricV[O~(s/82e!{+r黮 _K .?5@c;uߝGI׺c._ӮZ{y;%@3yG=c<w_=_[2>kh噧\|̗JѫO=bw3Y\q}?ןo8Uv̨=/(Y믏C?ן׋S >Qwu'R d#2šӾuя{8EpWΙ3D8 w9cƌ,@ ζo2|+"䤓PSQHRVMFk1@]VmD"5؃9\`?/(k5>F%qG.~3N:W#;u̡HgE[_q xE s nCKM>rQ }ߝﰏO#,WŗԘo^^HSNjΞp7/~ֺχ.pMȧy858οñ=G^M ޅé퀁Ȫ6OWdvgM]H!+U0+/v/^rNZ p_ͳgϚgGynO<?fСoUlVjvmy,ERke{@Ik N jpOy@WnYV^+UN!ǨzӄaYv;6}-6?%Yo]'>Ug5K/ǸENO#;,+;}hVN=:߿Cvᤓ~v_zIJ &5 c7MMwX}ʖև71=F<& w^}ka|﹃w}>_| tCXy[}7m2x{?K†S/߸*o n^4P|qy='9g:էAs1#C]v5s핯3Oc_ѩ'fҬ.We=`ߠyr`_?>.c|&Y3ynMgPRF_jp}*}կ_2=jAj̐f_-އRZ}}۽w/7-u/w~j_s } ض;3goЏ> 7^1]߹Za?Gz;ysϹm0'?_n:[zۮZ@˲0?oYnR(xԕ : E`_. DY)>yi0V pP480gtAy$d ΒIzkgS`bw] oxp[um/tmo\[H}/|% .+O\p~ &__FrolΛq ' L]\k^ wy? 6{Sꜙsvie~ ךanj i{kO~찡`Hl4Rj{ou_妶EbL hTmaVU5%xʠLj[`V$b}VV7ަ㯱ӷ9dn _}ǬB#6a6e>18OB]㵳JZcRhь#~K}E @ޅ=W\<~ھJ>g|2̎~L%Xy_-DQR 3W<^3o݄C:j (o?g~ilʗj7gN] `Baܮ{s}?Ǐ^sma1t0瓟T0_?Y7V\i~HB˾RjAU>==#~=|ShZI&ఀYS rIYpcbR67Un `.Qd°[ .p73G+h[|M=pYww"K<쯂{*[y9KYrde6Y?#gjM0}ľ/,+kg_}C͝t6#:o=H0ra4z \y7̟vMU#{yy믅6d616Lvղ&ẅ@ xG\~O:fä]Ɂ1Ug\~֩N;[fκq#[{+6nd%B\ogmu+o~Ci2i&>lyqIr]I6ɳ&LZ>f; kݺur˶yս?EچIgp? dPK婪Vu@WJ@ośYXjreC{w@cO?zy8;HYc~@+p<:;\hG. Zc&y0 2KHgل8;f޻4Zg Ǟ8s\p:dେ*L=q=3~%bT|QJӷ9j}EcV2"dC-[$x;]xggE˾-~+4Vq-scj8 CeSe}_l!1PSc!FK$i-8uX` Y~ΙUKr{fkPO#rn #Y!]ڱH`kpMox@( V o%|ݟB-*ql`')Uu]&ʫ]}H@l$.mw 5۶?? j궛bۙRHdȺ%Jad)xbJ`$lwYf g6ǐ"kc,ڝ6@ Κ>׿駿/%}>@g{N_W*ڂV}U digkLZlU[a֐_W,p~,gɢFd_K!c l%)a Plsw2% 41a] ',&^%5J,x(sZQY28b8 )P Lv >kֶ$2-fĴLRTkgyU:#+@XrroyA,Llhe 3ś Da*#e0m*Yk8g|v^l6Xm@BﺥXv;yí볼UZԵխRȕ`z&-Saq4 [$u15" 8V<ɖ2Y9_BUq}#WHL.)$ f@l 6@DHji %'iZcMBT#hڊN@UU@X į)y?u4YBBn7ɊȆ/v0A.[lM'TwZ^llq[̇h$'͖Hk*m +YUZӝC$U`y "P_n$A;}76Oc۲ź[ɢ .0K6 _Y V+8ʠp[):h:L˫JIm퀼AA銳`wPXw<[^TZ^d͖13_| E6}XJ QkQln̖4Ya9g||gERF5T*|rU[Ud2W/ e) ! lCҭtiˀ~aI ha1L61(Dzm̪*͠¢6ع"[fC{lh1},qԘ+7kOT0w(1ʈMa٤aLHxfc1sDv+I\r.,e!i Uy֫Ȁj WϕEאFp@D̰,a2K*v 9FEXAj6-y lA6! {BmeSJZIUUa.\/hk&RX7p̍DܙNWzaBLc\]j!VYB!mj%_4@nYi5ބB e/T$fUr'*f0Bʹr,u JW E!%ా+6b#PGiS%-gm Y&nAJ*1ȤtA/> 3JmV@hhRLcm"׵RUv5Yp=.?dr(l<}P։ ^:Yʦ:(Q^Ld"cڑYxr1%0Ng{}ERk/@6?0aZڿ,M@]xMWfRe|X-&Ro3"=)E<(c8oW{ ِCiq, H-oJe^Qnȡffr4 %ޢYY=hQ'+ LYpJSVR=f -c[hi才fZeQ>]Y-Y)kbDG`z_*Dx[,9aVlaI30Q g:`X~}"FQTu!Ӫwc9]K֠5ĥLk#>"òҠ:P R Ƭd*낵*ܲMAb XF V!Am`=MvA( U5VJU^%UVXo15zJYb-ŮrDKYҡ4flale}Efm/Uف%MԢ,W񅷣KQ5 I+[ÕI`Ư4@bu hN@r؈$Qm% 4mǀΠAd \nrby *f=8[._#X9LߟWRKW1V7z[#Wo Xj,S _ɮW սz2¼Sy?KIm?}| cR啼 /ג쎿{BT%/ZOjܓ>~uRj1/O/V LtWcRJjK'k=C?y x"V}b&9X?_~$E{=d(ھY_g{%{~']ɘ/归=ߥ=k D_K]{zR۵ 333v]ZlCUMfXrBPTkSket}X`I vh[lO5Q`TtK;<g05YrQ{Ŝd|cZ{ggݞ{/<ԝRRR'%(΅˷y~OKZY˴x]HѰxuj@TPD8`Tha[;СY-ҞYgt捍_㠐|] !,3$Ɛ/,c LeaE A C1u0$H8YiF.0cʜI͛8 `'&nWCKvEfH|IpAX&@HL5 KHqҎɐk@V:"ο _g9HA+ rឨ10ՃS…3'zO pUG(PQCIMKH!Stq,C)SF! 0A$cl$0ǎܢ98ƒ"sS9-aK&0djd:ӒMg YXj0Pb]`J fy]  L…)s#,60rM ,ذd` ?,[%6trbP"Lj>{/L^g%V2f> K(Zp1Zyb ?h8d`ɒHbEt= @r$ z 7 q/=goLZ3AX2p LŔIRApU-\pBSq%p (P=*!cؐ dX@pN3Wј 5+Pf"3SWY+ĩsM"I&4beIJ8 . $ g"E$5?*2zH og1SՀ:w6MahHB @ Cd"D dȓ6# ~^ jP Q/iIfh@ (XOL>(=*T%i#k1L.0LR@Fg @(n@$p M< !:!!F! A hD#'ɐ>V̊dIBԬ>P,Mt| P}L2BT8Ee|.BH4<'8A G FXs5!Ft&CU4}! F歛1gD0<) u0`5`(E9%ȓ5L", pE& EP2'L5h- #rI.vh>ĈA ĐCgn )b S^ 3eC(h,d Dppr 8H%؃Dťs @ C(#{@FTa Pz cdcdXn\ DFө"l8-hZFD(sQ4W2 O|I>AXMr J4T\(0 2\0rtH5J'= pP@^C pl>  0I؃8c ǰ^"@ T  >G"1p((sBKZ0q| Β)b@&L6 "G ^"ӊ` Ϛ-EF0&eC=X W-6?I7 5,xXq zo, *1id,y"NY`d67Ѓ#y  |\&pE`^ 2LA' (+/V&A0s;0)vknP% 6nk$B!Gdzǐ/qFxpE]? =8'`P7uK6? P+xpe&8c@kP c {Xa}T`y@0!|u|b B;~vX V*kq 1)L0n6hr0w'w , dTFO @ L  ;n}tF$ &JJ:6`r z XVi60k}'?-Ep< p{aa/B T—Xq@+bXwn2(J h~aT!.LBn @"I cn@uR YwPS8Q@6 ?`B6pFF|s2,x60Dc7`{P w `.`ih"Um2 5|01`aSf 1Q~ΐC@G&deh=Aư;` w0pfo 2@P ` H?g` wh$: 2`2 r3yGs `.^0a"+%|Pf- s{h9tP 9@ `B1 K yQcI[` `x{@ I Yf?V d6'4gb0oiy&З`s=`2jcӀ<@8S`!|A"0 GX, qvXmhgAC~A*WȐBЈ0`&b0d \?]YfRc;Y}6   `u &c`  z$< 9`SY n`@,@k7}@nq֡! 5R@a5r bE) JmUhtPhQ MG@ P8 & h`28 ;`;J`s3Yx=PcI p/:07O@8sn@ CvL`z+@ d`S|PAKjS e¸`HD20|CXc/Vm֨22t!!P QRsP<5r14WJ)8)k<2N4LPeP8v^[h,!D9RP4d%L |`*!8sZ2l2 #@iaJzGjY09dFVafd9iH!5iB)0shrEhrOC݄T/Hk0(Nf*Y`2+a D2, NZhJ_A #!iC L)0©2ip.h!9xLpqvJNaze ~ywCH9CBԛ"i䜆&, x yNjz GAfMNп2+ `K*NA\vmW^E`j5svMy9aG.SO=1v@TZkA۶mۺyN9ug۸^.]VV755Ib r!(}b%$-JFNay.@C>_u %^jDx3U*ZR֠sNYg0 sX3IHDغ~;ރO|=AY0 +@ ` 2 }k]i-z/[ҡJxCP;yH ץ#ZMΘ  4_]v'?ɧ~: C5)Hk s AמO^[o} ׾ܻw死k"D(I0 p|ӟ$IRڒI["""KFi"cIiR 5)KHY:)Ȅdfr)&&ɐ5DVHEw'Bq/}B`sgͣ5MED62dYk5YMFՆ"k*ngTS1QLdȒQD!dMhZ5?~_CD}j]Oj< :D ѫ?ѐQl)6[dRl(2҆RLa˫5kٳg~guV65!>Osx͛7_p ,8E[nDZtzqX,C.D&}'vuu ~jw4ߪJnMo9phyWB*wޙx4zs^{)$GGFG/X~= %{糹fCӖ;ZZoj }WIoz[/_5qLqVĂ8ca~,*ܽip@l YL"A|xlxn\A E xw(J9_lîS9\j0t:0,, 0p,hS ¦^ꪫ.򶶶={qg?srr7~˖-p[ߺSZϿ+Z]}{?ٳf=P}{ϯ4av '|nپbѱ :|Esܻ4eO:ŋqo_Yyҩ;O^|{aLykϛ;cfk4?hooW̚b)5UjgwB!(A'łBq߭x1C+XYҀaZ.prR*t\{hA̓p>30 fgм$Iyy}S?1;g?{7߿sNDsc G:Z1_Rё[vlg??#m>񡫟>Vܐ了3N:U{7jh/9ܓ;fUGǮz׻vO_cO_6ʕ~+.ony\rYP1c5g]|W7rS5]t׭mch\OyW;կ>$B: Ƨlh%VtJ;o)8fZ)s&X<  n@㐎B^r[M镧K;z.2:u2v_'xbllldd{]n݂ ժhꯅ`x/Zx?cg_x/}Dc׷w`{_N.u Μ>#;(@p v!8I1[D`XX]p`rJ 64">vM˷ X $dBׯpHι6ɐ;+Wq;vضm]vadi""͋go|ahصv*{l޻Y™@yX,]2kytþM9勯vat<4l~-7/p;{V É!eK^$ѽ=YK,BXX &8 06F{\M8[|ۣ~4L1  !DI-GZ:I0WLhC3|׿Wi%g560'|m+Ν}+1c!DB5k|s MMMg}v!e;s'm֖L —-#lx[n↽?ntI~h"7r-eS}9^ DsF9J\hkC4lubP-n jTm8:d{r9sAZH_1a`JOؑU*l\{LJ?.4eA@"X'#|[7={qrOۿ{ɻq~﷭_W-V$R?zDZ @B1M2VXhѢG}'ܷ Elzxtttxt-^w''k.BSK[K`ht6wqبØ%X7uI=mʏ|զ4<'(6][S]9dbZ5Q*شkڡ ˪o[7[7 3`ҔNcąl M`)K]4+/`>0]=/i葻zw B潟Գk_38@`^wt Јv6?nG> ~[h۞}293S s"wlDGSvCCr`=P b!Z3@SkBTjᢅN;Z*:cOUJT*cqHa#?ܵ$E%L*5qidN #jUɂadLDb\Ǎ9f\߳\)jU-U݈h6" n\ҁ6 纒1atώ(1;*0E® );.KŇ?#rK ']^|KW=?#ojX#ШvlYvN̙~A;BY͘fv>w:kA B ˹ A0`9{l_$+c,1 GJPJ-<&8$_gL3Q Bts]k]skё?86W5)-]勑]|Ajt8cP9DYcGb JBF2ÕCK b7V .n4 )ksM| a3 c Rpb pk844".4Q/QXRI.ro8R *mkniߺM^{ٮ&4Z];{9W^u" 21x+ !!%";"GXY&[kDJR4+dƘHC{NFd22WqRB|ޞN+n3j#2a=oik/)?;:heʵz&5:ւ GJ"ldρp$@0'BGZ@A=PB+#c#JsK3ƈk8HCpi-mCiťeAƘZHIĹ` XcH8%Dq$9Z!ptO5i3|OB(;md2xL벥8$,ZL'zҖtd@d_dM\)VϿBØL&ôJaQy;MLLz4 bX;OFHշ5\v7=4^˗%r"(=m1y~}avZ]BQkYLLB^񃦶Vߺq`\kOZKyudT*k.e]9l49X.]"@čLBRw띀ƛ}`0Љ-NYVo{ ;'Ե2ڕ`X3ջH1$8#pTdm۶9R65dɒ⎎Pc4KPأdO8č6apдi$K# !}088@:9!pn㦡!^:HYpX5 %?#9crgy׮wO=իϤ(gsozE{CqI2Ls?-?EMWLp.R˗Ӵc`Xm$oǝV]D)8tQK#۳ fΛ*֎Ha5J'-9'S=mmOP@4wOJ#幌5\c>Vgvn&kz=3ot|[KGkBbmm[CBHk淋t(LZX2{G@d WA;28%P\h )3J!@IJWbp3VC/lhی!ꎧr\nCC;<8v@~.պg`G[[ְktqK3/?o`bZCWPp-[rL#edJ3ɺktzbǿX qgc cbIz.su?qUƽ]_ѡ}w⮃c# pm]9uū[vpwk::mصṵ;犷7 vrb^]xѭ?q:- %O*}_3wٜs|C>4x~_x͇?w^fAșws\}-ZTVfϞ]Tݻy/+_[~嗿/=Qe27^{9ss3ƬՎsMMMB~Зͯlґxϻ;.g|Tξ]x1]]{\2~i<묳>/qaz;p޽{[[[|W+f̞ޱMK.ӦM{x'F]e+K~*= '@;h!!hqٜc!I0@̾nxN=R ;un4`0뺵ZaE6brN2-=5[XYT< oetqTPW}cI)({Ƈ7=pMzf ;wdg@hpfsN?c&O{gc?{ig^|Z7PAUy9׭c8Vnڴ{ߩXy2jʾş̂1ÕmhRdT($cLk;22-Z#իWoٲeժUFsnZ֬Y /LLL]$k+|8ElX~ͷR+Z}Ν;֜F=ظ~c#PőQ^~=HɐMHI=|޽bػߜ9slܰA04>62sz"Us-]LimQjEe'o+!ǽfi=y2 &ftѣOݷa۳ppo Ю hdXc]bbuT7Pk0 3ZV5 ߽㱗=g֯-n6[ MIo^kliyֲ}mܧVS6l1Q PiKO%/G<+|oV~+N1ذB?_7] K^tXqT~~vwMC '}N^}e @ oںpBT/]k0f͚ zy__׿˗۷.J!)eZGp~ɥֵ/o'vDml5 8l.4_sk -[?nC?Bϙ3oh/˖Bm,Zxl^LN75yCӌWe]/u#3n@1KVt0KwPkQ3zxׁ*kl8x}kU3q55ǩe^H7"p$m(77\So@ tΒx|haCLf~R8I~Q* IDAT3]NgvTK+c a-\tՍؽghCX/@|7䛳 v~[J0V+VW8s])c00,*k#$1wy_Jk'j*/wg͚#`'jZ/|Qxb .-wTh#H0?7t=&ЄըM]~0R+yٖup2dx[.TCsM/"X`,nzϝ3 #0x0VͳJօLUx [ \z=YVruKF71kǮ[h>JȤ!RhH𚳗.]ʖcছ~pS>7mp@k8j* )AOo7.m֐1XB ͉IΫj*$њ a:t(Y{~{Fw.tuvX ƠHR[ g F"iBHzS:T./[|8Vkc1QSsF5kjTu=.(YA5Zs A?cK}0*%. ('; _2SjMPL  E0j8&R4R#!k0Ơm5FM3y׉LHEmĖb!C~V|*"~ \J<ʦzYO9Uc_v[^i6C3͘յ lhN2tԌcb+ցø\c#)I2:1⺽;vq1ٳӳfl|ᅛo_ၡZ횏|ҷaq@2${]]fRB @pq>WJ9S(լsK6ͲpWk c31 uoyEh8B)5wz[{Z+ J%,1`ր8OjͰd?aג@BNHJ{ɉL& d[wwU"pY Bg\(]H+kq8}G_yND{bóYkV1݋ƫyֻO])̉bMuhצ=^ٳqݎuCqqRX#,Z?ݣ#n*bKru(Nj2c9T*G rqHc ` 㓛1:79TKZ&ͭ"bHZl7GEZ9K=넓3yGxwO^s7_qsO<@T5qNapd "h“NZ>kVo^Is,IHŎ$w2ziӦc֬YS~IKhH>,nmfϞ=o֦C#g}1Pnk@et>!\5 }T8F?gƨ#fcAqvvv`,Ξ(Vu w3/@p媳z|֐ztc8ϦJH$IkBkBͥ3i(jQT*׷߾!3h]5 s]5e`gtl?tT66  AE \ZZ{:woOo`VQ jPzMQ1<ϰAq!`FS6eWM5[A(i+s/D6>+sNVtOn7Uֽ> F+%ҐنF78N, l!!G򕯜ZmŊ'pO̶V$AK/gMxeGR_@3VMɭg6" ~r:)*(1g:1,n~'R= d< aU캒`2Y-ǎ?{][z-BhI,]bn"T%0'Z"cXVzdAp3S,啠ey8΃ .:HVP-*WǢO^ZIXy\Mk?eVLК_jS>=;YAŒdx<8QdM@I9λ;'&&q1Cs18F:2wo|+z+/oذ)Vfkjk;osϽrJ{}YcygO? ^H$K $a͑4Ɛ2QqK0 A[ ٨Ұ%|r-5cAGGV4B8\:_QD,륕0XAR021.)202˪d fZw% nMԕ*9*td!N!(ijcwHh.J)S0JF,eD2fKdŨ^O!\Zh+&EOsXNNw]׏biS^s+NjfZTϸ׌D%m!LGQ 4oJ0wʃNf8)a#!y^ƚKIb'+A(t*r#_Mȶt57Ok6ʹz}R Ã:0YV̳/t9194J͕5ښ6Zwc9d2g D3SCweSHƔiqN9GB*Gg;8?Z:Oa/X$MZc88'Mv>TAK*^68|sdO Ve iI9`uFWKWk5  )#28ed]t (2$mq !":}iR#89ͣ, c1ऱ;FdGO0!jlr ס6{6w4{v̞1}vlF8֒!EHqʥ8Nq3 hS'R!!E*łF5 fڂXZ*Q*#8Wp &k%9Ju :HN:2z^^4Y'bLQYV .8""rNml>hgL[dT Yεsi$LQDTd~!q7frEYk%p\(b1sΌǭ./tF2鲌&EmAwSOped||{se{ t/oY3k. iFlj%ř㈣52ׯO{zz;pO(|tt4L N'4Gǘ#;Y &""sfU81lm#q_ziގi{^R֘Fq$!Vz"&&uZ!ɐVX)iS31J)Y搈b&\Ǧƅ\mrN&  IB"„*HZ(lz ca%+b)*% ྦྷJZϓ`7LV`RHVF$׭jIZhPQ%)#Ci##5a8ިRԵ5 )_ e jB0\V{ txWq!\3Ky٬KIgimվg%vvϛVz`*Ϛ맽Zm=c/27j.jkn\Fܫ\t{ |j[ĒrKZpݽ{wR?~ooJ)k+ٙf3}yMNNJZf=\.j#Q2yR*JH-\VCHWr"0:rdS=KZzªݛLw֌zN<$o(9FLk]0滢liL3)v ]0v]raS9 (yq2V[9)mXF j8\#xdfVVȈAa^OZ >$ L1q#yXaC1RjjPSFZUK#+=nX4)֜UOT/ϸ"3ݞ59<:;sFK[alϾzzz[Z%= [ )re"_zU:wg/:ڻZZj-HBHBۀ#>؜ClK6𾛩z~ZL>'i#ZQNFwy=;z믿eğ'jƶmۤs5:\}ꩧvءiڡCym 6]`a9HQ>S DGDmd+J]DGWS{gb=iMe_jM{ex=k֮}pt"(ת0*@ \#*DQ]:C֪6/Ia`D .TCV@B0l9O5J1,Ll T ;#*24,"Eõr1&az 㘻+ Xeq *w`%!- 08n੓kڕ%qE :z @[:~ꃾD2v݊Vm\W,UTz-7t%y⹡0֭on3:˞ yOKURa۶(5pޗRou? 裏~ҥ\.L&ReYSV.k]ݼcx.jAMUl,LQcuwFG(m^t93b]llaVG"3'9B ÕllPJy'թ.1]o^zvL7BV(j*jNh#۳ ,M ŹUE9H@`JN WC$` F]}a|Dh Y=sO:^f޽{lںo߾Bo[oe{~󟧔;_Ww?]ɑǾ??~w};F)g~Or ro˿xGߴbpKCuk8뮻?=Ξ?pݺg 5MQ;_zq9պ}d^Q\ ~dP#Lg;ۗl\p趠g/.;tʩj4MsKRm<8ٿwrMZ-:A3z7s{n2¡^9vl-Mv9Ng_OY/߭m3մu,ƸIE;#S俲^i`ťKJ.T*Oߞ={~8pu]i"0"P(D`HfO8c+ 9Dp2 ᜟp^S,i{[Zk A.aؖqq˖m VtKRV,{g/wݶ?}n3X<?d==4 ڊ7Dɳs ӫ 8wof8-̻}ǓX2,?sqܶxCP%λPG_#$J pl^eqbT,sc*FK=-4:>%#]vB |Jl6;888N[[ۚ5kxSU0 Hjnnp8lv* drbbR8 BP%V 4m&*}UUJ%ig| C600%]B1׷m6)̟|C:t{;8 Mc"AF8+ d\Q R@Px?w ~嫮` aE\)W@`\E\LLs'ԧ_m?}@*@vz7#Z@OiלL*kf׳{GY4uXyc?եsgF Hâ#TU˫M%c#10kP2pѥ7*Pc2ϸXZ @E\wǦ@%_w-Otu Hl r1Γ^'7ܺ#ʩK0yJmL`B9!1@bB2L___$ٹsdBHlu߮%rgF]%d.-o0$Oҟ*S@_?9+V|:ejueO= J}f*{?'TfM._R?<0)Mewcgk"|OH#N+”jryݢL]BÇ{\noo={aa<ƹ²L_⽾< .GI.@ -B~9sFTc_.]+߄pu5b9vTUDxX(BͱH4 bU* &1a:U`4ǰ"Lt :_Nsi-x\ tb>On#%#_Raa[EI܁/a}ZmnnR8qB&q +WlmΔ+o?`0 z˖-rΛ6m D"I\`0. Q)_t+fw-i(ebʼV[½V|)*^-ǰX Z4"~\}} [\^>9ē [7mf4OYs% Ru.RZTB9gDCa_cjP755avIENDB`batik-1.9.orig/documentation-sources/skinconf.xml0000644000175000017500000006751213063003360021631 0ustar mans0954mans0954 true false true true false false true true .at. false Apache Batik Batik is a Java-based toolkit for applications or applets that want to use images in the Scalable Vector Graphics (SVG) format for various purposes, such as display, generation or manipulation. http://xmlgraphics.apache.org/batik/ images/batik.png Apache XML Graphics Apache XML Graphics is responsible for the creation and maintenance of software for managing the conversion of XML formats to graphical output, and the creation and maintenance of related software components, based on software licensed to the Foundation http://xmlgraphics.apache.org/ images/group-logo.png 2000 The Apache Software Foundation. Licensed under Apache License 2.0 http://www.apache.org/licenses/ Apache, Apache Forrest, the Apache feather logo, and the Apache Forrest logos are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. #content a:link { text-decoration: none; border-bottom: 1px solid #ccc; } #content a:visited { text-decoration: none; border-bottom: 1px solid #ccc; } #footer a { color: navy; } #content ul.minitoc a:visited { color: maroon; } #content a:hover { background-color: #ffffdd; border-bottom: 1px solid #aaa; } body, table, p { font-family: Verdana, "Bitstream Vera Sans", Arial, Helvetica, sans-serif; } body, p, div, dl, ul, ol { font-size: 9pt; } p, #content ul.minitoc, .note .content, .warning .content { line-height: 1.5em; } #main .breadtrail { display: none; } #top .grouplogo { position: absolute; left: 0; float: none; } #top .projectlogo { text-align: center; float: none; margin: 0 auto; width: 256px; } #menu { padding-top: 2em; } #menu hr { border: 0; border-top: 1px solid #6f569e; } #menu .menupage { background-position: center left; margin-top: 2px; margin-bottom: 2px; position: relative; } #menu .menupagetitle { border: 0; padding-top: 2px; padding-bottom: 2px; position: relative; font-weight: bold; } #menu .menuitem { position: relative; } #menu .menuitem, #menu .menupagetitle, #menu .menutitle { font-size: 8pt; } #credit2 img { margin-top: 1em; } p.quote { margin-left: 2em; padding: .5em; background-color: #f0f0f0; border: 1px solid #ddd; } #content ul { list-style-image: url('images/current.gif'); } .boxed { color: white; padding: 0.25em; } #content h1 { font-size: 15pt; } #content h2 { clear: right; font-size: 12pt; } #content h3.boxed { background: #9f7ae1; } #content h3, #content h4 { font-size: 11pt; } a.broken { background: orange; } img.floating { float: right; margin-left: 2em; position: relative; } dl dt { font-weight: bold; } dl.options { margin: 0em 3em; } dl.options dt { font-weight: inherit; font-family: monospace; } dl.classes dt { font-weight: normal; } #content { margin: 0 1em; } #content li { margin-top: 0.5em; } #content ul, #content ol, #content dl { margin-bottom: 1em; } #content ul.minitoc { margin-bottom: 0; } #content ul.minitoc li { margin-top: 0; } #content ul.minitoc li ul { margin-top: 0.5em; margin-bottom: 0.5em; } pre.code { background: #eee; border: 1px solid #ccc; padding: 0.5em; margin: 1em 3em; } .codefrag { font-family: monospace; font-size: inherit; } .expertise td { text-align: center; } .expertise td.area { text-align: left; } .expertise th.tick { width: 6em; } #content td, #content th { padding: 0.25em; } #minitoc-area ul.minitoc { margin: 0; } strong.cont { color: maroon; } a.class { font-family: monospace; } h4 { font-weight: bold; } .figure { display: block; text-align: center; margin-top: 0.5em; margin-bottom: 0.5em; } #tabs { font-size: 80%; } #publishedStrip { font-size: 80%; height: 1.5em; } #top .searchbox { font-size: 80%; } #footer { border-top: solid 1px #482980; } table.elements, table.tests { border-collapse: collapse; font-size: 10pt; width: auto ! important; margin-left: 2em; margin-right: 2em; } table.elements td, table.elements th, table.tests td, table.tests th { padding: 4px; } table.elements .attribute-name, table.elements .attribute-note, table.tests .attribute-name, table.tests .attribute-note, div.object { background: #eef; } div.object { margin-left: 2em; margin-right: 2em; } div.object-header, div.object-section-header, div.object-property-header, div.object-property-desc { padding: 4px; } .object-property-func-params { font-weight: normal; padding-left: 0.5em; font-style: italic; } table.elements .elements-header { background: navy; color: white; } table.elements .supported, table.elements .yes, table.elements .partial, table.elements .no, table.tests .supported, table.tests .yes, table.tests .partial, table.tests .no { text-align: center; } .yes { background: #35b92c; color: white; } .partial { background: #e29e1f; color: white; } .no { background: #cf1f1f; color: white; } table.elements .section-header th, div.object-section-header { padding-left: 2em ! important; text-align: left; font-style: italic; font-weight: normal; background: #eef; } table.elements .section-note td { padding-left: 2em ! important; text-align: left; font-weight: normal; background: #eef; } table.elements .attribute th, table.tests .attribute th, div.object-property-header { padding-left: 4em ! important; padding-right: 2em ! important; text-align: left; font-weight: normal; } div.object-property-header { font-weight: bold; } div.object-property-desc { padding-left: 6em; } table.elements .vertical-bar, table.tests .vertical-bar { width: 4px; } table.elements .element-header, table.tests .test-header { border-top: 3px solid white; } table.elements .element-header th, table.tests .tests-header th, div.object-header { background: #ccf; padding-right: 2em; text-align: left; font-weight: bold; } table.elements .attribute-note, table.elements .test-note { padding-left: 1em ! important; padding-right: 1em ! important; } .license pre { width: 85ex; } #layout #data { border-collapse: collapse; width: auto; } #layout #data td, #layout #data th { padding: 4px; vertical-align: middle; text-align: left ! important; } #layout { text-align: center ! important; width: inherit ! important; border-collapse: collapse; border: none ! important; background: none ! important; } table#data tbody { border: 1px solid #9f7ae1 ! important; } #layout td { background: none ! important; vertical-align: middle; } #layout #data td { background: #f8f5ff ! important; } #layout td p { text-align: center ! important; } Page 1 0.5in 0.5in 1in 0.5in false false Built with Apache Forrest http://forrest.apache.org/ images/built-with-forrest-button.png 88 31 ApacheCon http://www.apachecon.com/ http://www.apache.org/events/current-event-125x125.png 125 125 PDF created by Apache FOP http://xmlgraphics.apache.org/fop/ images/logo.jpg 138 31