From de3f128d745e02f20f185e97a1d6db71c9e9d334 Mon Sep 17 00:00:00 2001
From: Carlos Amengual
+ * It bypasses EchoSVG's style computations and uses CSS4J instead.
+ *
+ * Read the {@code IMAGE_COMPARISONS.md} file for details about the handling of
+ * candidate and reference images.
+ *
+ * If you want to test a non-conformant SVG document, run a non-validating test
+ * with {@link #testNV(String)}.
+ *
+ * A small percentage of different pixels is allowed during the comparison to a
+ * reference image.
+ *
+ * A small percentage of different pixels is allowed during the comparison to a
+ * reference image.
+ *
+ * A small percentage of different pixels is allowed during the comparison to a
+ * reference image.
+ *
+ * It bypasses EchoSVG's style computations and uses CSS4J instead.
+ * CSSTranscodingHelper
.
+ * ImageTranscoder
the Test should use
+ */
+ @Override
+ ImageTranscoder getTestImageTranscoder() {
+ ImageTranscoder t = super.getTestImageTranscoder();
+
+ if (userSheetClasspath != null) {
+ URL userSheet = AltUserSheetRenderingTest.class.getResource(userSheetClasspath);
+ t.addTranscodingHint(SVGAbstractTranscoder.KEY_USER_STYLESHEET_URI,
+ userSheet.toExternalForm());
+ }
+
+ if (altSheet != null) {
+ t.addTranscodingHint(SVGAbstractTranscoder.KEY_ALTERNATE_STYLESHEET, altSheet);
+ }
+
+ return t;
+ }
+
+ @Override
+ ImageTranscoder createTestImageTranscoder() {
+ return new NoStackTraceTranscoder();
+ }
+
+ @Override
+ protected CharSequence getImageSuffix() {
+ CharSequence suf = super.getImageSuffix();
+
+ StringBuilder buf = null;
+ if (altSheet != null) {
+ buf = new StringBuilder(suf.length() + altSheet.length() + 6);
+ buf.append(suf).append('_').append(altSheet);
+ }
+
+ if (darkMode) {
+ if (buf == null) {
+ buf = new StringBuilder();
+ }
+ buf.append("-dark");
+ }
+
+ if (buf == null) {
+ return suf;
+ }
+
+ return buf.toString();
+ }
+
+ }
+
+ private class DocumentInputHelperRenderingTest extends BypassRenderingTest {
+
+ DocumentInputHelperRenderingTest(String medium, int expectedErrorCount) {
+ super(medium, expectedErrorCount);
+ }
+
+ @Override
+ void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
+ throws TranscoderException, IOException {
+ helper.transcodeDocument(getRenderDocument(), dst, selector);
+ }
+
+ }
+
+ private class TIReaderInputHelperRenderingTest extends BypassRenderingTest {
+
+ TIReaderInputHelperRenderingTest(String medium, int expectedErrorCount) {
+ super(medium, expectedErrorCount);
+ }
+
+ @Override
+ void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
+ throws TranscoderException, IOException {
+ String uri = getURI();
+ URL url = new URL(uri);
+ URLConnection con = url.openConnection();
+ con.setConnectTimeout(5000);
+ con.connect();
+ try (InputStream is = con.getInputStream();
+ Reader re = new InputStreamReader(is, StandardCharsets.UTF_8)) {
+ TranscoderInput input = new TranscoderInput(re);
+ input.setURI(uri);
+ helper.transcode(input, dst);
+ }
+ }
+
+ }
+
+ private class TIInputStreamHelperRenderingTest extends BypassRenderingTest {
+
+ TIInputStreamHelperRenderingTest(String medium, int expectedErrorCount) {
+ super(medium, expectedErrorCount);
+ }
+
+ @Override
+ void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
+ throws TranscoderException, IOException {
+ String uri = getURI();
+ URL url = new URL(uri);
+ URLConnection con = url.openConnection();
+ con.setConnectTimeout(5000);
+ con.connect();
+ try (InputStream is = con.getInputStream()) {
+ TranscoderInput input = new TranscoderInput(is);
+ input.setEncoding("utf-8");
+ input.setURI(uri);
+ helper.transcode(input, dst);
+ }
+ }
+
+ }
+
+ private class TIURIInputHelperRenderingTest extends BypassRenderingTest {
+
+ TIURIInputHelperRenderingTest(String medium, int expectedErrorCount) {
+ super(medium, expectedErrorCount);
+ }
+
+ @Override
+ void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
+ throws TranscoderException, IOException {
+ String uri = getURI();
+ TranscoderInput input = new TranscoderInput(uri);
+ helper.transcode(input, dst);
+ }
+
+ }
+
+ private class TIDocumentInputHelperRenderingTest extends BypassRenderingTest {
+
+ TIDocumentInputHelperRenderingTest(String medium, int expectedErrorCount) {
+ super(medium, expectedErrorCount);
+ }
+
+ @Override
+ void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
+ throws TranscoderException, IOException {
+ TranscoderInput input = new TranscoderInput(getRenderDocument());
+ helper.transcode(input, dst);
+ }
+
+ }
+
+}
diff --git a/echosvg-test/src/test/java/io/sf/carte/echosvg/test/svg/MermaidRenderingTest.java b/echosvg-test/src/test/java/io/sf/carte/echosvg/test/svg/MermaidRenderingTest.java
new file mode 100644
index 000000000..3c99c7334
--- /dev/null
+++ b/echosvg-test/src/test/java/io/sf/carte/echosvg/test/svg/MermaidRenderingTest.java
@@ -0,0 +1,190 @@
+/*
+
+ See the NOTICE file distributed with this work for additional
+ information regarding copyright ownership.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ */
+package io.sf.carte.echosvg.test.svg;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import io.sf.carte.echosvg.test.TestFonts;
+import io.sf.carte.echosvg.transcoder.TranscoderException;
+
+/**
+ * This test renders a number of Mermaid-generated SVG files under the {@code samples}
+ * directory, and compares the result with a reference image.
+ *
- * A small percentage of different pixels is allowed during the comparison to a - * reference image. - *
- * - * @param file the SVG file to test. - * @param medium the target medium ({@code screen}, {@code print}, - * etc). - * @param lang the language. - * @param expectedErrorCount the expected error count. - * @throws TranscoderException - * @throws IOException - */ - private void test(String file, String medium, String lang, int expectedErrorCount) - throws TranscoderException, IOException { - RenderingTest runner = new BypassRenderingTest(medium, expectedErrorCount); - runner.setUserLanguage(lang); - runner.setFile(file); - runner.runTest(getBelowThresholdAllowed(), getOverThresholdAllowed()); - } - - /** - * Test rendering with a user style sheet. - * - * @param file the SVG file to test. - * @param alt the alternate style sheet name. - * @param validating validate if true. - * @param expectedErrorCount the expected error count. - * @throws TranscoderException - * @throws IOException - */ - private void testAlternate(String file, String alt, boolean validating, int expectedErrorCount) - throws TranscoderException, IOException { - BypassRenderingTest runner = new BypassRenderingTest( - SVGRenderingAccuracyTest.DEFAULT_MEDIUM, expectedErrorCount); - runner.setValidating(validating); - runner.setAlternateSheet(alt); - runner.setFile(file); - runner.runTest(getBelowThresholdAllowed(), getOverThresholdAllowed()); - } - - /** - * Test rendering with a user style sheet. - * - * @param file the SVG file to test. - * @param validating validate if true. - * @param expectedErrorCount the expected error count. - * @throws TranscoderException - * @throws IOException - */ - private void testUserSheet(String file, boolean validating, int expectedErrorCount) - throws TranscoderException, IOException { - BypassRenderingTest runner = new BypassRenderingTest( - SVGRenderingAccuracyTest.DEFAULT_MEDIUM, expectedErrorCount); - runner.setValidating(validating); - runner.setUserSheetClasspath(AltUserSheetRenderingTest.DEFAULT_USER_SHEET); - runner.setFile(file); - runner.runTest(getBelowThresholdAllowed(), getOverThresholdAllowed()); - } - - /** - * Test the rendering of a SVG file. - * - *- * A small percentage of different pixels is allowed during the comparison to a - * reference image. - *
- * - * @param file the SVG file to test. - * @param medium the target medium ({@code screen}, {@code print}, - * etc). - * @param darkMode if true, dark mode is enabled in CSS. - * @param selector the selector to find the SVG element. - * @param validating if true, the SVG is validated. - * @param expectedErrorCount the expected number of errors. - * @throws TranscoderException - * @throws IOException - */ - private void test(String file, String medium, boolean darkMode, String selector, - boolean validating, int expectedErrorCount) throws TranscoderException, IOException { - BypassRenderingTest runner = new BypassRenderingTest(medium, expectedErrorCount); - configureAndRun(runner, file, darkMode, selector, validating); - } - - private void configureAndRun(BypassRenderingTest runner, String file, boolean darkMode, - String selector, boolean validating) throws TranscoderException, IOException { - runner.setDarkMode(darkMode); - runner.setSelector(selector); - runner.setValidating(validating); - runner.setFile(file); - runner.runTest(getBelowThresholdAllowed(), getOverThresholdAllowed()); - } - - /** - * Test the rendering of a SVG file, with all the supported input source - * variants. - * - *- * A small percentage of different pixels is allowed during the comparison to a - * reference image. - *
- * - * @param file the SVG file to test. - * @param medium the target medium ({@code screen}, {@code print}, - * etc). - * @param darkMode if true, dark mode is enabled in CSS. - * @param selector the selector to find the SVG element. - * @param validating if true, the SVG is validated. - * @param expectedErrorCount the expected number of errors. - * @throws TranscoderException - * @throws IOException - */ - private void testAllInputSources(String file, String medium, boolean darkMode, - String selector, boolean validating, int expectedErrorCount) throws TranscoderException, IOException { - BypassRenderingTest runner = new BypassRenderingTest(medium, expectedErrorCount); - configureAndRun(runner, file, darkMode, selector, validating); - - Document doc = runner.getRenderDocument(); - runner = new DocumentInputHelperRenderingTest(medium, expectedErrorCount); - runner.setRenderDocument(doc); - configureAndRun(runner, file, darkMode, selector, validating); - - runner = new TIDocumentInputHelperRenderingTest(medium, expectedErrorCount); - runner.setRenderDocument(doc); - configureAndRun(runner, file, darkMode, selector, validating); - - runner = new TIInputStreamHelperRenderingTest(medium, expectedErrorCount); - configureAndRun(runner, file, darkMode, selector, validating); - - runner = new TIReaderInputHelperRenderingTest(medium, expectedErrorCount); - configureAndRun(runner, file, darkMode, selector, validating); - - runner = new TIURIInputHelperRenderingTest(medium, expectedErrorCount); - configureAndRun(runner, file, darkMode, selector, validating); - } - - private class BypassRenderingTest extends RenderingTest { - - private final int expectedErrorCount; - - /** - * dark mode toggle. - */ - private boolean darkMode = false; - - /** - * Selector to locate SVG element - */ - String selector = null; - - /** - * Alternate sheet name. - */ - private String altSheet = null; - - /** - * Classpath to user sheet. - */ - private String userSheetClasspath = null; - - private transient Document renderDocument; - - BypassRenderingTest(String medium, int expectedErrorCount) { - super(); - this.expectedErrorCount = expectedErrorCount; - setMedia(medium); - } - - /** - * Enables or disables dark mode. - * - * @param darkMode if {@code true}, dark mode will be enabled. - */ - public void setDarkMode(boolean darkMode) { - this.darkMode = darkMode; - } - - public void setSelector(String selector) { - this.selector = selector; - } - - public Document getRenderDocument() { - return renderDocument; - } - - public void setRenderDocument(Document renderDocument) { - this.renderDocument = renderDocument; - } - - /** - * Set the name of the alternate style sheet. - * - * @param altSheet the name of the alternate style sheet. - */ - public void setAlternateSheet(String altSheet) { - this.altSheet = altSheet; - } - - /** - * Set the classpath for the user style sheet. - * - * @param userSheetClasspath the location of the user style sheet in classpath. - */ - public void setUserSheetClasspath(String userSheetClasspath) { - this.userSheetClasspath = userSheetClasspath; - } - - @Override - protected void encode(URL srcURL, FileOutputStream fos) - throws TranscoderException, IOException { - ImageTranscoder transcoder = getTestImageTranscoder(); - DummyErrorHandler errorHandler = new DummyErrorHandler(); - transcoder.setErrorHandler(errorHandler); - - CSSTranscodingHelper helper = new CSSTranscodingHelper(transcoder); - - helper.setDarkMode(darkMode); - - if (darkMode) { - // Opaque background for dark mode - transcoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, - new Color(0, 0, 0, 255)); - } - - TranscoderOutput dst = new TranscoderOutput(fos); - - encode(helper, dst); - - errorHandler.assertErrorCount(expectedErrorCount); - - fos.getChannel().force(false); - } - - void encode(CSSTranscodingHelper helper, TranscoderOutput dst) - throws TranscoderException, IOException { - String uri = getURI(); - URL url = new URL(uri); - URLConnection con = url.openConnection(); - con.setConnectTimeout(5000); - con.connect(); - InputStream is = con.getInputStream(); - try (Reader re = new InputStreamReader(is, StandardCharsets.UTF_8)) { - helper.transcode(re, uri, dst, selector); - } - - renderDocument = dst.getDocument(); - } - - /** - * Returns theImageTranscoder
the Test should use
- */
- @Override
- ImageTranscoder getTestImageTranscoder() {
- ImageTranscoder t = super.getTestImageTranscoder();
-
- if (userSheetClasspath != null) {
- URL userSheet = AltUserSheetRenderingTest.class.getResource(userSheetClasspath);
- t.addTranscodingHint(SVGAbstractTranscoder.KEY_USER_STYLESHEET_URI,
- userSheet.toExternalForm());
- }
-
- if (altSheet != null) {
- t.addTranscodingHint(SVGAbstractTranscoder.KEY_ALTERNATE_STYLESHEET, altSheet);
- }
-
- return t;
- }
-
- @Override
- ImageTranscoder createTestImageTranscoder() {
- return new NoStackTraceTranscoder();
- }
-
- @Override
- protected CharSequence getImageSuffix() {
- CharSequence suf = super.getImageSuffix();
-
- StringBuilder buf = null;
- if (altSheet != null) {
- buf = new StringBuilder(suf.length() + altSheet.length() + 6);
- buf.append(suf).append('_').append(altSheet);
- }
-
- if (darkMode) {
- if (buf == null) {
- buf = new StringBuilder();
- }
- buf.append("-dark");
- }
-
- if (buf == null) {
- return suf;
- }
-
- return buf.toString();
- }
-
- }
-
- private class DocumentInputHelperRenderingTest extends BypassRenderingTest {
-
- DocumentInputHelperRenderingTest(String medium, int expectedErrorCount) {
- super(medium, expectedErrorCount);
- }
-
- @Override
- void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
- throws TranscoderException, IOException {
- helper.transcodeDocument(getRenderDocument(), dst, selector);
- }
-
- }
-
- private class TIReaderInputHelperRenderingTest extends BypassRenderingTest {
-
- TIReaderInputHelperRenderingTest(String medium, int expectedErrorCount) {
- super(medium, expectedErrorCount);
- }
-
- @Override
- void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
- throws TranscoderException, IOException {
- String uri = getURI();
- URL url = new URL(uri);
- URLConnection con = url.openConnection();
- con.setConnectTimeout(5000);
- con.connect();
- try (InputStream is = con.getInputStream();
- Reader re = new InputStreamReader(is, StandardCharsets.UTF_8)) {
- TranscoderInput input = new TranscoderInput(re);
- input.setURI(uri);
- helper.transcode(input, dst);
- }
- }
-
- }
-
- private class TIInputStreamHelperRenderingTest extends BypassRenderingTest {
-
- TIInputStreamHelperRenderingTest(String medium, int expectedErrorCount) {
- super(medium, expectedErrorCount);
- }
-
- @Override
- void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
- throws TranscoderException, IOException {
- String uri = getURI();
- URL url = new URL(uri);
- URLConnection con = url.openConnection();
- con.setConnectTimeout(5000);
- con.connect();
- try (InputStream is = con.getInputStream()) {
- TranscoderInput input = new TranscoderInput(is);
- input.setEncoding("utf-8");
- input.setURI(uri);
- helper.transcode(input, dst);
- }
- }
-
- }
-
- private class TIURIInputHelperRenderingTest extends BypassRenderingTest {
-
- TIURIInputHelperRenderingTest(String medium, int expectedErrorCount) {
- super(medium, expectedErrorCount);
- }
-
- @Override
- void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
- throws TranscoderException, IOException {
- String uri = getURI();
- TranscoderInput input = new TranscoderInput(uri);
- helper.transcode(input, dst);
- }
-
- }
-
- private class TIDocumentInputHelperRenderingTest extends BypassRenderingTest {
-
- TIDocumentInputHelperRenderingTest(String medium, int expectedErrorCount) {
- super(medium, expectedErrorCount);
- }
-
- @Override
- void encode(CSSTranscodingHelper helper, TranscoderOutput dst)
- throws TranscoderException, IOException {
- TranscoderInput input = new TranscoderInput(getRenderDocument());
- helper.transcode(input, dst);
- }
-
- }
-
}
diff --git a/samples/tests/spec2/foreign/mermaid-93.svg b/samples/tests/spec2/foreign/mermaid-93.svg
new file mode 100644
index 000000000..f6b586f1a
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-93.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-block.svg b/samples/tests/spec2/foreign/mermaid-block.svg
new file mode 100644
index 000000000..f84f58fa4
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-block.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-c4-component.svg b/samples/tests/spec2/foreign/mermaid-c4-component.svg
new file mode 100644
index 000000000..1a18d263a
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-c4-component.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-c4-container.svg b/samples/tests/spec2/foreign/mermaid-c4-container.svg
new file mode 100644
index 000000000..264dd2434
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-c4-container.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-c4-context.svg b/samples/tests/spec2/foreign/mermaid-c4-context.svg
new file mode 100644
index 000000000..f33c453bf
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-c4-context.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-c4-deployment.svg b/samples/tests/spec2/foreign/mermaid-c4-deployment.svg
new file mode 100644
index 000000000..201b6dff2
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-c4-deployment.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-c4-dynamic.svg b/samples/tests/spec2/foreign/mermaid-c4-dynamic.svg
new file mode 100644
index 000000000..f4c0b44de
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-c4-dynamic.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-class.svg b/samples/tests/spec2/foreign/mermaid-class.svg
new file mode 100644
index 000000000..2180bd5a2
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-class.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-erd.svg b/samples/tests/spec2/foreign/mermaid-erd.svg
new file mode 100644
index 000000000..849b3d7d3
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-erd.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-erd2.svg b/samples/tests/spec2/foreign/mermaid-erd2.svg
new file mode 100644
index 000000000..8ac236ec2
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-erd2.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-flowchart-cyrillic.svg b/samples/tests/spec2/foreign/mermaid-flowchart-cyrillic.svg
new file mode 100644
index 000000000..a7d1428b9
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-flowchart-cyrillic.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-flowchart.svg b/samples/tests/spec2/foreign/mermaid-flowchart.svg
new file mode 100644
index 000000000..b0d692fea
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-flowchart.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-gantt.svg b/samples/tests/spec2/foreign/mermaid-gantt.svg
new file mode 100644
index 000000000..1980b45ca
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-gantt.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-git-graph.svg b/samples/tests/spec2/foreign/mermaid-git-graph.svg
new file mode 100644
index 000000000..4b46cc37b
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-git-graph.svg
@@ -0,0 +1,3 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-journey.svg b/samples/tests/spec2/foreign/mermaid-journey.svg
new file mode 100644
index 000000000..5cd3e2513
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-journey.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-mindmap.svg b/samples/tests/spec2/foreign/mermaid-mindmap.svg
new file mode 100644
index 000000000..55a67cc1c
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-mindmap.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-pie.svg b/samples/tests/spec2/foreign/mermaid-pie.svg
new file mode 100644
index 000000000..54d42f05e
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-pie.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-quadrant.svg b/samples/tests/spec2/foreign/mermaid-quadrant.svg
new file mode 100644
index 000000000..3a464c12b
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-quadrant.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-requirement.svg b/samples/tests/spec2/foreign/mermaid-requirement.svg
new file mode 100644
index 000000000..4ebcc10f2
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-requirement.svg
@@ -0,0 +1,4 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sankey.svg b/samples/tests/spec2/foreign/mermaid-sankey.svg
new file mode 100644
index 000000000..345f07895
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sankey.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sequence-background.svg b/samples/tests/spec2/foreign/mermaid-sequence-background.svg
new file mode 100644
index 000000000..cd2673b26
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sequence-background.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sequence-critical.svg b/samples/tests/spec2/foreign/mermaid-sequence-critical.svg
new file mode 100644
index 000000000..08e688472
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sequence-critical.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sequence-grouping.svg b/samples/tests/spec2/foreign/mermaid-sequence-grouping.svg
new file mode 100644
index 000000000..4b3b113ba
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sequence-grouping.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sequence-parallel.svg b/samples/tests/spec2/foreign/mermaid-sequence-parallel.svg
new file mode 100644
index 000000000..f51273f9c
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sequence-parallel.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-sequence.svg b/samples/tests/spec2/foreign/mermaid-sequence.svg
new file mode 100644
index 000000000..78eac7837
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-sequence.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-state.svg b/samples/tests/spec2/foreign/mermaid-state.svg
new file mode 100644
index 000000000..84d5c5b05
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-state.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-timeline.svg b/samples/tests/spec2/foreign/mermaid-timeline.svg
new file mode 100644
index 000000000..69c03f8ec
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-timeline.svg
@@ -0,0 +1 @@
+
diff --git a/samples/tests/spec2/foreign/mermaid-xy.svg b/samples/tests/spec2/foreign/mermaid-xy.svg
new file mode 100644
index 000000000..4b9e756eb
--- /dev/null
+++ b/samples/tests/spec2/foreign/mermaid-xy.svg
@@ -0,0 +1 @@
+
diff --git a/test-references/samples/tests/spec2/foreign/mermaid-93.png b/test-references/samples/tests/spec2/foreign/mermaid-93.png
new file mode 100644
index 0000000000000000000000000000000000000000..10c0ff916aa0c75ac43998a83db4bc0e2a841dcb
GIT binary patch
literal 20320
zcmce;bx<79w=Il^;1C#sd$0il1Shx-1R2~Vkl^kfG(d0$65J*@4DJvtI0PqXu;A|g
zI=}mF)vd4U)mQcYcu-SQ-RJa??tM=0z1G?jsiq>2i$#uwgoK2vs2~GHLP7=upJ7Z4
z;EbaX>E;;vS z^=m}CZo+rf2s@)PWsdS32g?kjXhFAE<7p9W_;#IL)$E%t>bP@}cU3WGUIu0XNvuTiyVbc;=`aX=}(!@R?M zoz*%({~nrAe~*&gU7WNp^#ynDi8TXF?O9-u7&B|`Nq3h`nSG 2-D%-Dl3d1Q3!i%Y;zd53cBVR{Lqq0 zi|yeTdj43PWGs@cM6TLP4)DSY@aJg_nbI6c>qLG=2o(OZ{dxi0gh4)tq%pMK+Dx*n znps~s^V;XcGqqg`xXkIfJzF?>)gbj~m~QQ$uoYi3cXUU`YaAgI@Lbo#d~z6U!JN-= z`3<+t)E~;bw)cHqy(t_N)r(t6s?AX`6grzW-$|XcYOIRuSk3nnt5PxYt&x;^UUt*3 zRtIzrVh^$LUw#7kJeAmoPrC#jo8bZSeg7BlnCPcACY zCYrQo2#L;#g-}zyQVK!0Z5E<3K9H+e*y6y%uCZJuab@QHLa0)9P9&0&RN>?f#|YE# z Wj)jtG3hO(0*-XN8fhRg@(MD#Q>5{&% z zBM}TP#ckgDuG`zQND90tlexc7z=tBQujT1Q?@gQizrVYayuV&&S>4`dgrtBufR`2> z2A-cu6qf6s9}eRUM dktE|h0XwZZ59aHr0n$$u)=jl@4B&S&Tdrv}u0UoH@^JM?quj;LKbbBzr z2-B$87RG05z&t?L4K{s_?Gso$Pt*e`ordUC`rkQNoA(L|JzQxu#Pr5DCdp|cU@1`w>4);8W`MgnX{^Z#4kVVWc2Zs(=_$YhO z=~O-*(dETa_bL*$y0Hq&qenY)9roiRYoc>?@H<{i*`~#!4*l7I)0!Abb>)G XnwoT=ZalCYzeG(DK# z#q}|K<}hgI984*XXZKcbEXen&vbCNL5mAiR9&4Q^8Nt{f{h1?DhaMeiR(xhq_C=e> zKnhR*jJDDxZNj0&y#RqU38vQ&r0!j8_tzliGCnQtb8}YoM-`x%oSx>$UzP e2YLM89RdKdRBJ 52dHe^Kh|atzqSF YYS>GZZGzpIoUVaUA(oA z*a^wIC&5~}{g64>lUl6*i(No9yc}-S@(6nV{CS>K*kGP6H$EA!&96UUwf-uZ!ms3U zemAoj)VEqqZTGsJA?BDCYd)rbj*CmJc-7Z<-SG7VGv3h3UwgU7hpWa6u})4_$B(vA zg)*8I`>+r0Rcb~}E{ggV0D+nioU&kE=eon!X@2p0s^l3hc1m=1HqDAYU*yEE ?>+)GQ31(bL+l`MzS+fWk~;N@!PihkYuj!$<*?lXWU`4 zFYa&bs_Gkz0?n?jYVA&QAJvioW<^FmasT7T@@|ns!w6l;|GE-G^`t$uOiMtVg2?sY zxL!nnR-1s`pqDWmF7E)i2;3pxwF7eA&2+f&?|1ehIviI*b&(BbIW0bsV1p(DeWrC2 z;_o3-t8+#1?;0E=%Yty}Il$}dq5q1{cE* s_eDq zOJUXj&RyC$>F*gmHR}~2QTvA|Q3(@!$QVuOQd27T$-)nYf3yNIta?8%EodKQ8L2IY zd }=5m#bUBONZ0MgAQZ=BE|YILil ~gH xer9;m@Z_^6D6@Sw(Z&3CK{ST3$=(h )q}*Uj}HZFmwoZ_ z@wv?J)rRm**<9@A p)9M-i|(s` zhyw$9CTk|6z}hCjRb{I`*!}GC`D_ Qoceb^K;dD >iwLY4?9VRLcTk z;4eU#FekWi&wO><5EK-2TNE`Dp 5b?LyB<14)a z-EWN%Lq&Ok-P{C3i!m3w)9lf^Rz{4>%q=I0!kM}o7-)Onyc}iVe6i?LnIWl0N==?` z2mS@_y1H{O^}+d?u|9ja?t3#Fp={P~)gm;85k90%$elhPd}50b%L7`|bY3@g$&(S( zi#30AoOj-vn~RyQ$0t^XgmgRB>%ZcUiZJtjria|g(=knP_*KAP**=bo-2uG)_t#;6 zY|B8({qm3geg%G1AxxTg#hCzo#HgtRFbekAO3R0Nnrvg~4t`fdr-3`ra~Sxc?bGV& zs^RL*4&Ifb+cN;xx{#i(#Y!azM(_0b9;LBlYL@AJ-|{$Fs^9yrm{GrQM|ggcE&GUA z*%P=ucC%f8im3Qdea4T_%*?ElvH9l?-jKha-@Uplo$iltwCF` 43N zYqI=9H}x3`23$qJUg H%&e*@RU xt zeDu$AHza1;2gk-LkxQH&0sX8E#qOWyfWZMvqY2Iz2QrDCA}o2wsL!VsbJhzy8_4 ^eRche7Hx$3Ch@akxVQ4^Ji{dhtR! zo{9im^Eo=2T^c(}(B{f>kOp8`3Hh@4!>LzPi!~iC&dyxrFGjun{QPX9ruxXJM7>Wf zcwEqeEi3elmk~a=y)0;aSrI^BBKqx|cJmz){J;s{HMf%m#znEaLJizec9CQOO-jrZ z FDppX!iM63j&dYvfc4fw=s9%oT{FqOZy8AjA+c!>c3`Sc&N@T+wV z#=F8MQUFl~Bdt8G?(ZrD1h}TQb`979uAk%kJ(-bI%Uu1VD`ZDSbuw)oi(G9JfX)3Q z5x892m!kJ8x9Dc) DD@rI~e zvCG5wd%Eo#t6xFSysjOBUk-MxBrpI=rtgK-DrAQ`>h(fi-Qw{VFArM`4daS(00N=g zQ2uN6hTNl=ighI=FC^5|l7eSQ2-JP$wj@s|mSlylLCv2#Z3Q_1lrNVFB t2UB}g z>Tr}eQ>Cx-x+VD*x{Q$&t@|^poE^e|ySI`T4%8#FQ4YgNnUN+o8+E=uUZv76pUKu? zb)?YfBT(TqkAM3&tg`aRxAxd Y33;KI HWVscGu5pfJYqYO2fhkzX3C*0=E^KWoc;{i(T z`#FaKohaej2U&y058Vs3ze{|Ipv7YH9KfTS9W*bs=7E1LyUdq!9YfIcO9FdtToIsH z&^MAT7ImlXY;SMx#)( %aq+s; fj6I{gn>!Sn?i$WFp?*n}q%X;aAcLf2j!x33;u@1@n&-hP_NJO6o>ePOq-Ew!%+d zfUiBcVpr&X;dT0W6iE)}_V6yO)9n4`OFlfiVi^@>jR>rE8j6PQ+S|{{&>Ms>51($1 z-*m{&Ofx0FLECG}fh0@8c7||##PI3^M_2L%U1``*3&B0Z-zFN~rM+>kOWEUYb@QNN z@)W+J0hAp4ImvXoLMU3_`KC-C;ad5&MR14*zyPtF^$>CQy@S4b^-6zaI}HL~v*w*H zHhy@=dE}G~P%`pwi856L<~Ca08Ff(!9Q$8XL2~5$H42uS^GD2e+Q(c!^DWM-@9hmu zl3sWEktQZ4Haq)EDM}+;h_m|T>FYuYX(#(kmG_7Iy}DT3iMdXauoY@Szg&1Z#wHU* zaANNmPn(O=D>T{U4Nm!P?(UvVc%Qv^nP`1;d9vPjV#miWVIRZ%F6KQ;2Tun1xCF7; z;R_<7F70V#X-K|Cp-M?nQISopehm5Bjwb{%#~$ BAI$*xOG*|4U!U%RU? zBnfP_bS##8w6m{nM<^-3XCpJ*e0WQJIY(LiA@TnVO3V5O$O#5iR zcSd_OZoS1b)Db7MBZ{&773Dv9C;ulQpzYS_CN@3KX>D&N=?dKa#Jm>3cJZ(VeyTHI z?ZId$y}J{_@@DxE%M zu)1DK_(pvP0GfaV|7z1mc^DM{Um}W(TH3wt4z6SXX>7GS6#(iG{U<%eq=O!d#DzpD z)q(ybifF};SK04o^D0lfy!pe!C@`{~$kzu7@EagSq(Cn7Hhx^AFgB9=eRz~ffF9H0 z;v(;Z2&fLw|3~KJq;#!xR5kisBx2$%vt920=4`(^WG3RGsTnhSyx);3_aI=`aZr6R zA{A!1;e9e;c-=gdTABQ+HaGXKH%>e@vBMVf2?ZTq)ZE;hOC*VqFow2zv5vRh^{Fm# zz53hk X=)1eFXy@O-Ux_A71Wor%q!xhh^B(eHBkgaG=wbNTUF^vhP4VMl;gPjBxB7Q1f` z9(H!hDN^=_Vt^Vi3)v!$=y-;c^>?p`jsb69E2dgzXh(|BM<*pN*oIjfw>FLq0Re zOBK@ s+YpiEd?|h`rM@OV4-Tgh3DrBP|9r& znd6bqKjnHVuK!G#rA24sXY*dsYIiX? o#9}kn7)q!1aZnF{K5+M$#MfWn?p9vp*Mv zJr7xZF7HEE0u>#0wVE8e!@1%&f2X4zlUg5;aj>hPV)y}(Mn6Eq^ei@M$gH$?%ScGP zAf)n73B9!ymj8IuGW?B~d0>~F{kw`03;JHmQ9CX7gW?zJx6fff$TPgT+AZk3uj@7c z5k$p+O*)z!lP&w1)x`KSkkn!E>zmnLj%M)_HQQjPb^gNks`}}-MQVo)90MuJ^?4wr z=cSlmnb&HVX7s_d&ceXYG5UXbKi*$%;h1Dbav=Ff zj&)D4oLr~5?U>i&_u2jhAdR5lZi&w}1=0W{1c<;7R+=x;p*S&p?*$dcW=PN0qB(ji zi~{pfq!1DwMTSi!wNPqivB!jr_8;2P#$EXlIDI85* 7BV(0UxJ>_xy!ufFG!R>n%T^) 1U8HUxDEvK&DNZ!4xx^bi8Vg%R&b3N;$ zE>Tje-`yQuOsuV4tGJyv0TKz+q2YS_KuGG=-;q7N z!!ZUQ(Wsx!Igby%{nlvG;a?KX)!`8L)x8A?j9Ppeyo5tK10!}F&e5b+GdlCm`DXY0 zR!~+>8ewJIjO6}&oh%;oH6dYy#g}sTy@u)xQEXEn!=VeM$2D7dbzF$rz`YIl@eAZW~Z_h)ZD_wCG8wPaiZ34#(rM!{oM zmP50$V_E)oxlu3ub=u&WYO%bo3Km@p-KByCwu%pr(!?F1U2J24w?AB+jpV&H`-iZ- z90;GSdJ~T<&JjLKPfASOs148f98$H}+vx!sSp=2znGHpS6?vT`S~u)lpsDJZHl%Dt zS$+)n*9Jd{ovH`4hj#r7WA$2Iu;AihW2gU1?Gr6d(YpN3a%?e?5h_dD;Sk1srOgz3 zLsrN!hh@RRHplVGbI}|O7W|DAgtO|o0TECJBn!w$;FW$J8&bf0Om{#j+(_SWfTT^` zHyc>OWTET>(9!3Bp1mJOKEw%7sUv}oh=j?|0L&5T$C{Cp5Wafhq~37mJRtd%_yE!- z3~_q 3q=VJOR}{)G4D{JN!^aGOW(mHJ83$%0R=#_okM z49E*$3x%eN^!?f^Z|d6AUJenJ$qp2tVuwL)+6CH-14k$BHA}nyN3K9@Y727wnf;fA zY13+iPk30^0|1&JnGSeSfXjGO+yEF5NkTX{I9O0~>MK-AS$UWcP*?vjkBp99pS5a% z3KNi#eX~&90<@V(1=6`{tya3Y^|h`w+MPTq7Trp3kowKsgpK0Onka%{sM{Al>+$}Q znp{XOc#e*aq# f1Z5fAdX5y@(fLux@vgvrTK8T$Xnu}ODcVG@+%%!srx&4* zu7wjs$%o G zMxN&2%1VcD2|1F`TGRPQhUl`=n-rhe8PW1pRq0n9pGq)(oc%}p9lFb)?_V%(1p<7; ztP70nmKMZ>FFi7Xc5l~KUogRHMATz{4$w2 `~Se4ubDy?sZcwm;1q_~Z=8Q`GTfFJzI^$|E@X@|XXAh W`UHDmjWFcQqPmiA@cGmV^r5%A!g=$FgFkO;YRr4~XOe`bV`1si$IkqaQ z!%zUnFDnIH8dE!;0A ;dr9%kZ1=}}t1JA+J)pgHjwF^D7 zE~8^m8!LG6hZhkWzpaS6jmOjDgYa~zj)`hmt|T8ityY;;r}=ac^m9mv^a4PZGwV+B z71 gxB@e(QI}TP?BcR4hVxJPqQV_-IYq*duiX?K?tku=f-G!Jzu(9?a!F>hrS2_Fi6I zU-*op2SM1|^L4iP?3zW0FIdIok=hIa7IMF ($_-;F}jv#AdE_7 4Z(qp2^4fDJ3u &QVb`KC;YQ9?0x(j(U9kX)$2hX@FLQc$R`|P4&C0uYY_Ff7 z%GnB S$PKn-8N5$^9#3f#!5k%Gs+nBC z4+LcY`(1!n)hBGk&*n<7aB&~{j8Bn*VaT68eS#@A&aL^F6vWmapGPz$zY2?pc>hzh zUjul^wv*;yy@yH){u3m^XVbI44U7Tw!oe9ge>x7gg8tdo4Qt^G273Cg1ZmpTFt+&J z1)bX4@Z56aTopIB%|RGxxqcnQHqINRlSj1?lIVoXgQ-K<{nxZaIZ3gRpFTnYuO(na zuSg-onA>j6sYeD#Xdt^3`wd7%aa-Hkj50Da#S65k^~x;f{8A>A>-5_I_*S~ApXnHU zJVcw9m$&>UGW)zL*X&G|sDcK_$oRWnfrB~Ys#USQy?t2=XajT1Tq(6GdNo%+ghxbV z%W)#}ma}@6@Y1L)?a0%xQ}AbhA6vJ+bJR>dZgj-dj_o7!5=Ik0m>NKMv)iXjzg@@Z zj^-IIZXD1QqDsiW{8U+4N&1{9nizk-k(~bs?!(Im0No)w!W%?r?6a?XngoCLdiJGq z+qKJCi#0{NX7h(+p+#rkZ_B_MbpT4hZ==Xw|L@jVc3_OQIGve|rB&cS?W2gedZ=(2 z=D#*npJQP`#r>`knYqw*ySZTo;XrlxJ=|q;FrAuam9A<{Cxmp%{gxsV0^cPgCvPTh zvZlDczD`zWgVBt$6`qEV2(XO64{D0a9RH;V-KdzFn(~!v4{4LGY;Bs=HY+rO5?+^c zUluXyib~eSpB(Ad7SVS|r_5k& ~n>lPHXdKdF2A2{gWD=$1s_+bTGCU|*! z3pF)0wJFk14fX7rdl`>>2q?-?$jq_95_c=dj-0XC$kB3#!rX|2?LUEMAVV2IrFNw*rHJZMUzas5FTw#HgSp2U-&OM&VzK`SG z^@wsvW#mk9+(uSTVLF)Pc$1Jh0C?-uRr-rB;ax82q#zt~WNNi*dk#2{a50f00 zxtTHZ{M^qU&tK2$*}vERx~}bdeZTMD=kq3 FygL{x>8d s0MfL=0Xr9bk^%-FPE*x+YN~Qwy!Ztv)R7v z+b&f2LqQZqR|I=UHe%MWmpmyrwc67(tD+zxJFNQVN?BYdWv_F2COlVb3_GW^LX*yq z!{c+`lKZdo`+!sC^*=GwZ_KT%M70_R?e+Cb99cwbkEl;>MwltG`K3#l=N;dN8`R~G zzO&5g#=p4|NUYv7h`6R$?mmjfF`5i *{iSdc9`Kg-rL~_NJV 5yk%X4AbX((HL)0|w-1*m5^2cXrI$owR zxT*Wx)M@qIv>4ccO&wX2EhZ4qy%!5<98&H=NosrD6A%hI&IdiSnRo1zpFq<0yVuDm zpW@)Z79jy$l6 fkdRK`ZGz2Uss6N@`ySsGVkKSIQ!@oYVA~ Pe^G>oI`>l%zs`;oTNdJrc6Yr~%dw)knZc zKo6Yj_8BB=7hQVFVBHbFrRlvK4Q`t{y~6=kXT=%b4GL0o4fVS#4=d5|z+UntQNbC@ z4;l(?NKwno&h*UQdgl6(6sd;nb>p^^@xohXx<(ZxO wG0=~K& zX}WO2LXe;n`s0f`SP2zEU)g)q)JAjm)-eIL>tJ5y3(nr)ZE0PK)HPE4DOBGN^OIp) zHY_(+rAzbSJq70y J}N7OmO8;J9x7 zJ^y4~8sNSoF}%9??vQt-m)o3{4KY)Ha3U--xd$v4)UQ1|nc$f|6<=ciy7fozh0 +RMcIPVnw+!#T++Z27^#=XkBn3u#;po=%Sqf zruck!^=a|dp;)+vI5b{b`0I;vm+O3-@NsMFOSu7C{CqXfz`GryXCFKW;+;}bD_7?o zrQBWtPf6MUmd7=yW5x?ZKOYQI?8)ePPI~F&j *js zhm}OTibILf9E !6fv*W>R9lfls01wJyFB_sYX8^Z{mvWhLwu`^fCT1aNY zMBR0owr%^~_FLJ&@dZT#xS5aGV<2!TA$)Au0RO>um*;8Xbg#gNJ3I^`j8pz6R43 z68y>Kd?i5IJ~fN)!Aqd`3*oQa{N*T_>wS18Kqd%6p|%GfLkEE->@&?$b&wNHFDf`3 zO&Z5-)rH%oXls9s?htsVKSc0${@bA2PYfDH@^0MUIF?+F^d3p79QYeNIT)Pnf6kY! zS;m?e_p_TdG6-X|9_7SNApZsRzykM5-=+Zwh2jc~?>q@NW^|$9P&KqRvvJGiebZ#` zYZTt^b9}S5Xv_{RwB91a#bK2}(l&I@I2r^zI$~wo-o(Uv_xi);hgMVGGQYpY;$h8e zGdZ{uq~;jj5PaWiS8h{|UmQ8NbD3yB{=LeXf}#bhpp9jY&fFMMgktCd??iVt1M~H7 z{VWY p3n|`o!T%~HCFO;UtUTxYq7*~fDAbu! CAZ#d_<}UEL!mA=nR~31WU2p^RXK z=gfvL4f_UgBo7E0rmf4$XBkA^3?bg97C+(_S-e!e|2J59G^EVd +Q||~e0KZ `hi7AaXY+HUoW~)wnv9^Api;5=zQr8Mi)wUd+q9kDbm;^zW_`5|X-@`BRs-JB zW5R^ Y5DHSr>9L@$l$#xv-+cbgj}Dxa?pQtx#L!kQ=qP8dElND z6KP4!ACQ56nPSIW$Bb@zg+rbL?Wo2>45u!!a_4(m-JW&51po?;d5^NkMBMo z)tE#SBARH(?hKM83$`oy2VJ?z=NlM1$*~6Bmz1zCIZ$J?!XoQeV&>t3Tq>sI-aVCh z+_?U$K=v}JN)huQpl?Qbs9G9MX`7@umY8eLS7--e$pVsd_Qui2pumuIVlGt@E+zLw z%b_&w?VCsw@#nktAVBX;uT2P6VU_?1Ebt&$6d-UdmxTs9H0(=C#ZCs7j(oJt(zG0q zJ&Qe}!Q4CX@w6bM(AMl+aHB}-4rTUJQ42;nb!WwZY&c5xJoP*QcHW5H(SK0mGVz0_ z`?Gqku!vVRssrm*TT!?uGkAZNgO+UeZ4PVP&{tI4n$cNt5Ee(cS3$ddMIpBw8T|Z% z*qJB(&C=7hMt#x}5=s}%uu_%;3-|s52K0>+^&N6@%07*(4?3wBU~1u`D-|2r>724z zYSPl(K6N9xq1NPsj%seFlsJJtm-V}|46L8nvH}jd;pyMXB94cJ3g8Y ?Mxbv^O*9*a_NmnuMr)1bhTKLmz+g&- zMV?6W&kEbCP}}?#$m{^?`$xv{-;woy%(4^DKQ=rZGPT`tOnGc(cF(9Xq8-RB{@-Wt a%ntvWhC?jmZ117n?_NULm{y#>cK_ckWFTn( literal 0 HcmV?d00001 diff --git a/test-references/samples/tests/spec2/foreign/mermaid-c4-component.png b/test-references/samples/tests/spec2/foreign/mermaid-c4-component.png new file mode 100644 index 0000000000000000000000000000000000000000..c496c1d0254d8f720d2ba45b8d9e16da2cb90f20 GIT binary patch literal 102422 zcmeFYXHXOG|1KQAc2ux}bQPtDfKsKaNN)lH(v{u %Piozr4~@zrw`91ONc8 zXllGP1OQI|1_1sUy>O1va++=)$N0Hpr(viI00i;_0RMgh01g>V|1u8pdkg>&-U0w} zX#fD*`>bXI1;&muPS16p0|3=A!8C(J#`Y;6L-iK`_%PQxW8<8yw)#uJ$=}bnw&K6L zFTU3>^8o;uyZ(MpB?~iiGEN83eEIzKhq;aH^I5N_W=}@k5szASMKufz;`#mK`De7F zs=K 5UJum~hpLiAkIG>WI5)nfjFB;&pYVoHdfuZP1 z3#z4?9=YmW=eY_-+m3+31fs={IQ=um!o5e?E;p9zTkBAb0=R#h8j`3dxBeyU5}O)m zQ5JPgp|fTU!Yk?gs)4eJQI`SEy{<)V&rnWAb5>a>IyQBc5mU*gpv4Tn&8*DL=8;b{ zJ%z2Vd1h`og}3McThoaTW2$TqoE#k&?9fMFRws=8E1`Awp_Mw!+>hTrTi;$C;H3B+ zu&|4-?4-2c4{DF@Xd~C5$n^>eI3>*Nu~~|kzzmKJLuLPhXW><9RmTr!?_oBuB|!rl zt@5F*&?-}eH3Dwk)?D)dA9MRjeqypV;c$;w9^yvFjz8% dpXDrQCU0n%u$8Y|$!XxcgC+%%4iEikFuHN0P#zAs2GlMb|F&`w3&XHZ& zdv?|`JyYhSJm+U+pD(CgAHWyHDrLOoJ!|3_i$EZhWd?EFx64btph{M+UnjK-?|G=N zV*Y9Oz@#n_RG 5wlq Bv?HNe@QQ{ly!0yEVncImMc8rWYX`nu~&W3^r#2`!W(S{55~QbcbXrg+wa zQ)j(S>d4}-<{3w%HK{K-IXQc%_b`In6xai*qgmSK3e1tk-%385!y$d#aqs2VMksVt zO8ZFwZL`6ttEdS @HPC^ZG%N*N32yg5pP(9R4%)!24wzsJsT$WX zvlW5CQ#X7 +PUy_uL%6_M(7hdfRvD=pU)G{-1zm$UQwh zJ*C-kBO_zuJ$=PUtA Y%$F)gT`j_rh4ybIV;ZNVk` zqY&rxLbc>Qd@arOkjs$VloV-`pZKjF-dr;yqaD3mC2&kiwTH`xe!`fQ|1o0o{nU`m zCWp^P78C=D);Q^p$$f`czFk-wNk2BGwPgd9>wE?_ed0FJwQHqOA_zU}s<+S0w6kse zk1HvA@5`4}VEVb%Y;}3LZxn;j?I*c8=omA2pvwqlYJca}-75E4acodDuwjP0vzhLZ z3U=@DtlkMUYtL~yDBB*_IIvx Nin7#Ocbj;llxUo+`Vp%Qe*1 z?II{aBi|GuLe6L-cMF#uI#wx}1vFa=Lbl3HZtr+%HGmy0S`@|j_?Fc_hCT |sd2s7aQ+jWP2YW_Yq$HhbgU_aFb_A9o=s&jDWsodiYj|Q+n-|xp^Cq9%? zgF&(L#U?YJY_rn6Nz{V#EIbN>@EvuDJHyhUE0<|G_G*3W;^7-hF)8t&uq_7_CuTpSoB`uGr@xX8mb_w#ato5+yqZ2emLDe>{Be&Nk5zFXd0w<9G& ze1~2)C-cx0c4zEjfouz&3#|ce|8%bNv`j |F>g z(Rdk?U2FO1#q#{Gd3%ZB69*K1lC;x~C9gFSk@a=Zkzv{H_FTbGOiW8(zikEAsgI{- zKVzwWG&-3=!#I9ga8}Fv(NLUeAP?#Kd<|&tJGW;)4|{X?S`6xeSMY>F-S>bYbb3hg z7d5htX L1G)fuMtvNL{W%t|U6yWjbDZpEq$KB1nQH8@>G;eS3n Ckj9I&rM|XLAs^36aX7tvRAndiFjd)Yx?-w>!~#U2V%S|4{g{UK`>X9@>u~%t zREv!rdyKL`qh4D03weJ0jU0y$nbJV(OYNR)BzLups4-=XRBY|Y#-01klTjY@${^7z z%vQ?K<0FwnThtXPKFWiEf=e4Ck`nK|Lx?orS;)`{Gk%pd(<`C6VAsWdu3N3s;kV>k z*w*vlh0R~H!H^;ttY2{0WeudOf4lG~v3k>%?^`pz=3ADfE#x6f$WF{eKniTYp#ox< zUF~)>cDYV?V~4#3eT72^iHFQ?t1)L +JN{2tD`P8L^a2Gg72uszt(|9Bb3<828*z+VdsM;9;tcoW> zfe?A>3suOORSp Ls~Vi&NyGKa8_^k*x2P-G z@*vW7_R5Y_N-D=56nA_S!lkvfsY4S1W0$FC(QYk?OY%PmJA?aWc4`#*G>@l=ui913 z8VL?!6?aP)2`Aqh@iWlDWjN32Ea3aI^MHS`-)|C&b^4B>r_VDFUc5a15mq4_EO+v| zAa M!6b%xbkZ z^kqLW4ZbzK5G11=dyk1{+AD=E);!(qwM^De12;7n56iZR-#f|v^QN2Z9=POxs%Qst zZumAX6poOWb!*_!P^vjZu AV%(?^8P`9{PCEq&zk$(nBQj8%Dmisj>_1DuRL#d z{?1f6?`OPHC}CUj;a50e%ckd`Fn;7|`Qy%tii+jdB5Z?abG@!A`)-X> Hnq_~8`^xF nws$48|(I0oxTUARgCUun{ z41GhuuE%=_^SGCa5tlL7Qf#1KI8{w9G_pRmw54Vj|Jh$!S}G0+4lv}ynK+r2MO7-b z+u ghe(Ssg0_7k>9 tHw`j z(aKjr?Jt%(-*0n1+WdOc;7wp!gp=8 qr z2!;2=%Qh@4E5wR_EOt!BLT5ph!duT?WKYZ=$%pvQwG|ewoC-AftCRjU`7E@<3uT&6 zcqtq#Z2m0LRhCr@2we3^QtLBTLk?+L_O;0lerWARit!d6+;tkmFH^5@O1p<_qB7_H z0RVzRZ`J?+zrMZOD;DVpykf4R5^61ETrh>e3Jji&pbz(rIlmU}LC;cY{;aG#x2rO~ z#wBNF(ndSd*gLe2zr^1)=kk;=X2_}kUjDlW{(sg36ya+%-}b~QDKgE|4)zL*2}Ut| zGJsza&m{?#DxE>4dk#*zhkd2xN|$042q$avH=@ {*EpGRfSBckOieE7o{SBZI2<(4A9IGXlcWY+ia zJ435#uxff}!knSrhFt?0AsaVQ(OjcHu}||dPuh$!UyC)!VVrcWCX-F3g3_leff)mJ zZbdUqZJ1&jIl)Hm_^9KosFW-vWl=i@NcJ8#6TSp6XRF}4^gfP#P5h_6)LF;={K{k6 zZ0I(2Fjfo8qDLl#Q~JGDr}p4w$d1+Y>qZ9HU-=Y$rnn@w&D0k=om<$}kfhY~C60Up z#P`-e3#`;XQ}lUQjX7FLU`m(vww!a44+GKm?oQqlof=MDgr?Bj-HqxqTgv9GWNH$H zYl9S?`Xticf*+hc1NiqH3I4P_w2uRCZCy1*A4$hr#U4q@%-T<@nC?k^S(%58o1+z# zv8sbH$8W8Ql#BCW3l14ia#FHZv<9!D_Of_LpW*57#{30)L!IoQ)KfTAbgGN6v}sU8 zP29(v)btHxM#Y?^HE~!T_FYl2p;!J4slB2h({+2}3n)^@ddlb-;QjY^XSjdec@cha zR)uN4iyDcYTjD^R88SCnb3{C%^3CC(?qNaR{_z9Sp)}JQ=>0LWXn+eTXPwiso*i#! z>zMZBWMyM$;pxfxPC2JK8^><0kTxp2bvT{0tj3#zH(@mnawuyPQoS^7(n#bnU*iD> z)ygA5G4jnpDM9;{FVOYC4BA|2wjdV(@E)BzJzFmkdU!4IR;RAXWpT5u&wWhMSqQOG zKQ=5iFI7H4#Ye~g3Mm~J?w3s?a&lTVo9&6uJ;=1L81On;Ab3Nq*m2&5Vv?c9t7p4O ze?-$EUBUEej#N9^>a%vAemUyE7q>Q@qwR~_*q$(BkL@3oq@B*Wro_YRJS>3QzX4UL z0Uisipl)1B^CO8mF`k75tL;=4x<*$+=)tnp;2mYSevB}}<-Gs}xE$>U%p7o~YlO7B z-K2jOHG?<9JF>^c^xjqTqSME6GkN6o9$DM0AMX;*c{b`>SuWuL% ZW?C(No48*?x?0Ady^%*ruM9mQ}|)C;O$zq `dp5C0J!Ldkz&X zQ!z1k8{ONqGIS($3l5@1sm&I|dxfba=4!i0VZuD8wl@93 z0V}P&H;S5@i|(wPGu&J)i1L-q5^I5$2K7Y+0{)!_-0(Di5)su*m?@l$lIXoSbL-*I z_ng|Y`Ph6@v>M&{hlFDz$Te||Z8QLzl&lAvah6=1V$q&o+m@q_!CZNljwwA3aGT=G zh*6E_WtAYvitWLgtFk$~5~c*(ZEb*!a|da}@TSkWLY1Y8dy~Fhr~XVZ 9JcNKHP(IYC~p%{de|vdFv+h^U%Yi*J=H1UIL?^A<-rK;4cHF6}hz zk5btdgeg!eIcYt5ugM>*OEq+ES+NCzClx(=T$8M0T>c%oJ~l^SOVy_lF)J^LpJaan z&I|eNjq&54d*c~DQMn&LJN`W*7RC!Jp6vVbOWg-8{!j*%XZKyyO+1`NrOF&vR#88! z{Gs2^NwZo}hHmdZJURFvQNt{I7EsCkV*dXDhu@0jnRaCb>3rl2dYJ>oMzX>WR?jNZ zwboktQ}urTg3A^;l;`kH@L{6m^DA+6wwvuQBDa3?1Z`XUR30AJ?gZ|W1G|T0)ch6- zB-fK=PpD1SkSBKl0B6Nr*Hn^2_!>0gH}~3{%tl;Rc1}>|Cy(R3Z(n|6@d y_BiZpjVbrTs6wMVCQz7YOBJxM;y zR|rgPVa=QP@!YuH0Cf+s5W%p5D 4@+E(`n zeE+qITj(1H@9mPIiJz@&rAyS2nRV~oA}4mR)mHQ+pOInVuWbQm{_2chzgB;Hm_dwZ z$!XW~Z%rB{+(XKqc$l_vz&bWY$x)k2jtD`}vhH&;JEorq8*8Ge66$b8kMv2!XYfsQ zv$%w$O&ZSkopdxaF}s@E+ejx*2t?JfA)DqzJCzEFD1QhJqcsbua9G8CRD!&<0JXDE z1^UflU>C45;81PtFO8ltq@`$kA!RAQE2MT)nSIk)%OF<)<$LtCaYJe qg#VcP8c|DXm|X;_ji1&>|K7$^n5z^4M+7;fScDJM@%cFN#i}l8|TM z$f2^6M~ze8ZuvIB*gKUAv!MQXa#9sr;K|nP5~=;jstJ;$$|u^h+q+$Uv>@fzW@mPX z!Ab_q6a6Cm`gUtn$%4wW_MK( D!TT=tRYEOr$_@rbooyhRFG_J2r%Uop 1&(S*jE9kg84Pof0HTLt=vg*u(VwQezKFzc=E-eYj!J z&McPh*6$G*m<)v;$oAZH2SMA`bkMxcKg*&Vsw=Ach3|^1-O^K 6`2uGHOm5qNgrr$24$ikHS) zg9E1RI|(9Eq@Wa@K99C$U9vNDd_^;_FNQaYsP*n2z&W|^#TTQmThd0=Jv!#JK%M&@ zN}mw2yCmZ B;6Re^2y_yC^ zi)vrg`uY+n0V|pptQ7Zkn2D9Ei2mmsN4x=7dp}H{Hq)dPNg-l?Z_#eVcVKZhD>NN{ zxqW(3uwZ?Sn6R$iCACDJ$j#YM-wabqy&v_BYcczVAE}9o+&A5sap1h-#eT$sX-{SA z%D=JO${^gH@zwIn1%{v(I7^TgN}7b?KUs2;?)#N;!&Gl-eVWSh)uL8)``MTgLQKdn z!he2Cj?Y^sa%b?H(oRV*RKKtOYG2uePWaSZ^ay(rSxc8W=Bv*OXkBT4@m3Kv(ke5` z9(`AU^-c2!aB?b|sld~T7RL#wQoh^8{g!3y_cmh&JXTy5zbrLgd6oF`W*|2Q!ZzSt zJ(NuJ0()aKmdvRuSumfTayQPSY7S!-70N?bWNt&{K`@gS%NUnG`z|Q0TC{ul3-R1O z-E)pQ5KI1*oY)8R?ft-<9K$wPWxU@Y7~7)m>fMz+FNOvRA$Ix`$0r_$RrZDW0&5dE zulN_~$DCPJfeXnm?qzB>l*Fo8Rjz7Vn|K$zKo{H@61yYd)H&F=8}W`BuVLRp)L8G= z(%)W>Miu{{5=F*ZiL8LPCk0AJkv;VwD_xHxyPs+@b!cQ5R_h^=g9h2dYF}JXHMd1 QQ`nsUEPOpD!3CPek;n&>FydH!BdK>> ze`UN#zfVzj_Mg8#;C|Bk#W;VZLW{fJ;+7{n!)vVBsTtR|-hsun90mz;ENTDT$p7=5 zZOzk*?TQ<|8DHFTv|&%(m={_2y})iRsmq7W;8j}tqhMri`&IQR(;Wv@EzL?7ZvEDl z**40%FD*;^Z$32txN_^^?eM#
hsy3vDOo~=o+FcspV!WM(p>x`VXm| zS9ym@gE-O&O^j>lihZ>Eh=tW6o}K?*K~VpB3%WCEZCjYv Uvtc z@_*L?M8J!TNm30~>z4x@#!NtCqyD6Yfx~^lk5VSA9LZzBDgeOK$AU|xqldsSnA=N* zg=bJ(|M-@}!WcNB@0_YX-EIx3WED9`CoQQ2OHM75SvUV2noI6(FS}w{dO&;Pn%5lA zT_W~npT*emxWE-V&wsU<=?9VEBaVmpV2`gYJu7N#+PIdK_VKr42GKuoelDKqPJ42u zwzj1ox1Kd%270x2;;XFvq;U^_kz>|#y*iJZ9+hD@6AbLJzsOhqP9LCGWe^k?CJZkD z3Co}xRf!K< mE;H4wmhW5f~@WN%UAsHyhA&kb5ITj7|({1$?gGn*2 z %W*R2faw zT5f83o|2ncDdx2ak^4gVhGjM)IC&BN>ZKLcYM?+F)!v~Tt7claAGcN~bH*V*_z~ir zWMTcpD+|Sd?mE=){v!o9@)Pv&(}b)9wbIUxki&&o9qF=MYt~Qkh(~2x%=RMN{ONfz z*@IFC`KsCu6%p~aVbeXz`#4<>?SM8GF#1p+A<$fVg)WtBJuK*|d(AnaIHSE#P;Boc zag!sV;I2218zE_>bhORav(J+K#KHIqgeeJL9;W`l=GJutE;qQLcifb8ELA=_#V7vj z4xhONeQDbT3eL=O&Su1QRS~_*N{VUn-1qJ(yDTDa%`T(dlHcT=owfg<{cb&p_0lDq zci~47j<2NszaiUdZF|alhOLYjHX!Uj=3YJpS?ts~a1Cgn2_%j!6Txqn(Pje~sGg<0 zWJsiw-rEW{)xhWyG2wZLUgKH~QFbX;l{(E|m=-2@M)AqRJIC{n=`Z?okZarZGdZh8 zXLU_G&|fRTy)dS%|fGs@Hn0w|CDXQ#9j{ z5b _vwR;d|IYwoU+;^wX%5BJwY%lwE7C!Xn ze}DAexPoo#s~my*7qblRP$znK{8&WXF7x8JZ>quLBg361Mp4PIB;AED>IB0r+3>u{ z4LhrGBYs)_1?7MKAq#s?Y+FkJ3hRlT<~W(lXoJmHlsa$sXI%~J?1|_)4FJ?h?@q_A zjS{CAwGj7P9k2XPbLRheGXG`Mm|q-xett%Uc{6TNZzGe4Qr XbflFK5%oi2jfqNK?bbutTb)`(nUYfmp?RBiRxq-|0tT zQ@YkYtO;2+x4cyck4k)VMdz6SReZPqUY{Cw3Lf`P^nnWEa^%Z `584 zl~?fj)Rd5~mjUO`sg0hZ#C6I!?HdnxLL8Gh=Or+!Fo6S*UopS>JX+nKqPB<`7?`iJ zo+ZUM$h2sOH!y?*W{I_;^1Y1S?=_|QH><~VMpsY&7G0>CrlEowM&36lwDbpU>pzu5 zC%bf0LDDo(e(qo6%IQ_R5X&`XCQF8*hfCVg_KJ!~b*F&y3>M?l#x#CJv%zH6 bkb?^e9R+^a3AM`k-^h z$A-*|7u9x$x5$~`4<>oUN&YD-u(tquV%&x`s&HNr9NGf07oaX=Fv;u`h(i|&!z}16 zlRo2#oVaw_S&3%-$K8bJ2M>-jpaI|l;a)v2whY7l!vsTyjC7|a7MmXI*3|}=x|JHU zFdY7_MJsWz4LvgzedsLQm$DeKlJ;c&r*Yc5<487>mP6-BD~IsIF>I}lbvLwPlQGys>QRuzy#C1gq9fRH z%| z$=y)u87f9L)c52#nPg^eN6I?ZMSE|FgAYxm&ndBFKI z^PzyC@qh0P@5zK3Ykj=!sXG3l-f z DE}d)GSvTE3 zd7@~$F4trOXJ1|?)m*ENKk|$sY#=0@9GXtRTj39Lt-%P-_tE&i=XZKOqjH6uIJO!O zS7Jo5<9SCDPdK&R+6-ajeswHb{ ;{$hVS-o)#!z{!{YbEoAPi1T(i>-#R5&a zIhf9YN3tJpO_|tj>x)Y!MQ1QQSh*ROb!m0REWyQbbb$TN!KTBfA~yzeEr)l0x%Ag> z%atqi)i}6tMd_mdl|hJe`0D;gAXpGf<+WKrPw7X})!H$-Qnp=lWXo#0F{yY2;lE?joy4_8?=fjS32-ga4@HF+ z2^}3z;7tw=ATE8?e`r5y%#}lqBH5-JQ(14yD2*6kYg%`Hbst!8;Nywy;;!9%wM q9TKMF0oURzUc84Gvrq<;U ztQ~OOh!rUHK)7J+4@<6-*Sr*~XNhm|`Sn+m9cB5hx#9WSa?sYCow@VM-Y5v;77S85 zPC5b^PW!*~=gP#+)vL@jtG!P8>GS1Wqdum_`{V=xKMFNkAHGX(Q0v&E0VL`gOr`?@ z?y|xweW5`<1t;*T53+t3`};JhxBOy{7Wf XJzGzD1ZkKN=D?<#jIAjMJGmAE-{(Z8d9@S@MV{Ua$SHeLINg)z_*65A1? z6%@CKqxZq4i8ew?QC3DBH#Kkd=h`L)1(@~m6K!K&gSAqIZLAiVH*ZT2RtHI(!8Weq z`4)l=NDU8%AU^2&PoSQqh!(o;1mPa_J%eHE?_FBST#3u-N)UKycIrQp_|4XvwxT() zrv-8H>{#(**TD-@y;YDC+)j}6!?U(+?DN|c{U=4w&;4e^2A+Rnlpc+Yn6bo81>o2x zy6dG>)r2t~3 RTFVeDnb6(r z7pd+{@$FRiRMN3`cb;yJlilOP%DC?r)z@eSmp2ph3*tIrbvwqT9DWbX-ckRU#ljN& zz@M&q@myfzn+0s@-WMTD*sim$rO(jntKZ}awjk@FRAp+~Kc3&kuy3%pfv;|TVn5zW zSg3YBD{rEe{R5v26(97=O}fL~f0}!u!48IFBTK#t=-s+oe4asxf^Me359YnsT;J)3 z<+ V=B!#-3nD6%yuEI;DwCmk&j z4Vdic_R0W;H|D+aG073#8Fi4l5F57S@^T;MWD*!^#0SU_7EpbDca4dBOs)~9&Lv#; zyox(HJg01)<94o{Ra0A9cPUpw=D+|DpPsV8W-+1h?+^0o;}4`Z5sy&z7VrC?E|m$r zeieR1_>{bWGqYa9pC+`9mjMfio{-lBmGcg_h3Vp>-Mp}hok;jPSt;dMCX^VV@YpU< zNXgG58EY|890w8cD3)})`O@dwp4IyJk-w~% ?d#f| zocZC?9FsMhV4P8QOVpY}tVi;PsM+rDS8wGS x+jF8j+o>u$B z2pXe~W}}FSwcDh70_FnZfZQg?zr4? _GhRQdo;BQQCe#J7y#*LVT3_QG-<2L?{sU3U~xz23HIe#kJU+Iclu(vO!gn* z$dB3_%D}9HX6gEDk{p+N?~}vdQgk{
mhiNQm8` zuE4ymUY*`wUaBiOLfgfOZR1cMEYI_D6ps<6-)2QHpAor7J)WCZwylU~5wR~ecwhNK z8SM3iw-lFY`GIWvPz3ND^75Lk9i-)tQM`$WKhs~hd>=Q;p>Cg>W3z;)aRy3 2r-d2QH#w60_M}uQAy?LF=C>Ex~jpZgERmR+5Ra z-n!5=&|+MOVzU~VvhMLRH;bPp*P!Xg@b*BojQGz!ra3cXf1^~l#Q0Wpj*P6(QaEKU z$dA9`d|6~u(39-kTQQs2wFCGlC4~{cL0#ZjHCW!UF=V3+vo@(-f|$7`WYVLgT!HPF z&dt5Oi&vr4DL3r+0Of_ePU5jX37JGZHECn_K4|z`@Co>H-=$=I?HQ~zR#t2(Tl(9O zN0BjAp7{I7#E8^lkxB#gzX#Tur&bs( Irvp|a&$d;HA;Q>U1qX`|SbNE_St zutv{X6sEf?!+I9t{al~eJeB4r#%!dl){MW(1R3YD`}e{JnlGv&fnM@*6+Ua$Q_0s? zck^H<{(E$JDcPmfjX&5A?N*Bkb{H88vCd#_&wyl9BsgZ9c;1OSa7nZu;T81o^r_SI zXFE>oJp?q6hA{q(YzeyS2iWvMn)b@4UlVi)@EjYFOAj_$s~t~hyXxxN%irXs?jH2X z4pbnKu!xd4mF0qpR=nq#d#iUg6ltnw_{ftw**7-a4+GI)*&x`(Kho(fxCqVaI36&q zOA20C28q2@`|91alziQ2qg(thCc?)vp;_EYxfUg7a%N;e2+r7{v2v?s3|sif!ZTo_ zs-KLge%rnAAI%R|9X%hmwO3RQPMU7KS(H|JFDCcV+zbjS1xh&BlRN5Hnur;VwLuW` zLYno)$TE%e{9|4|GI#z5p-LVoH$76^c*;Z_6fwyCw7{bOJKSvHUB>6AV~tCQYd9N{ zhZSX0^g)f0*$1r?X<9{%w5j#N7%JkNTd^b8i0pcws63eJfW06A>31Vw5!U9*Wv-l* zSFFX23=13R3*V?e^|4pl3_X0Pyl$UR TjZD zTgamPMG?(vI<0gSCbKGiL5BRK5+j9tludboxo)RdH{3A`RhwoQMrr;l%-SqP9V1!? z{FvSH41Y}Sj?mp766WMoL|#9#xxFwfY?ayXYGwAewJ#LBIO-3FD-n2tK((0H=EUTh z>Ii(3Ifgo!b+4hOq**gUqT^F!(&xV}BCkiu+ GvnMf{Pgc#k)+wjHqC!(iNHNU858i&45Z3sVK>`q56p6)Be3mWsDt`7@ zlyW4S!n- 1|6d)$E{^ z$`__COfkbJSyN|)K8n48WGR+>kD8Pe+aP7O=Zy_KTD9o$t8bR*8Q;^26U|-F7<{)w z`syvS7diu3ErwT*kxGNQQ!5EhX|c=akbV(nRtMkv?P6Ao#>M`YPXxVR<7bOz=Ogvs zkUNx<^)V~WY<*wO>7rHLIvNN&c>@u6=++sy+Gw 4Vju@_#b<>qw13nd5_y5$NRK_+;3CqTb%ELoPCQ>)r^X|dq?%|{R^MB;1u7azJ z^w)zK g|rZYxn#ikaB1cJ^p&&~Ri z&UZ95%=F}j>=Mbtlr28Y`0>G7v&K8s3f)quK|A^lCyfzHnW*`-^9Tm!|2%9FaPstU zH+``xwXkgnJe>Wu0kRJ!FpGaPMxV3Du7dXuL`cMX5WOpvl%B}*3um}Zfb=cMR2#{P zHcz8i3%Thxa`$5=#a1maZ^ok@8Q4JM_oT{XB$OWdd75)i_?_IUv*`=1@0M!kDJL7- z
aIrm zrR;6ap<1ivazM2sp=pmEe^jXPv4b8kY@Ge(igs8;UmSY*Fql0>zygZEn?j9oSAk2; zqdp~KDLRvawS?osu ^9LS7ErLv1Ola2cR=-K-2lLuFAduzW zX-?pD_$`WvU92+^c}DyhSY^gW$NYApQ*^&|g4-Y_mCe1r?)3-RqGOGi=%Q(s644C} zwVnc{*9XON#p Yxz)6ypH L
?LBZ{OckV}I!NgdN$5e=T)DD|$eJ9(k9~(fF)Jo|NSfVi_kD4m z`aMebiPgaNivZEtdy1NVrlH)Sf%XSZ#x@nw+#_4lYy%%fX1#O!nzfhbzV6DczvQhz z)H!+L5n|cP=}oF6b7JDAfN;5ZuE!qxI7|PA-1xgBs`q70%HJR>SKt8N4x83XsxXo* z$+}PU-Y_dN(p36w_Tc;!TdS>~{?9yuWA?4%T7PovB|GtF*8&4`4%{9d;asU=?Wpd7 zZ=-z$+exCF{ox;+h8+0h_FGMr`6oRdprsjBms1&&Z&qYP_Z*}I(?6rbeC|$RO9^v| zna#K0i}8AF$h%Xgrk*56_LG~Qfs*Fgo%~w*a~3ZOXIAMH)dsuyvLWokfUoz2Ge*&x z9uU#b%?3HzxnE9no3)e^eeyOGy8H7Y*K@{&CV9f %GXe+x&A{@F#>`DJi9)AwnAUBAke))YUp#URy&>QT ttjvE4)6%BG`% z*B9)h!-hK1x^W%E2&0dm*cFi9EE@<=tGG`ZWMne7um?AC?J|U YLxAOF)A%)M;mL|>t4gmrWw7Cn;#9s!pXIxJ)`iJjLNktM%;*du0oZNdM7H*6? zr`aXN14EMi=tGoD+ErPZ$AVCAM-akYqcril*z^0vT~ ?4sjpX41f8OXG79XDkKzlSD6q zljAQ-t!Cden=)l*yZ&jbq#f+x{87lCv-P{-LDc6RL1BGAmW%bGuzkYu4UvLeiynlV|;nM~mSLk@O~xy|L#|czgr~*wTY6{pg)|eHZU)uUrMRiet`}f7YJ- ztKo5%l?!wp$r($CCrXJ3MdRvgUW1LZU$q%gAbo_eIf8Pfwboe7-%1`(?E@4GIg_ z-hFPFtBc~_J0Tz-e(&^+_L2L6Tsb()%#>55uk3{)4A)S~qO2Fb1&TTRVVUmfl}-74 zc(aecNLljNvihgjxt-1&vIC$9vIf?g`cJ!|FTwOd5<$Cx<_c=ea4_d+Yew0Ie84 z+~nv}HaQ4(`VCHuj}R>J`#zs QeWyv2 zT?O&{>&2RTmtM?E9fFek?(KQGUJB$9nrrTn3{qpqi| j) Z8IEY@2;L>0G9IWxEOK}!`P1Z8m zlXJkety5u5VaWZu>mz~i!}S&&Jz?c!P=vX1*`dJlrdzT90_pI^;IqW6_$_u_XW@sS zK6%*+V~{UY*6sDl>dW{JF%=VVdDJo^Ph2S8gX&Bl?9R6B>A03BsFry`!FHjUDC9WN zDDP3a$Ked!M1Qv>#%NZf*hra=!J_HvK`<2NiTJL{N)=N!CLuoKxY(=ss^0&u1rWca z@_ls%`qO^Y$^ TX z&TjDO2z66)ub{AO*vikl=jYgVNQFHjRVdp#Nm8Z;?k(3zSjzTqUwOH7lY8~!Wr!8Z zbi( KDa=jpPE1wA7@qu18q%fjkm?yLah61`2tb1)V^m&h{KlAeCn*15eE^-~L@0 zqi6Ebrh4Q&kY;-SdisqGbjiqdOrgsFpI<5%aZzn#q>AjR70blYy*j}L%((>}`{#!B z_3ztDn!T6&x(FAf$|^<`qG2yv<4SkKV=n8lS8qAntDXCDnJ|yNpl@OJdij?8MbJeT ztX-qu&FlQztz|~Zr LWQa1Q?o*qyxkWe>FfC%z|?o;F;A~Y$ys}R&4Zg=y kBXY8TTRDT9ZA=HU$?l>Z|DUCdSaQ za}2i@S6yjf!+!E`#QNf*?e+zfGroKt-4jrF!>qljKNeCtUwBi}>D%vg VQy*&d2Kzap*%s~^q<0B z6`F`RAD%`i$huKRb(J7na2lJh22WhDZ&vh~f#IG!P-R*SEXNo|-N1j-`ZxiDs1L&m zLZpS9zEFe_g^hh?-wuV(?tB)lj`vkfE*V})7q9Vfo0215IxqB((0f-U*4tgn|2V-e zTe|>F=P0UIn9r-#HTE1%=pv^`VaKgOqq*9r4%}`p+8_0_LvQZlZ%DfG?BYSLcSLV* zp#$$H)TUx6u}|%6!mO;zG+|&}yujyE0PA=I$^7G3g-uu-pQ2=x_AnI_>#t`CQ1Hj^m47_+{HZPIf7A z+aK$v43DJ5$qw0ck%-)FmCe_D5LYT8b~iKWz3g%ff$?5P!|36^Q_mM3_CE_C-a6TM zO$NL|@lZCm#LdMYWts35fCjGxL>K(pD$zI2Ej`v@w%X%%VWcJ@*M0|La$7SwinF)^ zDb&;F8>LlGN{-7ElSnV8{YKEAA*EuSPWW2~2EC8l64nXYt1nX}tXIqAMC@Mct)@&0 z%knu?lyXf;U%%4XbyzG}axCO3^5ni1^O?REij220v&So&`O*!{o9MOW|AVTxjH;t) z+D0J+NYDg#g1ZHG3GVJ1+}$;3aCdjt;0`;u+s579A^4f(eeQ3q^Al#zbahpAby;6c zFVpCw;+}7Kdy=~?Fy-s~qavQD+z 8_Cvb2V_zX>fAwh%aJS(}vyB)H+00#unU&U;(gCo{lJ}P1F z*iA!7eMieOs>@P){FR~Z5GR57B+pfm*nu}uoobb|M*1Rq+bQNFoiW%#yjXg@4J(au zoSLOIjw6y%@>)Pn=^EEF{B5@h&*n(asjF3hP rd*`a8d zO>4N%x@MVX2OK4((Pul)X7T&t^>TA+60sk$sdP8YS%`ezGcxfDK@st|Zpk8mCYiB` zt2@pr$7S#f&{}4YEN8r0^OvXTa!H`oGWD?fSG;sZycZ7ARS7V)oql2(NtOo=$p)X| zh*3Iwk<$O#%H|&p*byJ8crnvn$jWN#Bx>Kgn<%+h%rc3gu9rfJIiu5tkc<8J^>-9Y zfLtsdx6lJ7zeW2hiE!rf;*zQXX#iRz&<1muSg18|c;@rkn|6wjTHoA~+iLvn3l?ZU zs?{w1>oS|<;$%T2dTI^-N}!&Iws(S<9!!MjDy-A+O;ofsoJlP*djj)*v{E{kgAHd} zNVJ~ p-F{$KheYl(K$zJYTsL2^to1- zQKF(7vH|qq;Yy<1Qi?uweM#-rFx$2UU5#iKYQp6V-?_CvGiGMSA`iWr-b-1AZOdA1 z3WKY@6>G9^qLUK{qGM|BNv1Y`I>|75pJvs0z`nS*7Z e%G<_UU;!RGJ5*`Id= zR8=!!&ZF6`-tTyr-qP+p zBL)e~_>c)tsVPbq%D-*g*!XnX^IVErdT}Q+6?>M+CC $-Jgl6qwXdyDSL6-R>@7bDBge^ zL5!>T!>zwvup>p5sNRi)#0`wSt;!<3FHX|Hje>~^VkC79aabKswebFX1mUVb7Z1UJ z@+QhDP24Vj^u3tE_w3?l2}z4mQ|{Kxh %eTN3xmf$d5ECb++(G>DtLyg}2=c?Md)Qb r2)!?|IR=4l3;8|dUT)ve< zT+UDrZTfgWuw>&D;*t3%iO9w}&(7+GU%z-}X6cWoax)Ku8IGcbb*_!Xu$wk6GQVz# zTBQ(1)ojY>@3Y~y(3l>;nZOR6|4nxS`87*r=9BgG3}u8oQR&r}C >W^{{B^)Hj6Tp3I9<_8atjN-Iqw%!um8xiw}j_QZ^R-plpMko<0I zg;1|`uImV3% mz?gX7zr&L)%2is8wRa(ev8ym2J3+Mq2&6IzYyF|+$YsFDfg1~ zAucYIiX*36yjA~anyQLx1@zGHjCMnzTYn;GpQv0slxiRKI?%C&vPf9VFdI`lF9C1( z9zIQFnIRneY{R;q)*;Gn=yaii(i}fF-lmru)g~b+2QABEF6R<8NhF83fHigHb${29 zL`sp}YwA*{Xhy-Pc dO-+wyTh{jEDN1BY(*p8RTA1p }aA; zo(e&UB<5O8jYZ>``h>g8BH!nR-jt!*2yeZ}7_D6M7XGMYnli|Jd>D?9xWZ7Du=yn? z^e9wRU!`#q2g`!rVx&y$az@3e;?ee2<0zSxS3;H!+bv99;jJ>35nFB3%&~%3^abtX zsg(AZ`oMA8kt@2lg9hWNP GFxA z5 J3#&FxV5+_Li|?N~2` zg?qqPFzU=>xv?U7I#&lvR8dY#-K#uh{CUM7jCuxN)tNY@bLmwl>dG)pmNY%`-ZuO~ z#d~xx(P3=PJm*%?&DBn}n(DNZjC=ghfG@%+o;B#s@J%Iu-2+BPY$m7xlREnQ>2`dk z`qxit>KZ{xn;s_uNr5xSEO{$Lf?%LKycE~?u@tX0bc)ZStFTed@d6cd9x+mMXnz!6 z_==LD9-m+*Qnd0IH_x-MTFEG7&t1yLe7GRb82sMSo6 dq-XKkwJ(+(6qmpsi+l}6V~6Tk^g>2YQr2CXbNR^ajjg_ {)41SB-Cf0CG(NV{b;Ub zSgCY `-+2b~X|6DN9c@P(B&S1=brU>?zSU75#U*auLm(-^`PgFBlD~;G8ii9EI zrFP|%Bpo$Apn?<34NiM1;4D0^4#gfGIl*RmS8ze6qt>rcqRuijBTg% q1rRc+= zCx1&c3c6Teq*WoYC<}+%pC_hMG-~LU`3|%^kr8EE+)6sj8|XP)C~Ib!`B=6KRzI01 zNOX-%f(IibIt@MdA7j18FqL#InL3oDOOI^LRbFBps=q3FpB!O|lwRzY5tucYkFmmc z9HslWQia515oxa!5>YztMi<#oYHPui_rfGzrayZdP88XFox_b(Hm|L8>l4&dS#v YQ2=7CVSzHi9B<>Fxpi9P^eA; *rGIiw0JZn#${^r& lY=;@rPp{1iT2|d2T5DdL^qn9o6V@%d)t#GTm zgegm76_cj|N;9V?_2saWW`O3l!A><;?{j-afs^yHj+JcNnwR4MpC_GVic^g#xocW$ z N#GuNAITP#1H%Qr z*;nVN43%LePHk1|(nZ}v)$Grq4c>Fnas996TKJMyZ(|MSoHGU5gll9YV!{WlN6A2Y z_8EyJ%Wi(j$|I<9dHM@TeDlzOjZ#r~{}6BP&;@*7_F_X>dVL?uEazSF_!45$hcP ztsvtZr;ry!q>@c`{aq=g?zuPih;UXG86M%r*#4#daToQe@iMsl5xRkS2;(+-f+B*8 zMlS7`0W_-ds}S5&TG-R8!3#7PdrP525H=WKQ&4CBfqrqSFp5|bdmG2r1$T6`uY|mf z$g6dgvBgm?Z#^x^Cmk)^k9MnZJ-+YP#NsP&SK;fMKu*dnW@rtqwkGn!akHXS`A-ynUud<_#ZTM7c4)ghwmm8&;QJq$cD_BXZ5c&aUp` z6uHSLV~DHPY!V))xTUjwco=Mmtg{iZ^SzzWbQFBxW}fuiVbrwQA8sLo4M9-jP0kYB zA9|qB5jfqSBP(2k#72zhF;3qaRy{RUX*u8a)X;ldX(z4*S _s3qE)&INOm-MlMv!prkA*nY+2Rx;NPpM zXC_}O8JDt^)|a-kILmA divg`AYxrVm5aaL4?2&V8df^2Zq>yK zDt;9SU_Bbx)9ON_AI0-U%q%yZgh-A$HusL72W>wV1^IYLmoae9r6-8Lgv-62Hch0` zDsr@e)i|kY;7!vb;xgi6JHKcju*B%a*-D+X2|=SBWuXr8j~Nh}FMoJYv|1NhW|tQs zd5AP_J{BJI2agP9k2Ujg(wx&fY;9~MW8OINd;2tC#wk*=*ggbPs1Z0#P(}a3cx!z~ zRYBuA`Ra_W<@@JIhT{40*F{C~i-U`XqJ;-rArdTV*Q++e-wty3{hvEOFv8jo4+G=~ z%wlUt#GLH-eGOQHkg{?9f2~|80Z293Q*f1OQfaXm@Ydk4G+10sQjz@Y(CbP_paJX0 zTJzPM64&D)Q=GFaL13M1wWZRIsAKr=cMw3cm6xQvI9La^g>jykap`ZrR%mYp|B9X6 zNGqoQJkYsyBBM@<^uI `0MDE9*mVoZA8YZN7AM9<%B()@0 ze<8A>CyNqO4T!`Oo9}$6KZ9G|$QxO=i(M-|@tm>VexhHx6u)}js1R?MdTezizEz3# zb|F|?U6)t$tPF3~9wtPhr^x|}u+ce9$v(YWOU25-YuAGWuJH8tmD?U$Q|p)pftIs? z3 12Vqw6ET+`OmTL*O#HdLRR-ajOJYfFwpLDXw*KbMnZ>H+{|OIt5rQ2W_g zSfu}c6u<%b(jVFAJee#`dX?$z{p)b1SZ#42_;P!IPzVgX$hGZN<9(C;)p$7n=`d-a z!E)XPgYzF`!bPg-#YRuZ$+p(!`jpwt^d>08b#4B>vb_8$-g;gUI3-g#%rWsRns8@- z|83&6d3`XJq#;WYWEjn>Dt89;w-IhKloZHT@O|BKDFg`e^442-eY`m=Cy5n*ZMNU8 zqk;xth(NY7Fe_#-j$^OQ8UT`KC^@`I%qfIjO*b_#>Eh?+&dyhg!^1<66|SC!#>2T8 zOIicJjn(~&siNXE`rWN=7@#cOUp;OP&X)$_m5OC`Y6)#UJtQTE&j-B$1@PnOkHmFN zp)y@xS-;0;HW}qVB@z1g7l^Yz3g0tt$Zr{`+xwj29&$t9|C1}k0?q9F{Jto0?DUKG zx*5ykRf$4=zY;K4*inx2rOC;Q27iD5?6Zj{&Gl+lc~yW5Ko=oIi~s;QSA{+Dv?>7L zi2BZ+c{7m#>h+e&Xdu*j`_cuVd_I6*bxQ!~u|umTw @n;d?3-$4>P$P`Z@mnB8@_c#(n_g$DGF7vb$ z^6!r0qoddFglb9v>hV)FpiIyFPbsg%G}WX05clKZqWNSA|5gkHOMvKPe0)6e&mVl= zk2hbHX4z7E!69+LSoaaQ>^2GBXesuuzkf7$-9Btvr;AJc8%Mw~Q$kVEMn^~I@JDOc z>XVHUxKkE*bmF+(?)vQ;XqO_>X?g-l8HYG_a1daP8WrL{)HX91<|s!cB_-sPf1}+3 z94O5fi?$In2i|4g=2?!oUastVyQ^$kTeABy&FHW*h{ilg63u(3j!5?I?+F5kG5uCW z8v_G_Lr7UrN2AWaH`8qz0e!d!Ppq-nZ~ca1d*h~~J52}<4xXn%`Zw+Z ^ =cO`cV)8qI#LuN|A|g@e701{ba~+OU!X(s7U1{$ z?`azEQ+eF4USPTCfT{A0^Sw%y{-3al0|64Be*OAYO-unCa$DfwuK=bIr>5(^y9bWR z5+`-A0Th-w0pTAZUXm$X&PNDOSUv!_Z(%F|BHcC+_z{&$IDblunwq-P+*edfqK->C zgTo%R5b7VVvWv#)s1APs*kd$ ?v64szurt_JgpQQ> z|2Xw0fysQjptMLmtL%O^?(ZPNq-12f f zWDOZ+cTuu@+@~)@2`ul1(vNNeA OQI-594ii?Ly8ib_Q^z=9U;H0urD0f!Lda! znMl Yj5TwF}0qtZpCkj3jIOfL)+CXR(@6(>c>6pW>X*__6}>0rl0 z3W*TG3>D5}{&s;MZ1CRL#H4d^daM7kb!_``G)@sERQTNiFrE_(fHDa=IimS}#Y;7( zK9)p`tFQq09%aqfuV2Z(zDG9X@GS}wt&MMP0vZ(||B*2s{@WycD_BPZK5EN%duz)` z=kLGazKllMr0rE|XlU?ThF*>g4r29PYSEC9p@hDl6d{f+arayMPIvH$oeR_PxnDYy zi&b4x3YaWTw>!1(b4^J}30bA{n!xjGXAnPM%=CW*&LX(;WDR222oC(|OV*~JZz`+@ z$Qvv#RVpUG8XyD=1c7doO=fvvXQ%t|WL%ObYUuybIh$vkW>PR_VmalPm73a;vCa98 zd0Z+KV98w-0OI!{dE}O%c;;bYt1o;+%YuhOI)$;HF(Og%`~Q;yl?{(b!-mF6r3VoY z&$9v*Q>^&x_$JS9o2Iw)u2-wGl@ ?{v`AvsFuQo2psDVwL2)yefU!80c4Au5SLuXu(t^sSRN zCJvbT{|ObtKZt~mu9CI685Gu;&fg16Zc^g!=Nm|{MMOk=_wR2l;W6p8*Kvrg()L&Y zR+OS;0tzJXS7Uye-(m+_1M4XZjH1`J`ieI2@R5oWAYL~iE9({WHD%1MGmrH*X8gjX z*ebxi^1_?{rruxxOysR(%!DSB#axkp2oZP-X~Qen0BfX9y^?HPw)mQShQ-){1JD;g zdO*adf>_~aE^WrNfcjb-+r7RAJyea3j>>5+a&uX)G}}uRya!b0pK>=q85 A?1G>if<0clr`93bT9biG!7Tg*-A ar~R&bPVU)2Rxn{zu^f-p-}lcQ?y9zfS!gf0gH0z?RMmQz-!BNp3z1&aiyL8h@M9 zoPm%dm;Ltp`QaMAQ20OoWd>x(nwB@^Jl#+L@_s7-9w=BUiHi0^Jrf{}jE}#XTFQ!9 zTc5JL{t=c`{*Qy4a2Pj@5C_1b4w0FmP3N%Rf}m0XhSU6gUh!n$JU%-5ELLutuw giVZ%Upg9! z$w){@g7~8*(pX36$Y}nX@CrIeei=i1#r)xF*O(yM^fNnJu~coCa2^KIespTlp%uK{ z*$g{i1$2|+(En3^K8DZfbp5*y=uL??My94+J&|kNMvH&fpCTX?VYf%+da(02)Zm31 zPX{KQX1$aoP@4ar#(bbZv+nb+iZ{aQU$?Nd^d&6>XwggqEU)hvVaTt#y4U64X_nZx zDB6T+V8DMS(djj8EBL#)mZZFi$)2VSExBA8OKCV-H6TyHFHaOREbPVr70XG}##sH8 zySuyRQXhd;{!gu2A*^ZEMjMkTLqM0FHXq)!!vInm0`F--55JyeHGAz|?X@J;H8nNg z`6^dvx7107X#h6!pFyR}*&EOF?A^Y!+84D?+X)sYeJpcYwr*Oakj?nR@cQ@> sOVBgGK@KDEj&=r?U-n)`_T*V;1*};qgw_jOdy6 zjLCa#-TsS|9)dawSRPRmqQ%j=y#f%6HU411 90BsgDT(J`Q~-{ zu50b9xi2K6hH14wpsHxT^6uPasvBcvZI8jt8VaWw{f3stY>Bofm}iL_a2eko2Ya(R zH|+ML>pssl>y0&}H^vktzuKo8Bef|^&QeuLn)X~3_a_aZ0^3JgetkWQn1aG*a(_=& zz-}7j%IwuVT<^chNNNGh0Fo=DtqD0#$Hr8$Aavyk7Ncn9A$;Q?(ytLwMS?BG0r9D( z3)0CT0=#Xuu}?FMTSJDy7ufE>25G@#7*-@CU~9z!1CL%Swu&+9a@7jcUldoX#8_*+ z&EPhKHhYUzn;8s{0H!QKbnr13pRP@ic$8eiu2<8lP5Bkc`lq@@oNjutL2E3w`9lbE z7{?s^38JT7x8unzUE*bvSk8+^u>4Dy_wr)l`R^!AYECm|PrdZznn7OKD$~2*+iuY9 zuo=XLO%p`|P3_C9v$A=N2EWO=Q~KuuZYk@=uY9VY{p@ R7T8Y5AE-&ES-zm?g|c>GVq$v-lD#M3dZqD z^AYc2J7#6idLN^pXEfTL*$uCE5Xn(=xMb4V=qg%UAEBF;UnYRt8>(!>%>n;wiz9su z%+AbwZA@hk*sUu`+Jiig$jsV`@&IkN=w*z UK z(FeIKu&H (dvVA`}$#F*;X%VXwW9bS#a&h66`=7z08vpQ{PqL zh-Ku_EJ-*&(eQ(LaCClx_l=gKNn>*iKK;<8?P^NU?>^|TlsEYP1OG9RSAEnvgN;wu z`{k9!cj>E2s$#Meb=Zc;Qmp8qKmTs&3uR?x`wt(}d+a*fDvRQmKe}Gt8UEuHin7@+ z|DZIUhT0WvwiNj9E9CgUmi=Lu@y8wLPxxGHXy-pWvz|0cf(n%PHgV#4@DbAkmdA=B zaaTiuPw^r*3@wc~s&Up|es2x9XD zdkEsg9y*i^(+Ie`(jBB7LgL06Cn_96a0s} KvaLoaFh;2+8mxw2K-f-drwmZ6i`!hx;bO-AT)6?biMcqYC zlx)-3#rwsrjJpjRge3`tMf?@vOP6%IRNOWNHqhtMVnbRw?JAP-#!1APgi#DuIRZ?z zE|&|Ok6~Y!%iyO%PlZFF3RWi6$er(gaILX>Z@TMSR=`hAuy*V63j}YZLQ(SDc&yB! zW-Y0A=c30f>uj*`4&VpJp1ZUmxtCd9>9|B=Ybba+^~}W6kY0<>;f;GT)xUymn)ovk z6IB+9-n`s+*0-YHBuoFASHf@!jC$?DG4-7iX8h8|jTl`d&&gdQc9;bOPwH()IWAZ= zo!A5a@}h)@j6|cmv=#c2>4lr3`7oPYVTEu^a_$wev(|3}S5}QJqjand=*Re?tFL{` zRi*JKpBvB$i;I!>qX_}mF9efTeX@u<-efezKd1kOpwi?v{^U(2||%dy3h*W>TMmX~Gv5Rs5xyJBKujtf!hrI}LV zM|S<8@%abp!};+u);^Pn#*CRfwa!8)SSrfMjB&g+OF0NRF_G2J$30|dB?OPju8r+2 zZ{OLRajo5$;=9lCoioKAOgGe(4cY}aRI}V?2-h DMUuJkvfV&8JA3MxS z?n``%zh}0(T!*Zg;8Hde7$0^2fKpae6#5o|WX*0~RZ&qeDL)EHB_pqJ9KUKqNZazI zbpZw5qny}9ed;u_yS+LWj^;B?Veq41%E;=CTf5(R`m+pOZUlC!owiKm32(KJ(7SY< zE6rJHfof7_md4Bu)^9)KLSkau!bZo{#PORyT{+XHb-JebFi $74sl~7D zGIZ@$){)pg-PSBH_hx_cG!VMQwij-=7jIZo(tR9RdBj-rtdl&ki*c48(bVe;4m3@@ zp>jZ{Z5>qRAEv;r9n7t;VvUvku)}i`sA82aHkpv1^A^4)*MR$%y!DSojdo8(*8Fn@ z2WtCPkIhb`VVc%Z*=#l|;zL72v$ci;E{QHp%ZQi;#)5#a|JMgOkgnNvWM@9uk~y!g z&`mO4Q3kD_a?RZgFl88?DtB|% Dk z934a1ZFbPU%Q1aBt@ua2%!rEM4uWm+M0oK&THWbG#wesrHRQQqhsD;9>D%U4pw2|7 zrn0V?y+Id1ZFzlsGwr ^B?&oeNOMN5FvNkxu8xkAD)AG;n$)9$i;;a87|iMU0@O5 zbDTV2L#LY2>tZe2-7P+`&IHWC1;`{RDcRQ!s%ps+q{j~eht<8TX?0$2z$fEKNE0k$ zzvSi@lceN1QWY|XcshedfB#r(#e?{c>$H~v(>qp@jJYgt<;q6!BtkspUe?;024p6M z17HyIE-vmCYu&GQBqU{I5{JM1Ukp3teouR0!VmSk{+-&(bzsMVJhw^ ii=H{ogrrUtvEj9r5$Vl!l+51{ z4T74EuJClZsXTQgz~6t#Bw%_|9+!*w-Qn+0)P$6jg@fCfV!2{~XJuYoxVgWeP$yWy zOn@KzFFY*iJ1WzSWhpWx<>lp%R{ZXNP(_1s0J;rI=+?(0Jj+pm9WHfM{LmN3Wp ZxCs+A z-ZeR*s}rY8=KHnOM;MsWf=Ia5qop}@7S*ObgEpIJpRI}sKK2~(SYboumHG}aF4@<| z)ww2IaDH~uxc}hcIwnC~QDUiq9Tt_orZl*~9X;y9E(r|;w~#$(RjbK5F4!i1Ht6<9 zA3x^y1i&g87!U!hkZUOfU3CB##vHA6wBbnUDkum7`L&~rf&$W`sr- F7{kF>zCg>(GFzMmeS)|7j z;EsMP0axgM#Ra_(8jJLJdP9$PQXgw*N-Be$SrUb*2A=X(bIJJ@#0u96dDvis9D*sz z* <3Iu& z-RgX)LF&gJ8TM6SAQm6y^*x#`wLo9Bz|m;_BBUqU;s3I;>3k6KhW1l74G8X#FCht zJhL~Jj;;^N>u@>MgdVRkvSfFG_^OY$&vU=x2$uud=kD%~hK*gC<1rLRc3X7_u?u7r z9zD0)6B5w49Cm)bI|Yg{R2Ti;s3<6C1>0WgdyvPUKYyl{&Va%i@KGPV#7**YV%yN= ziu{RrcgO<7?Fv${>XRaQE;&I6J>jm2lg(=iEbW#YFDLn+SvtNH8|=?w_M1pJ!;IeN z2g1-N0o*~C=XOiJb!n32rwM4g${3dQxr{J60Z+VMuVr!_HSO1C=(opMl6oifg+2)9 zZP(?c{BOFg#nO> ILkn{s=dt|-oay~;y()cnCh-1-x7 z_F1qiBQw9^icT@*nT|EnY{DzAb6zS4HFT*K;#Uou>%pX;hMQJA SyPa@=arG- vCnr7(-TKI+ z&R$*s1SYQlv8Ws#=hSk}36vkX_H$MwF!tEkT{{0a!Pd37*fGUKRC^vlVw@VHW5K z)!f>-{Uy~aYE>1-=M{Vs=aqCh9Ta6M>I0J6^-0_63ftz3*b%pr;mDsB@q~$(6gM@w zgy-g}IO;EUNAF_5$3S!gi$I}B#qa|n3~L@i9@?mJBwLa=>)k@&0TTF4#a2b`Z3S zw>@@=9}{i~F%8^{qpXjl5Bt;i^=J840YX9)@_i*dLz$yATNaX zxozI)DcP+-x8f@ps$ dr2rRO`OR+|2wgg9a#+Z$O$#5OP&J r2>#bU$p4<8N4!L1y z{Ily;B?0*ED(IN`Y5S@Bl{({aW%>W*`j(n4Xl6Ax#?bpq4G}!jlg8+)&WIJb6S7M2 z>6dF>!`l7PJ6mjCA#7>9ECH)Z70y9>^EZJ=KpOuW*y `X zQKk~1G(h!ehF^}Sly