From 13e3c2f775c8a37db156016541385083967e5079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Leirer?= Date: Wed, 16 Nov 2022 00:33:07 +0100 Subject: [PATCH] updated Grundglieder --- RegT1E_HS22.tex | 329 +- RegT1E_HS22.xdv | Bin 102208 -> 147584 bytes img/{ => DIN-Symbole}/D-Glied.png | Bin img/{ => DIN-Symbole}/DT-Glied.png | Bin img/{ => DIN-Symbole}/Differenzbilder.png | Bin img/{ => DIN-Symbole}/Impulsfunktion.png | Bin img/{ => DIN-Symbole}/Integrator.png | Bin img/{ => DIN-Symbole}/Multiplizierer.png | Bin img/{ => DIN-Symbole}/PT1-Glied.png | Bin img/{ => DIN-Symbole}/PT2-Glied.png | Bin img/{ => DIN-Symbole}/Proportionalglied.png | Bin img/{ => DIN-Symbole}/Summierer.png | Bin img/{ => DIN-Symbole}/Totzeitglied.png | Bin img/Diverses/Regelstrecke.png | Bin 0 -> 30454 bytes img/Diverses/Steuerstrecke.png | Bin 0 -> 24350 bytes img/Sprungfunktion.png | Bin 8130 -> 0 bytes img/hsr.jpg | Bin 204337 -> 0 bytes img/hsrlogo-bw.eps | Bin 413070 -> 0 bytes img/hsrlogo-color.eps | Bin 413438 -> 0 bytes .../Integraltransformationen.tex | 132 +- include/Integraltransformationen/img/BiBo.png | Bin 0 -> 21540 bytes .../img/Bsp_Grenzen.png | Bin 0 -> 12770 bytes .../img/Faltungsgrenzen.png | Bin 0 -> 14638 bytes .../Integraltransformationen/img/Spektrum.png | Bin 0 -> 110898 bytes .../img/Zusammenhang_Laplace.png | Bin 0 -> 79401 bytes .../Integrieren und Differenzieren.tex | 61 + include/LTI-Systeme_kurz/LTI-Systeme_kurz.tex | 56 + .../Wichtige Funktionen.tex | 223 +- .../Wichtige Werte & Vereinfachungen.tex | 25 +- matlab/PT2.m | 19 + matlab/PT2.png | Bin 0 -> 37212 bytes matlab/PT2.svg | 596 ++ matlab/PT2Plot.tex | 300 + matlab/matlab2tikz-1.1.0/.gitignore | 6 + matlab/matlab2tikz-1.1.0/.travis.yml | 16 + matlab/matlab2tikz-1.1.0/AUTHORS.md | 63 + matlab/matlab2tikz-1.1.0/CHANGELOG.md | 439 ++ matlab/matlab2tikz-1.1.0/CONTRIBUTING.md | 66 + matlab/matlab2tikz-1.1.0/LICENSE.md | 24 + matlab/matlab2tikz-1.1.0/README.md | 95 + .../matlab2tikz-1.1.0/logos/matlab2tikz.svg | 102 + .../matlab2tikz.sublime-project | 49 + matlab/matlab2tikz-1.1.0/runtests.sh | 86 + matlab/matlab2tikz-1.1.0/src/cleanfigure.m | 1294 ++++ .../src/dev/formatWhitespace.m | 87 + matlab/matlab2tikz-1.1.0/src/figure2dot.m | 123 + matlab/matlab2tikz-1.1.0/src/m2tInputParser.m | 231 + matlab/matlab2tikz-1.1.0/src/matlab2tikz.m | 6805 +++++++++++++++++ .../src/private/errorUnknownEnvironment.m | 5 + .../src/private/getEnvironment.m | 25 + .../matlab2tikz-1.1.0/src/private/guitypes.m | 13 + .../matlab2tikz-1.1.0/src/private/isAxis3D.m | 5 + .../src/private/isVersionBelow.m | 13 + .../src/private/m2tUpdater.m | 310 + .../src/private/m2tstrjoin.m | 35 + .../src/private/versionArray.m | 18 + .../src/private/versionString.m | 9 + matlab/matlab2tikz-1.1.0/test/README.md | 101 + matlab/matlab2tikz-1.1.0/test/codeReport.m | 280 + .../matlab2tikz-1.1.0/test/compareTimings.m | 256 + .../test/examples/example_bar_plot.m | 53 + .../test/examples/example_quivers.m | 80 + .../matlab2tikz-1.1.0/test/makeLatexReport.m | 222 + matlab/matlab2tikz-1.1.0/test/makeTapReport.m | 74 + .../matlab2tikz-1.1.0/test/makeTravisReport.m | 360 + .../matlab2tikz-1.1.0/test/output/.gitignore | 4 + .../test/private/OSVersion.m | 36 + .../test/private/StreamMaker.m | 74 + .../test/private/VersionControlIdentifier.m | 47 + .../test/private/calculateMD5Hash.m | 35 + .../test/private/cleanFiles.m | 19 + .../test/private/countNumberOfErrors.m | 4 + .../test/private/emptyStage.m | 4 + .../test/private/emptyStatus.m | 24 + .../test/private/errorHandler.m | 41 + .../test/private/errorHasOccurred.m | 16 + .../test/private/execute_hash_stage.m | 34 + .../test/private/execute_plot_stage.m | 45 + .../test/private/execute_save_stage.m | 63 + .../test/private/execute_tikz_stage.m | 43 + .../test/private/execute_type_stage.m | 15 + .../test/private/fillStruct.m | 10 + .../test/private/getEnvironment.m | 25 + .../test/private/getStagesFromStatus.m | 5 + .../test/private/hasTestFailed.m | 13 + .../test/private/hashTableName.m | 55 + .../test/private/initializeGlobalState.m | 99 + .../test/private/loadHashTable.m | 19 + .../matlab2tikz-1.1.0/test/private/m2troot.m | 30 + .../test/private/m2tstrjoin.m | 24 + .../test/private/restoreGlobalState.m | 11 + .../test/private/splitPassFailSkippedTests.m | 10 + .../test/private/splitUnreliableTests.m | 7 + .../test/private/testMatlab2tikz.m | 146 + .../test/runMatlab2TikzTests.m | 38 + matlab/matlab2tikz-1.1.0/test/saveHashTable.m | 164 + matlab/matlab2tikz-1.1.0/test/suites/ACID.m | 2818 +++++++ matlab/matlab2tikz-1.1.0/test/suites/issues.m | 43 + .../test/suites/private/getEnvironment.m | 25 + .../test/suites/private/herrorbar.m | 167 + .../test/suites/private/isEnvironment.m | 46 + .../test/suites/private/isMATLAB.m | 4 + .../test/suites/private/isOctave.m | 5 + .../test/suites/private/isVersionBelow.m | 38 + .../test/suites/private/versionCompare.m | 20 + .../test/suites/testPatches.m | 121 + .../test/suites/testSurfshader.m | 102 + .../test/template/.gitignore | 6 + .../matlab2tikz-1.1.0/test/template/Makefile | 33 + .../test/template/data/.gitignore | 8 + .../test/template/data/converted/Makefile | 23 + .../test/template/data/reference/Makefile | 19 + matlab/matlab2tikz-1.1.0/test/testGraphical.m | 47 + matlab/matlab2tikz-1.1.0/test/testHeadless.m | 62 + 114 files changed, 17653 insertions(+), 180 deletions(-) rename img/{ => DIN-Symbole}/D-Glied.png (100%) rename img/{ => DIN-Symbole}/DT-Glied.png (100%) rename img/{ => DIN-Symbole}/Differenzbilder.png (100%) rename img/{ => DIN-Symbole}/Impulsfunktion.png (100%) rename img/{ => DIN-Symbole}/Integrator.png (100%) rename img/{ => DIN-Symbole}/Multiplizierer.png (100%) rename img/{ => DIN-Symbole}/PT1-Glied.png (100%) rename img/{ => DIN-Symbole}/PT2-Glied.png (100%) rename img/{ => DIN-Symbole}/Proportionalglied.png (100%) rename img/{ => DIN-Symbole}/Summierer.png (100%) rename img/{ => DIN-Symbole}/Totzeitglied.png (100%) create mode 100644 img/Diverses/Regelstrecke.png create mode 100644 img/Diverses/Steuerstrecke.png delete mode 100644 img/Sprungfunktion.png delete mode 100644 img/hsr.jpg delete mode 100644 img/hsrlogo-bw.eps delete mode 100644 img/hsrlogo-color.eps create mode 100644 include/Integraltransformationen/img/BiBo.png create mode 100644 include/Integraltransformationen/img/Bsp_Grenzen.png create mode 100644 include/Integraltransformationen/img/Faltungsgrenzen.png create mode 100644 include/Integraltransformationen/img/Spektrum.png create mode 100644 include/Integraltransformationen/img/Zusammenhang_Laplace.png create mode 100644 include/Integrieren und Differenzieren/Integrieren und Differenzieren.tex create mode 100644 include/LTI-Systeme_kurz/LTI-Systeme_kurz.tex create mode 100644 matlab/PT2.m create mode 100644 matlab/PT2.png create mode 100644 matlab/PT2.svg create mode 100644 matlab/PT2Plot.tex create mode 100644 matlab/matlab2tikz-1.1.0/.gitignore create mode 100644 matlab/matlab2tikz-1.1.0/.travis.yml create mode 100644 matlab/matlab2tikz-1.1.0/AUTHORS.md create mode 100644 matlab/matlab2tikz-1.1.0/CHANGELOG.md create mode 100644 matlab/matlab2tikz-1.1.0/CONTRIBUTING.md create mode 100644 matlab/matlab2tikz-1.1.0/LICENSE.md create mode 100644 matlab/matlab2tikz-1.1.0/README.md create mode 100644 matlab/matlab2tikz-1.1.0/logos/matlab2tikz.svg create mode 100644 matlab/matlab2tikz-1.1.0/matlab2tikz.sublime-project create mode 100644 matlab/matlab2tikz-1.1.0/runtests.sh create mode 100644 matlab/matlab2tikz-1.1.0/src/cleanfigure.m create mode 100644 matlab/matlab2tikz-1.1.0/src/dev/formatWhitespace.m create mode 100644 matlab/matlab2tikz-1.1.0/src/figure2dot.m create mode 100644 matlab/matlab2tikz-1.1.0/src/m2tInputParser.m create mode 100644 matlab/matlab2tikz-1.1.0/src/matlab2tikz.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/errorUnknownEnvironment.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/getEnvironment.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/guitypes.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/isAxis3D.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/isVersionBelow.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/m2tUpdater.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/m2tstrjoin.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/versionArray.m create mode 100644 matlab/matlab2tikz-1.1.0/src/private/versionString.m create mode 100644 matlab/matlab2tikz-1.1.0/test/README.md create mode 100644 matlab/matlab2tikz-1.1.0/test/codeReport.m create mode 100644 matlab/matlab2tikz-1.1.0/test/compareTimings.m create mode 100644 matlab/matlab2tikz-1.1.0/test/examples/example_bar_plot.m create mode 100644 matlab/matlab2tikz-1.1.0/test/examples/example_quivers.m create mode 100644 matlab/matlab2tikz-1.1.0/test/makeLatexReport.m create mode 100644 matlab/matlab2tikz-1.1.0/test/makeTapReport.m create mode 100644 matlab/matlab2tikz-1.1.0/test/makeTravisReport.m create mode 100644 matlab/matlab2tikz-1.1.0/test/output/.gitignore create mode 100644 matlab/matlab2tikz-1.1.0/test/private/OSVersion.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/StreamMaker.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/VersionControlIdentifier.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/calculateMD5Hash.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/cleanFiles.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/countNumberOfErrors.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/emptyStage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/emptyStatus.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/errorHandler.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/errorHasOccurred.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/execute_hash_stage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/execute_plot_stage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/execute_save_stage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/execute_tikz_stage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/execute_type_stage.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/fillStruct.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/getEnvironment.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/getStagesFromStatus.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/hasTestFailed.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/hashTableName.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/initializeGlobalState.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/loadHashTable.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/m2troot.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/m2tstrjoin.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/restoreGlobalState.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/splitPassFailSkippedTests.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/splitUnreliableTests.m create mode 100644 matlab/matlab2tikz-1.1.0/test/private/testMatlab2tikz.m create mode 100644 matlab/matlab2tikz-1.1.0/test/runMatlab2TikzTests.m create mode 100644 matlab/matlab2tikz-1.1.0/test/saveHashTable.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/ACID.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/issues.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/getEnvironment.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/herrorbar.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/isEnvironment.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/isMATLAB.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/isOctave.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/isVersionBelow.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/private/versionCompare.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/testPatches.m create mode 100644 matlab/matlab2tikz-1.1.0/test/suites/testSurfshader.m create mode 100644 matlab/matlab2tikz-1.1.0/test/template/.gitignore create mode 100644 matlab/matlab2tikz-1.1.0/test/template/Makefile create mode 100644 matlab/matlab2tikz-1.1.0/test/template/data/.gitignore create mode 100644 matlab/matlab2tikz-1.1.0/test/template/data/converted/Makefile create mode 100644 matlab/matlab2tikz-1.1.0/test/template/data/reference/Makefile create mode 100644 matlab/matlab2tikz-1.1.0/test/testGraphical.m create mode 100644 matlab/matlab2tikz-1.1.0/test/testHeadless.m diff --git a/RegT1E_HS22.tex b/RegT1E_HS22.tex index 22997be..9acc810 100644 --- a/RegT1E_HS22.tex +++ b/RegT1E_HS22.tex @@ -10,6 +10,22 @@ \usepackage{multicol} \usepackage[export]{adjustbox} \usepackage{bm} +\usepackage{color, colortbl} +\usepackage{trfsigns} +\usepackage{graphicx} +\usepackage{tabularx} +\usepackage{mathrsfs} +\usepackage{tikz} +\usetikzlibrary{plotmarks} + +\usepackage{pgfplots} +\usepackage{lscape} + + +\usetikzlibrary{plotmarks} + +\definecolor{TabularBackgroundColor}{rgb}{0.83,0.96,0.96} + %% TODO: publish to CTAN \usepackage{tex/hsrstud} @@ -39,8 +55,6 @@ % did someone help you with this work? \contributors{ - % I created this template, does that count? - Naoki Pross % do not forget to add yourself! } @@ -73,7 +87,6 @@ \section*{Lizenz} \setcounter{page}{1} \pagenumbering{arabic} -\input{include/Wichtige Funktionen/Wichtige Funktionen.tex} \section{Begriffe} \begin{itemize} \item Prozess @@ -113,7 +126,7 @@ \section{Begriffe} \end{itemize} \item Grundglieder \begin{itemize} - \item Kleinste Teilsysteme. Sie können weiter augeteilt werden in, siehe Abschnitt \nameref{Grundglieder} + \item Kleinste Teilsysteme. Sie können weiter augeteilt werden in, siehe Abschnitt Grundglieder \end{itemize} \item Sprungantwort \begin{itemize} @@ -133,98 +146,232 @@ \section{Begriffe} \end{itemize} -\subsection{Grundglieder} -\label{Grundglieder} -\begin{itemize} - \item Statische Glieder(Systeme ohne Gedächtnis): - Der Ausgang ist nur vom aktuellen Eingang abhängig. - $y(t)=f(u(t))$ - \begin{itemize} - \item P-glied (Proportionalglied): Reagiert mit einem Faktor K auf den aktuellen Eingangswert.\\ - $y = K \cdot u$ - \end{itemize} - \item Dynamische Glieder (System mit Gedächtnis): - Der Ausgang ist vom aktuellen sowie von vergangenen Eingängen Abhängig. - Vergangene Eingänge werden im System als Zustand x(t) gespeichert. - $y(t)=f(u(t),x(t))$ \\Können weiter unterteil werden in: - \begin{itemize} - \item I-Glied (Integrierer): - Ausgangssignal ist Abhängig vom Integrierten Einganssignal, Allenfalls mit einem Faktor K multipliziert. \\ - $y(t) = K \cdot \int \limits _{t=0} ^{t} u(\tau) d\tau + y(0)$ \\ - $(\frac{dy(t)}{dt} =)$ \space $\dot{y}(t) = K \cdot u(t) $ - \item Totzeitglied: Verzögert das Eingangssignal um die Totzeit $T_t$\\ - $y(t) = u(t-T_t)$ - \item PT\textsubscript{1}-Glied: - LZI-Übertragungsglied mit Proportionalem Übertragunsverhalten \\ - und Verzögerung 1. Ordnung. (Bsp. Tiefpass 1.Ordnung als RC-Glied) - - \item PT\textsubscript{2}-Glied - \begin{itemize} - \item Übertragungsglied mit Verhalten 2. Ordnung. - \item $T^2 \cdot \ddot{y}(t) + 2 \zeta T \cdot\dot{y}(t) + y(t) = K \cdot u(t)$ - \end{itemize} - \item D-Glied(idealer Differenzierer) - \begin{itemize} - \item Bildet die Zeitliche Ableitung des Signals, mit einer Verstärkung K. - \item $y(t) = K \cdot \frac{du(t)}{dt} = K\cdot \dot{u}(t)$ - \end{itemize} - \item DT$_1$-Glied - \begin{itemize} - \item Realiserbar, im Gegensatz zum theoretischen D-Glied. - \item $T \cdot \dot{y}(t) + y(t) = K \cdot \dot{u}(t)$ - \end{itemize} - \item PI-, PD- PID-Glied (PDT$_1$ und PIDT$_1$) - \begin{itemize} - \item Werden häufig als Regler eingesetzt. - \item Name setzt sich aus den Aktiven Pfaden zusammen. - \begin{itemize} - \item P: Proportional - \item I: integrierend - \item D: Differenzierend - \item P, I und D in Kombination sind Parallel - \item T\textsubscript{1,2,t} bezieht sich auf die vorangehende Komponente. - \end{itemize} - \item Berechnet sich aus Superposition der Teilantworten - \item $y(t) = A \cdot [K_P + K_I \cdot t + \frac{K_D}{T_C} \cdot e^{\frac{-t}{T_C}}]$ - \end{itemize} - \item Lead-Glied, Lag-Glied, Lead-Lag-Glied - \begin{itemize} - \item Varianten von PDT\textsubscript{1}-Gliedern. - \item Unterscheiden sich im Vorzeichen von $K_P$ und $K_D$. - \end{itemize} - \end{itemize} -\end{itemize} +\begin{landscape} + \subsection{Grundglieder} + \begingroup + \scriptsize + \newcommand{\ImageWidth}{70pt} + \begin{tabularx}{\linewidth}{|p{100pt}|p{160pt}|p{60pt}|p{80pt}|p{120pt}|p{80pt}|} + \hline + \textbf{Benennung} + & + \textbf{Funktion} + & + \textbf{UTF\textsuperscript{1}} + & + \textbf{Symbol} + & + \textbf{Sprungantwort} + & + \textbf{Plot} + \\ + \hline + \hline + \textbf{P-Glied\textsuperscript{2}} + \newline Proportionalglied + & + $y = K \cdot u$ + & + $K$ + & + \raisebox{-.5\height}{\includegraphics[width = \ImageWidth]{img/DIN-Symbole/Proportionalglied.png}} + & + Sprungantwort + & + \raisebox{-.5\height}{ + \resizebox{\ImageWidth}{!}{% + \begin{tikzpicture} + % Grid + \draw[help lines,dashed] (0,0) grid (5,3); + + % Axes + \draw[very thick,latex-latex] (0,3.25) node[left]{$y(t)$} + |- (5.25,0) node[below]{$t$}; + + % Plot function + \draw[ultra thick,teal] (-0.5,0) node[left,black](s0){$y(0)$} + -- ++(0.5,0) + plot[domain=0:5, + samples = 50, + smooth]({\x}, {2}); + \end{tikzpicture} + } + } + \\ + \hline + \rowcolor{TabularBackgroundColor} + \textbf{I-Glied} + \newline(Idealer Integrierer) + & + $y(t) = K \cdot \int \limits _{t=0} ^{t} u(\tau) d\tau + y(0)$ + \newline $\dot{y}(t) = K \cdot u(t)$ + & + $K \frac{1}{s}$ + & + \raisebox{-.5\height}{\includegraphics[width = \ImageWidth]{img/DIN-Symbole/Integrator.png}} + + & + Sprungantwort + & + \raisebox{-.5\height}{ + \resizebox{\ImageWidth}{!}{% + \begin{tikzpicture} + % Grid + \draw[help lines,dashed] (0,0) grid (5,3); + + % Axes + \draw[very thick,latex-latex] (0,3.25) node[left]{$y(t)$} + |- (5.25,0) node[below]{$t$}; + + % Plot function + \draw[ultra thick,teal] (-0.5,0) node[left,black](s0){$y(0)$} + -- ++(0.5,0) + plot[domain=0:5, + samples = 50, + smooth]({\x},); + \end{tikzpicture} + } + } + \\ + \hline + \textbf{Totzeit-Glied} + & + $y(t) = u(t-T_t)$ + & + $e^{-s T_t}$ + & + \raisebox{-.5\height}{\includegraphics[width = \ImageWidth]{img/DIN-Symbole/Totzeitglied.png}} + & + Sprungantwort + & + \raisebox{-.5\height}{ + \resizebox{\ImageWidth}{!}{% + \begin{tikzpicture} + % Grid + \draw[help lines,dashed] (0,0) grid (5,3); + + % Axes + \draw[very thick,latex-latex] (0,3.25) node[left]{$y(t)$} + |- (5.25,0) node[below]{$t$}; + + % Plot function + \draw[ultra thick,teal] (-0.5,0) node[left,black](s0){$y(0)$} + -- ++(0.5,0) + plot[domain=0:5, + samples = 100, + ]({\x},{ (\x<=2) * 0 + (\x>2) * 2}); + \end{tikzpicture} + } + } + \\ + \hline + \rowcolor{TabularBackgroundColor} + \textbf{PT\textsubscript{1}-Glied} + { + \tiny \newline K: Verstärkung + \newline T: Zeitkonstante + } + & + $ T\dot{y} + y = K u(t)$ + \newline $T= \frac{1}{K_I \cdot K_P} $ + \newline $K = \frac{1}{K_P}$ + & + $\frac{K}{1+T_s}$ + & + \raisebox{-.5\height}{\includegraphics[width = \ImageWidth]{img/DIN-Symbole/PT1-Glied.png}} + & + Sprungantwort + & + \raisebox{-.5\height}{ + \resizebox{\ImageWidth}{!}{% + \includegraphics{matlab/PT2.png} + + + \begin{tikzpicture} + % Grid + \draw[help lines,dashed] (0,0) grid (5,3); + + % Axes + \draw[very thick,latex-latex] (0,3.25) node[left]{$y(t)$} + |- (5.25,0) node[below]{$t$}; + + % Plot function + \draw[ultra thick,teal] (-0.5,0) node[left,black](s0){$y(0)$} + -- ++(0.5,0) + plot[domain=0:5, + samples = 50, + smooth]({\x},{2.5*(1- exp(-(\x)))}); + \end{tikzpicture} + } + } + \\ + \hline + \textbf{PT\textsubscript{2}-Glied} + {\tiny + \newline K: Verstärkung + \newline T: Zeitkonstante + \newline $\zeta$: Dämpfungskonstante + } + & + $T^2 \cdot \ddot{y}(t) + 2 \zeta T \cdot \dot{y}(t) + y(t) = K \cdot u(t)$ + \newline $y(t) = K \cdot x(t) + T^2 \cdot (-\ddot{y}(t)) - 2 \zeta T \cdot \dot{y}(t)$ + {\tiny + \newline $\zeta = \frac{h}{\sqrt{h^2 + \pi^2}}$ + \newline $h = \log(\frac{y_m}{y_{\infty}})$ + } + & + $\frac{K}{T^2 + s^2 + 2 \zeta T s + 1}$ + & + \raisebox{-.5\height}{\includegraphics[width = \ImageWidth]{img/DIN-Symbole/PT2-Glied.png}} + & + $KA(1+e^{\sigma t}(-cos(\omega t) + \frac{\sigma}{\omega}sin(\omega t)))$ + {\tiny + \newline $\omega = \frac{2\pi}{T_m}$ + \newline $K = \frac{y_{\infty}}{A} $ + \newline $\sigma = \frac{h\omega}{\pi}$ + } + & + \raisebox{-.5\height}{ + \resizebox{\ImageWidth}{!}{% + \begin{tikzpicture} + % Grid + \draw[help lines,dashed] (0,0) grid (5,3); + + % Axes + \draw[very thick,latex-latex] (0,3.25) node[left]{$y(t)$} + |- (5.25,0) node[below]{$t$}; + + % Plot function + \draw[ultra thick,teal] (-0.5,0) node[left,black](s0){$y(0)$} + -- ++(0.5,0) + plot[domain=0:5, + samples = 50, + smooth]({\x},{2.5 * (1- exp(-3*(\x)) * (- cos(deg(1.9848*\x)) + (-3/1.9848)*sin(deg(1.9848*\x))) }); + %KA = 2.5, Sigma = -3, Omega = 1.9848 + \end{tikzpicture} + } + } + \end{tabularx} + \tiny{ + \\ + 1. UTF = Übertragungsfunktion (Laplace)\\ + 2. Proportionalglied ist einziges Statisches glied.\\ + } + \endgroup + \normalsize +\end{landscape} + +\section{Klassen von Systemen} + + +\newpage +\input{include/Integraltransformationen/Integraltransformationen.tex} +\input{include/Wichtige Funktionen/Wichtige Funktionen.tex} \input{include/LTI-Systeme/LTI-Systeme.tex} \section{Tabellen} -\subsection*{Blockschaltbilder-DIN} -\begin{tabular}{|c|c|c|c|c|} - \hline - \textbf{Summierer} & - \textbf{Differenzbilder} & - \textbf{Multiplizierer} & - \textbf{Proportionalglied} & - \textbf{Integrierer} \\ - \includegraphics[width = 3cm]{img/Summierer.png} & - \includegraphics[width = 3cm]{img/Differenzbilder.png} & - \includegraphics[width = 3cm]{img/Multiplizierer.png} & - \includegraphics[width = 3cm]{img/Proportionalglied.png} & - \includegraphics[width = 3cm]{img/Integrator.png} \\ - \hline - \textbf{Totzeitglied} & - \textbf{PT\textsubscript{1}-Glied} & - \textbf{PT\textsubscript{2}-Glied} & - \textbf{idealer Differenzierer} & - \textbf{DT\textsubscript{1}-Glied} \\ - \includegraphics[width = 3cm]{img/Totzeitglied.png} & - \includegraphics[width = 3cm]{img/PT1-Glied.png} & - \includegraphics[width = 3cm]{img/PT2-Glied.png} & - \includegraphics[width = 3cm]{img/D-Glied.png} & - \includegraphics[width = 3cm]{img/DT-Glied.png} \\ - \hline -\end{tabular} \subsection*{Blockschaltbilder MatLab} \begin{tabular}{|c|c|c|c|c|} diff --git a/RegT1E_HS22.xdv b/RegT1E_HS22.xdv index 7cbe44febc4c2852622d57eab097b4dd7c70a751..0b627b697e7ea9976fb58d9688c1e2073e8f06ff 100644 GIT binary patch literal 147584 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

?KI%X0)1DXpfy>j#9_8HP6MXgb{cSGX{P~` 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 Y5Nd6;*jlY-WATSNzpAH$U&G^n0SP%^jsO4v literal 102208 zcmeEv34C1Db@$U^?bg1pBgxvWnbC}Pd68wymN)Psb_3R~!P=0Ok$8xQ!+ud)eX{fW-*z4-+M%z# z+frX$W3^Y;)>n_XCr|zyf73nOWn}MIzol=qW1q!-FzDE- zzc?Am_lHODXWwtXRXu)W_VW8jP9|dEgB@25k4i18_?~OXxL0#Bz55y$JUTeu*fl)V z>*}+twb;j@ukC(HJ$V|3t?mK$BH$}mVl^@b`< z^>`;%!{{8X2t!SzF1H0%7d3;7e!W_+km_btjqC8tlKfp<*h)xx$ z##q%w^^p3Ys`+*V&t~MMFq@mO`5-5*arImagK+*x&(In*-7jlKCR$}%?{Z&m+XjDb z9q#V2T`<;jK5?fp_;IcJvEsk$hPx_vx;sYQ0kGhc^`=5CP%6HDOGjtVz!+Sdw|8*t zGCTaS(>A(l6;l3A+qzY&F30LluhO*1$;pG-=PwKP$3D&c`k=P|vf%eYvRbr+4G(Bq zTUVpa-7`Mmx~9j5;utRmdn>zLV{TjT@Q{1VHVln-gDA3%?Cl(Ib=d|6;s3$mq2Ve= z#(~Qh4nwpYBfE}wJ=?9N4(}xe%CFQM zT9ekV?a-<`OX}Xj`sGpmHlAJmMu!JGhN|j(EBMr`cEikNTAV5rKO!IfqWU}WK!nQE zpD0kd<=cOwa%;rjs=VpSCsf|jbxh@(>o=(U{MkB{Uo=C{U6J=wb=|%5Rh18xcBy>t z`*eM+HmG%K+1h6K&!KJA>frBA_-_#YZkn2g!eJmie{sXu>BbQrg8{$k1~>NA8Z8D( zIqw|$YHXlm$US#NXV%PW$=|zJ3stSakFZE;am>oA)xCth)H7?f?Ll!`+u@Mk?wi$e zt4d5%5PosIdNk(NPL;&Se{hZIge8d3)(+W*TwJ999nM6Qr9*A^{*;#a#X5( zHIvV}-ad7`@y_q5d=(OoR;cRV34h}Z!?qwfDXL6^E-?rhNdQwc7oTwV3+j50wolum z?U|acNO>G*+4LKlcCyak>5PZUK~x5UtEZ5()@iXw>+8>9g2LSF93JQvRy(t9R;vuZ z!Zgbwe}KA^rp2zL?oPQ{F$FFAdFu8e&Nl#|k3*+y)yAi$b3gn!G|}@XXyRP7?*;TH zr{8*a$0Rl;TT>KvPIJ=k%bAbOYFXA4Q**+3IHLC4NX>eQ=L^$)8uK43GzZ5S{v8fk zF*~cJrA3)WIdY81f9b0p{+kOt3};WriG{?@FVyb2t`O?JRMt*gl-R6 z@&2qlw3k?yDT?svPUERa@=0?w+1* zYj+RfFN;a@9PR7G;;hbwT6+WJwax~IV^&-C;8BfaHg<)yFB)2pDUN$Lne%iQJ4{*4 zD$^{Smn(6T4ZYW*jcAUq%xV=KZCW@z1fTNW81Ap+TZrpsGxNyjyoCF?9QY^7_U+KC zoiG}qkL)nXnNzdchDU#;Ej3<0L4U?@p8Px!MMf(z?_9nvc#^J5+v)q|eC^=tI-p@p zE14i#pcG776x6`E-l>LpD|{-b0aZitB94K7WKSIhb}>1toe#4x0e`Df_ypxqh!r6T zbtgf)Fr{(9nQxMG%Hw<)=at-$8s_tf46wdQh=q`?KYe_8S1uf+8brVZ*>?;^< zs8K!OifH~7yf2vuC;CPrqy)ZBVy>F8hgzM>dEtA+VagbtSUGp_{Q@Y(2K@l2l?Vz; zh1rArB}6aPw>1rbEA~O%tbj?3x`i+eMKFu@Y56%ftX`b927*B6=VGsx9a(lk__of#Sahc%vtz{d$164<0q~ zh_Gf=JuNbv=E%}ny%D31IEwDX`qdX+e_*gSx=7_TP#JBRD!4g+0^h z9_<(!JDE1#IM&rM&|?8Jg1xq(R&sdk4t&fthz7{P4)>^Q9KJ)QPXEk*DKTi<@8~R>4GsiPm6uzzg8IroLXm_*@c>=cJR^y>ybFf*^j(1S+&0Qyv(IS#3G! ztcHw>W;TyIMmLy9 ze47o@MlpzwVyM{`8t72_R&EcENlA8@Nrpu*{#rUl9gxHwk;Y?^#T}T>8VJh&CZO^b z?K;gdU)TIq=LNo{@0gmp4{@evDXcGDv6vIVFk|Zr6@hjU=$;GXmOX%5fR@v=;90E! zPzEX1NGRbi5^Y8^AWvXGp2{?y&Hb6r`LagBRVBd(@aI|u->>598oq9XzD1yJgI-1r z5z!WK6~8_0S@I9x1uh%>SdW}po_!d$L^W;%R`@jGxcd7Onur1Fi}3GgN6EF z(vy10^L|W(z~6z385{?sOBOt6KKANKOXH)qL*k zWjqLFY;UuTkiDr!b-AV?9_dtQ8<&q-z$&B6T!)pq9tR432tNqMRQ^j);|L-=FiONX zgNKsw6dOWf?k3}d8bx@j3<@@&>>R@^h+j;Jj6c%=WMRtV>K1bKy=Y+`Z0QNVE@xi( z{Ha*i(01}E)Bdy%7N&zh1sBKyAHfAociBtdIN7zxN{XSUnA~jw<-D*M54=n`n8C|* zb20NDGT_d*Iy@c-e-8Z_I);C0X8II$eu}*R8*3kda^Z$K zi1;I1)L_5sKymOKQw~&Ctu&S2(`Qo8!=qLzL>qG#E&u4ulmTlN`;z6(k}vDB7P89s z13Lu24gjv`8#(XN&;FmM`5J2)&|`Ap_2GYe!2<>qv>f2#FC}p%Ygu5a7>#U(eL{XY zCr`^dx20m=-9v$SIUZS@-9skVdD(UnNcqzs(RyJx%d%<1m!TqN7$B5^i zP(MlFJd^Xn4syRKd(fi3w^sd8<+WQ~Dqqd{`Uk&A_m%m|YyENRNKnSs7hpO4$OrHL zW+kqxL-K@a+H}eC?S3q?lPCA0=1M*no#;XVz8041+G^Ns=WtY8s%mQBFMC~$1zaXZ z;49ieS5@t>I%=JD^{|7k)HT#Kuow0>T;%HNce}uMWBuNtJ-F+sX9)Z&`fNK#M)wZ& z_3};Y$WULIW$K_dwRXQr!$X$|@Nz+S^&@Nd!^}Oe<_VK`a99@^*mSQS_E1V=Z<*XJ zmIFxdiT;wazlQb z$qF3G)?0DrNdy})rgUDY%Vk4mK0CM-JxkRhd!MG+xLMWr(qi@n8oDQEgL43Sl(wkl zybIBr=zVx;7g6U~dY-Gj4)wkcwKH9_TIq{vCgKdcf~=)cUnTE_rT zYuPVVQ*+%vPymOpVd!IM`~e{hgM8YCu%X1hZ@n*>#bMXV9rK2haR^hl79XJ9Hb~{Ux=zX zegw0JLO2_|>w?#6yTKtTe)F*t?n5gM9k-uonwmNq-P^@)x(sI4^!tzg?@3QksIv_Svc_{B}BM{4+OcT5pdQ^388fhn{?U(m_+x6Y-xDfmbE9dm~ik z_{u|26;IGr-#UIdH3liUhm2F_Ldi9AD7j}=L+5;K5vAaVpHP2<@#;auK3;{t^c8hK zmfblnfB|R!Q5dr_Z~%PFu$e($hY;%tpHRQjV&13O8y`j9AuY<47swmz{uY1;vSI*o z7`^!+g&il65%~pr)6%t+>&~TMZ^M+%+E-QsRW$d%C@0E9I>n`a)Wo`=tk`cnU~*Fo zc}%@R3ojw7TGVeSx2a#@%0)<@dC`9d+=;lS*GyA(S}a+@c0NT@@YK>jnmy&EQ+1by zH3XVmS~cv5xDYAjE~dGvv!mWsNWCx-AWf%fF_<;q@I{nkkd!EEdaJ~*D0BM}WmOFh zD{L)na9ZFGkYv@>=OD>84vy>{7&}u*w&KxOOd=zKB~1*Ah-| zjrmW|7#4CHOZHP+D>hJG3G4!sJ%}celhH{Xx6!D3Gqgi(GJ&zCbxUzNyAVXkghsFl zx$|<6&xY5uNb~5_{i>u`7OzQP`kcB>-};=&Gw(ybtZ6x6MJl&2ek$Ucmc?GE?hgR- zK?Y=lJ|&(BjPJ0L>uDf~4dxsAnK#rAB5Rse9>ahQB$T>NP8?SGdZ0LT)F=K~;xs$s zf+~iwYmSQeA=q?yBkU~?_ndki&K*g!-K_I@L-}>;g6{pG{tEo3|1t6udeYO8m zH8macDlADH)Lv}aJNyQZU%`jGzouq*mfZcNXDjpyd%`Zb0PCw)%oD7IsCs!4 z&#UA20M3ItnTwxOn7!<5UN5atuR|OK{W$h+G4#&e={Mp;&xX0OM2#JOgcY1nedBzLG!uqvsz(TfZ%N3$LdA%P|>8z=<*40$iIV=um9SF^;s&kQ*t)K}Gjdk^R z^tyY7ELV2-47fX3_e0TsM7#SR|D9wy33X@dd47euKmF9{Y`~h<)>u#xt+B&4f^(4S zJ6(N4dk4={s-F+MJXUoveu#b=$70pZaCpl5@zN7xeYbABe#nn*bs8<|dF}XFB2hnj)LCj|qy~K? z(0C%vJc}xle;4>Hs==5_Rduj2(@_ia$zEG^4zp-S#~_4&IMZ3w4)esAMG!jYB*AzfO9@rVLWD zF}MgCgV0h{0aibgHZ?V!{pR0-;Qg=LYEO&+aL}|;b0Bqbc zZK9Y%C-&kMB81}=hfZ`HFH_h=-Bf?U9WOJ{X;|4=F|y~cI^ll)szWDM9O}?*LO>m4 z4T>47L$eQL^P7E=ixUGk`{dv8uUsHvEi6&Y0cXQHrS7W^b$D9@R=@duGlg5y-t|l2 zV}4+c1ERkHc&M&{pl`_as?UY%tsCueoiTxL7)mkuSBXJjDU0aD=Sj&-Wo0yr3EGlO z_lwz+xQq=34i?1?=aT}x`XPc2EiC%2pkJYo^+VRg>ax>*bv(puvNW-|S79wdvAHS_ z!d#3yGySL6`X@ahsZadNRsZb%7x0LKKc|DYJav<@8HQhVkFpthg8nuXCIlpSLF`R` z6F3EBYh5zzK(fHibOw1=yq4dU0>p^5nVM!ES^nmC%oMc#ntKDMpt@Rw$4)0Kk2uk~ zbZ*Nduzs@s3>QaQ0o5;M;pPW?zDwdWg()VTSzR8B!J^xUk}CK)2ZOg-7PAdZL954z zk`Q!m1*X{SyWtG&G`)4)F4Og2g74|I6?Wjjd*u`<4%s?pp z4ua{~EbMl|oZqgjDxJ8g6pDaK;fwuNEPC|^zDwm0>A@5K;RoIovwrviG$0mKfDoy_ z<{N-T1zI^Aa^Q~;SpkTYluvwG48}2=Xth0_<#r0^Ic(g?=Oz_%6DtJkog!jv1V%=& zv0Nank+DJGl>_h2Y8QjiEJ3fAgfx)~EM@4I$axkkUWIJBE9E&*$qG#M%{2UVeBHE? zOm)qiuVd)BiLcLRsM^lgIuMfCd<5t}t$XbO$4C=rl~SeI&f8Q z$UKT+H9Vf@RWcJ>2Itw#39Fzl!7>T`NfnKUQ8#GcwV?8k6Ac_R^nK6D5?Zmp5axM{iMB^uup$6KG#I)E-yIacM zd&NX+QgexSl*m{ijbEGDMO~W5dExmq1ZbbdgysjNF{-ainbPZKuQtgfF+7BG565tx z$UUFRZ_MV_=QA}Iu_{;k_7ke4iXXCx+{&sR!*v&o3a*EBf*Pm1#c_n-9@<+28zp=H zJ0`2FkhgA?t>iYsBWn(=BXrsgLE!6 zL!>R{8R8l?aOMRRJ+D*=Sg7CzBZHQN2%=t~;$uNFVe;LUWZH%V@Cl^j0%0v)$@7h~ z16!gO3TqLnid^ucX8q#&Dg}ZW&N0%lM78jw`3;Z^tNQ_p+{%~k29X;L<7TiOVJP7& z?AHLHxoDPG0R0#e#h0cfEK?#g`E;h;oJR;R79OBkUdqFPG>reY2Cr3)ZYZ;sLJ3Ay zbQ0oUsO{(Q6b5B52rYbqzK-Jxr`|wwI`a*h(>V`6p&l3ju0nzbXR#yv0YCH8*O2MU z`1HU`to}=2rV75cHB(*Cb&uMI+7bFT6BmmebNXu^_YAJVs}&unxzW!eRU%mu$1zV! z<~)P*TyAF}=cUZ^$QQ*VxuNxCFeVXHRrnM>A?{D{JYuo}mdV!^22rwXm!(jM{$_Y@ zvgdbZuL0)!680)Cm<(+f!0$+wm4o(aYH44jY&y@;p1~@qNV`A#gxTrjD_=}r-@?9Ij@AbVL~>6taLSW2C5yf zI>n(|KyuA$xZD(?9>fpnB|$rCPc;dy68lk8?L>KtU_lkl6Hf$4Vmpbj!xy-%_&=UH#hl{}scg|8DJEaPh%|E`+n z<}lFyZjj7qQ$}dYd(EMIWa6~=j#c1J3Ch-1!gnbEca07c$y)egBPqgmBCRmI^43S#&C0Y8fmFS^-WYtcK{mP!d7|gFeG2=wT51C2wE>S3$qe zzJn&bLZ!fbT!`B+pybUfO%o!7Njri$xp*?73!T)+umy-sEuP6I@hP(Wq;a0bXia>$ zii zo$&7M@MiR6>V$5`5^TVLjMmI&UQ1@ip22z6YrX1?dEC09OKAD4oY@(f*ASthlv3@1 z(F#nXE(R82!mPmNFiF5nv3JNc&Ay0gpT{*5?PD8g&FI`luH(%Z)*sx zQ&c3-9VRhCB}Y+D%2+Hm!i;*1!ZE5s^>MAju+kXw6B}tv10ibx1JV^JCkqKYKqt+8 zUZ#P>bw#rwKo1y*Qm;W5SF(t^3D8FGA#%~<8oxx-B^@e_DQiCsiG}lJ@2Y7Q^cIj8 zdq6{ulMAB~7Xk1whBHuZi#!@r0h6|g`$9SBbLnjp6j?7ULt1*yydFwg4(&9i$Pxy4 zdX!?|iO;tZexLr&`w2TH{x@>&=|Dl@ySL6545-^Avw`GTjO5oBGx&baEkwcjEW3*s zPg`rAP$SU~)kSrr(;RdPG_&7=N#1_cB)?>mM(iSn62ns?9-hLKd>2olezubG{an6J zP#BH#yjk-0klEJ*6)P#F@0h8TsYuok1dEDEM6D^Hki8J5^7VvdUc|)Y@ z6~0WmUm0IpXURP0P?zOjjXmB zVLg2&=2xGe)z-d|VhRW$MviFE8!^S*OA|1KWn1PkmiRCeFcooL%Al+KwLW#<#`mlF zx`D4(wh*nXVa9g>XrKhGd}5A*K?_V8Uwv(H798V8j+$VR2roHpBZ}D=?vSKqMjSUo zn>f=^_Zn@Wp_QP07^AGqj0yr*zSAi?j%a2XGvPAMD_Jnx`TJ_s(VA8d>Mdfy@Nvfg!Wb8Mg4O5{J0C@C9TRl$s5FZuFrrOM$M@&?lILz>?XvnZX3t26F{` z4WKn!HDCyL!Y*qIkhAf^uxt_?zNX`3o($;|>it?aPX;m-gNY3|j-dp^L8lscSt=>a zCXy@3ds7YvZ~kX!7qs8tJ;EdfVhh+wg4Sb7V+n_l8^>n1w)OVl&Cda*fiI2M%u8a- zK;*m#A}xifabQ1wX%3|>Bn6W}CP)X|I~MLJLd~)Fh^2-T#9X2L!aJ5CC~B zrWR8T6f83a=s%gXlo-zA-X(gKQ)be6-16xInQCRSisi= z>WDSKYjf} z3i-KW7NJ?7HWWQVt7s(GGZA9~@C;T2t+(bb$Q?X$PVVlvo$g27yWZ z-BaG9CCH4IX(05IiXT6qo|CNw72Gh#mx*NSIB#NmY=<&7;z}H%T0ax?oH)*6x!8R= zzxA0bb3^8LYvZrXk(grd^`lVV2_W+%W)+-!YqlzESk<|;li;%impQ$s zEr+r`ArJ{_k^^1nM=jv#8P8U@lzRzmNld6w?TF&*pzpyuY%qwXo@3E03rO*7B~5vf zL|!Ie=ibw+25%W(7c;=C;2hUv(4t2Nwzt6mBXsdukW+5}MF>ngi|cf~h+7p2=OIQ4 z;p!SIePXi`_s0J}i7?}CFS{NSUpQl<=*OtrWL-XmuYvd!iIA&G#T{iPrYB1oLYAUI z3)0g~+k)3#peGCYnoP+?IIzt?dbomXFcjHcAlAl&XURy8hh)>PD14)_b}Ti5rRFJg z0-26aSbwq!xAN2Bv}4BUD0qsa<+5gXziUh#32eLgl1nYk<0Hdkmgarwxw>{jfuIE{!g&?EX zMlG<9Eb!gQB_IF{v8e-OMj+zgGlzoWXxwuc$rKzTAdQPav|W*G5RSvaU;oprw&CVg zCUr?19HT&q!nCxX_-q36&@{fz;_E!-p@qzk%eYYMg!;J=7?uq~jr{yt=HrcEsY7#% zS}oEp@IILB_TaC>F`8#8HtX`+OoJ~Ck`2+)kW_9!Rxqg#7S`jIv9-4Bha|~mr=flC z6RJhkmyn)^9-KB7IxY|j7&h=i*jEyK&*#D81|Bt7tN53TB_87qsMZ295QBKoRb`)P+jr|_FP>_>He&4a`gai& z$r!$EEuCp|&$L3Anq%oJ56!godV-P;sJnah@5%_~LJ^A)ULY4l$K0NkO+0bT0TX6! zRHK>ZjWf{nN zW6dXg7nL9FV_-|+>-5{mYLc^rAf<&70~y%VzIK+ufuXL9Tb?mli9}NSvIyB2f@%;h zg5#vjerlBoKFdiqG7fQUL`h;JN;>DY&<7ZT9rk#`J8;=0NcA^~lW*ka%Jd zj?rlG8s7C0vkfR=B~Y8mQpPwaP_`laM#VyAWdo8koaAUN(^MnVloy);DL^X}u(1aj z0t6R;sqYCX`29@lN)OELnYPWI;FIs4+FbDD6rK9cTw-h=@PW-ip5Xd_n`zst=DOc` z4&Lg4BZ%q;%^SXSLB!Kq_UNTuN2awr?x_N9aq)g?aXGvNlf7AGu(W@Tnl-2+2$l$W zYdKvB|Mb-ejz&$~%!bF^PX1 zZ3Y0H?{LU!2tr%=@DnEFa;7*)7}|Ur;kVu%vbqz@O@Md}I2S&lDx}F;XCg~*ac|CH zoGjiA%iexM{h*9~g`Ai2 zec2!|Z0d6EIv7T5uOY(Ew%3HcbHE>X?>R4A1G2>y8>+Z0T*G!Oc>iL!N}(fZ2#p|o z3gL-A1p*$mhzEme5c+(+qe&C=BC*R#*a7k#rp#1G;) zA3D-7TFTssnNT&*Hv!As5ntw3!+nuJ^kO(}ECYyVOk*(`$i5|!nn?_p)6!@*X2P#9 zPnZk6ROI8IWB!7K8rb9jABPSiY$04ruKLp-X5N@i~coih`vjK-3OQ$*kk2 z1D3{wC&ugGi64SZ^npJ{z$u>jTMEo}OqrbLGXJtL;3{fXUu$JN zDwTK8^HuxlJvBTk7pNEyI1)`7u3(~|!GCCY2s!qXS*>M*Ib61{zTmsi;%icncqU@R zsVt=_WMc^{fh-y)sJg2;_cBGmWJ3=c+(ip)28KE?Y=LsaVAj%+!ZZSvK0ZRrqdvg`_4CAV_!e1ohR^_({WqQE554Z(`nz~MfVW0N36fwLI`TgF8;cgpxA zOsKc%r&VX>Qt`6uIRCXi^}sSVreukcNA3PWgHI=GO926O;+CH@CAoem#WaEuY`U1U zdypwZ4))H54#t$%ORG-;sEYZ1Sub^6KoHK9}c?)>vqAhit`2s4S z(}`QtL{`Ag6O?WB0yWo43rYFNMNp)|bK2T2AM5@GTrBH{pkq(@TE*6{z-xweTp# zK24p823@>t@~gAZ;=OrSPJJ~5&PKTR9e@H*r|6kC=Itid&GqkfKm5h9$<+b}GMO#d zge89Xx<3pcJ4_N*ER&gYE*PvZ6>?t8GDP1f#rK{3Ui8z)T|a0%asj&*J3M=LVv{#xggW60n*rXX<`AtBzC%F~q6Pv#` z5R}9hInbf@8al8Rw?nk_&whxr)G#@LwOOZAneJ>$K8z-&&6?K_Js~$<2-9ydF;{H3 zIRKB0+)k}u)%Ja8dLQ+{xg1beH|K!5J~)HzPxqMYmvHcC==JviNYA;^Y@Gt1aMk+j*RChaSRo0k`dvzgDYL~ixp!RqC@#zkBWH64zd*+Z!8&pf6BA;A-ic;2LS8l1JBKB z+w$8?(c>4JJJ&I3>)e^S^jfy(tcTJuZKC^rxiF$V9Sjps4NMr8!#px(-F%!knE|K> zo@@r77M_L6m@g8iHHiY4{rhUJBH<_ zp-UoXT9pO|Xcm5l$|8AE9IC)O{!p+ez4K~wixVVwt^KIkuj+0BcOst>PY~BnAwZy| zcMxf2^L+tFa~vXAt8=n-p`P$q$k^5>MwGF0g?d{G@&QE^~$S0wz-#9DN&8ApD8dX$|F^hPl(iKCU}^8~Sq z;VqcZMoO;pM&!Yz&<2!YltgP4NQ9(=x_CaAq72|9Pl;|T7(0<;AEt3Gj#Rm9(2~Oy z)gqMIpBWf~O(}fABx3{hi9vss8f!`bpg57CV=9wL7Uy|9QbpX~<=hTCycH9%YV`d* zqG60m0ma^q;Q|9&(JU8NdTO!Qs(%)DJGhu2j}%i`$UqXk*vz_b) zyKX1TIPi~PCj&0J`76S1L;lOg>{i@Vraa+)xI$;TG=mq1f8qf+hE5^u$;#$~ne}j< zTIgr40_bt>P*4Hd#o#;68S@&#d`@FYw~^wXx{LTx<`!a&xqxXg6|l}DXOdU4h9Z8+ z=FNUIV~lX?H^gqs&_OwJT)IW z8&eU_)AA*xYumVctNEG^FhXkq?mx#)Q+!n|x}fdB;Alc*XDXzKqw6ye2NuNP{z{7=&PM-jg?6ljWmWZlAnmX`%Z8_YX%}( z{`4~@VwR`m#S%U&rHgP^&PtkF7AA@U_%)^yzK<2~8b&AqqYN2U7cv!BN^!eKmr^gT z6#jqy9k@~e78@)AWVTVne2t*Wk=@k9_^?KX&c%B9Vz9A%P)ZEt+IL>czLGRnU9xz7 z(moT!3Vaw63VuT=7P#QM-%VoSqqESUc7xUg-4d9cBMU%_QO(nF+jJgzIt7vWot22g)xc$J1Sq;6O4HzYj-H8q(s07wcn8WMK*Nbh!pT}fRf^sohi7RME zE5&(ZjkK~l_<+f`L%i)I+8xHi!zA&2MP_82Pt=&5M&oJ$QHE(5(^)CgmzA&43E$hd z165qx;5hOE%J&;)gP zGAsPz<0ae&c^9S<&MTk^@onj;m_Ha%F_f>IM+h%zyG;n)(SH3k3# zCUm)?Hsu3MHy~{o(`+>7aa@aJ&eIswXTl7@l*{*bDxCsVbd;2Bi$}vKT8%DeOapfQ zI2b~cV1gA~Oku08Re4lnj>=;`^M=ZIXqDO?_~)APfXg(%EetqiEU3>3=K2V&@yMD^ z3iIbI)~s+rluS`@GCAo{XDaRj+aVK}MXBk!S4`|mdPNs5toKM9XFLZJQx4~%7nSfe zo>qscim&T-9& z!C4K>WPESqlqc-jy*b4S z$8!Mr8B#N>8HW@||3R9Eah#_#tJ|7vq_i;lF06S%eNi+^8df>qxAFA`Ab@OOTc(v= z0R@#%u<%U7J13e85;!ErxGa8gE*EIw0*d&4xn3ap%y<J9H$W$N)oSt9Qp#`kI+~K1yB=Ts%hbh*R}h*Jqd@jO zy{f7f_%$Znm4Im&Dr!2PP)r3rYM^@5Py=OORtgjz!rvLTB(q`2z!UTMfK>qhH;5uo zzX9<9%d?VBSja54^j@+9n8^VdD#mDDBqJc~W(EFdNQLkT>Hu*_7v)#B7|52X?01Q4 z=I4{3E9Qw-!Pk|qQ`Mc!UF-OIfF-gVs)sz+WYalQShSEi+6q-P#zJ2)XA08~W@j;w z&K1?o!2Q$!K3z#G<7+ygo%~u2LvJ7iX0UKz>yaPg+Cm^|gz>X=V32M8Bm4~Y1_R_? z%;8nO^!F!gP2p8~y4-M1fkS6$aFc~s>q+pkply1)CZ%6BwesB$?@)$2?; zaLE4cqm%xv&70dj!8hM8vT|Hs9=d$$NKnm9OD89feDJGla0P5~`VSDzpl(j5ln2x+ zAOtZiOrzJ7j>!I&s&w?rH7ZZKg7S?2Riv&hsryx4#6e-oF1M*`>z%~FYHV5R+RrJZ zheIb|BWLP_8Oq6Y#3f8jqFHYF(&tQ*HewA(Tu8C5eJW3^ARRMp;IGtm7W0*Y^Jt_> zA0R$sWA&%{iNor-`Wy39zB=V|Dqjz!V3HGHQ3o`i06RW)H1TI|LqGd9Bb~uc@)@5Y zC8z^yaJR!6oIbvYk`M`v^VbfOKgQ+aguGAxt>LU8Ka}sxKb*QR`FPyoH(?J|V`B&S zn#64b7)6UJCSsKe8&BdoD6hSk9ZROBlaI$Qehs-QhPSqxd(O_iu15&TrL}AQf+mxk|uq4^_^@u^xBZ2KezJ_)n zdqV#XqD!4|47EGTOhYLKLNUkT>M{l(^j-%?Jq(k89SNZ11T1E#Ml#^?lx+Bs)3Y*J z@6Xx$gnC>4C8XysV?dPFK)$!B~)GRrn!NlZ&xicL?{~3Hw zEZh+t#7iYSKh_xV&EjyX8cbR|iYfcY5u>4X~pnNP~sxYuTg3 zG|M59efLmaabJnw=nV7Z!<&8oYfoXJVI`;j{d4gm*0}GNFo3;y7xzmQTyb88| zz|J)aXZc#6slOxHG#$qQFjH6=$o${yRdow$DKGhcx4N!;wO!>^M}MjEhGmpD^K~0v zqp6#GqtM`uyTp_yBWXP;A&DljC$Tq|ej!o4Qa8}_>^493r{Ab=<5>k$dL)ofJq+Aj z=^x8cIFsJ`f%;VjHzSXKT|WI|b>Getz>6W`$VA5c$H``sDhc6BjR>YNIDrjMr*bvnifzfFfC&`lC?fu(rp5UR_O_S=r&)b zFN{<$fC{^RIP{?=h};MA&@^$Gs(oW3p5dV*FjBbb&tS_^0cm9{&;%ymjdQp|9M>=5 zxZH&(0ovFI#~A_7G3iR&F@jc37Z}AWzzGzV4nkB0!$3_!ruwk(G@@lrShSj&I;g!m zz1k0~HEoq*CATb%z0&V?W>+pJM@(|b`dHP zGM4kTmhU$QAe-YTz=ZL!9acYepVG(FU^|zX7p#`B9xuC9;+v5KU>dO5LSnJz@^b|| z9gCaQW10kQ^kcncT`u8wCR8EhEJQ3*Lx?$Pf?k`}MXR&foagf@zwDSU-$V;OHqH?m zsQ4}lW1@!vYND_QBF1*(bpEy%AU21louL`|(8|f_lmBsa(i8e21Q~G+^?J0Q{Mx+_ z)`3$1TY19ozkd1;UHfM)4~9*iv3Fbt3$GUzo!at+yMNHHcmVPNSa2QNS2wdotAZ8R z^v3;Qv{Zs9`*w;$ayaPsWwf^1PXfvl^!ri@nvjhKHHuU6`v29Vda|_+zB)9sIRuQL z{5uS)FkQ0yJ7{~urcS>#kHxztF#8+61155HxS5P28Cu6OG)$gloezi|lZ4?ZV1=e= zLfzKN-X#HHW6i#0ER^^{qev*+S;Cvk%Qv8s{Zrj!^@I8s}3h zMcXOhhM5~eitb_r)e9t&m3iRFf^5ewfzFG$d8MiILZF?PB0#&tR2RG!9FoCf0DrUs z+y?AZ)7c-a*2(4%^N>w#;ADeJ$C`(nx*1B-A`{7U8wc_7F(v=_29;-WZu!lix-RB* zii+QVQ(Zf+ro54_hhgM*gL;OabZ&VQs%b!~&~6)O#llr!)fNm6m~deblZ1SfNHS@R zg|nU~Ei&&h^_W(~q+8B9wx1#ohn)A8udT8gq_xv(J`H5P3M8_UFA?!1FuWY%hk>v# zS>bJ%r~-As-gX20R;rRG;C&;);6plpgN#wiT-td<3OiUG2u9#uYiZO5%hivehA#%^(;P5>qalRpfxWVxBJ615#7-8TFt#biJV_>}#3-T&RQ569!V{u(P%P%6Oz4AE@4aGD zqkSiB?3ZbDlR!3OO6Tirmco_?sTP9JDw@?}nw43b!$}U4wRaQ5TEW*iS(Wjg%`@4` zppWCe9F`uZ4luItqgG6MV2#(8CHgz1D;Gzt8zw#RHmq0p1l2B%8L_zU`JUsD%apK; zjRO(@*vi+=2k4#XJ&kE)F7eSd-1n{5{Yu^6I75PAE5C31;}lxwBH#g-cCo3YgYzsk zw`i$w5Et&CKPdFF%mu}hRUiE*3Ht~d>9>!fSAPH$v*a;T1dE{TDNnrbehMeVa^HN_ zOk0~rd-el`3iH)6FaX7?5K;rl*rAce6c>6HxAXaqn2?>(zR`!4KSkt;4OtINi;go^ z79I#acO@P&vlxwndar>_78Ym7tY}_wk{#x9G)4x)&FnX5Nb@;g#?qyXb1TD82M<{t z4`n0h`8zfjN4oBSCFw=H1K>S}(pQ}KIWoRuz$zoW4WGxP+ zuqWcq`kA&%V6Fbw^c#fi_=~e#?m)%{qYsMzBRfoN1$doGvbP&1o4S^s6oWEtH&aU| zqs(4r9H-Sz{0)Q*BgU3^F$N4bkx7kV}W4g92Nr#(i*7 zYoq=mE2SG`)o4A+1|VKsv#!3yymTNkP^Jt*Crq+$DwTOp7B3OxvTU^Q{bfvGIe|jxZ>$*ja%)eaDawnEV=3v^c)G@#`VL)Uma?)C53Z-)R{1Nj#*>9|Jq6y^^=uHxA2H^TsL)g~ANcsLJ;D@$Cy2H&#(# z{v}6(pV?Ce4q~&#_m2Q~^WWlwLC048g~?=wA&$P^e(U6s55vBCDSDT6#HJ!|^#5xm z6oJ%n)&}V<_a_zA*_GQM#9M;?n8^GXz!#W&mkKi;Q@6D|#sJGWFC8b=u$;{%cBbGO zrkn;wC@UG&wXmAh28W$u+R8aDDPp{_`K8@`iNOc4@rw|JVWzFbEaq5`Jxd-6lOK`3 zL3zTj^-0LUKrBvp?iVH#D1&z(t1x)JFc6sVpgZS-xhMG0A~hZ;k;%+r9}c3r}>*;@tnw8L`F3tkmx;_!u5dhi*p zumqx(%_f8iaRJ06j!QwT%&+>%c^?T+laNW}Jd1P7N;0;|Iq?iajaauxm5VhcfhuuZ zy)lbq_K21}Ulblw)E!d27V^xt?W6)+c*HZWy!@E)0QWIf@BWDN5zRmMH(@D_btnSOYYr+p{T;!y`Z00W( zu2vBnOXYZ1M+Yf^_4$;qU>4kLC6v34;n^l;)m!;_Kb9z9&~<8twBX*{Jryu&pSZ~U zheP&coZ*7&?IC+I0U|zrz-$Nr7KBN3b_~&pffeSBkqifgU~H@qq80cQULmW!ND$3v zK7>J@b7BuqdjX7UY3=rq<6m2ZgU=3!9KUO(&G7d1M0`CF2F?N!++b|tofOGXKbCVr z2ua6S_vicBg`~@O>MlUazy%$I=h`C_qa>%LNH>b}A6ly57tm?*b|}2-j66r-UEa^n zH@|tFqEVWirMqFf+ju+jAebX29>k3h1zdkkeDSCs0~E_&bKcZUMW7i3?SmH+ z4@(1mL4E=jC)OS!I8R`qk{m;f8xMk#V~rCUy;g9!0iww1OV48@9`OJ_G){uOC4NcK zX`p4m$g&G8AjDd*`0xp;gfMW?p3XK@v2QTURd*3vTgU8c<6~6b`7i*Ob})OpfFZ%9 zobPT?c9`J#!bbZzc2F<^KSq+d?(`nB<9*Mh3JtkMo7s5Pt$maE5Y_)Wpt`uP&ur=j z1xW3tS`<9LdCM~JJ1f6BAOy5CFXpz}~S z!wRv92ZjCWpuQ6$pEg&;-E-N(&R>oI*2$(LCm`G@0E@G8{(|7d%K58(!viJ?3xg|6 z(MyOD;x~~|PolqNKc>Fc3i$g{w)a;u#W-0bY+x9&lA&`e8`Cx?kbU(0XK5UKpgCxZ zrtQ*nHZ?GCjIL*hVBc6F7}Ep1mL0D^UwndFb7*Ee*kb?re&rgHf9n+|z&ix3e1WXf zp3YxHxjlhs#R)Bl5=>pp6eS2)Jgj(OO6I{y-=T#4q!K;Ru zb1jG{z)#ry@JaSiwECjF1l{e}113F1UqOzefscNVmcf#F0_qEy`-uSaSeO;EY9vdS zQWl&C{xZ0!w>Z5{wz`9Ckb$}i7C;p-;W9p^3I@>*eor0eOB<; zf?s~+bfYESJ%Nq9H~jI%pWHJ3*vpRH5HoL8J8{A1&$Ie0YdIB(+L;begjW6)jb>`n_6ZIFYV z3Z~G`X0Yh$brN@R2|Jm@tG21k7c-emExgE3$aN?I{U1{WQ<#;nt9hNNfv4VTR>#-! z6l;B*Ob?ql-^P|W3|~14wME-7Y}$c;zDNd+to+^{+VE)rb3-Y%K=vjIINPz{- zQl2G=b|SyDy-%pl$Zn=SDY%=Mk!-TCF~P{@iUP$}B(9CJiX9Gl{(4xtcbc~nGi%Etzf z8JNyz$;Eyh0jwDL-db zoeuGw{mnHe_|wn7ejVam@ll!T17~lZpm(;To)z@Ywz(V*hHc}VVGAUd1+HPA@f3so zHS>+xB@aKLC2>!K6(yO#l#Cap85e#}B{peAdMm`P>mn$pD z{4%FLV41TC7>NOR=g6D`gzeLwr@qcwLVz~!S-M~Bq&`~SO7|ViW*V5iui`OT$C@k7 z4_f#^EGB0>0h-jc)&JR+vfF*!i5P7tLlB?|IMBrKGeXFLfP>9t%2tNv6O0Ph27$*0 zD8@gU&+s@*T0jHI_21R%1$r;k{?Bfig02n!(znfHF?APg=K0n2zxKn*OgKRIMOfJP zzag-h$-e(r%-m?^c&zV44H3t|K$Mtte`Zzz^pn+?lP%*}Tz)>yS_zw9!yv1X^|IAl z2*kBMNFZYK1_E*Cv2)r^vJYz)@2C5<0LH|T7j+1~o{LlWrC&9s`Xq31G(Xy=mkVEZ-Cb^iV{_Bt+JmHjnuX~x;Q8fo>%P0ClEPA2i<({zYJ7C#t0#+;4Pw*ogt}uxU zw48;V1wRAZjVCPgx>>CXjBQeHLjgEbcMEjdz$CU0UmGv<{^799>p@#AY&Rb)yW}zT zGcD={S_+S6I!Hc7<0&CTa~Z{ery;m4P;`jhXh{tq5I;^3HE7kRypEn^Fc8J;B)*xd zlEmyr0uN`gDaiuA##GE~r<||td|jnr6s@Z3ekZsJ2-1<454wO!_w9mO=Yl?ItWJh8 z8ANvwJda}{PG+q$gRjZbrW}dE6j1{}(lAB%z9XLBmBM+(2{OXx@pS>%fK+Q@h3cou3;wKz)X7OernAs zpa@hG{4wbzWuH4kCVhBGDR{JeY)l$=rWC+jF%bsqK#?spqhh(436GGeD?OWJR1Pzi z^(b0^#L)5OQx5$)zOV9O{r=`_Xa{VmI5SWc+F|<`=c^~Q!wyrn`mQ!Jh-0uM>#gxOl9?lgIa_8s znMLw=Y8SCpwt}&Ml|dLqJM6@Xtem>rv_eB32NFsTzz=Lm1Ds@-YR**7oDOv%ro+_G zMav0hxn#%{fS;h==&%BgsG8Z>q)vHFcnl8*{-2D;LT|FHJY@HTcCLhm2C&5&o?M~S zR0YYP+f1`vo$VEK^?rC$0D*_qn|xQEJfSz`Q+-whRv&?y3MHb+-VaX1p)^SI&jA%f zp1VCDsCawGa}9vK#>~e>2|^Rs%GgHFf$K_JO|NZ0)u?sb5_<< zMf<}&N$AI!1B}xI;t2KV?z7_eiQb`@(wNW3P+ATtB_#7G<;-T(h9p`+GR&&UYi zC7q`{Q9tVf$)l{Ix_Q7?76H#+Jn-3iV3)~ZK>V!5*IB~4$dSx^&MQh* zJ6ZOej}e8|vewkdOkfq8c3O^+(s(KGUOXiPm#^{A>)l?qy^x37L1vutCo?2CgRo@@ z8SAUnb|{?`&4-0}M9{-gr*l|S?uDL^ha=$>M`#4_Pfo(j=i6YYyU~Ien14$EL@JtT zZLqUXbu5^yzw&FC=D6j~*z$N!vwqVRkBQXu$2@~sM@TyY!LL>4JF-smtOAFq-SvA&RJ~}7z+)> zHiCIZOfXqg64{cHHcK|}>_^2WN%bsc)uwWSuAQ$Eu&84NxsiEJGp}N|^2)yNxre3> z^h95rF>UUlsmX)diFZFctF<3ADaKq_B~d<}JLc zxScusPT<+wq59}{#K)8=!o|=E$aZa>xcs&`4f*zmKLkrYSSF06u+Uv)s!_6B8p}Ie zlPhQ}GI&gKdARdmq=uG&*$z_$cSIFed<|<07^DF!f)E|(^hclduFTYQeLtMPKsVt} zoKBOTFf9lt&dKe#;O83b={r{l6m{!-(TreJZgzx2kF7x^it zzTR2`_zj~TRtw!fXo5TtQF}@FAPB15*WWQ|;o$j79R#cbQ#^CE zq-J%g$=MmEbG|&O$G${kqgDxfdy&Wg;yYk{Sh%5c>jc||KEgT$RebC3XSIA7VPnz3 zSA~pa9+x~quv)@lWixN26TlEBAa7G{!s{OP@(?>mnQMQL3a()((Z~e0ngyY+tTh-d zSWhjx4EORn3S>QyWVx0ny!B67sCAEPjBYG(;tIWytul` zQf)`>d>VGuKJ31($K^J2Dq{a!mazXFeoAsUtAI&WRaIH498ToQr;#(;+N&xzm|3F1 z`Hj+u^ZS!(^?JkVm9%l5h7q?ryh}5fzNs|D^w0OxxY`EAfU7Oe8sz#_bqkla&ZjJ$ z*_+EkX1~o(Sq;@nj@DY7wb-)LmeuZ4n9l2^u&H}=Mju!RAW-m7k2Dm#hIwNE;d2H* zASUPM^S$83jR6!`jN5aI0W{l(k%K7u&-~h5AP(lx>!{qKhKD+p0fztF8s2F&I8W#V zcu`rOe#Ru@VxA#2P!7aP=kpXSKiH#2zJ!H7onnIriWW{yZ;JStbmb3!6G8O&?Th;S zDS;7Ryz^sH0wccoRWEpP;m`X%iAvzo=lt-)@ zeaUlhK+Y#ce~3T+bLvx*7N=8~anBfg(>;AWS}cx4|4?fXvfeP+9$5;?iuLVHRW;N&eC7w3eO%XcxIsUkTeOKi=;a^O^d6Oaf^C6p z8D&kc{Osjmx^Mb9R&&ff+S4&;Y3|=QJ~-06wa4Aj-Qn)Al&)AkKGM;(r^jvS?CEn2 ztt>eC{T~-tT-_@RE~?pT-#W6kr{C3f-DuCw>&|QMx^7QbLwCXIRZ%O(8{svB@D|JX z;K0yWko<{f^Z`%r1MOiE>Mxo>#>(=u_aJ90a-|Zf0wArq`_FC(;PV4Y! zpRKB)p}}T%*c^^Zc%pJ_-;ldwymDx)P`!iSvaV;WYt%J@1|$og#up`G3cF#|XT`ZW~q4Ec~kOF8v)N zdq)RUtGl~wJp(<1V0IaU_f#$Xf|34V_wZQ%@QD5%@Ak;osz#@4mH&50drtT3ty>rV z{ovrjO&N2yUIPQiWZ=~dslr%0TB3IJj1BJ{?doa02KuOQ!D_*Hb|A@`Xsg5J8dUv^ z-`R%7Y_9Hw>jls4UFaoy1APlj1%Hi$_m7{R=Cz6L-ipHmqJX*45uL*fC~< z2Ld9!_HBLoi~J6~+cwg-a9zgS>xTlOpY>qaT$pS&j<~z3VVbWU9_`Vq1w5vU+UD-I znV(P%RE%Ze3L?R^j=Ot?#(-Dpuf=YgLz6x7*y-Q6Q}y)1ucOgexXoBQw8i&~y7w*o zwh?~n^zXyzy70Tuw0!#atatScoMsmH;v*s$Ks0!Db|aG`iXKWz0JU`V8FyHm47ijO z8R-}u>!IokyJ4ZDzX402&ga*!T7!blvJJ!<-Cu$7#OE2k2KXLTOMb`5Xiu+ed=>n{ z>t}p>-k<4n_W!kaHL;NtSJ)0(mJksoTyhA4iixrUH0v4LRvulqxJK!;k?PXUX z5$fr#nQ6AC+v)CEugL|06eR~ZkVwfT3KGYhBISq>5=w658i`93PF!-yTmq+jud08l zYsQN`GsuIn4`aK!-m6#d)qC~o)$2Dmw(G_r=0#YS9M&Avp|}%4t4tDP(>}Yyf1$S@ zmxYp*f(gmWs}g0#ZeZ^1aa)p{f0QG37=k;d+Y^#AcA-TYitOPR;;~Fz5&6M^K?j8Z zms1+5^!XQJvNI3GsC%{pNOD%37K=KZ*}m1I&7O745Uv*YSl7p)5Eo%A@|ojVZqMcn ze(2twO9HJb##%*_5oQ+)alBURzZawhEM3!IQny|ah)}| z?U<}#dbpq!Y#CjZV89y`Htx_;D8io_ss2exxH3oMD`r_EoBT}7!K}neDy6g@QXtxa++#H6hblV}#37Oww zW~zGHltxmdiP^ro2*+6b>m{pjk6VzOMF!7=wG|d}dWH0&TvlVtXd1Vu#8@P{qo~zX zDav-D&Fiiih8k(dHEj1pcH%Z}7k&aVE<6}E$7A~)$Lc8Ni#ee%ZAcZ;U8a#t*;M%i z*SG6C4Yo$dQTPTjI3;Brdnchd|ERvnaKD;PyE(v7JnJK#nRDYzxo?257t*~<&*E^j zTaL@e)TC)NX>t)IdyL#%vUxN3Wi)Z}x20}H9jH|5n45M7s-;_)kyLA9UV_ZV5;NJt ziD^1yMp282os_PNd^0I4QXy@MC(C}b-41wL5Jy1*jke=%J`+-zFOB^aq|v5$vg~jA z{_PFv%4>9;2G++jqcaKx2xzj|wx0_b>?33#EJ4_r%+^0K`*g>55!E<_!conVoFwyl z-6jvTxt^?o3?=C_=!VLECk%T$<~}m@v1xnoiifVelaF>Evvg zm*UiJGQ9pZ5EOC&tSIn3oPWQ{vU0-a>C~w;MW>V_OB$#7is+KzH4LK!F(-PW1WC+{(g=%k^J$qLZa%R! z^}LA$Fei43X&yv;9aQPp$j6n2c-?T|h%kyoCVCltWe<_ByLcBi0`n;V7CNtTI%@h> z#G@$-c)`y+#iG~}XGn64>97!z5Qe(VQ){xqUNdr{X^9?B)NmyiVi!Vo$Sgf;FPV50T6iA|cp9eljIMBVgaf)xAi; z!<)!RqoX{i0L0d1=)lV}Vi)c}=<<5I5H>U{P{=`0p@ zcEcp{T&}oL){<>FNCT|8I1N8NXY<1PwK-#(w|7e$?5DlZ>|$CiTvhhG_F(#qY*DZZ zT5=<=f;gE}oQ-@eT51jl&)7{KAfOmV3~%|PxB${6B8EKuUTL9e+NO2xuLdAC%mE-Y7zm!2vv zREx#K23PP1nW#h2&=eilhE`ND&6h*&m5lT2iCA)61w=|-!AheDE${t+cP~N~`2VsWMi;HlQD>`-OQgu`>v(0qd~Ii8;bO$^3aaBritdmy z^suFAge%ik2^UIp7-W-N8{1C_Qrs;#=w? zp-}s(NW?V!VAuCuW78x9O#x2U!Kw(5C@QR}oNL@k0d6#^$(B{G8NHrkS4%5)#avlv z7M3gKVqu9dEf<<)e4x>;l$T12+*}km^RRiOS!R+%y0mOvDz_@-!lm+(Ram-IEEdeg z#l-^tD2oTcn;=zS^GMT78l#l-&6@IE^En!Z&08jll_XHw(*#u9*jKa5-uRN+h&lnM zcr2v_40)UfC!b6>pGGAC$(oX`SUkvLuWnr@2aY=C8$>s`v};O2D4Jy>-iE>JGxO>D zGnvB3l)Phq#&jJUE&(`$PdG8!?=$|5#H75CKD}T21Y2EY^OSSM=96?thJtiWI)$+LTa8U-7%Z+N(~H<;9Bxh5 zZws&#K!4d6AaDH%Uo`S2)nFO+WhHOV{QI$I25R1{46S+dznR&!`)A*H`-4Y*Ow}{) z`}7+hz5D9y-@pGjzL@&_mr{F-khW!wooiziG(%2T&ozUjrWxUF$;z8o$G}@!$W=-s ztXx*19f#U-VF7=67!~tNax&ccu?+dzVYsRvKAecND_^e{&RDG zd+X5@#r@P1@XtQ~(8oVh;k!<`UoZ0C2SW5QeAlV;uYK#CrlG=j9l&4Re(6bBnT@)h z7lZ|s{>J_T;p=JV2V`@pNK&fJe7l9>b`zHUnp{yM$_ODa9}8-T?5{|?TVt%$5J&20 z5PN@BtN^NKpIZS>eg2o;!zt?^Cr)yH@`Liq1yKwMHD#nom-|mN|7)KUi<7VjIj{6D zeCMP0|DpEmI?MeZ{d4wv3u@1cPxS{!8+|OoafBpISe~F*} E16m`K^Z)<= diff --git a/img/D-Glied.png b/img/DIN-Symbole/D-Glied.png similarity index 100% rename from img/D-Glied.png rename to img/DIN-Symbole/D-Glied.png diff --git a/img/DT-Glied.png b/img/DIN-Symbole/DT-Glied.png similarity index 100% rename from img/DT-Glied.png rename to img/DIN-Symbole/DT-Glied.png diff --git a/img/Differenzbilder.png b/img/DIN-Symbole/Differenzbilder.png similarity index 100% rename from img/Differenzbilder.png rename to img/DIN-Symbole/Differenzbilder.png diff --git a/img/Impulsfunktion.png b/img/DIN-Symbole/Impulsfunktion.png similarity index 100% rename from img/Impulsfunktion.png rename to img/DIN-Symbole/Impulsfunktion.png diff --git a/img/Integrator.png b/img/DIN-Symbole/Integrator.png similarity index 100% rename from img/Integrator.png rename to img/DIN-Symbole/Integrator.png diff --git a/img/Multiplizierer.png b/img/DIN-Symbole/Multiplizierer.png similarity index 100% rename from img/Multiplizierer.png rename to img/DIN-Symbole/Multiplizierer.png diff --git a/img/PT1-Glied.png b/img/DIN-Symbole/PT1-Glied.png similarity index 100% rename from img/PT1-Glied.png rename to img/DIN-Symbole/PT1-Glied.png diff --git a/img/PT2-Glied.png b/img/DIN-Symbole/PT2-Glied.png similarity index 100% rename from img/PT2-Glied.png rename to img/DIN-Symbole/PT2-Glied.png diff --git a/img/Proportionalglied.png b/img/DIN-Symbole/Proportionalglied.png similarity index 100% rename from img/Proportionalglied.png rename to img/DIN-Symbole/Proportionalglied.png diff --git a/img/Summierer.png b/img/DIN-Symbole/Summierer.png similarity index 100% rename from img/Summierer.png rename to img/DIN-Symbole/Summierer.png diff --git a/img/Totzeitglied.png b/img/DIN-Symbole/Totzeitglied.png similarity index 100% rename from img/Totzeitglied.png rename to img/DIN-Symbole/Totzeitglied.png diff --git a/img/Diverses/Regelstrecke.png b/img/Diverses/Regelstrecke.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9c724f05fcc4c742333a76f0a943e8ca6f3bc8 GIT binary patch literal 30454 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 literal 0 HcmV?d00001 diff --git a/img/Diverses/Steuerstrecke.png b/img/Diverses/Steuerstrecke.png new file mode 100644 index 0000000000000000000000000000000000000000..1a59b6b7b08841c6f4c446e4447adb4b4f95ac48 GIT binary patch literal 24350 zcmdSARd5_l*fl0*W@fOMnJi{zh7~iTC0Wdp1s1csvY43}EM{5E%*@LA{gTR`i=-+S zxyV%QZg16e&rJ72ea@LE6(wn81OfywFfe3U83{EoFh~qgdkYQ*^quCZA_4jVcTb%6qi1I*YyrLuJCy3L`OSAW1|v2`x7)7kHEQZV;tUA&3Y`pe(za+Dj;MfR zTTuCY%JO2de(6>1xjghya=SEim3H;H{kSk>F94_b?|>Wuenv(9JJe!>pwRyv`2SCh zB5u$bswW)*k#nyPyW{7-BPYxfE(0r~GAH>=idRddMn;R^n2n$Z>yI$l!LW@)P(?$> zVfZQ(ft-a-xOP;a3yplO-nv}J#Ll5FYF<)(BP^A2pSG|kScS5nZ#R9oRw*&M7+z-H zt@+H*^HuT%4h)K%=9?(#>!fG)t#PvujJFiaQd2C-prNBDf){R!)U(+t$4WYF#^LGy z<(@GdO#?4yo$tqF=|YUS#F1BMYb1TY{dM`8dUB) zgy~`P`}f690PVopjf>?ta#irZ>Y2&aaEb2y`BdH(ld zZ_b{K$p!ERjRuouZe8}p6_fWCzvwnXxLPGG?hdXEBo%Nt^GBOPsrnA9W`V~3GFTXo zB6UmQY#OvlIWS_cGE<3adzh3dGCHnO zv2W7AST@b&zaroz?74|FH1}H>onRa8kxP9>$Dd$>Lwoyd_b{@dEG`HTC?$K_@_RUH z=>0v0b?%moBtwU?Jo2lIw^oYdeh~P%e81l1`P`Sa)podgp~oF9drR}w!L7KF@EZr; z{!U4{WdhlD8wo~-*fYbAAoW7kERB|Se;lpcIGJe;d6X>IoNM{_4)52yqu1qbYZ^gR z;ov9_t;k5UP%EZ5EfUD-t_H5lGqtvX)6{>HIbN~jtl;%YI*u086B5{4=_+hKW=PPu z^3c27dg^lY;@0WLSW=W{hj3r)Y%7FEERScWhBaajfc5k9v#AZyEPl!tgTZt|OfSFO z%D==p<3CEs|NUvQR=sNSdTY(8Mbw+w-QMf*r?ut1abCH`%^5qzWj)T|U9fg>6*G5? z+iW7#6%KDZ_@=7dMVtDZP}v8S&{y+ohU4qj)^^l{@M(?XE{(mR5RPW+r!O>wW&PHyoPLm5VO$uTU zT-uGZp}#g}JQ`4Zg#aGp_Jvq6oebY#H8D{v*&WKm2V%w*_82eeElH5k>1`ed`ogp+ z)xnD(3agD9Qc{r?DA~%}qQ1*|%m7SCYqy%zlJThHQCP_9zI0(C0%{IXK*DdQi?HsbdbK7vCuylGgNh?%!6UfRPm3EnH1V2Si&!gp9)3U$@=_*Kqplh)164B6mYIqr+Ei=?pJC z3jEDsM4pN(MY)Q+56pVu{EF({qFW!N#aF2YnOli78>(Tmt~zxZ&giYi zirpjr3%o5*q$+y#qCWe)@j`RCQ>QKY6k0(PjVEHb zc~s^%l)egh@fSkF0F8*Z%NIVX0+f{)RpQ|-)nTB{{9pLXxXALhxP^^Zbn>YXdamp{ zCCjwqh}ldxt(`yDfax3pRsO#JqLFZhU<_n7VTXdTIc>l73>YozvTBl>FwKth5liQ?jlkEYi8c-P7`G8bAq5Y9TF8@vX z?3YFX975cT=j3-;OT_f7tW#Zk6~7eJCWlXKl?g$tW^-A=u@0%%fJV zQ`?aUIBi3vMj4R_HNFNIz7{ErROD=m4Ui3OJu}XG6WAsMj2)WJ$5KC4cHm$5-uG@X zT|UAl>gthQ%#Z(QSAgt1#A@c02tjz>bRv*U8DjfE_Rs0nyIZ2=o7JY7mN{`<|Jp?3 z>n7VJrG(zlrz+`2yoSez&^Jq!sy!D>W9>p-ipc0jSR@yI`4GVznKylUbSw!X?u+}; z?WnJ@@Zn$yWHX<^)8GpHj!gntL(Y25Fj^^Jpz+Z{@Z%MA`DZ3O$^T>_SGhoYJwK9} zS=+ioNc1NxXJ=+w>Vaf&<}}e_x~_6fcss}x6`LmNrCL588fV9K2+7z5I6gOsr6i_m zhV5=^gl`SR=zFcxExOd{V`eVfKS=w232hX0ghH$HkUv2thRfClq>I#YS3oQQzHa{X z{^4wlY1QDU3N>_smd)qF^h_pwo6DTJ(=UvXa>4rFG^AkG!lm=z1?DVl!qLSO^saJm z^_-d=?PHD7ts3mCl4h;S4iru9jO-|J40Vv?d5o({{e^ zqFGjf?f;x->X5sL?-UfsR5T8&Wk$cc!wYsuz=VZ4IizJBT*rI}5maIC60i5sj5X$i zzOPU+OM0cshD)2JR^{nnb2inwdjYm^mZ|eXR0+*57Ln}@X+qIf7_t6|z)>9Q(FrwK zs&-%t&eQt+ zR~WyoS_ztdCLWRG>t5HA4oX z;70+q&sBbF8m2rk<0x|m^>u%VyPy|Ad@iPvT z>LPzX7g8ztNlPMG3UuR=TFm~*_HC5}iG>)KL}KG=aL*L8_WAfzrCZczZwf2EJ&k22 z$cGq-V2*fS*x+0=h30>}GetFGD-Reja=Ahf<_;c=FjY<5C*p^)`<6os=U4RIV`H{t zp$yv=x9QEg9@b*nAzR2Fc}fAXutOewxwud_*=VM>#ZwsU5#*yq&hS`FCLzD>DP$!h z42GdU+r62a#S01tReC1RVmMbLQM$r!!5`5aQy|0Su_VE>5_0fWR|fx!>7Yb9U8Up$Uyp>uO{XICO>ZT=bPza0?Qzq7#nxiG4#s%9xEC|**1{QTq-kjfMP z75jI{G6XW-K0dt@6N-A26opQ@*E@sgXlVI<!7g&^(6xf7^IjE35)c zwEX40k<;VpIR&_}SxSOY06jo?2er`Ie}Z>h$#5v46`(~%Mr`?JO#LHrg9quSJeKtJ z&P$qF+;3Sw40NEIDtP)*0WJ!bUA)|ZS|&KVwsjDxvTuHWY>YP(5R_5%aKgU(5Ko_e zW#d!^4TmF=8!8=v-;zGb{!xt~ldeS?VHogfvYX^$oht;T4GDqf{Em&_krBMF|FE-_ z*)^LhA#t3}4Jn7*&n!BXPRQSZ6B%OLfe*m3FC{g@nBM@d~jU;ko?BaJ;mW(m& z4;hKny-y^WXSk(zaWv{m4Ar6E0Zqh3QpOVJGw&)VfJdp6L)HyyR96jx5H~qGCV0t2 zBfPmI0-D&r!74)_+pK~IF4`RC2*@V93>M_0H&wX77x9g=3AMuXCFRw>dvAP3SBi5Bg+3aZQF4$-um-8mh@z+h}YK;UJ@NwB9`h+DvEmJpEO3*WLQra_ga0^Se(!`nO1<$(g%}}J0j=?7926ZHKNNh*vzJ7iqyz zoNqMpt)Wr_7NA6x+bV9E4Xs;W;=DA4o8@&jTq^H(?bn{Gb6tlK&S(&V+|{KcSc7$; zVD~)<+t=j&JhY#Fv|z*>+^vX~x66mJ>Fh!Lt4v=~H`0)99YxFy&V$oh==rPCmX^-9 z#t?#;DRDH%lhDNwfx^&Q8rejAZqJ9B<}@4u2J=5X?_*K3v|N2G%)^l+jz{xNlrTQV z60`bP{C@&#y*`jCy5H2~WXN8q9*7V^{Eyj3Dw{p^qfWb$S$CSZ@q`WPkv=d5NJ`1Z zuwwnY?dAgdopzVV$ubC$rCPI9>8-Goo^!T3Kwg*^!%u{pmhjbUNy&QE6fM8NS3k11DHN5a;cx}1r5wa)yQ zf%1h3$QWT*?4}F$t={y&&LRwD&SBP{qoK8mnrt6;@^tUS`{&PvU6lsuyq=i)!J2Be z9WvW<8&V^t^aMU(@;2}#BvHBxicqmc5|4(eYGx4IMumxVp{hY$eJpx%l!cshCw-fR z$*V*zTDO`B!fVFgob*)g{(c4wVO^}sE{|as9@VH*953nl_(hkP+tb@l`4x`(->F8w zN-xFyWYCJlW=M^(ap=ZHz(f2!SwG-vxFT0;dy9W$n0ItfuviEF>g`pTlIHV&l5&VrUZHYR@-{s<)>GJW}D3`|;D zUIO@zHdpYajjVD}6vVL#m9H>aLy&AG~56H%X-uz zyp?MNO^ZYLK395$P9Z1!2g;p6c{Go~_0;(R&lridsLm%(-72!}15tgo#INY|_2SQe zs5i=!;yVK%y~4O$51ZtQqnF@(=o`f%;)!Q!0f6P<(67Le7=FXG8QHW&@bj##OFD?LOObVP{eZ_kEu;MTAFw~0G~1iz2hbinMft~jxv}6tzZLs8 zE2qzGa1QrEmy;`-jwIcJ>@if*b5eBWL`vE-bC&BP(LyoX%w%rJC~sH&<-f)p}dZ zEn0NsqMYD6zTuZX^B~rx2fpEivTuD+f+;sWI182|%>n1iMbfRa_QXN=CK&=1(MQQ& zF1Lc)=vQPy3?(j%<0ep{&Q6-8IwgEM5FX=+hJ}8z$+fkRZPOG~_To(MO&pMRKUX02 z%p~`!WbyS=@8gS@>(-IgA1qPt_@t*KagR2fXZ;#B4kGBiJtbGZ?2K%*jqylW%KzE* z$a#P!m~CtJu={d_umRKjOJt*3yC}?1+P?NA{M-wtz$j@H%DCDQyggpuWWhn;g0T#? z(+!z^%5)DEn{~!Go*$89hxE~YHXM)W##wCQZ-VM31K#R}2(MOijrcH=)=|?t3J$f9 z_kbGb_Hr_ybHf*MRoCdV;w%RAPE6W)WsN-1BWbGzo1>mJ$ia%P;d$ZQ#ARzNb z@9eVd?2S;2&ZpCWFtdqUB3Rgh&zYE~dV>@8pa0eDorp;t9UWT-2Q-!bBrIGaRY5^P zvji3rG&D3Lc_Q5n51ZO$}1`n!Ul$1uDPt7ne*}YL5>uXIvZE+Uz^y2a)S! zjtNfC7;Ox|gdPrtYXG>crQ_|p3@mY?f7z2wKZX^bkjEc;+iy-_IaJH1!HAfINpO|p zB@(eVNVP@g1*cqCgI`Do7evNnOO2KOkJ^6?D39yy>w7{Hm{Rq7Ks&i_a&ac0&>1vuHub!)r`QE)k6|m^&c0}VzGx`B|ABMLA093E1^mmH*KFe_W-9zQTN6=Eev6AytYEDQjTrVj#&s@)+JWKmlld_zL}IsOitjmVST%a z8Yvvo|Jzv1QWu4pG)IJjJcvhCH8YT-Uy#Ai86Dl9xjNx&An5nXSvR^tlKCeaF3Rqn z8~82NJ7vR8Cb3Q3J&%(+_2r)A?)dhcH(k91Us}QxY2puWOkma;Z@rHe9ks)YWfr%P z@jAk$*G;e8p$o6aH!Qi1%G&7O#1BbTz=8O@E=DM^A!c)0_$=w}A3netwSfE5Qp52+ zJ7=w1Kg#RIvYS7OtxOgGo+xqgyX8ctY(nI0s$v$m zY{Jf3cOa?H&0gZ7FzJ44;!{B%)mmjc)MJx}=r>AfCWoKy6Jn6gZ^I%k_tR)toNC+K zqZ}iKT^$XuS8~alduQL^9bc==4q#W<=~?235-b9TCr)mit+bW*BD>=-w-b^dZ}Y!J z{lYiwz#}5oAzC=Z9e9%#n3>R$wwNpiD4MqBC6ESLRU$w~k2g6fgB*5AYo?-qz%rCb$?LCKuIW6a}h@-^u|zM6A? zIy=W@)Pb~WvLf@__xz5?8Ijb%OP+GTMvmdpGxKi5r|g82-ZMtjixCx;n>$&wc3wj8 zEvc!MEk^+4uO=IH7!)ebFtoH%UM~|g1X`w6hU%?^GK=fg3Z= zWQcX<1~)il*fXjs2_!_wBrWeYtZjLMc+(VUJ?vWSsDfO{JCF6(w#<(vZ*IVNVu65n za=K($tPbnS750DGx>#>-8@3VpaWr3wxzcDyTdC>`WXfVR>d?`9RSO!hv$sC|&Mo|x z?dZxvq4EcrnT0WyAARFZ$RJp@R{v|3HA_NDn%BHk z=J~AVPqkrxN#QyYH<*A~Mdf%}hJbUrYS(?LRd~PB5}@&iPD)|_XfcS%|6dv9xl2(;?z>WUIxVwscPiCaFfWZ4_C7zkyE;xN_B zPkS2GTNNp6Uj|nDWqZ?i5M&_&4r_OAVB4xB&o7y7@bRP8F8ns`|7r?>p3w`VUO4+Y z#tw4~0Z`v&*8AK14Mt|ppQ`W^AMWrCrKZVK;uP3ikfSF)V9;aC<<|ewZt&FgV7?x3 z(gU>C{z6-admOU9ZAq0R(h!B|u%ZYBvy}aib z?BkXEApE1ZaL5^H;yk7+2X^bRRle4K+x*T!1KaR(G@(F0!E6r9sxvV^Q9Y1RUl=Sb z0ZA-5H@U`npP(ZBQvl}vHazOpSz~FDJyIt-PlLpBbAM3TZTDh+fK7Trwwx6xYiWNn zhXDDR8Dj(aYSOMQ(sJ<1Ldb=lC`@Bvn_t-26LPwQp`e5x#t;+OKU70BVwQrv$UW57 zFgK>uTkyBtQjuSaxkSStTtAJOTush54}$M@FSK?If?G>X7|jKTBVau$sef&=noIG^ zAJUIz^DkO|p*Q`15@kgm>6--Canbkby|YvqDzb99>`{+jybyYZBBrO6N4xsA&*=36 z)m%m#4f}w5906Zk4@8v!e2n%Lzx0mavU9E(JX48a9#O5{t{%Igb!-1P%kJWTYV!%q zwFU03bq<3N+fY4gi0@C5#4#hk6P)cXo!0|yvK@8YIMB9dPMTj!f2zWv3I<(cE95(q z#QS@NT(e8PKXA?0CVGE3Bl_Y_KL({2$PAb2)Lvrl2X zRWdM-p{3qQ@C4^i1gRfm&yA=EXj_A(xkWB0MFkr^=_k)_Fyx z#X}#=XY=oo=3c+%;*1r_u7)}Je3kx@$honkL`v<5>5?P;K^yKsEt?}=y)~cUCrNmf z;lWPgy;o)>&6jgEz6@a`sS))FXy~HJoe|gr3XYdN0U8v#kVwN@R=;gdB#+Z@=$o$e z_41Jj0V6xuLtgACvBuLv6@sa!?zmTdOFoqfIe*SFV`K{iz29%c%Oe;*(Lco-UyxPn z?ZI_UGe<@fJIxj6tMtHuG5i$GIn)aGT`>qc0;$sLL&&O?kxYnS5;m#mH_e$bm`e{P z?u`aDqx$fMpE_luM}eV0AKkaMM}($F2I%3H-C8p#%;oM!|E0I(2J7HU@wb{ogV>bf z2u-e75pVRDvRN-;L0y|M9ybnr~to7^5^VLgoPo}fkBUTRYqf< zmXB5h`Ioea1!=j>KVyDdxOXC)Hmdy499Eyr!Z*Ls(ETad1@blSVXRfw@t=3HNNq-$ zwslH{Pc%pJtP9&h6|&d2v@YPetNEf)CzGAbV#KiRiX1Iymw~@74esD8u6-gA*4qlP zcHt-rrw;bxLY95EU?}Flrmg{1Dg%Txm=XyyNMFouOYw9x-to_cHHb}ika(J1z3Y6C z;{$kiBOD5%GxLA3XRD=N?+y@<3RX-b8_tOi<*`A+JJi!22T~NWOqQUv#l7H1PsG$x zYuuLKWe9H8!V#M3#hIfpb(@`&|qn_UF>MxgY_jtvU#A z0$F#t#0ngXuIkM=aGc-=t;U}7E_(`**{o-}cctU=xXtswip51{Mbvt%3&t9JLz)qb z+Y)kPbs2@R7rACJlJ^7Eh486dQl{U2s;BcG&cc?pBBQy%yL|}8*6j`z6*Q(ufv_UR zhZ8!3Z-AgnLU*xbv1_mQ1-KP$5X8+t+(zJuO zsD6uK({CUkmqUe&9POJW1Ghb2bbdD1Oq-#8Lm7zdh2=JVzmRV$V*pKrR4y?St#Z#} zR|p%!mU^ISN(;Xg+9Gf4;5-V7eTbaI9X@_qMR3`|OV4UMsob&DhEJHC-Am!<54)01 zYgFz#rjHHut4d2}8xs`r5_e&E`{&=E-Ts)g4`1>UkW&};m8&Oj)wWU{FdidyLe7F{fU;4y zhT+(m)-8?_2H%I1Fk@fjfr_y~w)<)F@pBEqzaP%N`1_I(&u%J~?XUr#4Y8!jg4{)W z+0;kb@$3OO)lrecl;vfZwH?ZMH1Bm#OPJi9isbt_`&W3RP>=h8g~iDA)*w4mMp?bN zcp96-L_C-pUVDyV4Rlr37)|^$IiaP==Hf#ds`vseua!!n-|=s=}9AOK<#DenaA#SQd=zPet>=)U*!$( zdD|%2>>sBCZO){E*Q(AwYm9*q(dXP?zNjFPa$(N&y{~laNp*RK-4N%`vz_FB^bQQ* zKgpMb#Q*EY@qnG6U?=v5+viXNK4PuwFrQ#l61Po>xYABd;I9Udp-D&>6F|bt-5Ndn z69E6Ii}h+ELCFyJ;icclDF~6U`hkfF9i@?S$X* z5kIVcvb*2U++vxgQ?DLJJc6%$+td~313r_F8raqe21%1A77HQev`z;UX@0xPyhiBQX`YOTHk9*LRG)W9%LfS|Bz{*vsGxO%sex3`un@C{>7>pE4Ny%aBov5@H?;%n-Iz|OdBTj z1>}lVZ=6~&Jz5a0RyY;>zsMDVs;=gr#^lTRgF7clGwFf*;{HT?HO#u$*#Dz;+d4=p zNO$2!sQ9M3OQQ)+BTaf{oR znmLsE%p5&PeFMPS5Xj88(Vr$Q>;6lxcLOZ2;Q zDBt)JgpK>KrW*TFpDTmbj%%@Lgq%eoeFvwZq-v;we2a`@V3lMAT1 zcAeYDtw@AR3SV2lqdU`GMlX12&UU$eVb|?hJA#jQ+K6Ooe@8=0x{@$wolL^kO=+$P z1nJf`y&#(VHmWgIMgB(hYX0f*@M6BZH9&MyR%Tpnfx-L(Z4xT)(^Az{4o}`-{v#v3 zzt12}0M@_OVoCG~R%lRUH(-!^HIJ>W7D9UQEzYq@-QDjWJL`{(MD+zZxxZ<{{Y*y) zZGmW&oZhYIEwi zMS{rMD$2WfcaEsM4!%F4+lUxI%md31uCWLu1;KWB2=JTS##{YGHqK;kVq*p+4;#^v z_Md$sfb5gt_ty{0Ip?bfMWP!5$VW?N=Q@rM1MM6#G;D8-jrY?+%kFbHrE|3ElZY!4 zZv0^*+z`9Z@Jq#Sw9R(G5BK(HU0&#^hKf43CQyX>Ps_uK`oPIGJ>BL4i`$6>$;T!!Rmn*s0lMv3(b4Ve%}=6m6g6lBQ?q@EN5*XH7u=|g~$ zsV!oyx{fI}({OPF)b*V9-w~cU>>l5!*yRz;qXfuY(`@oTb=rXB1R5i#{?ZCfsy}tn zIZxJM{a=pseTxA5*|YHy_&FH3hwh?Imszt%R^ck!_qVj(7^&mla}pB2`o9LxGT$Q_ zbh^u5enXAQpwMO(m>A5)#=)UGZpq%^4t6+zd#6Sh zH%Q1e$`;<)INp499y}0N4EMK^s!UW$JTJuYPYT>7uv|cZSi(Me+ zb=!f2#s-SuC|=LZNe4#?)0`an+P`Z@Eq_;BcBZ4={tiL?@@m_ayvo*;>fq`TkOGds z@713K`C8-gY~C>Oj%&GNYrd!HU|`5f8k6MG$?vcXIEV`9pvL>Rx+f`mJ7z9bVV(NJA*)p@k_qWE|yt?!F6^$pnMM_v?9!2*8%`3o|!qWjGD3|TDd|EZrGI=HtH`%KE(L;nM}*W6`{D{dNf_~Yhz|!P0qs) z97aL-XCXjMFaN7$`PqnZ8@exd%!d6;;_W3T>U=y;#Acahj@6cCbtmP1ylWO`o)-qaBl~n zITua_3u&~Tr~gh9u#K?|pFqBP#d{5Y{WgHr;9WtA#c#?Ypl+zO1b=r<=DC7 z&-zkl)Ey8P1PR+WIx5SPsngaPgzkeToK|LXHRZ##sYdPSxbnT8j(K6s)Y9@rmJ8#L z^wKsd1~mxzySZ@tyuvm)zF`RGdR9tiGVY1Z1#Ca+t$e+UGbKw@%Heep!&PXoo`Gm~ zTu)NtAW#JFKBlr4szJFZgSIv*re8r$k9=nEuW@Kc?I`|;e)w5#dN=2()9HXwMw70+ z&2*cY-e8N6X}%FETnV#N-8#owGv ?!DiNkEW0-gvvpK zB$cKmR6FGRr9)adZ))sk&I|D#m!A6m)s@GTQ z$#)}clts@H-eV%OFq-LQAu#H$ddW$MebzHFfza7BU?sG}QWf!^p9~S=5h${yHcRF2 zT~}U?38KV=lzB85+8gV^_q5%Mj}l?Shs--{yKhL77(W?sBEx%TEx~U_htJ3m(x$J&H#2s%R zUk80#q*1hy-ef6c*_!6(G<3?llF|Hor)R=VXX7^w!m1wG?_w~H|2vc?Nirrj$7Ly)514jET(+3PNK-hT-RceT@L5S^((g(XF3CfM zj6#yg0!JkkCJIBu9Rl?#(5iRLiR?mh_^7j?WUi^@LeMLl)3-i5)lGJkz?Tzz zeAXA?hbfZChY9`uMmueH$G>=rYf^yyFxH6-nqmY#_$kvW>!ns$-^Y`v4S(NW|1I~k z8-0jotz;MS?U-^g=UF#AgH;cygpJPWdN0yDSJKGi_P3gWN^Bb16~6OUmtB}lZinbH z&GHkelfsll8;a^`0^b|~FBHGWi=T^MxVW7*vI}Djvf!0-_^}&p7n0PzgEXdFBZ-u4 z!z(Nx@n@EMLewmQL%om#X}pn>{TinVkh8`ryYJ?~FBV7q7{ zhR^N6g2(v9QgvPm1QaZ6|Ky~S-YY?_sl{n=3;z=t&Cj3VbSk<1Bc${uh1~>vhW;*q zV`XoFNilYcRBovU=Fc9RJDY5LZ8?IguVI1BAJHg=mRnC8;2aU8Gc`8;^R_dPLS>eH z&x(XD+!}F59Ehv~W2B3XFsAM?5Rv7dDZK-=-26+?#tFAC(X_q|8Nr9dxPap=`Vr=w zn{vBy)|xrIwX$w7yWs^f&vhmdE(lZ~ze_*7Qf10CucN}N2N0a78&i6U&Sy* zcM(1SeBbTc1nN(E#IKBez^uGj1~IxLek|#J{|+AXw0ne#x3LMOo|9#wYN8q|=mN8w z14Mnh$M$}(4xyV8FuR`ZExEZ6>nRJ$VLj0DXVeiuY20Ck$~l7U&UaqN9+_`JeetS@ zn~i^{Vdn{{Z7N-e>Bsx~i*Ql!Py8Z-l8HzAn$smgdEVJTwW49|MZ4*8OP$CcUAyLv zzI|wsqU$Y&k~VAH)TV@XrG*5ZeEp(~n%oAIkM8vsAi`5d104Qbd1yPHmtDM?*GFxMKt}pv>_wVJ=lMlgEjJ!^89b zR37Q)$7^*1&To&?#dJ=aS-&NK6tFT89u96=Xc6WLBxr6MCcRyNgg=)N2l@Fw>-~5> zBsJ*pR@IX?`le2Mo~BxyqaYdrLT7MgL1-*^|E!vEg0CFB!`J-x+E^aDMMn3dX;Hm7 zDOjn;!3!)IVk`y$H;4bTRCh z%wH{*;0c`=rRx(6q+TH57QEI5{^Hp9X|>=j*p7qXO(YH^@mINv*ht?t zLi+>gF0fxOg{$C(Em&O#`imrd^8bi@T=&{E9ZzR#qwyFT0x?F_#4;t6q&xG)K6tOI z3fYYg@v3gc{Y7d9Xo){wuI=aPw}Jpaee;!PNT>b61rX>Hwwvob*tlv44zgDu9w9P! z+W6534HydNwlj4C9oYhWKgD|T7XAS0@S@*erTcXG^Gf1~RqQR0iSEv$*WmLCQTmFj zuxBj)Qtq7|!~hTpItj%D57>+6%YxA#vrKn=lsRR+89m^%nwjD!Ujql$-1KKC^AKnQ znZjP0!*@4|m1>eaV{kzjH@&BC+~30;h^X}B?m~@seY^lCO#aSpjv?!+`=$CRVEI=u zdB2?di*-Uu>G*lWKzvSGCI3ds~Xz315fVOUH5vAo?#ia(N$2xgoA^N_ zlFlCej9`qyNF_qlMwAE@dd8NxZ`WVVJ$81S!2p5V4G+T0;~UF9xm;b1x83MSk-hps z2Z>ircq46Tx(gp3Oukt2zKQ{p?KJCpIYAvA<6Hif)0e^xKW48*BA;*d?!WeIA_SfO)&U*i?*18CX=dVgtlIIuQ_X7QHQM3 zMpz;P3H0&^o=AY8>;4~V;K^{YqH!ueKT!cW+ep&tMbUZ9aeorG!z>Qo&E6ZJ{`UT^S||Z;gFKQe)XtnYqvgkdb%~3hRjGFm;ylzu(qnx0 zar+u36MQX0aN&g7;RW6)!OAUlJXdjv9e|3yRQ4QTZSq@Z* zNyUoQi;Yqjo`h(}f+V;~@nSRP2)|T?iGS4J+jh{i5wPJ7$(Ht<`SjnaMsUiyo zw54$b#??}Y?eWV=mADTEc`*bp!oRdnr}@1E>?7TWo)Br-=${e6iCvq9PPD06U+(Z@ z8Gv8it;vkcC!*}H6|0T%dY>}6*d7|-ZKnjIiTyv)cy-|P!)aRAYq;9b_}_(Kkn4^! zoLLT_ioNpU5S1uhUe3I+0&9>Q$~_{c`gIgV`=PXavQ;|FZ8R$8h=^CXzOrRO9hSGn zSU8jyv`>i-*uFyP?gyz~Cw(!jMalHCj({1o$GAs*N&lso)v#pHM`NFt#r=KZK%2Di zJg=xz_jG%^;IugzR9?;TP?^pZgWfZWl22on)fZ-F;&h1icNIMo!6VBJDA9W=kHl7H zKEs8D%Z(nRL;DYZ?kH1#lIB2x^?D?6($CvQ5#KP@k(uycLK#XxIbm({*#DT@Hqi+ z+0OfMgO4)jWWGAm8Z@80y1?VY!eZlEvQsA353*lZ=ccJ`Jc(;e6PLF*KW@;2c2}w6 zb%tlW0gn#i1YjAg$;uI?uiWMmC#WkfskrpV$t-*`CJH@3~a3~hs z-HW?3ALq=>|IA#>-OR=0Dl6;D%3gcD+56qkexBb+(-dQ1NB{n~3^l8128w9*g${$F z<2ZroxtQFoXox2b=D;pTAz=k>SH-0#-$9NXhpKzO;Zeso3s-AkERq@6iAxfG0Ri&v zmWp;Wr%-rUPd53T{K>O~tuW(6!g@jq{NI_H7?$ef4rC3wGY@ap46)SN^w9W{i%dF> z#?pdCEMKsRIX{0v==>TsHaUlzBLoJ6w-%aymDXpw2+BE~@ahibUK2J8f3u)qS8XvA z9UHB!I)2?9Vv$HQj7BzBhXJD`C)b1KWt?x-dQgA|w0#!)l9o%gDA5;iZx^r=DD(bZ zgB4?yV&K6WXd!{C294aOq2rK4tpYsHJ_+o37hWEh4qkn{V_TtVhq<0bh!p46{nUkceW<92b;pvk1wF4KRbB(3)ttTH4MPb#ev*jMwA3v2wy$I=cf0?1A#a17e zjuG8Pp&>%B+zO=^_hYfqKcAW zj!=ea-x145iT2|A-)ZBoc?0sMJ((}_ZSJ42iadWWm7bB|hpQF$7S?bxBN<0l(-}gQ zx1l}`^LC5c9lo~lLlT22RHHNahbmYvQUFWSV2beS#z0a-h9J*K55#fSgbCM`nu-fp zcy@r@_xK$~f}AmkGfME=J8^Aav8E;mSwqAYwtF-sJan8;fv@qEhu=94f9SMM1)=5fz+7U-t2;^94^|SejzKC{k=0NM_&$0KN{V zvW#jqRUpprnX;|(8J@}jH<^3Wq{8f|7$jO~k130k-)bPbzfy<#|h8-#U(_xg>*M>kb_YVkl) zbrz&(oW+3D+f7~xojPuXY!tNwp8XABhcWKszG|jn0gCkU+*OfEAG>O`xheDBY-W>= z%l++VH+OehzzzD&=DCUP(~>06H_1E1xIt0*xdb8ae5XwZ4dy`e@mQ;5T9`~}qxY5Q zbvq*$ULX2NTL($7@FCN|9JsF2b=aTc9}>Fc5S{Z;%)K^mr!3x5Ar5{crF+;;66ONx zdcZBFfGlyUzn{&-xQZ;2=|gH(!%TQ~aUTZk;6qr1C|cyZ5e~@k((0;jmTY*Yq(ACA z7Ek17DA#?UkNF#6k?jVm%WC@zUYMva)SW1UmrL;vjnYD5caDVgJ?yqp-e%hCk6F9f zt7qwo28Q3K_wFU7n^zY{1Pci6uc8?sNrW(~OnFi;jFrDW+@RiSS_@n7NegZgZH_L& zp}>tw-`*fa3?QM-YXZr|YjmZFq8*wI6+tD;{nTmip4MJ* z?dEo;$=_>b0_Z(X*f4&VcZ`<*MTtK^+_LfekQVA?LcaQ(Z5R;<8K zcY$6RZ(8ivyCi9B{Sh_u3iN*f4r#b zrV5W52~tjMH5q+_uKQpgbs;rhv#3o)GTrO{nCm*QMQ=a$XI^Z) zT7#Pj+Kg`gNK{QiKN|-_-rcbh@H$}=%*bslP$)BirVTnRniiV`Ok@{L+F*U^J$T<4 zo+U`e>r4kDl>U*f3&OW#90y(PRUpgUigDL-Rrb=$pU!7|Mj9xx`@`Xw)Vl~Zq~#&d zAukM-+r(3DJ6jq11aFL}?$LAq7SC^4xHVbP6z>9F#D2{w-8z%8l2>6aLwf;F^xOh8)+C~dB&5A z^tE4&6R_)5I+NiXu?g-ShwX48XNX$!Mt}8pprR5^i*Dj z{uD7obVpkb-7^EKw_R8Yxv01&I~xShO>*o%fi<`Tzo580O`0M2p_V~#1Ja;AXZKL^ z`=iM!dBlMtR!4zUM$BSL7G1sr2JpZsE~^$B0T0*}AA@BQzbWp@>myBfcJq0@Qp~k# zl3;j;z(#04EsiJU4dH;_CQO#Ad=M1}$LFv(2i|A;WG1fWtGj@-vnA{O`DuF#wKC2% zFNibrynQ41Ec@j!?Z>_w`%8V~M+Vc;X+6ohY;mXk4^s!HSxGk0OU_hrcc0<-U8d0r z#xJ!@0n!Hh>fzA_`Q0hA7LE1<@Q^G=z8n~T$F9ufCtKQXarxXR8##@9wH zC&JyXk_gL&i>3NT)UFZ|AIFiD!XUMU%h^o?pX!5y(M^>&O7H3x4e;&&M7!>k>fZAn zU0KpJqDfKVbax&BB?U17C&qlNmx<0n35Xs>mC&+ad z=;b<2Z3XJgYn8Xd_eNT6pXqqL5%=eU|GZBkuqrF}J3;f<5y5?^&QE6*r2L3AWKv0! zr^X!9XK6irixvQ|8ghj->r^p89I7BBJ6ug$rX#8)g8ooJ82E&?^b3BFEg{Eh#>n$4 zRH2LrsR`-L91rYodK)rJpjsY;GK1FjK>4XPR>V9>%pRL1%E(U?C`we`9#_Y5wx{&j zE)*#IkWA&w|Hh6=M6;jn;)_?|ctWe+*Y51B&sQEc2ink4I=Y?XzqFf%`f5ooLPqsN zLKF#l3X$7_*_)?oHkm$%c>2t@V0F*LUlZ{|fa@DQZ{{;et`-RW7_k$LLo`AHI>QD5 zm)0UoVv&8yd6-f{`2kjER0})bgj*F0`tW(V`u>S=YM5Wo-RQBoCflsJdjEUhw+^>3 zue$P>g8#Je8~6M<4Azd9k2^|?i@n|D>sa$2tk6erqy+p zf~@HXr0nt#wrp#v;x)zFuUm)CnmZ=db6bJd2~WOk%uP$(Kr)%Sj< z%ydMw3E=}l)F#IDdrS9%iW=B}5kUx&1O!T_k5Z(Vw2%~Mbj@EF7=MGsN z-4|f}XJqhzh3_^AXfyA#+cDWe`(@^@!f}8VzldyX6T@9#}*bCP&>#wy#kH0O2YbV0b~v7e+SwV?~dvBQP?`5(R73IWFt2pgaS#GnZ`&kvKx>X~$_i z4NI1g*iNhogmBNMpX2>t~y0K~{pXrOD}({y6>INjvpRXDPk5y9QP0 zTBi6+?}|7+mA{c>5YO!PTi#l55&=8+JQ(7aaj}FH^6f5)$67PQTf57Fo7)24-erk7 z&_&nf{aJXg?*4!=k(^6hb%#i6)HE`m=%#RmjFpaa014|!OUz3H2BvN56BfF>4 z;o=%2hhj%q_P*%WziyKUB)>i@!0cC;FX@X-lEtjp2av?t$Tl{<{0k+Pp~BJ^o5mYZ z*N?8VaQ==z;uUsywd?pg!OwCzr3~%!f*;R~0ypR|UMXdHSk0C^ttdEHx`e+7PW&X3 zCLX|p1OB)>j0TP3-3ERv^LsFG-4oJ3f}ry$M}=pNWAq7>giqeWI_Nq6F=K+miS2N* zej(aPLWEHChB%IIe7>@^@9Fl~vcR&J^5UV~1CkKgOgMNbM91Ok!02!iUe}wLxqr~w z-K8mPKWjAXCq*di!lbQsOpixnYrK=b$`c1JU%UBjGQuf4pH%Ls?5q;`*m| zNIBU;>_Gi7tpaZ60@Ic66YL?a+T=bwjHUDmV&YH#vS7){PzFClh!Bzp6d^k4uyK$b zOU1|BQmoUn#W$e9(pK%Ge^XD^1imZEkk>}Z9Fs;o&L$`3z3HnSXSc~eQ;%mlm~U^F z<~**?|9I15-B?rYs|2?o68y|hz^>ybqz2BglwvgdasD`;_Rj!&8T~&`VrxHQl7mPx zW;a*Tv}Mf{w6qd&Q0t(Q;WP|x<(4mF4JWu_WI3 zywqAm3}|D@^IUnm37(FmO=5_^wm;l4A7KIqlg?r-l`=5luxPBLuSNI1Pu1|wQn>Fj z#ypY-jK2eqv%xU5fIg}P^;hs?6bZ0vUzJ{m{DZ=k@O~|e2+^?KKQGZS|N00r=fO_j z9r`thwKh%4YO|n@ndXQ4TF;+&sKX$OR(?nPd0Li7mMsz z(+C{x(!52a+cUy}25Nnv-RCV^xf}HeE}Go86{F`foU0G%$YYi*&D~SoUI2~tZ$9aM z5Q6mBWlF%1Vbe==phK2x4hRA2h#S+|kYK=xak}Q;%(u4AF0MhfS(z6g<`!s@WHs)av2>TC)c- zmb=ax z{UDT@-~I&}n2{~JDh^a|^daTWkn_*}5CT)`xG?(Y1Z37gn#_v{fe|r>%>569tGY3` zSIIj;6j=|rP8N66;M?QMt;64+mM`e`?bSrjaUm^3)ND#-_TlV2-1xCVeW9w|S$ui? za%27WjQ!A@7QJ5vkviI&*K++$(eEb?2=h8lH~jsa7iLUatAtE!T4FQrs(8LwJWK>V z0z$P2kx(`9_wfjW@QdO?KjS?|y)cRk`90(sypIVU`D{i|^O+=6$kn97w5(?3hAg&C z`lPu#B~XzlK{teKT{d_XUcR!Mok-J?QqL9U^}siapHL!GnzkYT0-xsk{^`q{?TeLP z9`rK)EE+Q7g^4-x=Bnj(a?A0ep~G*Zsnt9f`>>{|vuhd01uM@sI}=Kns|73hJR!-` z*MAiD`X|uonqL~xL_8b$)_%{veGQtc5wL_=i?u5 zWX$kuw#}R4G0IHvVB<<&f@P;u6K6iic+xdQJW&{xht?hb^^S*G)S2jwhas>dRujD$ zp6q(P@<#ze1cOB8Lm$=9y+HDimG{JVRivF-5{~IS40nD-@WUlIHo+NuT%8!P8Yx|3dP?rDPahLfQa?_&CICWqxzul?&vO+0*}Y}2{{$I)=PsjM{yGA3rgBS{0it&t|?$>qAQKfj8Agt`Ps*g)jl`<$e* zwl;3!+jx;y7LYg@A<5C2sgOI_7|7vUT4-|bc{GQBjU@krNKt&ZcXoO@CVEfw9CtC^ z&l_Mpx4m8&y(RRPZuxpg^v3K7E%16Y9 zk4@%BYS(@s*EcZ8;p+>k;sf+M{YQQPH8pill0X@N=op8R3TV^b`Ts@UqyJ-z2vC_~ z#QuZB=gEiu2n+|1;qU*Sz2VNF7GFgQ~#nqhM z6pBk<@4P7rwT*y6v0dJ|1Ma*(oYVjpHa}C{bEy1g^f&mk&E>4YSrn=;X3yG{?eKq> zkDjF;3MB%qL*J1`*O71gWcKpzw(UFu^;{b@GJ(gHe4ZS9 z!U)$K?U!2&9vtFiM>7Iz{Nj&G4f4YHP*<;4&+))Dl5-af9ECc49Q_kq-aYZz3711o zZx6#I^8P>Rp@JnVMV=#4wJ>yfCVOc#TR--ATt=p3jhAP*0Se{nk&FH*tvMOrX<0a) zU-{Unc6}jg`yT%1;tGD>Uc^7PpY0pk2&kHERwL~}p{i1Sc1EgVa+xZ#ALQr_!ru2S zUtNo1YrZF*BIwyyYEY2zvE9z8~uH=nihQ zppoYCRh8-PLMNM`;oEJ`bfStjUdlQ()PH#&OW# zbd1(U(82wDebmx^-=^-+*^li~uxL^QR5oux&5Bz;zRQ-;_*SvcgST?B)LLcp<%^5) zk8>izSyA@&X=iUyW&Oum=lnakHJ3gs&%8T|;luSf$5U?Y)qEm}LZux-|KyNtUFu=^ z;fd@~ZspIBzT1rx6+NGM57pq>bOc^lgtk@%&r;Jyrz19RFwJb69-nlgM=Ke2P>q=- zU3M4wU>lJx5>H(@H^=Od!t!WsF1IvII=k2X#vv-GG!*J5@7Y_N+oG}9ue`Z7+oZD9 zAdUM#U%g!@i(;lz?A|rSo^!*keTT4zaf+-NE;TPIG-sa{g)a>g=z+DXw*T?=>G@7;Z%Vt7mWYwYyqU_^mekY~GXtE#8ZrZFi~UQ7 zvmr%pexuFNlqi8LX6#9u@|SD9l=P0Kcp0OCxWOQLG}XRRaC#`SRI<;j($k}S_zt70 zyVrbeBT9<{qWr1P&O;dJD`KR{e#6&)s{b{ba`vOUh&FC3;+KfGp9Ssr8;qsej+lN@p2$`Dl##{?(~U?_gdb z6za<*Dr)4@#`IAth{??Zjyl1AH)`^8txw*zY(%7b~RC7=yp=r zZEjWOC9*p4%4oST|G;poQTR-(FCQfKmtU2)y|J>$Jtd^zMicTLmMqN^iCAN`RR&H| z`Ly_m+L=)N9+N~X2l6xcVc!$=$D$$8j z`FH)ARm81|UH_<%@+=z&V7wxl;2yV%_go=}P+I^9&G&P&y=+$S?3K4F^>|9gkAIMB zxet4&fdwFe6va;o4=r7|FQTRhH_q5@z3o}tcA>2%Y}KrzI!d}i@A7uknNs-v)oCQ- z#8ZNfz^e}hhW9~QooRpv@H@!M%?6jNu)xL_GYyl4bVY-&RxR|plh{!x<4uS)xA##p zHG(iiYfe#h<&?069vTcUdkET>jKx{l-5ahWG(zf_LL{VxLwB^B01%CSEgJEVcae9r zq31pMRWnrO^|^KoG;Q_SNkDbp+*n_2d?M>)suLDCd|RM_)hLz<@4t)k+39dH=<8D# zDmz*DPYFzBy~=1(EEy}T7U1#Plzg0+IMA%QIssD@3Ftly@!s+rip|Us^iSF8yLgY+ z&wXphbogk%w{Y_v7L5=NP5?io%1`43wW3FLAKbqvQ!Rhtz93J;#%yYPEK|bEPimu| z`8GLl@ZjP=pgkE@V|d>gu4o|z$*FSs1G9A_o>KMYFR>(YgjIU0_ABWpROA|b@bXdd)KK4~z`*dShtSPW}5Ec2fH(zOyY$EIOS-Yw0XA)U0rRBEdah!rr34zVusWVy1Y9 zl1p=v@|TC&)R@%gmwPbV&d1yM>ibU*YT&iT9$S0eOI@FEA(0atbxaFyy4~VZ)DwYS zH;Uy$YDecA1Pm5c5z z^G;QDH{x-?uGxANy+6*7e12H_&Lfv2NS=F0v1i{=8VovmttCaoyLLT*X^ho5G5gIZ zLKVvc$!|4o(Nw$qHIdX-Sdw=zi%7X!jbjGuK(?ge(-Q%N73DncrW?gh}k!E1E>U z3(O$D%G1L$Xe^yD5?{OKd~l49$ev@Q!gw@BBVjDrQD>$g<=wN(N$%LP5EF&e&9%`c z;r<<*g8NceXjvmumDAGR`>ll|^5KCN!W?pK81p3sVR<(1AdSs+7fC5kiEJ8ocN7go~E2+_euUED%@}qg~bU zTo2+u#7=pwY+;MXen?W0!*^c7efLe(3^Uca{jEK#F-gUb8XU!c^4X2WskRFIcv1d6 zU9qs@s+#bOXhq4|Yn0u`P^ixl$l9gZ*M{RhDs(+}`v~B51-Hg(j3*ocprvty|GxVr zcQl~+al<5puS8ae1EM_}$t(nxlL-iyhTF%@W@a)ySnag7#DYXdxuT&@?A)h|GL$0c zCR1z}!a)#>29!tPn|`CAu>O-JT@5$4?=hV>LD*HWu;nm7S`>UdJt-n-VX{xRz^>X9 zcE>mnf%B{V<+!$2E-k*A&eTU^pI%%927$_MfzXB?|DU+*KY}6)xJw za8OM$#bF9&aXvd;TahXkd)z>>5ut_^|8e^vzlFQ!$)3Au~PR)H5Cl6>CoDg;v82<3{`yL#T730q{$`}T0! zpmn*=m85{)>kMK#hiK3t0EpxiXlIN;9wx{-U9iDX_;8Fki-x;AM@N=NQ;m#}ZclDK zR>nDoZmtf+ylPgJLYP<)fKwj@Dj-HhvD@KR(O#(K^E(NVJ2IS`9?SZCe)B}p(@F)I zBLcMT80d)%C0JgtcKM_C$h)I4m-ygT$yw!XH1``5g}T5XO3@r>pEE#Dr8Qu7X^PNW z$hegK@~=t0R0&q{bZ8bj(X-St1SWLGlZTsa-n=W{Hp3`Y6Ny3xPl(Ih?J`y0&sD83 zbC6rvwMej^-P~Ar0 zfT>xy%x#gte%aEVYl&uTs5cb|e{6syNtIl>3hVI~S!TF3+azOzoRd$4?8^dFqa{z4 z_DQcSObWAeaNjTW?8}tSO#p?cAb;iUw!eVv%r^iT5kP7`l1tpV0Jg9M|EnmAyzm@i z0Qde_eEl6^uP3T6L!dMW<*xWzTgHfLI3k(1k`1){mj}utcaZ`1mVj<*#5Ib<|N8*l zb`H1lTYK;z^!C1>>=7iCm;!xNROd7Hz3RrNKq=AO|4(wz^<{$m_5Cg>!PgK1jTTS# zH{IG2><{^uCIkq_LvM^R>fo3k?~=){Sz*EmQ8X>{|D<>@mWQ%`kN^GaA&}sIEyBMR z;fEah$4A1Mql-wf24!pd06`*YgcCujzu@)hxqcxi>o_{NEO$ZXnsEcD0@_}9pg!|% ztpBy2%F6tBd<7zdVOR%)SH5M@3mZkH8td=zW`KhcM+XjMP;f+i3s~OK_Q+K2%g~L< zM_bqhJKKQ!5a$G<{9By-H3Rc*hs!4s6y^{MJ!KcMK2Kxw#V_=@G!|cPH=RFAIX#e5 zP@@VI!dNN4c4K9%JN0;!;qdj{smJSJEnmTUYTD-Lgpi1p5PcDX5lYNukqy)Xvs&9G$9N38FhD2)>RH zfO!d(fhsAQIW+EgAcyFR)(l{@7DTL%&lpQ;lDoYv(Y@P^`T9Iw8Td145?cfO`Y}-; zMsvlL?AEx@=Pgz_QFM`PuFA~LcxF*xM|zf?%}L;wwh^o&?3F3IXpkT;ajiMYvIf3{ zN|S^JwM$fsn*E6$Mfz)>IkfKbpR{@|PIHOtqY{m?%bTY_r0?T|T|l{eP#;O)5Gn;+ z?=4RwSEFue975nqYG}E#mPJ?fgFD2|U=drS5Ey-rSKPBZ_lKdTYF+Vb@XUJ`FsuQK1;4DnEjjw8?b7%8nfF~-B4qm=9`KK zp@Zmg<^@k1=gn}JWW4$7bJ>W&HM5`pH{-fvX!0FL>z6Ci&*(A6I`gbU&UpdzfExE(UfEzpzg++rc#r9G?M5-6?qB;}mUtwyRs7_A z?U&vPIDUTfTU(Ar0ToHT7g=8nw~{N`X0$n(PQw_TY&m#y?|-=?NVk8tbe_pzF>?wU zV1vz79!uLM*zE$c2`Sv_dMR18q$(4Sr6aat2q*z#U|y{|=cfkLj$eB6klf(?{qtXi zpz|B`#gh*}UfMH|l)EpiBpt>N9y$ea#MpOm>hYBrK*PIht3#U)5bFet)GcG9FQ^(^ zLl$g_a>D}=VL6xP`!1RBZl2`S7=My;>L*`nG67WW4us`UL?A&_EaT_aLwOce5 zTw6mBqs$z{)qVHJQ98JwdLo@WAV7|?TDA95whP$6^rjJqsCJDZBc^<{!nQJ?4S>)0 zfD}<0l2uUN)!4bfAW@Mq4t8Al$~M%Q^#JfqnAyw?rbGjm6 zQV5fINun|3#+2p4;!wmU)ea|Z0?LcJp*CH`d-3rv5*A{RG|dnL^1B<+ewSY7dEtq- zIB(32nKVbq5f=smhn^^T+aX#O@#W-qBR-Bt&GJ{$N|3eJYv*Ec6_U0@Iyu8}J7W6* z;I`_m5ATh*3!eH5GVUqD*1=N&QhSI4aVZcFr7(y!0_!Qi<-(`!_|Gt>EGtsj-i@Eb zmCqm+8saY5gfBC|i#p38a$tRBJ_-O#x6Et65wSsxIzK>8kHG9Cv^vee8-J!v;3kn% zMjD9p2Wrw-lN1^MPx|5%6J3!w)f{sV4Jpk{r~y&tc~%sPfIS)^oE{||=HGzd(_T2@ z16g%%-X3&G;sHS?J$id&ed6I^ZO2z16{W@cXnSW2*m$xJ; z39kLgxQIabdLEbw(hoFO#?12Ua4A<=nn?+Td7P0Q2_Q{E*T?N+bfWlQ7=Ap^^#@`n zA_9S#0G4KlWPV5l!0fY9{sexGvt11f@_^I<;8zKiBhYwqWlldi4q@L#_V?}A znHFsTPIFg3PQdvE90aUAn|WN200wf+{2$Y>5RwN*_06kd213U3Fo7>dKDLUyW~rZ=^d^6NcfFb)#h~e|_R)ij{+ax(C9cZ0$0pI%J->zBr_X z?Vx`+jEYpBs9Bwo_51q4w}!%RU7t=6wGuV?4u(X^Z&g7$ngRKY`gr}q+w zi(Qme54Tj%B=Gwi$Mt_;N^U3kA+Xm|*&VWAQ_ppP16KhDNe(5V;OUP+<;Z&g8tHif zB6<}5JB@cQ8qv7UeTEAGj*x{3%jT?0Pxsqa_)CnAQ^(pe5Ev#A1pxriejj8>_^fV{DF(udN5{3zSr$F>R=AQL5!?p{oQidQ&aH~aPUZL zmF%drjqb3;0jIAYo-(R}B5bQ#G8Yi9Sl@|@z{~)*N-cao$DRVPYuO3Lv*Xcw?IcVsG*Iq%}WskfqM5=XG8OW+MfR<3K^}M#$QvcSKZ6*py!zAi#{JQ!Cg= zGo7y-DaJaVF~6UqOxG@jX#!Q+!qwk*@s1#tYs9Bw|8JjW@RU&z(DAspyTs+mTD+*p zhRpI83y6t;tw%h-#T%5y2rv*Bt8Wltt?{Cw-+YJhMdnIr(K()>=dmXJUIELDc;GgXE99VpKv=y-V3`k9#b`h@ zXTp>foU9L?Ia)LrG9GuD zMQ=ef6h`BkDP64<6DCyEp=3BuVbzIkoWkaEmBz8r{#<#Pm-`kFUqq&M&6j*6LCITm zpaL(|^6mNuqBdz0>R2W-gV=WxymjQDLWl^;I#d1JaNXANBh*k+9sE{EhwUanqLQhl zr{VHXJH!1)_+Ht^CVNYwfNfWzVa*I|VYn-K?}>}gft;aGPYZqj*7xwxS<{j`pn7}$ Sw5tR1SYOBReEvCyoBsw_JlSRd diff --git a/img/hsr.jpg b/img/hsr.jpg deleted file mode 100644 index 9bcb0faed62b4a686569d9f21a005a7234d5c2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204337 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%0DFnY|hG3vY%D3FYjw?B5;n7B+(U**TAZ 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 ^vokNnA!xfv|WvtH$4}k@eO%M0u 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

__wlb!tyJs}OT(J8ucOFwIn7gm8NMx~% zNx=S2NrXWjOewx1o$QDbdp{UDaDWMfCCB>H(m@!6Xi~Vg&bJ7`FSNTt{%`KKt_Slw zgMNq~o?<1ce&F=FSk?VpZQ!y8c}D!#X(%T6Y<9C&{DH7?#pHD6c6|22-yi*>XsP-y zPV;E6A|qgoO&eIyrd^hTY@KPG$&M^B31vA%I8niWfI*nftsf_-?XYgV9B_= zvC`jVtcHjT?Q;HH2&?SR2a*>C~yFQDKQ<>lMGG5z$6vm}0IZt_pr(F1^2BU9T} zLK){E)!Y6p5!HJ%y_}9hC5Pm%sgKk^m=F`N@q#RU^?bNXVX}i#ZwKY%sDTl2KNoL~ zfT_=i#>u{%gtzwZdUi>DERJ(m#yKc0Lnx(scNN1sAA@%tX!zVBb=)cCv@|V&*pw6v z*T-vB7wjq|2|9d#_)m-V2%ET1LKZ6`Sfgl=Im^-;RZhw2q!t zCq%~yJAmOrw6LG6WSDctbPri94f1jK&`6`B{~1xNDH-pNd#R&C6cmEP zD){54>2rtmkFpMQzkbnQA%=1+z-kdsu`mzwL&IJ$cqx*BQlw{gNhs>#Y#Y)C&Fy0v z$=8XZpHY}^5@6SUNGRqix7a?RF|7*FE*faVB3D8hkhUJ1mUURQd@dTCwDFLpOg5@g zSrWck{sZURiS`6wqb39HA-3T$Y^B%1f5qqr*qHQo-AqMA%xQUSHn8wLxXNG7w17_| zB=T$q{ws8ZG6qi1s;?D5iR+D&)w0|;5Y>##S8V+>PvbI_PG2V`MK-v-^Z3pi?Ci7w z6x#<0AK;=IvErBNjoOYNoMi0ruHS9ncMy}4UYG1-`FyAa;4N(}3>Jg7&|~drFCQ8F z1K)WomdHEXQ%tqSFG(9#KTCSk%^MGRS2t?;ktCd_1p2Da#!=_K+B7WzUbxnB{(~G0 z8NY#?TxlOCICG;SCQ!<~3?wsUXvn|m?8-3Fwh|NFGxb2rAtDK|^fD-T`D5=qVp`7U zyQSY1Q2U5MaPZD>KsY7{0Tac&uYdaGY+dVK70Fm!n_3?uecG3IzEDP>Yh?$D*dTsU z2oNfrMZBZd5B()VhVU;^d7Dy-%i)0_fl$N-!7nn4zdG;)lnu>{&vQ_+k4S)fU>Q_u ztwVwn1&Tfz>#dVv$AWH*zbqjnU+@;7ANq)NTshJ&so$8ZT^f)0K~R_BeBs1;Vn+eu zWJ!3*U^;Uf;!yz^gcE?Cb`|X*bL)!Q9Po_La`e&*^(O@?h??094nzicE6ift6jq(F z(U1ycM4Z>b5sZGTRpGPTq6Q6zAa}+02gNgc9iZkJU~Q;S-dFyDcpv#sq_yaBp|_gN z^{(?RW&gIEZs6W`X0w|M->E|NPkoPi0ZW^*tK=;3QElqCiQ+}O4XQr|H$avj(n1f^ zPEh-hyk1KXMWcb)42ll1m+<;*M@P6|XnohE62>Oa&$bEoBs!7#?HrAX&<#3l&jCq?HzfK-63DVIMK6%u4AIUbY=Ao zH-oQN4T7m%sAv_70S#`&e-GM3BlIMlLd*~ zJAUEY@U~$V?xI2L)ES{s<(;!HHqc_fxd(u551@+$FB4T++o!D$%t*jq zOWYlpl)HX@{=)24f!@c6em_3Odsgb+6)3ga%6&;!d8kcdA_>SU!P{d2{I-8q({gAb ztQgt3-M_amKtASMF$dhhd4QVe{U|PEk(2C)=b~=nf?pNrxW;IuS&;z_yl{ef;lq~3 z+5H@cRTijd{L-EtdDJT}?)XOZ; zb#t#>OU9hAV+I3b@ayL1@7is~0V#(?0`mx}cI?29F#QqaXC=Lx0$4|!e`Yt6ia!lKmYwvR93uhHb0|2vqKD@pyGhdB$uG> zH-e+UM!UyoakqfLNTu0y zpaMyxMkv7|vZ|W=AkRAve)B&l?AMZcE zYw~}%J1vc%y7lXi0j5|6S<5%JJoNqAF`TGt8;+B9lI{Xx= zT?(i&em*iVS1d<4R0ET#^!6%$swk#MmGfM(GIk6wH*{+?9kkQ|+5dbnbymZO4=vn! zK-lT>_eYF4MJBlJ-T_~RmX)F}0ClY2_1}|Ehhz8m>B8g*cL2eLqD0}#;27f7T7oHh zGS9JW^YOnw8lTRzkUzGZdi=ZuvD$UIP@V|8fjmO_iKcj}SlWd*&tZRTSp9U`t@Lvf zek$k6zK?0!ugSx(eBfLN433vHO^BkWO>|@k1@hohd6VAhH)*>O+`PoqwY}x4B{1u; zRCHEr0UicS1e})RWyAtByGrk{3uTfj0w$8zv@!`N)od z696adzROgqZ7x*+G?AlcL0MZR9$QX`z~bF1a0Al|5kaSejNp>~{5W8|Ag65hO^kr` z`@Awf%{+Y!l@OKr24hC9%m@V$Q`KZ&aN)Nt1GOwAw(h zM%T(2yMDbtIj&A`H8b!l?ReqJT-sAlQvAhtJLhc&m%rX<*}L#f8`5&C0B{+hPDP)2 zcV@T_E$rAR#{2QJIA%{qE=T91Ya%1B+CE)oY}{zeuVK%6zKIRHkN7uO`<=n}_sHo8;m6!_nI=5-N`x^8xq*ht{{f=8-cgz^E&4(xh3bCbVTa#=f#5Y&$A9442dF`mh~i^#*~YnhS?n7WH5slBL26xA^A#8Nx1Ea>>`AF zyGJ&)XBUwuY|eQjAdFa|Gw}HJrcCobc=Rl&eH65&r%%{r8}E;*v)&i%dQ0(bES>o# zE;jGji1gZ+hDOGka^0S4h)gN?ZHV%hJb1E$3qAiK1VWPIOtY z-4CXU%SA>ZpMR?;T%0?8g`OIqYWQcW(wiAy501xw`)Dg;C*I(1S9(1P7`qArC!7cV zH*Xi}8vw$1-Wo#*lXB*y-Vfg7>}@>Ijma|yg$-P9VHK5uZVoJ``#pb3p7-eK6Xh7% zJK9kr0s(nRC1~X|cc&RD>I&@LU)Gi1R|kjh5(?D+^Y| z2PL7pHeEs~YNhu#w5~o9d(P@OFF7J*i+XYngM)94HcQbRm%v)9%4O5nn6IAG7()xi zt_#AYt)<`?J>C`?!U|YLF8eoS@ez7I6^9!|9e5Ssk!9yHvD*;ylTgb?tSKr8Tsc7KbO;bB*n7d*|Rlu_qe|mg8gDTl*_7|A3` z0vuZ}5w;|sRG1w6;PWqfRFLs#g0GL|V`w@fvCnv7F23&3UDy0OZ^`Ei5(-wSu1J;@!bsqBA#Qk4At`K#{d zj(3pLf&lrmuPBl=yz(_>mdh@Ha|b?ziW${Q&flvW3P$nVfr^-g`P@%wuWiFfJO6Kt z^4R&nC(ru|Twm?f0DKR(#{ZZc`TL`kL3^ntTl?8OceyD$OCGYisbA3XA=`ZL=<&T> zsqq_p*ZpTno`v*j>^<3JU5Tx!Oer_6D}QM!BP$;pe2-Tf4Ki{4hwiA>GO)Gstqr@I z*sOhJlf@jDyDL_aQ6m-C2QDO(McY0|5fZYx;7!$`nSpZMhre9o25?@;6tYal%^(4u z%V*xDUsn2yD^PhK|8{>GL*6UAaRHViT-sH4G|gI1^b$%#crIo;gVy}!*?U3fY2&ME zdRM~4istIF^sii(ikQJ?l?MuT%SF@AM1Ozu5&E6y$_pQ-oX+m5rzVWPC!}HyNJYDl zTYKLebUyu>Sv!g7-Ra?OC-WXdY5+eQ*sQFiL3rm%*S(ZxH?am7nXTgQ3d;CPwlh!$ z8Ft-s+oMtQ(`5VbGS@sP5ep~cK>sUl+65{ltzX9hDVJ1b)2-I3v}ZAPJg=gg2cVeG zt+M44U<6Yf8)o7ra)-|Oy_!uxZnW4{&_w8*)Lk8yeN#}0 z$W9%J9*ME%U4vwtHE3|TdQi5=?;TClP;1kHcyxn->2yNKmFcO;GAPCNkIon_gN*aI zhzb=S2x>s=w!Hr}p%|2Yp421pR;~9#Lx2nYrsjClh7`u~bMqB@piC$S087>OTj~<~ zWXDjH{1<_C8Ej~x|FBK$SjQ{Q9sR(*Jz!4Vbv2x8=EI56;TZFw%uP|HSnjP>N`~#T zxIaqqOO__CigqS{A|G*9EeSNca|~exAa9IM?AHMdOn8m%{aRM;4=7wSY1mkRI2g&d z8s=?otTr~1h2~uLVQgVgK_`zE73jKjySjzo90Y0fA^Em-mZ+f5C1;y=b+zUFR)X^<&l*El0Ugx zhs$6-v>>%n(&m^JMsW|@F?6C`5IL2+M|z5?CGm;>mhx%718njJ)?gs_tDZeNJcw;KEfM3k5i?iI~gmAkufpL)AZxZI4*+CbB zDTff!Uf1F-N6WkRyZhB9u=@a?b8R8yY~Y%=A4K)N6h@uPqI~|6ACgx*P83B@m3ft+ zz+%0K*SaAkwX?;xEFKQSw&AI^f1K_%gQd*{z}>Dz*u$ODi&>rdxNJL zLu%74O`-{4m*QK>g_|YjUMl_`Lzwf?MmFHcHk^0wt9=9mDfjF706jpnE-@OKT{BD^ zA@F*;u&;9JtM$Gf5W_kn7W@yKS~`VOJ72kvLNLgJABRHnq_pgPTNC0Ig;~*gb>W*T zaMBV8vZFpk20Rmhagq$htq?45l#*+Y?hK*(MgEsqIb+FA=&ACmxx+5l#HgIfDq%O2 zq}UHZg~kcJ5BnIo0I;|FxlmlgB_zAb_~_?rWFuPCp&0veNM!;H21Q9817p2!%+N{? z-?i&S2EV!O4)#bw0|oD83IS2rlOhF1fXKUcGR{LCY~NNQz@F~q zNrXm`I}6dm%hjvS9mY!eR$4gw6U;TeAl+zl^g7=+)|T%W>lg0i*MYT(Hw9Go;Wnnm2(W{pm@><8lp?tD%1^MP&TUzY$ppM`+_mx3@;^*|AFK;q1F> z=^@I$hQf;uU$+gmqY8r%LD|2V!`>6qp~XT8AT!U1(@r9a0QUO{^l*N?x{}g_y`30@M zZ+N%XQIVDds7d+&NKm!g!ioG|$BTx%vvsCN5+Sfc(HiUXFSf&rHI$!5?bNtHmQUXy z_r@`>i@j35(uhrHEBt;eD6ZP~zqAo=?KGYzl-I>#qBkZv0zdUG$G~FOd=8jUejx#R zxiBCoyt&do+^r36f05IIvreW60a@H8+BVG2(gVtW z*MEd>uPIf*+DiKX<)EMKKos#aQjo3$hW;lonHB+(zYaXt|G=q%O?$pczGUMyomlQ_^;Q04>PM%p9;|G+eaAu*OtEj$HzUO8J~GEHQexk zr?D@j9ql^-lXcDNJXS5QL8`&LXUtqya0#vfJKv7t2leEXRSR0)=p2Bs4tff4E zu9gC(6u56s8r%YLs^26fgQ>d&W&*aK?_sV5au)gIfY1l9(9T}r-l!RQ&%c%&m{SIq zgzq-N$u|`Q1r;EBLUpvyvdc8*=F)-B`Ca#R&gnhr*n5@`UDA$&}UVDIk5`Rw6EVW3p6gXHaAK5-;= z*`cSmBQXnd{Y^h!eL~Cke)vuamo}LZKmxa3iPx~Pq>$C4&et?9qwM_N0O6M&Gisuz zh)rF600VSW4M$-lj3eGuU*ma~C1K9jGU+j_Ec#{-pL@W7!~9a=BS*jY3hXiv(vA)4 zym+mrEc}Y-HSRaYwoXr01bn?TTsp_l{Qc3ox5BvR3!ySWuy@@5!ikZ0Y#^wu7etRQLOn6b1hV{4Oilc?gMsgVA1qBt8N%IqK4N| z)tg*gNK`mnfEBT{MGCmXh@hIbxIg#^r zO7G(}+ZNXsA1a{(m8cA;2ZVj2JVY`_k$i306;U2#-UjPeF$#r#esm9#NM{{eD{eKF zi6gj}$sV)%#;SGh9!*+iOEd*z`J6S-kss~dSSiwe*QRNK&|+ z5bR+lVyY&t>}qzarxbT>8|rd-Ixu27gyaEQw#^_$Rx*;Cy~o%J^=-kB>U?3lC~$-x)WJ-(K=FVoczKfG>GW#V?NN-9~Iz*>A!<3wI1X=F7q}} z00s=8M6Jw}8^f|TsB#{vBE6?_q5pM_aO8+(o&VR-x5p)Y@BjNfTeW4bRqJZbGc{Y9 za^|(vRiX`bL!P<;EiDEhKxLt@XL$|45S!T0t z}I`8sa-M z=DTLiMb1dQ?_zFgv1gIw{G*Z?XyR`uetB}SPI<-?T<2BU|K^;96QOOmX zpJX@XygKgL_heJyCk>9YaUoS%uM@fgohv99TgYb=-f@|ih1uG4y*gWSrjPYX1(|R| z?uu<#j<>a9*4?X^(7jY#*LJ7)@+Y)jtyPazKW8L2(Nwloy4H9d_%GP7cs_9k`jSRx4HB& zPz1RtrR3DE+Pia+OQeegzEmVoLd^kfwo=#VeZu!%ZH*fV?e{_!lQ-gHJ)Qa%d&H%_ zfgBXC?d|B**})UD&km2CIyw=Y5J;>TF@%B}QQ0-foP0=oDKiYSbJw-UE3z$##JEvu zSr3eGMUgU&;S)6n6(KGn{jfKWTpoe1Ib>Q)1w~Paug`_{FaeCb-TfdilifLoQKCVf0^{8UYUy@N?ztwIVzSp-1P=LR*6gV(b9 z+jp}Kopn*W_l(a8VlWx}=8{+!4GIYDOSCU$0zQ+6M%Cec$VCXJPVQk-AmVn_bjcGd zq&l21vr!SFqckj}yT@LN4muS^q+ci-j#^ldk5qx)|Mfo%U&4ORYU?B7N%E z0n{C?qYVpG$!Wuvq1W5ccqhg=%K1@Ot!LA7U*hZFiGnF3BqroP&~d?b@zYJS&_Di} zGlF;E8m0@23k5+Va(mSV*wDR_* zy5(Yfd*>@3-;&DnE(FCjC(6~f`VJEGdOS5wKg4Vzn);u1$&U<)Ll89IlFQo*c?kF+h#pb5FXii! zYTsB3`O!D^|6RaUJHh$4o&r2MiK!Q9s{^NRyeN5hZN9PKQ0t&-uWHw8Em~guN(Ni< zSQmLQG{UbXw!~I2=C( z9tQ{QA92&Ynj6^MR^o4O#$2ye@v@SI?d)J}FV?(~a|hYPKY8iF^rGD${con-Pb{;@ z?<0nH#%OtP-sY5=>S52_$#(43;CH-;APgIi{gl`l&nl7%)8Ns!Do2>m+-aSc*q6@l zF81>ItCD9}SvR83#7}PxyXHh9Tk!{!J1Oi?XFwmH`X{p~KwZiqQ{ZhpYsAUC>kr*} zdja~@InLLqvixKK5g1fZq~fSUwim_j9?xnrnU+YpRVI^1w1w*H@}xmI^G%*LiE|{f zR%q*u#}v9i(=()r*RenD%;jJ6J}t>>OMKsP_42_xIaR#>Q4lH{T_*Sq$X!P@^f+IW zhT+jfS`^?l!Z4PFCD95^9u@J5Czyc=%0dt$rK-j=g2yUiwmbuxTD=YyrT_mv+Dp=p zmH6jSzKe|K7m|1UEp^EpoCpewQBBp3DBP2AQi<6E>2Q5UIb+n|g`yw%#S=(KHS$DE zGo_WY%0b`rw2^Rcy3Eu^->rA_)W2pM(9i*;K>PqK+kc7n#DsBnz6|YBEbOOu%f7ni zqF@OrG8i)FrpSvbI0M6EyD7ht%A7sE!AH0N+nc1V8q=U?{9_Pru}qeknB4fPq|N2c zNN3YRabK-E5#VFZ@+3gLYDFEhXFK8^_8vIXCySb^-qoFZBb<6-A?*Ad%sxVJ?BV`r7Us#P!PX`OE!WW?OaPb?dbSAS0NsFzt!(a9@lf2m*w zcxgDwLSX7Vp>W^)ECc^MA2Yp(dA4@L=J+Y$kn8+L!WX)NT%cGRPT%Q0VChjJ+o7n; z06F+bgSB3+C8+FY{z^VqgU1s;Csj_*%c9P8)rEECYPO+?R zXPff6gop%4)>xHkoYbLrC5}2$=UT|=&9{baD5ya5g1;FoCm#3UG~~!HHoZPk9Es9U zU7;6&d7w>68`bxn{(EwxHY*)PdXrdCQx*Z@n_^;$iVMQa`eiJUxKq(nb8fJLTbK8M zAtUu)4vOmIKt)=W+0B^(@~es@J#S_E6vu3>_vSdbRW|1%5k0`zaI97IYzXaeMa+Xk zEAdxlJ_ivKbJwk}ga6;8B%2pMq!E7HQxy-(^**4yy=?H-*6r=xS&djQH+08EDu|32 zMeHXb^RoMu(M!<`{GAMk#`7gv2w4Mb-qC@U2ufSOhN|zteGzV2z2(JjGIS8}{i>^< zD)XulqY+Yo|48vVNo88wPxM3NDMI0;xFxK!j2910f&LLtZsO_a2CWyn^@U>5rrLu- zoJd3_P0ALP2J;da0KG3ffO7tQ*D_%$a0(w#rXyu-O^G z&4SRTk0evAuU+w?{B}*U7x-U-MiL}W>fv8g#uVx(J6ra zTPtXD8^5wdu#{ruO)7?M+PYCNVxH?j+Y979gjV#|&%Z2H2UZ>r%AYKx<2|W@QJ^fDG&n+;%)idll=JTjPHtF#`9xxo*e4na0ektH zNlM`tWyYayy_Ze;dzb2eda{8U?uO+TXH~c`(;-;3`>Xec2Jz_4bsn7&EQ!cK4ae(x zr15&t5jAYWQ|xNWc;}EPN@vcos_f_jZEi9Bg_~Wwa2OZLX878z9A(`6TL68M0JTs9 ztrY`tY5OGC0=M7e@DqpF-!KZ`5&XS1#cV8K*!90|+7o;U>P3-Oe3ip3OfDShZlRLV z;B045N+z6xy=jWep1U=V+!dQXPSGi6+-wiSNHlPU z&MnMd)R&X^Vsm8PrLo^&lk>K>#Yf8~KkIl_oi?EIIQO7vJcZw11%%kG3W)ilEan$d zOd1+_5G!NN*VaXtyne?GBIvhPUOdvR*u9Tq>Lt@Sug!$b$2C1V`o72W@7kj|^=@8| zB)%=;RrNDeX|ymisKb)r>)hHZ?4II__cA~Mj@$KM?4x1#6O!ky=r5y-mT=Ps6VU+| zlak1ySKjMJLIh_6zMPAjA9@f~5nyFEcB(K}$t1CM2nb5y?=JOl52F(wzH0U+molVN z*BIym(wOn_NNteKoBCY)6F;<_i{j9BRy{;^>u|-* zTDg&V!hx>z4wWNex&Ulv(V-WirDS7?pYOsnv9Bky@bMU~u9+Q@sf zaq_6O_NrjK8>L~|?Vf{?)Fo>4SW)}ZhYLIzcJEqC(*S8gc zD|-W$l8Ws?Edhk22Yqvc*ZL{mVb z;^LB3RZibwnG^ASl8}P>GZ_4c6}kLrQt(KoyiITj3Mo=8*-vgVyR&JQW!#10(ufrS zFe?p{TGGas&%Q1T*>V1;ue8)Wysh?Vz6H11dfh1hmm0Z?oLe1mU!zc{Em$fS?oK(P zdy$=-`$&h(_e(4AV-FRs)i5r##{!X%o&==8mbjXP>NfZMfUgn?{Jh2^%U8N#2GUs_ zPte_H%Kh@fq>^XYhOD1$Cj`7)%NGaX=y7={HFBX=CIrnv=a7>_w+GOfy^$&`k4JAyW4Tr8@k0h)#iI}b{Hy6aWE?}I^cKPs6iJIt~ z)&`OgpKGo&jw2nEZ!`2|bua8_9ZRu$JaY1SYEMtM>ETyOP=O${`wQxDSrzgn_rrik zW@&{t_{RSF1_HTTW%Ba%qQZqy$&QcI#t^<|}Kp1*0kTUcw8pJ_F&h)|e+9905tzTD#lqJ2`_PTxa4F4K-y zr#_&^Ba8RA0Nh5fsL(uZn#;a!(t9msXNa2LZ>?@UCnNeySEFls&Z0d+e#5t%mM(?nQarv{#_1uf6#Z5NLr=_JN>}$ASBPIX9^}i(qNRVx zpHWGgsO-a%tu}%Q5Xw=l?zYGK#F2c**)Y#m5TL38X}|iT{hQGma218uhO%tVKefW? zDG@(R?t?hJ>!+Lzt~(h9N;pvQ=%1WBC^Ie_uBo?lb5-reB~acy^dlU?Gy!l}ccZFx zNvg{Pbpd{|+}T@vr-6h)4#msP5*&i;oqN_d8g);tF0@n8Wrc4%~!Qx@mMR= z+66qM)%-dG<aTMxPL#L4{AOUdCd|E(acmqNch@m7rbiBCF;6SKVtB*J z^^dsR+>~>ow(ed;6ew2Vx918cyas5qVA=5@Fxc)X?PVVk$`~KRzZy@w1n(@do%ynp zns_jS=ui{gm0?jkjm#*ducl&iMi>39_n{@CaJUQ?WZD-pot=)L&%S=&V%_L2DE9xC z#tME(EE)Cvm)vkuV1$|yyR$QYr<0))xMIK+hLmKFkJr&E^USpjX1 zJvA2nQzfOkeX$zP7V18^(*8pkTmG_jp7z&`wiFk3^-1doEPtCWm0L}(Da-+-O)xD* zw>EY7kgQ)^<`*Z=PSRvAdiv^FvJ|Y9%_B2Vq;+RMf%bs(Itm$Z&$;Lb9R zk)6MtGy54uyoUn#E`&n$ypDYdijUkCI0dtC(4#roo^wbg(r^pMygfP8ZgMGvV*Jmh z_;}l^#;MC;ao#N;>Z%cf`rKv8g5Bj_CSlh9uyP`sw5pYYPCN&4Qa490dJ>?^<;a0r zt7lYCgG1)(=sj|JEUIl&(A$lK}QK)ovO;J(-8E$lFaz+l>PuG6FoE`QjHP z2A*W&4v{IEEzyMKkHR$*_kvB-Yqlo>hkT2_K2fxjG!m{KA?c^y3LQbZi1O}{3?s$P z>`JsV6V)mfPA#M=PsnY`9cf>TRdYbshiyvhs4UYbZGVrhp-p_UZbUf?(9(*JBW%-| zUw!*Y%39BqhC}?C`t4;gmsMn$8hqN(Pgj5Kaos^Hm;O=Af20ZS&7F+ws)8SGSkv+t zT=P%Yjb26wXKM&+Hh&_g!f0#D&Fe<}X-@@3=613y<3r#Mu`CZJQ=VG~`{#QIWpR`8Z8bQ{Qd4G9D_OXxU-)I0gSfX;?QDiK zt?>V&a^6HY!6p6%?`Yte>o*bY;H|?^nSBK_rysEQ$!Vuu-uC7Od*!>|Ou)EGegl3^rhLC0e@i)=@A8k%YJgW~QDu?ZdeDnmEs2JpORHz%LD}jqpSBDe zgB9#Nu}tHhD4aX7#qclU%iizKm!Gz|pX2YXXAMeCb{}!l((*==x2__eVrR}LWTA7Q z6UOo55*}*MNhwl#QthPv{isA3w-*T2gur>jEmBRWx5BLIMC~M95nJDw3;nvV-4g2G z?P}bVLG21_!J5H!qmd#mavQDFo3q9;-2M-DJ|W?3=HoBc1Wa}KAYcDpPYbs1_)EiL zZ%O|ueF(tK5!$0y9sXw}rN>&jD}$i;)U)`Y!9}@^ax%k$bofGJK=-JI*aAEq4h*e} zsSXP42aj{>MwTA56=MjtZ-(kUg4d1ASCH_Je=w;nS6(H04~3f#*Gej`vOo48p6|Nd zRZqfKFKuMGH@H!R?c;=sM(_cYa}Hmp&ZaFW)_E=+}d$0(12|M~B7g1$01 zu1vGrdHd>K!@ma0Z68LMMtf5#Zk;`Kf!mOCtgGUDr|qdeU|MmMtgaeZoEO#jUv(SB z=}Tk!y*Wj8X{Gr1>KIZL4@Z`P{lkfn)NkSQWDEOfA2-#uA}7kRdSqo(kJKip|Frj4 z^nhB-Tyw^Sd<`bKBBKck#L08;Nw$whw^l|;(tiK;4YTI%v$7*g=wnlWIKm5MU}F7n z!CaRZvTh`m8`77B)wGx9ZRX2E1pVO~RVl-zCwC5sV>XOJB5_%jmlJn&Yr(+@6h{@j zXuYhvrDPSGJ})nhb;|cBz%@7xwAmg#i-YZgm%*9>gBF#_W^jP^5^)-0>3M+evZK1; z@Fsy_J1F(rIh*|u$ZdHw<7bs+*4Ak@*lqj$q#3WUxVS-0%Lt}`Mcr_9uW{qh%+tw^ z339W;Yj!G%)U%;P1R8rQRmiVXI)$?pgf6yI!0HNoMHXzWN=AO;RsZIqMss$a{AIvZ zf+>=HNv6*ZM$)u(_(6pkyIMRoh+h|$wy}hd+Zz>p^9_>Z&(IjI&y0nk*V4n#M z|5|>lvxh7|3|WJE?7`4gx?^3I)}kS1dvv`o1tcFSqa#9@CZ3}W z(x0AYF-QFpCZcMKJ-dy#`neLAstaZm;PXq{t25qjSU1w^;RJ;}=~U09(rIfp*ubaZ z_I}-i1xk6S&o=6g-o#tCN63`#N+vI(!B!1u*y`va_7lu%VtC7azoZhp*#X?`afSRgpZ3wP5dHdd^EMz9PyMSRLQOP9BO7o^aB+J|^ij>Y4Kn~V=7x-I*j zHu8So$lKdF&tGRS9%sdEVt8|C$nIQqrg*y=g`>z|;hQcJ2H z266;SgQ7zSVSTO7M^2RCXm24@eEh6hb%WM$P5lGQJ~WD zh{0{h#e-0=R3O)OM@E+|%sz&n0+Yly;jGKWPe#V?1Qo}g71@z0@;K5q9?|J`NidOS z3~O?gehE`AKS{adoc$bmB`PoVm(hz&ie8>7F>4754aCBE!8cG&ShT`?nYI)?!G{@! zrGdF_^fL^jC4~pY>P$4&@~Po1hZ7Xn!b!@22z&LimH(7}NZtZYFNPTilgXmklZ#V) zTnWZnYwP$VTS_ELx~kbg^FquIp}`CK8>0Ez44X__UD!C5={1Agk`r_Ozi{sMI#;$a zpLM$VUA?+%j(8m%3Kq{Yz~8B<&KFn9d>0i%lS=D2%(+EWc>Y(ELV7Gn>aH@BHNuI2 zECatxgW9uhbnYpQU$%BIu5aJciKKml@!5T8PfwbNZ&H08cTQoR_dke7<$D=sEy+0q z6{4G`g@9VeUMaKWbzW?+`EmMF^Tc5Cd3|Lh5bcIF9MluxgzFQUcpOSY#F_arU6%RE zNBP<|)azbV$nb#rjB_9M_1Pp`lJ+KPG-w|OWw6tl0trQ_WG3Z)i7ZYre*3nJtkTIHgMG%#HGhLhxUzF2lVT@Lm3{_&$71x;;b?AgN8N)%jFck3 zy=8Ors>nhQnG~~S9u^inK;Q_XOHOkH4TAJzO1l`sWb;{61!zR3s=L973g64ocAq<} z%Q|pNp9VoCoY}g?fJD$_a5jIa4e4w~@aGDhDlcsbB_Mnm?oY<^%J1*Z^v@K3SF4cQ zB6=Xf>TW=Ve=9J3NE^%PwpU2Y!IMf3RyVR1UMlYxDr~Y%CQrto%$#phBt5BgfMX}IP6LBK==-ReO{|@Rx$wPWq@xvtwSc(|8nCiR#N7YX_=tjs;6s3ACb?N@qRu{{AR8;oLW?E1A3&Wc>D&2HV#l69I}k?55pjG@pzPQ zc@|;FiC)Pa#uDBK7)eKME5n{(Q6b1QSJIVSy8 z7Pc-T!wF#$1-RB}QKr7>UfH7Z>*138(^->_het=`aRM|RtlEG9i5JhQ*NqOz!R}>c z2fXbcofDOCYb@*^K#_r#tMQp$sq5)Ad<_~b?BzbghGLuEhGz#~pS8-+zBCYc2JwPj zOhSNaHOtTprTm9$=pLw(;5N^~SBR*ZR0jL~?wR{&#OKMOLDy|7J-1bV_qtLpM~xf!&H01kYLb)(Yw z?`SW50Kb=r{Frh%@Y^FZ3BQ*$l%-J^L+-s_h-%3N(OD5%r!#Y1Rnm)61C6&Rc4no% zylH9!?I0|kaMe@I z*AAjOJ-%7S2;&9{SU?Q0>62uLkfXVqP~W4H))m zm!#%eF$h_9sPcI4Q!4V`M`!{N!-g+8%zBu79O@s)&II^V^+Qce2x4z(Be!6(CO&kA zwM}tF+Sd>r_o(S|hve43J)IIlU;N3w&###ipkE%ovXVPCvb)+bXd(EHQDl{`;?Sr#vEIyRz|p;I#{RyBiF%7Et}*gVQ}N5-flGkKd`~?YpitQBBPhEQ@?x zyi^@Rq8ii@ta2n-r7@0{FE0w$b|*V77#mIw(U#$hXRr?MzZo>~M~QfCHuiL4_Nh)M zx@>at(#Yf1TVvOMk%c5=1tf*|-2FTMO$^H-0xkJ`8$9_uhyf}5NB~)YRngv?xxR1F8qPz(wG?4f>_j{aRN`zZFy2ztL_GsTky6gd44dF^=v((0N~bny}aK{Z3HJ%MQ-U)&wul#){Tzeg|la zKE5vN!3=}k5@$By9_M#_$LMDtvpU!_``pg@r|4mT4(C!eQUM< z$yTa{r8@ao()*0fyy{*nIyR@^X{dBKi&nRq^{oHHqBB=lbvrZNQoM=@C%hvcxvp{E zzSX&v*?1$abTIE$hzD}v$Q+Yz11|IA)l%-!MN-=>d*#hExbb~xEeVrZ-ji{3-qgRqYgM=%HJMGSrs)J4zx9LRux zqw<2C$A~1?Hud>4c?npFb5E`{>yK#eLAipQ|IEK^Rgo;$Lc`zb)v#`qD)jc)wQgip zzkO{9maf&g|9HH7{Lp}Zs~i}MIW=6C_y}Ifn>F~nGMN9`mU^g>&+xzOoy{B%&XoHv zyq8q)Bi-Y@DAXuh$7Eouf?C;G+^XaEgU(X}3W{>)Z13Co?#gL#wlOVkbZBZb8iGaY za)M9CYt0du@Zf>@+O`V8>d>_TgTNf1Ijo=VV<*k8JQ9ht2GafT2HT*ZO5<6QV%73P z3i0&3KK+jv72mgVy1_9q;OjrQO$9KPNt$ft6d_i>Sj+7A%LjTzPWYd1bht;OQfc;^ znJ?=#!TucTy#m+5CEE5^T|Bxfc!*#koRBz~uK}^M-Z@!3R<=wvUzQNwhuIT;Lp==) z8n99BWI_Dr727;3SPc@fuR{;_*dbh z3(xoczQ=lB%Pts-spjG{dm~$6IyqfKGyl8pVRa6 zQ7)yrT$kf12QnA98kjTRrjZca!_F*)T@hIQnM>^z`Y&0+2fAS)Vm~tU%eTjM7LG4` z>N3Z}l=IR5E(agD7UFwH2%6Vu;%=Bs9nKL>d?Ccnl>Z(ybv9}rx;sC#vn(Vk^;mzL zbzZsXdP#1{+HOwA5!cYF0y z$8Vgvk1-}(?~waWOQw^iaGb^mXJ0foa8X(iL$RM~BclkbCg=KuttC31s#9iOJ8%?(0gURV?=UBOqd zeZTuQ4xd7&{npjFn9ajf-GAWF>u&kDn@xk%T+jA#g&+rKbQ3~X578lk_QCdyz3N&L i^`2PX0d_^Y! diff --git a/img/hsrlogo-bw.eps b/img/hsrlogo-bw.eps deleted file mode 100644 index 709aacd6196e5b74e21f1a4ae7d7a834a2b6e6b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413070 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�nE%P1W{mI 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 O{|9LQ_Y?fU@&5yga(3|m diff --git a/img/hsrlogo-color.eps b/img/hsrlogo-color.eps deleted file mode 100644 index d86aef7ee4d8b40ad466a38756c1b184d4b482d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413438 zcmeFa+j5&pvMx3^`vT+WcYybvo{+qE>*rCTI%fA89;9x~w0dMwb26j%F4>B`d|LH|NVdM z{^A$E_`m*-|A626@4x#$|HCi-@98go@!$U2FMjdmfB)+AtHa^!eDu}sqwVgqSEtYM zVe5-uetCHEhu+EQaqro5FdL4i7hiY(Jf03`KQ6kjXIK3xN__cdyqt`_?tXXry7&F; zV%9r;`Pbh+8eK1#cRU~Um$UiTT>;*GF`3*fmUAXOc>S=uz5i&NrJl3I@5l4O<>l<% zXx{z9Wc&et9?afr+HWrx^GAcrhY8|%Ha+Pt(dd(Ed%N1%+TLN-(d=eQ9FJxnzwU0~ zzwLv)?i0!SZv1+**pPobpIx_9`@TQDxanVvz8`%UO}_35sFT^?=4v!u0)hV5-Q&rq zKYemEUIGEo>S%N^o*qxe$bT{Y+i0)^reAlx%6Fsw5dHd(hcC9bLF4~Oqz_*l^o&Y> z8qF6{o^%2Ak@vLsYCfJW(J3}3(2u&$zs=N1S zfBWERcd+aN{K1ob1#~={F8kx@;x8{>ecgSDPtV8m#qta7&a>(8vpVw%v|4=Kl|l7R z|1cU2M?;W*b~7I^m%aAP)0^vSP%CC%&u4?hXsI02JN))#@5L3sc0rLYIr7W@+%1b7 z&t{W1x7VZIAD83FczN4GMA!UZ+!LowYag7-e{p!A-&VGb(yBgfg=jfp&cb4;; zQ8yR+G=BHRFK+-!s*8y$28&MdPxiY^?+$OSyXUkEyVo}`6RYzfYOT&;Mt6s!cc1(N za;C%8^afZ;GD}q-rR?bA;4&mmhVNiRttPX+L6D+DDT*dOp@ELnm6YA?SKD3Ce!}Kc z-Zd~;30zB+=84!BzwBsxK>Nqb(R{>|&h_lNYd`q@j9qH9!mSG{&kONP?CD%>HFTae+ANTSjqEC*yI&fdypr7 z?2i6b1{_({>(S7^lCvK4kkG^Ou45y?`qj7d(P)~AX*o&Ll3rBG9!(&a)<8$N^+Atm zRy37m;Rg=~9|Bx0ZHBSn001&7_?!8m{G3RkC2dTgyZ-p*#rM5$Pv0EAdDh+8F$ExU z0mkiJETAlnM76@AAwYquOz#aQ^WNfm&^4AAh~xDG$~15vq87fx+zR8f%c9 zu8y-7yz0;27tM4BSWqvq0zd}GX4Qh4LTbqn917h-5N*AalItLBcl$%ta`VwOmNZmC zExmp>T|&prmhZ5NTGQ{zkKVb-c#7F;xD=h*0&J3~&60!u^*V@uixB@dgNAP>`PIY= zUX7Qd`DBbgR@60Pe{or-&2ZL*hHa$wnc9N&qVJ7B=4S69{(r;rZ4E}`syQa0$W@r= z;GN*?*WL@v09JekRd!9k#F~=l7hdw5OG>ORNAUST4MO)}g}$cN&0y};;Kv!wh1KVy ztJw$Wz*sRN4QJAHL7$Nns1xhrw)c^lpjdl>^OR5SY=@DGw1b$Z{FXtvTzZ!-`;&Le z*>s)QzMG_y?pAd1c~YcwX^B~qAkTJho3Lv+ug;@Ip#dr6F)_| zSs8u(WYXI@;+&C-xn|OO?kI{@qu@Z(ZQIK5Mp@ZcWddO<7%IsTEQJvgOi@s{K z3{;aTv<{6DyB@JXHOIf`qZfrd?d(79@<+{1)uO3Gi}_$<{&2B;yw}D5>uP@wdz2bE zL8P5kBn+;HngFYT&ea|t zk}fii-~xua-;BoxUq0+l2bb`GLl_5_2{*Ii0Rcu@Z*X-Bt9ON!G>NCH83LEJ%v4v! zT$w$1Se@RSKS$2V2zz9suGU92C6}z;)N18;q#m8&3-j#*%+{!&SF5U689N9L-wu2K}I-mhh=Ox^{gG(c189f zprYH(>g51r%s|mL+}JDU`-BzQyc%bkR+#TSQ$+w8TBV~!JZ$Dv501Av<_;^Bn@(Qj zhMuJLm{^(%x$KtM94K%-Ta3B91M#=vcA(QU$%7O>VUjId$5-b!@2ItO>cH0d;?-!5 z&BAM}j$q_d9G{2~9(2dU@dsZmO1&4*1mvCT@ zuc4|_wMD4cmRkd0IzF_eNG%Tgk+r}W@Fn~biGt;eS771dm=4I}lP zw&Z+Tz3amho2^9A=9LhR?PRdI`(iSiWcv&v6-XBh6zfGNQ3oFWoD;-So8kEAICnY` z4AbR12i~VOdc&bT)}kd9Q1h(GrghjL>>3?LiBQLTo^VdY$oir8>U2j)lu<~0+v#=! z8=Yl>QSnZDi_vv&2p-a)21=i_V-)OEEu+(w!7*lpT2)Ru13lk*H8I@9)B$1CdQh@9 zXlFHEaKgguW*vgIge!cvJDp+BpcK5HKR~jmY_SZ|{&JQw9$lOz`sdDYngDB zNoC6W(~3@R?h)iqs-_hgHzG~6j2Y=W{UFMK6SlI9)-qp#egVlyz7D72z)HC*ds3R^FU3EFW93$SqAn580;y;_2Hs#t#sBkX%T5cWqGWDS?|%v@HfXhFj_;^!)Z@ znU(wZXeAejvOk#27ERf2wkhSv3N6}TI0A==CGGATdhBl&vJgSo;_wEBu*{v^95?Xo z%U3;H{`BB8`Oym4EKa7zHaD!v7EsyjWQhmgz3P77$A;|hz=Jyogm?(oCskY{a}SXc z-BaxLj20{->+qIB`(CKKzSO~eKpoHzdsll0+o`?v&F$Z(x%~~z9didYlW7kC8?DvL zJZ>qI2)%zgZU9J`+ZcsAJHEYpk3xI(K5@bTb96hM^{iA0KgqOf^K>f998s9=>dT%4 zEU~~?0N?3Wulh^)UASK^-*t)69bES3*M01uz7ro~m-|K~6K5IgeA1?o0uXVXFI>%C z20A;LTMcH@1){5EW*ox4)}^OUhiK%*%Wq+ejhFCyTwTeEGXiXzcU0OSOvHb+*)mrY zTcAi?{>s`)i6j#yGcdaOR??=tt_C_*%JfujeZ`<4K{1z29FDDY`Avr%#?qOLAevRgiyz9OVTBqwJuHv(Di!%pk$ERry- zA0&Jvnr);)q}FE6NW}W-jL_(QD<5>ssNCQ$I_NgmZyX@H;>?M(mLjk|ef;ci;1_p{ z$UrA<=m?>T(Qf014&v(q$8<7BBmp*d!XFKxE7l^w9u~s@@s^Z_?#@crk>r!S1cvug zqx)FoY~Q}Tm7qd+CENwHBdD&37lhPHl$4eVV5`!=z^ ztY({wFlMLN1xqo495a(bYDYj0qo|HROV3V!o_XP-R(6<{SJwHO0Wk;w|!0NiE*U~4Z#{GvEDb$>!NM;I%p1?ie?X$11K24=@caRRb}h}E2m{m zU?FYZ@mkk3h6iT)>+v-`WuKhC_~E|xWX77c?-=kjbODRf z?(DR%ln7rMbX!Up>DauFnVb;N1Rs=?XU>PlP}ZFi#_8u^pU8KVCFM$|Q9+-T^jqY~ z1zRWf;dp@)hZ96>_UHYpMF{*(QdShGsLoGN$&Ovf4w0<7C-4{&*)-@Jwd#8KjsZ}; zeQ1Cb+!RhV2*ZR@Rz8++QXww9KRmik5VgC8Caqz0bipu(9$Oc6;iK2uZ&@>w&;IVd zcUEE^3s$k?AjztF^~X0|@27T-ZWtSvS|@w%vLiKX{@+R>`A^m1uM+@*U$jDnnYNb0 zw(;Y(fZ&!(ad9V6F!aQd2Ejay?Zns^LKBeUBNf8sK^6ckVHV7;%;vH4y?r?}qSO3? z|9Seb%#^x5_{lzw>i#3CsB9o;WC8!ae?G#|2w9;ihJ7(Q)!;l6VyR7`_Hp&<@Y`qK zA09pXK47d>&@HBQ&Q@3_}1RYxdCFo<%~Wi4}@rU4WxlD~tXIi||NO*}Q*!IUY1K2AD_1FPDH{ zHBxRHDeoI8jG}|53pS}P9!i*t0nhlH84>kc-Xu*;b4^i4=hvX|1(q!-{!)6#RI%08 zBrh0u(UJ!&TdECkI$lHO$|{VO!Li4-tlQCKGW)SDM&gLN34fJWi7)NAZJU&2#ouS zR(!`(oUh@XAFa9X^kN5DhaB^OR@sJU&#pIQGMc*R4{iZrn{Q^X^n!@imQVBmaPRod zOOFUIN5czn3OybFTaB2W%P93JE}Od1cktnhT{hN-`@$ zV<@IJ3x6**<|ow*@(1bnX4=_%P#=>wpV1;p18ydoq9GnxlXwqdqPZl^j$ zYsu+p&MUK~TdVG*svYv{ZCiae$CH=YEci~Rf4)$x`N4c|G!M7C7h>zd2IhW%?`MNYymY^w+2~h&Wnkd zlhV;oVqVi3RhW6?;Csk_A-61Lbz`fdY=}yM2*Efgc)10pGXxhO1|&$M$S|&2xQ@OJ znLx#b=E8QNJ{InIOQt&^#UqSBhym<1&VBNmB_z!}_p~itjeK(qXKpgm>FY}HZaVB>R`je4-0W;XK$i%5;-U#``w_4`>rMt^OZOI|;%T_*r zouAKeqA6YV(A|BU*N^ct4&{Oafw)8P5zhjOF9k?P5zFla#j|)QXVP^l(+gCJUso%t_@r_uX4Badv`X|T>Hb%qxwrY$frZ6QI;IoNOVOM*HTay;-Q`38^n!OrzBy1^3FgsZD*)n$ z38b(Zus_NPE(&YWS0=D$4$;POM>~0;`zb!N6g7()e-#pC{{t|_o=lzNOjU?;WDiS4 zcUdGda+c89Khfx}E_NB<@}T>Wf26w%7jWFHvYBln&QiuZR4XU=Z+RFwaPc6BG`w*X z^OV>I#?x5iBd=j0NeVczL~&p$Oo|P!lUL#mZMFe$obHNPoS~Vs>J+l02k|Sq_ia~% zHQ+tQf1hCR7R4UOm2eLm1@jh@%-xM@f0b2mqh7Wtw?aL`_UwVxvPR$5Tit`n!ect2 zYVObjyTq>6rVU(cb6%spJ>ORcT?iyJn($2k4DlMq8Nz)kw_~wq8~Oo4=reEct93Y! zVnS0&wS(V+L(%pMLkqQQ37lO`Sz+D0=Dk*4B-m5+>Dc?Wc)^ zwns?;ufNr)yzWC4hhDN%OeMDNLQv*Kl?Sa`E4XPFMpVY?H@|^^EOEu?5wsYN*~;qg zn{QwY)Igcy#2>LHTu}sXjGfF1IkHJ=CwatFp+!U`g$R=Aa59oKU4BYnH&I$&F6YGB zn2ubdwiXZy1s`=m-%jUOQmMjXKt9MemG=O|SMLjN)55u5;H=OZwRH0{ZRphjw3usQ zDypL(eg%i6HsL0+kN_#FT13I=p+lA?h2R_`q0?1Vj%`Zd%~X;PXAZBOO7mS9Y+R)Z za!BM!qds(jM+2*s;w1tGDU#CjjMxd=a~vMD^0akoeMuHsxk~(H0YmR(|76Hnl1z=2S~wF@q6qfl1)A zrC^ zY8|mlubeBA8!PFD)D6EL%OV*SP98NFMs~wQanVFBz+1EsEeabr>?s5rO7pJ~G4E@f zdR?v(Hs!y=PWcEuSai4H-IZlh2JvfID^$8-z+HSY7T)b&`x>M258bszu-HqbxbSNf zB$}11Xqs8U0f5zX_69VdTu^m0h)*@3Pf(bF(6JnH14Ts#D+avYUoOQ>7kku;4uJPL z(;I?B5FMZ2<%=oACR~*MOt_rM1*SEWV9H>Wz;u|TbctwEicP%Bg5(gfzXb^WSztLh z73BUdiC9*3(aL&aADMR%6e%I!2L&HCHlF)weu8>elbfN@ly<^BZ|p>gii^Tzxstwm zmzpKjbtt+LUQLH$>MD7ol200#tk#zzn8>!DECk!)VDCZF22CJBYsi8e8N!549(nJE zrZ_S5-ot|O%&LKBlE5v2)CkN0Fm|nR!OzKGwXS(bO3c{c&(4x@6qP_=orF$OBeIX_!=FU(El|i)5WDY zj~rAnvDuLY!Jw^DoQoBV$WMJnK`}<)z_TT1Z9=V>+*P<8nsW zPdEL^+A^`T9+{8RC%FAl#DoznH2KrriM71)UdCFcT`kA({Ssnv72|Jy1JzNz?0p(#;9dm2&iOyJ=+dXuk_?(wnhG0LfPy?ZA9yg=C#yoD2Kf4$&vssm_tNuAsbI zP0YQA5`i7#_#6}(iL;5=7iB9&wk&YGt^*GNKzh6RR(FXlV-3GiA(iNzx=;VA2oR#< znQHc4Rc~Ve5o@vTy=uk)BUWV9dsWNJ)18P=6{3J zr`PsbhgTg0>LsdG)mrQ706Rh63Gg`$#i-T?f9}txhz0t(`#VHoVWU}I>yZz zoIx@@sbEIwfagT!D>4G7NqTLB^AQ0yosi1OLEVe%#T(2eq-)B>o|(Nk;)L@pr{rNt z0?`sQ`iJRvjPb)Bz(N;VE+Dyfs@@4sG|HJx$@!MaupgAdLBeJ}>-fS2A9I*TiUkji z$^g2!6{TaLActjzkdZ&uMnip8Dd^D2S+Iy)edIZL6nN;k1}()(dg(Rb0}#p>U8fmR z?-~nl-hVG4eG3^+vPnHXM^!kR)Jkk-lQk&n?TKyl>LEllIsUvUp&a6k#uOA7FUokv z6{)ltMX#)5e}E@huKGS5Eg6z%Y)5>R^*+0PVku|cH4u(zCu>|HUD>CwA`yLe8~qC| zI*GUIy;uh$;Q*;#;Q1<8Gwe~pw^UA^m}in82Z6Ek7`T|E%$()A4LY2$mKp`RoMCw6 zO|E<}MD1eqG4<@}fU*v0BI`!v~VH0JP=4t}xFgTu)r z9|H3s7amR>%oK4pb_)N%Gc)+}lk)atR475U`7w0t*{0}EU?3ot^r;3H2my*`0 zoZz+FVU{D2Wh06~3RzN6X?AcX$g`Za<$RDd;N3ck+T3a<_|2F$Z&AXxd6SlRF0d%% zJcPOxD>3ty#7JVO2UyQ(IB9gqyB@f!xuQaxkB6hY4R0!uQ-imh`g&*8poy|J1GeA& z>y)vb3kgO(1wPQn`hcR`C*%z!krd^{1(^Q?^+mO2!80rtKI5ZQbZ`aU64gbbHj#<( z&(#~Oh=^~tKhJ|z!Mxrvvc6oXrkIggB}{~yqU z(!5D9a(APl1DX~rB|D;VqeMs+dK$Yb+}%0`c_NVdHTjWYiS|>JwOBQNE_ZBlPMSLI zF}vgvt!eQM!?pPMEm@z1~rvw1y&u2;Lv-^2ua4?qtED%S2h(u$W77Z9N1&F)qr>ADJP-X|!1V&ILLI z*_$fX=OH~V&xLTg>7I6SOI&eb8BX;Cuthe|QXXbT%Zlwj>ujM^OTia%$w6L^>s5N4 zOsza*!t909_KXB`#bBOWHz)a*%GX`i$yv!!aJgY`w;tg}ynTU`ruI+i%2`QIo(q{v z-M4Dj*itw1s+AeM`h1vM&QjS;7BEB@paeI&-iC?J5MVx{X)UG(UM%wLd-y6mHq2^* zbzS?(nj>g>>K94NDvn86Y{4J$KOveBI3M}slPS$Lq;EeY6cUSP9yNmc#Eri!?Gt-9 z)hK*SS_${>?O}e>7Z$StCiS}+LIM$)JwX5n4Q@^Lo1*~mrhxGY#mvaBW6EN|WI)5= zTl@@*-w7f-{YiFMRj{&)3ub9Ld@4P05;sUDHwhRvs?rj=UZ)O zAdzq=*rZ%87>Ko&bafiN=F?=O$mC*b3b}M(Tdr!8w?$~|N->vx2t~!|kMeF;XeFa4 z%^0NggPsh)LlZS>m()mD|BE1LwX z$3pZ_|ggq{v#KJ}7C1 z+NjsE4o^a!w^XtL4FyiN^sNmQfe`{Do=Ob)~X$&rhK8@V~D6wYps71e)8^!a0}^&$OT@bar}vq2mc6 zRfyz(_g3ci#7im)XnaZ^daj6V*xGlk-Q!M>L$&pxRt@5f2nr2;;FPe#o%Fi@mUrP@;;RUe$7gN!BE4@|HUlKOgdv*@2sMyE@h z-oCOMG?hWMSi#G#Zd;goVY`y2mpEZRz3>Ci3dHDMJB2-YdUityc#D@o%dn7Nv*Vr(raIN}_SrFx(cWD$>3jvBA4ef|2&POi z7DS%6wWepqjOAr3@BHE{eOft^Mo=H$HB9Wb2zuL!gv|;v;>tySw)5;|lU$s#d@;v1^ZW&=$&*$cnNCD! zH~5eP`t;X3u`_K7ykt%d)KW^t0OVwBb?@(+Og^3+*JU=_IP;Yt2s9 zLSAB~y-i(Xz6A=ota5NZ`k6V{X)UZFDo}hW=v2^c)+-mO>^ZTF4wL|Q2~wMBz2&eJ8KH7ekjZCt|^-rvBg4dD=pK~q)W=u%okPm~5FQy2E zUBDO|Ny{{lnnbA0w?>90eZeSkM<@XzPV040a|Eq{hTM>wcv_z4NIBjWVj}EJX&M^; z(5UQ#|6*|*+zd(0Mhe3l&)}jBAhIqkT&qI)u=yO6R{$oa<7Z7q&eGs&rxrejNzi+Z z)U)t8gq4NVfQl&4kQMYpNG)KNnj8|1xgz+bfdT*RwGft5NqFBgHUO7kdiOJ?@22IE zEQ9Q6`Z&*^t)_mDAXrgQ;;)bqr(#T3fv(OecSe;OST7$0I_|!sQ~(~;5`;osC=Q`r z(AZ3pCHoTgrwinRP;TPiC<2KlScY+Fo4(&im2hR_*l$)Qc{^)eFVRPKD-9C9qql}m z=$NJ4t!;F^;8o*R#m6B}7M4*L2?pj$#8#4xob@su;4Yso2_MqjK24@oB_R=z}Y-^0y{Y8h`i8Gl|m_?D#jiVRztt6 zTZ?fhG|ase%)RxCcW;e)DXH2d<(=w;Gq#BpZy$kHQGLneY!7&{3oF0tK52Fb`H*Z< zL!?b(t?DC^)~uEgq&>&aW=-Xkxt~OM>2(6(*cWR$HSdmJJmXUf!^5m{qsA;umf{Yi z-e5f9E&IcMFZ2bWXL&(i$!3oVt=3FnFxXTymaL=)Jy9j_FhI$cP?h3phePs3Q(3yRvN zK-d3n>akO*)3MTb4q}b=qC5=??x*7trHKDFzG2USd-@U*SREbBKEgN4sPOH#)n87R zxN>{D`m6nw!qV~W>dhDzA703p-EY20gDX$&q-6<7-k@q;28e3*{{Ol>*=iB) zq$H0~ob&Z|0c}N;o91aa2jy+Ij>uJe@@-D`lJA*h)OxE8G>H?3+;dsh4y$5U61Nto zoBeovg1I`nu~%}KqtsCjPDY|Pv)c&s9*!J^;82D3bWk=m>b+yMnWJOK=Dy&u%*HVV zv?6Hl<2LB`xHG#yoJ}XU;;loLAI>Gx1t&|Ll8>E**6?TMOae;*amshz4%uD!l%2=k zF32E9r$V%0^4OKZl1h6C1*h%G`bo(1-3~tOW}0{*S)a33&Qi^X>m9Bkg2NH_X{8l^ za4%iE3>EAf;w$chW4AI}!+K?MCxfvU?H$_pv)Oy_w}#A{hdb}}@bSoqfJ2)qnef|o zuG8VN_BV_)YAFZ%gAhtF%Dx;QHo*_lm&(|=Usnx!E;!REkj&5vry%hPBL3&iwdt0m z$+)r$YyFC)!3Q2TFABjbh&Re}WE5dJE95MWcn6s$a8zTk^oiVOQ^i8Ga8i9qk2J0n zQRqpR{rcDCA&43n!#r!k*CRL<2cwrf;5!tXl_(p|jHwnQUyRi33b&O-`;)Cw-vQ)? zcCqi+*FK!HQBVoxF|^H_v7-^=%GGWI zktXnqqJy7;cBNYum(8b1LL@x<+)y76Ac$<^DVR))PRCdXnK8AFB(&c^qKQKxo6ZD3 z4iR-q$WHSv3qX8RR{YH2v2&u}*?Njw*t1Iy^+p#5;bRr?zY}VKYl2`4 z{a*QmV>%L7pNqVna|yoFdu~=@fA}||sAMoThLE&$sg%)2BhqJcJoU!TZav!3tJO6y zM80y1oFa4I65|r4q3Kw{4A7>5U^m|~p0X$7oUQf&+fCVn51RehqtC6Mos9|H9<^)p zGpKvo76*99di(4EGO~qF`2BYEn|HN;SaovexWrVq9h)@w8+Bq%GDvu-P5}nk4JDYXfDm<&QUQd{j<-hz~t9&9woF0%ZBB+CiP2dwNHaSgg=kerP8$oBFCk*9HPp(l_@)K@ga38uu8Whg zX@*iQX4hQA^1k98H!Z{?+7fp2!z4Xu%J3QK;p#B6o$tKKz42*)s1!ZangEj$ zxZ^-x+ACFZbAz%g4?gQfKf6hL`!P5V3=syervEm(zFG{F+aH&&>Hzuo?`>nrqIRoW zC^qiQJMUCiSG9z}pq8+>NsmN=&ybB10HYN`)~|4r$5nUdKjA%^EpAK!W_K`fwgKRJ z!7aXAV+F6SydY3&6huicczf#w(V1q!t!*#({=FA;S>Onn;d7kkr-fh*MU>oN*<-0) zg}&QzP;NnULxcr868Ppm&)9<}Uk_ zcRV<6!bU<(M+_NnJh?0Wf{-tlMS}H;n(8UZSF?rJeYL6ykn;?1N*l}dI@@~jK)TvyhI=pieqRq#6y_ z%A|A(C=*=xA-cdw7-Km@wW6~f!uNJq!{xI#B zLU+oU_j&(nJh?4RBw3#06=dC!Q|ucxPQ)NhQAD__{loMVpH3Dj&uSwW5$=v%EKuw` z#nnp#34dw4(b{SD48aY^F8tj1$(m4SE1Y;3;z3pJ;Bl=Y`0dr6d5asZN<-hWsdCR! z(&*z7eh#~dA78f87w+GsFY}%Baj+x%L+oia*a<~4oWXV|vK@+m!9+B@K~NjJV%e0@ z%iduAs&39XvZV;lH+D-GVhNJwnSu{QR$j^$^5S2oBL&obDj(G*&C6CTpz&a#EJGjD z+iC17Jk*k{)^GsDlKFi$Yp@kw@gAGNOiJCpja3d6b?fQ?^dp(or=xu%eK`!cKDNTm zl6d6!sXW*4$-nMA(eG)BbX&SwOmJC&R3;EPECAqagr9jnOZ5u|S0QT!#0V{M#@h3U z5bGfDmUs}9zK!AtXx;4tytPNLY2Z37H8py-S(9#yTrEp_ti^Nl-kd04xuocE7Kk4|I_QH@|ji+7~ys@z? zrwozB>_%^Bl1@+b)Y{ zkPfM8W1LwOrFI{a$@=rbREyvUqOziWt@^hZ_hJG^OI814Yw9h=y{&9Z>bWv184|$o zn?EkrXyIJgQ+@%3mV9GqAg9O>p|U;_gweGNWxh7AjRYl(EiZwq8QE)yKBo+Tt!Dr| z)L5H=?4pL6y-MNa50KH55J(Q>ySWwmSIrxe0R zj#{D^N*3Q8>DXnTQ$Q`aR1Vo2;6d4AzvEQG5-1=~WF<(h@DH9odis>;I|)I2n|n|P zclaNQ^NI3J*ec7Ir}C7PE9Uu*O=8>bbemJ7DioPdpeYvUrD)K>Y|%i|Y0sMcVYBhG zatb>qh%mc#m`Fd?W64H=)6<=dmMg0}(9%(6P5vla`Ev_e4Tj(lvu+zo%8dRrDM*+2 zA5{E)8$$e-%o5}xV(tC2i8_reYV2qYXDTw9*3jnbHIg)P(5$(vggKN6W|w7n>bh<~0(wWolzGo8EfF zD;vag1aXSJ8!q06rFx_6OQ_R*BI7|wTl}0~4eQ@bmi{e)OoG^eM`0ioz}Wixq4=8F z|H77Gi=dFNBdg0XcDLOw(=X^KQK+UjSJ&fgv*GIkv4;z;etm^&vQg0pdV!Vli|GLR z#8WZ83oeDZjMei#mSd3VA7e`@BLS@CQ@}VVCQc?w#7hyeVk!!{PsjKm4i=1t5$(3_ z4m+DfxIi>CsOmNWX2ZEo?1n^Ac$RUR{i&q)ZkLm{+u&8Vq!AT6IdN^NIZNe$R}w`KJoOQ9ph7Kx7cZH7KWOFPg63-kr$}I z|0N$A#BJDn1sw3ZG9O7Vf>qcESpEc;e61~0dTL)frKF5;jQeFeVI)_HUu^i~qWS3m zL4OJq%dW!w1sxzA94I2}Oo0px#BEo|TW0u>*vK?$7R}Wy+h}w}aYGZ**YLK9?|Y$V zzDq~<1dAy}%$_24n6S*eHev|_gFV4~wH_y3?6Zu3NhTk8SuO&k>f)T}WigYUsONf20+))w@0HolS6D7M+yP>VV(PRx8t z-<8u4C>Pcc8P~ha>AE%T7IV{>_MFePrLzpuYWaLi+Q}V_=lHqBVqG^f(UzvP#$owv zQ`*P&r&-d84Wcn!!$}#?7yquigo?q4ly&P}mUL-IgLm#Qq+P>t#9Ga02Uu9qLEjR~ z&20TsZ0Mh2LPxoXycm%UpYf3r6&-2uv+XdJe{yyA|9?B;V;N(NfRD%=&K?{ z{7XfOI3r_9lv(pM(p&S>T<1wvvWt5MijRB4IVJeA{~<2!76LaN+||d^WgkB3td^^f z&#}8Ah%zD1Ir!{OYfHX5!x7b3RhW&;(MdgKPSnT+mTC6nFk{I#J>(<1bgnDul zhy)7$aJ|j@(*^c+H9R$idr1*NO8X_>Jy5qbGj=n3Eq*4q#n0roz%hJ@;lMIp|27>L z9rIGu-4q=x0O_@G--53}!Vp=Bns>nq3c#Q0U+5IW9@^aGU?`cQ@G#KJC8Own@3W7h zI}<7hZauk0EP0|o=`w8^u(4Qir%xH<6NwMoMUCAr7h1hK~=Q|BdRou(f>Cvi=tp zZ7HuNmWDG{JS|Cl#2&M>Awy?8|6(Cw;`P(3DG-p4ba&;KT%(q%%@+i_xf(n=d=d!v z^<%lOHS@_rJzL2jlsS+aG1fJ|7TA`#xhmTdei90XvM}2u9Hp(5X5Pk%WgAuNyQNBQ zw*c5cI=N}FOA@ZhJtxpF53>=rd6HQHVh&nMYdLUaZ%X;?JPV$M&R6v4txMJh0)TPo zlDU{N7>du4bVUjV#kVwl$Th{3UOKnMlVm{9Gmp^WHkJkAA@3YhcT zo^-=UM56Niu&=Z=rx#1v_={i4NXrRPISa-Pgvc;lH7D6~W9j4x;M8>vC+Wpwuxh%ca&}wc8$05kI;~v>DPnk| zHEcx~fSMT+Bxd(~MC_bctEN2Kj~sgGg0_(l7=tI*RL6%%Lt+_mMr>coBed1`{d3sD z+VP!qtcX}q4t@wA^rqJ6Tm7EqIQ6`v=hY;G)>X4UDQqrfR`mUb@>rK3Eu!@zNSCW+Tva;GNU4p2ndW7o@r{)w&}f~{-sKrv&?dI^=VCA>1^Cs?lv3p{q0p7Gw%9Gb(wt41MPBX^Bfi*^B@l9%0 zc#nmg{_M6>)_7BgH(_`t7$PV+DeNTVIu# zWK3Jg1nUN>DBvG16(|XZGQt7gQ4Lfqk;z1Cxq%fro&W8%UifMX4n)FWiasQL+jyVp z&iDxz@4YiiK*Y0ZFX2f`xhZ2hY2ItBeO9Q{MF|P`M|jIJ@Z*4xUMVY$JQ|SRHJ3ZO zQc<+>OzQ5QY3 zUGZbdAsY+t(G;CXb)TdQ?#4>>=E@SqCKJsl02$%y1v?l9kkQH;*j(P6XQn-YUcQB1 zHSJ*ApOUFKM`0v2U6&Go3@j2<8qxV$WbhaAyYY*R83iW7)1Y%8I_2r9COTh5a|*WH<1Douf0oQlZ!iELyiJLKap@lXO2VKAg6 z0hwzxQla(KD~QL#!m^6(1^+YqkVNQ=(B<13_fQMEE?Fk6Sr`k|8&2Y@H$VlEi_s~b zmUur36TX_74E7594%L*aT|Mw@n}4EMJ*3T_*rGaGbYo$znOih3`?g^zT!+AJX7z*0 z+K?^|#Osjm`O@`(7%J3S)`;>G&uOJ)0d9B4bw+k;QlG1Fb#tgsBfeovW@*~q$z*s^ z(h58sh?TZTXku#yu$IZsC`by~D#u*870yJ<62?i%8X~s7V@HmxrxtAO4B z4w3>Br5~CmU#YZk?!NL{k~B%LH1u_YET4|)YqTYs(u)xAkJWu?!0+rs3x>MU5TTf> z232I}SU1ffBwDa$iv}Al-qmC>igSy($=v4W!97!7*bQF_@LzA+8^{ZK^e}#@54X}N zc@NcuA)6$)RUX#-$wE|c;97>ni6~r0p(SN?u-Y3WcjhKY`eOVF;(yj?7hs}r6n)BL z;g~l@ViQl@F%X%z0_Ec<6jB?JEXhg@-&a>qraYDadXN?e3+hUx*l4OIH_IL#e4F3) zDASGpsHcL&HI1;d{}}!ny^q<_KCLv*kav}!GpA@Cf)=B}q`2ss1!CMGpd6XcL!;g^ zYrBOaMT|0dGGFzb2EIX*`&ITQ9 z9WO(z?zY`?Ks-E|VR&g`=0x)2yoC(#09lLo?Is z0?`RO4;fr4E|7FZ3~wOd=x45u8<3)(=FJW~jY(sGty ze^fo`7jm)NM%ixZi9sfdRbNxq9C8uK#t>xfUC#o`soV*h@>|l7WDW0J>F!fZYX+&D zoae;>2-%oS<=RrKFiVo&1n+$_Imn$Yu`L8JN|-EfTNb(Kfh~-S zW!Q$bF8ox%ijNJddm?D(pxU9JHJj`u&L#A{?qra3QdB+w<-%j5xk;Y|XB9^j6m(Tu z`1%w<4+6;h|0<5Hi*?Y1<6)0B-%}IAfnK*3p>1Vcokv_Ji(6Sy3$`EYm}-_TNk) z843gKV-=jQmLvM{__jZ#<>tlmD}3V94r-#*rl~^l7GGPPYz}%G@jSCusao7VT$U8B9On+%`QX_&r^Q+eXfr83n-bzN%Y;}< zhrCEJ%|S(;6$>aB$X_fyN<$^AA3K}m$W%xcqYXlmMn*^KexzH6uKO5V1Kkgr?~$Gv zvnX_Ekae>HJkRJ69Q|?UPo^l**)|(*t=T*)MlBA5E%S2{)w1xE^G)78R8~`tX)1f) zLNPi>On_WLpJAKX<6!_ln6^y&7^TT88$E0GF_KKf9{4bt?6UEsHZsP^<(TjL7W6B# zB0#@&^wx0+{$a4M$y&Z^%C>hSV_TthlU|a5OcgS!?yPKH3CmFBcn8s2qhZ#3*->j* zjle81t9@K+iy?Q|a@ABFpPumDs2mx|ThJwmSrR_ScI`2h@xnZz zuG15bpX*h;vSI^^dwwETbLZTKVz1^(hFTe5GyizHv}Jj^ajKY^^Sju2YOQ`4{iw!p z_q*|*5R9RE2xo^GBkEJRc#S0AFu*-ZbSS@=;-W$G^mBeNNVHgGfu~?>iRV>2hHE!~ zphsE8&lH0biFSLsAvH4(+bX(h)ntJK&a!o}a7hEADwHBGkUWhW=NhXU5DoT$hj`F> zwt|_MDN4^3WwwU#Shdg%SDG6KWNx-WNO0CDg6tkJqGr95mc#{XH@TB2J(8>G)zDGKi$ylgN)>=YQ# zZP675nCmLjy$}swfa&fI@@O#4aYrvLuN;`99%QDag}$_=uiTch0BPXVnm7IEV@Z)q zhO86l^SkB?Lk3Y*3{bu&Qf(AT(;oFH%)Ahar_nyxN2A?W1dR27I3UB+iFFjdCh?K!#QJuO36u0n*#-J3S|wa z4$3qglL_*KO1*A#h|Jp7s`g&-^eq$?6?GqFJ1#^@Zvr>$qjw>Q-6|T}gc{3n+96F4wuOt!nOgIuY183ORWgVvZZzP zqmq$ZU}>%70gFtacqv+UE*tJOW~HH=R~w&K84|e0tWG3|W0i)==}cf^p+D~O%W14(dtM6m@p(4?{`S#_+s^Xz=6A^mG7jpZpnatG* z+Bluv%m<_2Jb(U;r@q7mRAXF6oO2hYv#mNBFBh*y^W+G{;~rKyFu1=O8ctA2$LtM- ze9}n>0=i(~iVMm|q4!1=xI+1&QeH(t$lSlepg+>Iei$kXT?*$$t=^!IyP@^U`nvTS zc@Vw9ZT@Ieh+|h@)dy=hnq;(Ol(Rl{6P%`0z*Z&$q6;etyLYqmQ4eaVcZ~S)7Bo5U zi0+0D9GCRv?Rt}6Z=|#G!&*`>U>@qQ=^FDnKqE7n%l)Y#Zk0K~%SwsaQ#k2-XN;)u zGIK1*JZUyp&Ud|=$uE6EYlaT~Xou)!bDA^J6<5HIH^AG`u*43ZixCDy&zT8Nu^B&% zs4g=(c5#054vRfL+|6EK>3V~>BMt~nC|NHVR^qWrRi-!ynh*=MNI0>K0F0lV`S4X2 zv$*|P9f@Ucp*71*ob(JG*tk+2@|G# z^%@UVB9&LaOIa1*>RPX+_0#&6sw3N5jQbTAwlg{}81jZ_Nc4m9IO1x(as z9CFX(>yPs>kCjreScIxSJFP!WW+K$Nj@)aF5$0J^?WS^*+GnjirR-XZlKh9U(m#M1 zWKaWrl|hXKGlhlCNyB>&e><^5^*RSVcnGE?!5N%}`6P=mBU5|0ECu2QV~!Zh=;le= z*q0FP@<*eTee*2g&X1( zaj&W0So3y6Oga-)|WM!FX72^-BAa3&J32;tTGM7<-mXx z^*QkCTW}0f+|7@Gt9b)Xqzfb@%c!f~w&j`_kYFOJR@ml%Q@-<^Z8XyyC|GhaS})!r zS0=H&FU_RShc9pxS?>7DMlBv!DqH|)DlfhOFqLyXzzn0Sm~d(Fpq%gA27AP?Y{ax0>~3@al~=C~CmN25s!3pivwSy<}SXidEy zL1uAWq}G%)q6KkpiIw@hwzM%@6m_h*)Bf^CPtBn}(ufzpIq#HrXFsebzT^Tuu18qg zTrY3>llxS5dlQsQ98i4Ju7h8MdJ=&gXt!qAN$5{2?P)96oT!BmODhc-abye2{)o`l9j+8>*Yn1WfB@O_|dX)Z{kjC zZIig<);5XEn&!N{)Zhk*2@N%*W*zthKR4hlV0~|*lVlS8H{mBK>cX|Qjoe7A4lcD3 zFGP%xvp_Vy6wND0HZhFgKi%RZF;$4yw|5-lifKjM<8`xNFD zJ-NJmchh&pyI$xHAnldffoNIA4{i9_L>u$7b?gkZac8!w^KfGG$xoYsd}rEnXO)8y z^JAMnLShc*7$7Z>*N8NhVOkoboL(=N0jD$jtV(+uR%CRR2WDE)$;+MxycAxI# zCd~AcNDAj$=pf-AH+GW=={FsrfGj4Zpjo3d!X+w&?Cw*P?`p_~pY7E_s6-+{%X*1w zp1!kXs_(z0oLa$Fvx9A=h?@d+>zDZ{WBX=kgmyda*0s(9qz-`j{!lcZ#Znihq{p!m z=aKmyg{FGa$S|?34c&~?Z228g`{S`GcgcZ=7709)@$JjwKfHd{v!XYHc|fQmOEQcI zJ+E^!v+&MKUvJon;E%r5sl(zhR@KqBP3Y$rZNMek@?r#!v|KGA_-V)Fci;jpXl}x458eYFbOe~ESM3B^GQLc77^}APHvCzBU(^CB%^yJRtt^J4n>ELoU zUySf((WTTC*FT5B3?GvX`_@TwmJDv3w@hN}Ptt>dwWNxxl!hu{ZX!bdWaJo#Z@G6t z$FePHXVVX(dAuxc{Z@q*eKQjVTJQ+9zH+>FZ=+s;^9r;Ga1H!9 zWjWTKdNuQYx93y#M7OCgvrum2By$9dLV+PikH5W#C`msD(EPrl`I>W|efKeib*=DB zD=zTH{gAX|SCtgVoF|%6*tY`3vTLbR0|52I`;-iZf73aD{R(h66UxPg5}x1d&*8%2 zAdqn5=_On+%bsL$^Kd!#O8Hlfvx)d zQM8hSA6v6+TY~nXSO_w?-M0(8$Xvy+6}C1FV7?>RR*Fw~w54-rWNe{e1kqY1^*wKt zpln;woowC;`qxGSdD#}N# zW4F`I6ifw7)&i#JnFnT=?jnXp^CT74c(eM?fPiW_+gj~ow+ijo8%{L3XM1^KN?qqR za0;)L<+kY6_VE@P$R=GLCua-+WHT+SKM%a{zq&U~kAUu-Py>=fNL5MWW-UM2%<8me zO12;+YROK$>y&BJIiUForBvMR7Rf3`snp7sSu$8=(Z_C4;oKJhf}Hy;kp!?>8k+ zh)jk&@2#_yeB#nyYOndG=7CSFQNp;s@g{U#o7lN=pR2i^)}GP=6^c7ZWto;pC}xV> ziJ|Pay0duo9CH}Ld5&jc3xEUP#4NqcjjcTRYDXVUNK_-ri_CU0Y=IB6h2g=j@)y@3 zy-)g7QoxAlmYBPC_acNrLK(m;EX_O5t+i0Lfa(S+*Lu=x>VK}E3kLgadWZ~BB^&bI zOuKBkOgjN;@&|``H5VDag7E8QR zZV>_+7IFuS*|kEbPYA0!>J64x?R&vaHtQ8l=Auuvz5Hr%J;eB6pX_3!hYoayP?r*A z&I+8~yFeGQV~c9s8MLq37#?h!@haujuSWCvY|hJjIcB!M_*vwkjENTu))O{i zmn)g9^)jS5abwVGV{r!^IcPcp%_cxQbHvt~xX<7SxRE{9D2!|)LaJd$TDH(^Vy&%+ zvi5bB9?PnW2UVs&n4V!K5yFE7KjrOp@h=(CWFMZ9PAsR#&!Da;BAz4LT@F7F0UF?T7`!*o#t=gJ zO0$Ehx(7dnmj#O_t|MEI6Xx{-nj@5a$!IgQmS9Pd7q3ryzs5>*ViqecrkISW2$`lh zyLm;1`j!adD$$}Ao&4D2B9HbM7ivB3;m^lInMkUuVK9$PsUt1fjf| zKB;kP%+o=E`Ejkr{CKq&HGEM+nXbCJmGKW8ZP{|@LC80(bbkWG!6vZy9~Ml_Zf^bw5!nX#T3#a|ht{2AwC8Fd{x zY$8-I;dF>Zt#w^w)G4^OzTwC&D*@%VVe1n9|2DR9cVI2%o4Ol%1s_EjXI;=m0;bt{ zXVoSVOjHmzK6u|IFt{c46|9uS32&J+QHBOhsz#)`hJ()$&P`-X;_UHpdg#`^Y23pd z5DKPSvmqk={2VwM3wH;HYauM@upImB7Ph6^ceJ2|LJK-b9*uBEkDRtpB}&lRaO>WZ za=ecVCbXV9UGq`uWMiE7hq(Ce!+1WMK6s{ouNdV;LkrPLh$M z{oCyPQTG{6H(-ZldD&m$*QopI)kzn51HN|y&XKa7HCrrCW$w^pe0VhHUvHq>aT*sj z7B|<|vpK(<-zxlTT7aYZqwYhscM__y^uv-FmxcCbQ{N+8Ja}VRq4nt!mthbM1eGlm zyB}#XNN?28zzjNuT{4?~MF?F)o?Xs{i)L#u5HYjcK{{=};ucs857!N#NnOVz93kT|D?an`5xC92-9B9%5Kt zv+AOYR&g8`iNxbiqxk|i&VQX+*+zUmwUOBpw)RLEz3ML(%ggzV&s|bhIHz8c2UB{W zBaV~|yEkZ(McWD~%{1h_rT-2CqQ^__cp5NU(tBN~ z*V{CTDZ#Yo-}APLoqqv_fhi_9K6-?}lFvQPvxS?)D=tCW>4WGa&OrG|u%*l7cY=&W1^Y3U7^r3M1cH zyi@&lc8y2m2JdC1e{?Iv?(Ui^M20w*(ady+<+tSOyDO(sWpzF07W!C{z$v5@Sx1Nrx>@0Py33Fi3F3z z6m=nxi}wun1iDr+7q4k>XE~HF9+wsKmb%bZDySitNG02q)}iTmmSP0L89s^w1lr@7 zW&2tb9DoKIv*5?BB84EE(UKeJxb9GX&vS}YNgSfx7)!k|D1=>A>y2+JTw8xzI;=@W zj|rW1wdYTJY{Qr&cAOD#sUy6tFZCyx2MaZt2ONyzZ&Kg?|moppI(6tKXsMM6g^GLUPLVB>>aY$a=@04RJ6=0x?|-YNW)Vn~UJ#Go5a54Gu* zqe#W!4Z|+`aD`gfaw^G$DaZDeLMxq4o25s1o-S=Op~ar`*;=z$$lrCr{EZmW3*y}A zJkgC<`MfWTuV<5OBJ1EUNi6vyG$wT%7zZR{K&!xldF(W0xAwqtC=pw-2?n_M4z~+Y`dMrXtl9UF#jF=)Dt5pkwzAn}q>ioz+h|FJLd|NWQqkTaXZLhA+L~ zmu~s3v=X=hOzVFkTfd1OYt{|Y4Vj-J zfVOy2T<@$`&pPxKK!e zQ;Hjs(h%3yY)wMPzNNxt?^3c-$NHyD3`*9JQLcAywL)3nWoGAG3KQ3s!}ux=#{G3@ ztkvM=(9L^rUnt$eXRrHXi6x_Imk#5YvC6N60+3w#6_mmUnL)sqJnmI=^z|r0A`lBI z5HJ!ACJ-2CaBrZe8lQl+h~8HBxBn@p6s?DJmTa55h%{myklR_cNtf(%i!MTTIchp@ zF|U1)59hqj;Xae23s=dL#bE306~>oI?2=j~{z+oAY~s^`nJsD~kg1%H>#mII_|13y zg*!kI@B|0t(G5E$k|NGDRq}W}f?R=#fyhwz!gjlv41bux-?ZT4-2M3pO8lumxq*uu zQGLEb^X;3oSQZb8wEaauk2A0En@lf(XLd*{HG($z66lM6b; zpuyxmAo%qWL1>eZF^MmKVTQEpVYFb>6jHRo;M(L~u6L7r+;t>r+yhtwP4~}CglX|eZYr$TCq`H`Dmx#C!vJo_x@sB6XrK4Gt z9;`}mzRr5M_26Oabwj+0!sh~vchO08VoM91)hbF?? zT&!CZu@X_)b5xwTs^}F9EgA*5;Nl`XF-J)+DWm#~ALUb+Y^$MjXKixe4jGY1^4G%D zo$6|a|LGGgV}hpdBuGngaN*J$72;;A7Uv8e}y{p z|47ezt^B<5vQEdc$-(7yHGp$Ng5AQ#7OpS(adC-X`ob?XBc@2@mZzLCvqR0)=H$qxhp~^$41r&J9}@+uT)X zk`~9u+D+1Rn`fBKTer_B1mvf>#fV+f;h%;0wbxaunpmifv%-YUn#x(F$r2R;XFhSJr)Pf_}Y0(9@1)4Q|?faxGBHPn$@d-?pXed9hP+ z?I5QL?R@ihEPOMiM4&J$Y~CnG0af~Ii_xy-COJ#m{IG6IQi24cKTqm(R-$QC_a;}k zehqs5F1Tt`V0tR5Ty9 zdcg?{FoYA6SbJ)1Dc07_TfDLa)bQZ0H$ zF_Pa!CKaf1vgGaQE|1({M$|Wz^~=YEXmYevEi?gS3lQ{Lz8cphNlt{9a!LY$gA%OZ zJ@+wST643Hsf>8XJ^j*(+ji`fkD{wZ2|H&gs1N=@Lo!8JgMy%7Q0M`a#G{dVHxz5F z8;Nc)*g6p6kZMsL0)&9B`X5b+*iN$P*Q{VYs3NIYCyeM=9{}UTOdmMIJn}fITzs}( z>u_ZD2YgM+TDVhZd!OYL`9*_S zDGjS)#|r@93|*n6h1V;IqT;g%c|p!zC0>i#|8%rGy*bB;uqCdKgrv}+NexaG_*KrK zo@2Yo97&kdAQ8M>sx>xH$f*1rP_KSvO^opnRZ!prt&>J9AS9Kn7V}QheVvjvbTcbS z<@{A5dz`OAKgdyeGF6~0DWMNm1_Y>n^#W&GLO%ppN~iR3kHeS@^tY-ucHkcGZ4pQX zC|1SUG?|!r484pOF?#!LNZLdk=*8fj$GP2WTnmmA#DkF}2Bjjol1nUEAn_Oawa^p$ zv^zju<{}M}p_XV$8e`q{g6Ep00jp(ZnI!2dp>uaiKY{pZ zqZs0(<(;hBkbYCF9ZMUULW}+OG;H<|P-yl*A^?x_;loWl;KL^ak;Y1f zFR#gemBvo(Xe-xbyzxRE2Y;AOZcU9)xln#`MiwGx=&*xE#993L$>{n|5`mnHV-*sT zG3u*&dsLx*F?zI_jkOf;VSWdQtwAXOtR{XIOkJf2h%62&&iT6zf{ALBQK<0KYR~n-Q*x`2D*PHf_f* z$J4L=y!+L`?)8VSUjP2|cVB%c6JK(822VGkq$#wht|F!Rsm1E}#R&&KZy&hxuLd(9 zY4dY}QDW&3e>!s2>)V?v^!R(8nFv_tL6T17oYk5dwF<7eS-YNP5+Z;x3jOJ#eI$P0 ze}D7s?5jWT|K!0)5HkLO1Dtw4$9SZc9O!+ABvp(kR^QHWC~9zYboA9r96!Ce3Yj%( z=A6}rTD3~|A03m4{#-_4?lOj$6{^uaqQ?nObLC<_m38ocAXy;*US#_8H6!CxK;T6O?f1NQ_Cmg-(wT5zjiX#`L_D* zuct3>N3-e0?`Edl91M^NL-XBVzn$R>=AflejcGFb79jjWj{zWa z3r>ooGVVdZ@0x|llc!sacEm{&8{-`cwrLC)e*ctqAZ^idpZ5HG#^oD|<5D|*un1{X z;qxkw4h|%hsPTn0y=G{K1tI$QvjNGMcrt1GZd47HHOTi~a8vWa0g}~kfDgGRM3WWr z?cEaR)7qsHXVfZ4`Q7NFhuwei%d={*wS}K;{OsUo7e9OW*~iag{5-+W0e+t1=MXEgwQGXXy#cx2^1%zEd*ad`LK-dL@T|n3aggrpm1B5+5*aL(;K-dF>JwVt4 z279Q#hx&U*gti9=dw{S92z!9A4+#5!un!3PfUpk;c(`}44+#5!un!3PfUpk;`@moy z_4iSK{~4j}1HxlKcnk=S0pT$qJO+fvfbbX)9s|N-KzIxYj{)H^AUpV>3cnS!IfN%&1hk$Sh2#0`h2ndIOa0mGt_^!OK8sk;Ta%21B7RQ z@C*>10m3stcm@d10O1)RJOhMhfbbj;o&&;jKzI%eo}>PA)PMe%(4GUrb3k|w2+slG zIUqa-gy(?p91xyAe=GBWtNA0`^u*P$D8+4yeobywS#wiE!*6f1x+Lk%_QlmUF`KVY z;rUMP0puqQxyLa1tu#<`Z%`W%_y%$MFD15(TJ`l?c#vR^{wTrh9^+XWYCQ_Vr|dL z#nf*)!{;xwbKZldvb^q<=BQO(5gt?N{H~k=vZ0 zk#Y^Mh}hv~Cj(7d#*)Mp9zD+~8j+4ZuN{0v+qK*N>`43oS7EZ(UBWq)E&LbLcQbMv z{7zyBN#cxpA|MbQ^(=$w1z!dp$%P?!%|jzcy1zlyt#9yxE#9z| zE@S9giaCJsu)Qj+D2XFRC}=K0SWZgsO=J}vRUjFnAI;`TLCI#BOT2ShX<(qGYc7;j z8RkPHvv-?X!*WZyxFbNQY({1TW#s$G`lX>jYL;b-^4Nimrbea@o+=MHU`Qehf9p<= zj48;@p+g8QdJ0nUY_1gaVyjkj!|T%tq-<>`OX16UC#0PfGn%JTtIGh*`!(+kP5xA5|`RjS7mddfk!-w6M84j=nRSJJ8e&c zGHL!I(yfT2P~sSbG8H_7p?!txsPw@|$f@dncuqdEH*BL*4R5ZlZqG^1fI72eWNL`( z<`ZZn`jrex?4Ke$Q5|>C$9U3#msJyjj0=(HXa#*M4Yzh%%@`LI-Rml+X0%zGtOIKa zrA`_)2D_=k>N9MdYLhNJBc!*%cu@jngRN-k=YTjX-JP`o@DafA0o^v@P=^_m=w&&M zbXLJZx9>&dYHbhClet)QeI1?!k1J|fhXPywvPRs=F0Rq?M||?#TYR*pRprBTk>YUJ z(>0Mbs0M3^G)Y|RYSdU%*!s`(v8Ybr{(hz3$>Y3pz2!#o4lW1fm13^wdAmB>!a+j2 zsgA!@Di`6eTkND*_=Y?E9-sZ!1=eMDBkX->3)B$68C zx+mBKVy+~60L`Of)XAUly`1~Xk=LP*wC&+y(U0%YrqWmL>tlLTg^)^g8zGWwju= ziG->|FoK)0CmE<_+Lmp(D+CgIVgxo?SyRb=vdA|NTt%olqc|`ZSO-BF9q&TW^1S1j zXf#au90})RvkfH4^esPUaykdJjHV`q@s)&RI)h@iU`m#DvX#mUFa8BaAtUA<7Y1qd zFDQ;4u#0zuNTjH#=iJM&LmB7;`(OQv!!9u}F54+*I6K8LFh*UKb(9j2K>$dh8+V}b zD+Ih)?3Q4`wu`V&9V!Yod7mqRWIwQ^luy%}WK;Ar_Ra;)wm6c@%fm>9^p98ypJmjQ|LUK<}m5CW6pVvzzrOQ;jEgtK(V#2_X}=y-euM5SAq1=dNCdp zYPfQZY~-vIG;)}Nj5KT^7I2y;?YrwntaRhCDe-zc@?Ge{V$xS3Rnn4~^#$KeOlp## zeP1xJL?c=nEIA)t_+s7{3T|Kp81yb7{wjenOF!Ltq1+Tp2=&2G(qrg@5Zv;s(57TJ zLi~(5y}B+6V=21`&zQ+~zG~c(s$)Fb!;@VKR3R|t%9k*xp#lHwhalO}Lj3;Vt9nqE zMKH1X78n=|vN2qDF3G=R14@ zL#gBIW&ZVmJHbz~m3AgW8`U9~5(F*7VuQl($=Wo1t11*BJ5y-IXIJNXO6}EbG9KJQ zW=X)H*@B|3v_wSm$6Sb))?2<*&o?*%;GunKd z8j#7lQKL4$w$yD8gA}l9rknqVxi{NxEY}eQpLN#Ce^BR*b5>-#GPmX-JBO>$mTk$h zCJ)iMyfj*}=FyUU55d-x@Y$1t)fP&uHLGxA4Oh7>%0eRJjh@tB!Uoh&G1iiN-dgBN- zk6ex9a@5z*REI7P*4&Fppi*2Uwld7Y7X5ay zjR&28z?~uN;&*}qh6@cBd2`S^ER-`6jksGVASz1#U?(ZVA|qreZVux{#k$*``0R8^ zFaSa{N;_{r3VI@6F zHdo$pX~YZi4uH31J3}4VLpzM;c)I4o+I2`6ZyfMFPp|9+(Hpg()cr*c_0pfC>za>$ zuU+kHv(X7yW+-o!lOpi?sRy?NC~K8x`BDk2Tx0Ol(4s%McO{R(*qX^2eZwP=e0(&` z{uNQxSDXD!IvKN0ax&g{^@CUm&bgJ+<{2 zE;suL)}Omkx1THDUBL75_&ZpgJsWS(BCx@?Y9DyA2SqUIpcp*l z)+c4c+SxP=%n1i02juXf zsCU%Cg98s~nCH$kY>dN%O*4)YZ$fMavRqqM`2h52H;*0Ue7fpPaI;o}bzhZ-*tw?Z z``XUOj7JgUw~HWqe^fNO+LpGlln)wffWl0GHx!(ul*QS5^hk0*#8XEtZL1_79^imu z+RcXtT*Ay?{86Fo2B5odt>rCus30{u6I^&(eIiuID%T+4%@tIkl;}~P&~Ke-jiTKM zKBa+cDLd68Z)ojh;p65$?1fXJwQ7des-O76)kPM`E^^-)@f1Jp7AWM6gG6RskE90e z&euX_p}_sit_h3%)o2f%ky*DbpLc@8N$uVo&LP?*ZFLn0#K57lnu8#4W919+KP;4JQv3nCPq}nemz+<)u0Fmgx9be{Fod_~9rqkFEn%}sTtW104*$0|w*>45*S9K9+~`(3gG$YbI1)4iaIdNW28b8!PC^5UUR;64T#*ycqzgWlItRu*} zCJaN+bI?r|)u&JG(ymjV*10sxJLbqEUtfHVbwQGKg3GQ5N3H@vSUj+ERq$aQp|UIB znI~9nuyalP2$NOTmdGx@n)3;RRsFr(d{L_?qGtz6ThwIeAtpbP4kMwtpvuD(QbVjQ zCcLN%?$g6nD(z4V0E{m08d@uGjztCHVw+r?rXu+{<;q$La=i&DXQaj+zUA%+u2-$) zy8&pqQy9{$gi2Ks(5tFtd?@x6#Ri|Ye0HmQcLbuAMd52Ea3euaInZWx?cH}i;m|PW zz4rF$^6yR24!$aaql5gRdaY@Q9H4@+P=BjXb5}?j7rWN%4yX`vwJ)kSo8{=SXmNG5 zwz=d32qj4?ON&c_aJLlyC)}wDXIdcWJ$zEf@F1cHU`ICe=r$}OFMIOa(S^oY2@qr0 zq(K@CbM|zPvOTw8Uym9|z40*2){VtFfHwKbPMsO&`Yw7q>KQ8RB@W z2$KzpzcuTa+LEiutD#`qj3ow0<&jk&Jw$fr1zr5g9qS`QSXa~XO!5T~T;~B-2>SVu zQC*_~W9wB`#y$nLrNHT#@Rr$$YEHA7XGa#Ny9R^T78x$`Ez7o=v8o=0FMpYlv5C)& z4z)SW3fpDH#vNxIh8&;nYO1@>d7G}N3&a$y%!}lNx3a8!1&FDGZBmrq8n21*ID&;A zp6;Kee4w8p0}#jTX^Tef-parXOCl4WL+|ia6oUql*@8^vkn<^E$ToXDb|0&0FXdhM z=yEPo&#X~CSrS>7XQM=2HrIzEi~yy%(|Se!VCID*qg=>i#6#d6`>k4$kCE*# zK_z>Mib8Y^g+A)m`Q+x6 z`MiK@>!3-}x@Z=7+DE6p@8xJ}L};?O935^~hwq~+wBJ_*)?Lf{wPEfW)YT@DznH;AX(^{F=pmOBrZqR~J$jd2fZV7UKfli?K`S&g_L4>-fH`(A_1Qt+@-o8RRR!d+D}`DV z&v3y>_>e2tgMYwB*1PM-wXHkZ1N%t17_1p-D}*hs)F^p!Nrxg(jCF^(G{GDP2=qtwWMVxm%g#;>l~O4)kJ;la<%*}fv# zR|f%LcV!T*t_FbWBIcwspTkR3Ga1n6D&?mJ1R^vUk-n^heiPCw^1bN!m2vgJk_B%z z=>yD$r9r&~#tVf5@#L~hcOJ`nbzD|0tW?b1!Je`7^YN?Td}JOCS^v;eMF05jYU&=R z{WlUxFMWLIVGRXsrmD?hwu$PBox&xG0~aaFg_`>v3)cxkMR`SUR#VL+mF3>%Q~53* zInGP_%?(`;1tr>$7%|~?pOE)NXX3gV0V#<*Q>!jyn^$Kxr#%9DC2tYS6$haE0EWw_ zIlOZ>05lNBfX>CK(_NO0V;58oSS0)h7FLG0!RpimAl(TvM<;M~X;xJxn=hl-h8S2V zLQ_evqFTGbBF*hrFtBJfi9~g=Eh@Qr=P|YqsBk~@_)~~XmAjWbD400zUkw(thBp1mgQ62RhkX3+eakf@CvH5 z{OcnC<#k3qby`Rcp-)Nu{*R!x9BO~9!`&;eOD7J;81IH=6XtC>#Gq&vFsecH`2DVWAfuDUh)NHxj5J&t zY4W&lWoMI3c!$h!rB9h&uO#0^(+s7%9AJlK^<>e_@YoD?>cHhX(VLV97MAGUoa9p6 z2N9K|QPboW>5Y z*+`{EJM};~O(+@etg9g+5}vXbjLsreD4LU_%F;UckQ4#(F*G0@H7|QSp zWpagFE|rVqqv;$#PUh0FL?{~0L)(d5G?U22GNE)PA4wO&sYEjKhnNk{|6KLE^T*lf zMc*XH&WqwTB1!_#bd;6w3Xcf{k^Tu+&ZVM>a6FYrgLMpdmdx4{BDP=vbXn$V+nHE+ zC?O(*Y~L@3wTGKaU|Lg)CK>wrDkcRrLt~@%seI=SjWX22u7Dt|Z+Z~10#^kh(JZiF zVM#S+0weu-!iQ$QqD0%UpFhJzn?J>qL5p|5pa_P5cENBTI5Gm4=LW-YLv65^YNvu- zxNSE$=ttl#kVGFQFq$85gL1nKw?)Kba0O2!+zlo|J$Pp()lCPx(OxK+=%wKWDFC60 z3rOiM+;JD_C4=dC|21zh2+XyUm}peyLauU?<2d97Ya5tJHgZD$Niv$9f~bp#O2Fak;swaT}8 zUAzCNqfyY%f9wVt{MHZH!{R}C*OXUGVSbD*w)heD5<9!8n&fYv%QPij0fDa~N%8vM zYD>V7!qdc?YpIP7qxbil{tWMf((ie}SiRag^n!YG(E~M;&q^7A_qvdJMa~J@;;!kb=Z<+Q;m+|K$LS)e!{zkflW=fq}y6-XN4A+_`6p%cMw2Cv}*#yxz zpd}P7f`$*-ppyev7pQ!}T6D9b$k&TWVdQfD2AJs3^>2>x9X6xzu;+wIJqE`rEejJP z+1=yC&=6RiiFyDB3+(x7wc6AnNcKt{z)JO54o?!8N&6SRvZJ;OB6A5 zd^Lt02|zveP{isPvYE(5T zZ&Vf)00K>ak|{`h{2?!I0`^vO3#TRi&n#U?bI64bDi9?)C}iG~^t zSXEbGg!a|@*sD5bk>lgakhBp(&;-Wm2`?HHrS#AS0wp9 z$V;d-;{ef|-Bh3_xmEWHe4<1!D(peo`DEAn5SIxgph3;$BE@-xG#h=5&8H)WCly8n z;m_AkLcPe#k^-8RnB!(Oo%z26jkU^k>2X}2aBsgT?NbO=SUnM6`KPx$D8uav-bUUK zHGOIe8kpIPLY|LMz(AKpIj{SN4CQj#8dDw|s1ykNDXt^_1i5OX7W@>96{!@|#uq#A zE^jf)N|%Q8Eb!j(j5Sp`X*SXyENNXCjRl2>q?6SEQW&3bU85B)D#?caVHv$Dy<2d2 z1~4SxR_EmGL-?<6b<~uzI!+D+tgL^?f^P$}f^$ApgGP}xt@-i)pd7(wf0Au1CCP_o z7fvEQu>>Nry6TW_=+{@NwiJ!wbeSM1Zqvy;G*HkohNo-sRHt&B3SdSxBhH##QN{8H z5is*RKi&c&>$^VRg7CiQ11<>fdp_ZU@V@6GE(q^?KI4M$zUM|Cw$W z{8etaqA~m#l@k~TKVbke--dmwacaba0W8|rBhfzns}why$->N(DQk&3ZT*$US!eDRPBMQXU&B3o3^4JougV;nD^0gznnnniXHuOFFV~ z+~^i6y{rT3i6*sP0=nbEO~f9sqr0@sFe^H_XwWy{(5{|Phg4r`M#3E!LTYbL!+*kqK3z;WCumbLO^qn-YJQ9V~aM6lLIX`fWRdce# z6MafY5E{5ll>jW2ALgGJ^pFB>ss0RuK1ikcE-aBPp{@aeUPSr=*(Qvy{q zH(jQ_+Dse3(04ah-`Wdw&?t71WA$b?7)E^9+4#A4x;4$Q8QDKpTyrIefLETb*W@T1 z^Z=?C08wN>I;W~}B3Z_3AfTMy$_;I2OLm{kRU8nKME*|<9-}EtGCkou)Yk?nmyE#9 z{9Y*05uDsU(ct!C5%(H|Yen0?0w27XhFpuI8HAG0x^#uYu|q7PdzR;&dx4E@O-)H+ zSS4(%@PcjPZH<(u!z_P2Kh>yFPt@AXAj-WeYML9`55vX0jRadDeSTFtpTdo* zUX%Us-UQ4-wgKTj4)FSF4!{CmP>7pPdC_}GJ$K+G47Tb9@Qk6j>a*e-Ef~}&yxKe> z{qv$N&_~+S26{mHdJJ*>IgEC#Re%6YAUQ%db=^D6IMbZd{tVuL@0td@qsJz=c1p<^ z1d)a%$*c|Vj5(N3E;2omst3eerWH^n5L~9{fS3!2n)}43hX7{J@)N z-~fs>U+QO6Oz52HaQJL}H0Jg|*gy&?jzafyMP z{J|EjhbhqI3f-r~wPuhtOX{nTW%!nQ zL=RLORZ(P<(+Jb3DTRQ_cWjg`W(0=Sm?-rxgHhNvlA5sW)EjBj>2w`NP=vYMudfw>6Jp$-8*0F^gp5B5_VtqwOAc&BE}CGn`mLWuw^6kWQtLzh8Z*Y~DF-)4fCOZy=CI zb2>K3#2&Aj(}a}42rWCQR-`~7?3qx30wC_t|BE|r{q_{rZ)$0v=BWA$bNh34G;6O8 zKlw~#tqcQn6|EwZltOs7mQJ#bP@Jl&3H*sWwAs5x;URa`tTaCVgr`c1P(2UvKj16} zNU&&C)b}}Er)bX%3jnJYknmI2HEBRp?UTh#bA>9m=v6gc3+aLJGH(;(+X+CM?Z~iB zrk*R6pb4w%3|EEHF)Apo|NO^K1P^;T?C-@A+f>#)VzddozFo;M8BjFvVVc2fcQPu? zL5mBXQ-`M*lth(Omx!4)kj)WT+*Q-FSB zPGTnSVlj$D(NMMg4yJh5Y_|`)^AO|@=R_q`)S04X!VT_#g{@cFlyDI#c2v!Ps^j>>f8d06lR~;zj;V)+u1DUzax+pXGn7IrpEj&cCl5!>tQtJ`7?MsK2;9=7YO>kWI z((^AAKrioag+$pI$_j?acWr2(hY1G4$-!OO82#dk7e!I1%fTv0l{yl93a@SSbQwRB z4xj;Aif9&aI{htEnQ9qi&BIqB5Z=4^wApC7uAljy#SomK@viY=Lo6682N^FXzFx z>^nd}(orGDYr<=_tI-aYqZkoj3Ly7`LAHVg{?%Xrjt?G)lEAVk3n^dh(??0TC8bGQ(b}~IdyG5iJrqE%w5pzqUj<+ zKrp;$H;s>wjTwdUgIFPR!YW3)16GRFJU%Jl*BQOtCQ&k7r|D?HINsNfbT*)xufrap zxcbmS*KXO$aw&5{)sF^iy^$q)^9I7e_{s#4b_^LT%vK~2oXzdaLOs_V@uJp@;2Egc z*taEmp+S>njx*VK7|7hW?lO_g97K%+3u5$N+I~J6!3dMl*9%Pd)fzAoFKe^I^6s0p z5Uqg3hPAAvP__*qCa7qvp)oa|ajB1&<^l5PMW$>qKRu3RC~5l;1mEzx@8FJP0Vk)t zivq>~xO;B?q zn@svfKokV;=`8#WJSdZQm;HN_5x7+FhvFhd6VfD=ZFAC>`OmGe&Db1V+KrW?tF zf0~;ZygEgn^adDokVD^(vUX%kGMgZ{vk<4zY7KW0f&~NZF(^!YqeO#}LX)d!z(IJB zEp2RMH5-NM^`ODjjS$EqII9MOdqC|0Vw9miJ)SCh*I3(GPw zT$H8;2yxp2WGG>IMKHAZ$UuV9iir>;JO&n2IY2B@x~6>(J=}YWK$ig=#nvywTIR|T zbX9XSa6k-q>;Tdl#+@ygm8c_xtq=yT1bEMZ-A&JNEUc9?bc;7(D31-nAoB+TEPD-& zCIDsi(ooAaS~^3odDVIXrvXf{TpPS#;_W3uR?Ibwh+B%u`9WcZyc{NHP8N z5dP?N=6ixF7lQQLS^(iRRUU1nlP5>C=ho>5hC5`t!GiR}N@610a1g;5tYU^R?Sl#$Ld2Ta_1dtBJ7 zHN8R>hC+@MFh5_`dwT(+&c&%7CBO(KDT_>0!@}qZat0BWULc`HjGZgirzF75boW^q z>m-*RQmnU{&o=`XD>8s){MNYfjVcj4{R_mmm{Nh?dZ}1Al8kf*;nW}=8$gWqA56Lm zo)p>!Y;q=_+;$^daiS2?qoy^Rb%hQ#p>L$u#y+sFI`oeMSx}bI74hfY!kH!c$2|Y4 z#ux|6sCg`k0zh_1HEC#AMq|Ls28;@rKLs-@n z#uV`~7TlE$^Fz`VQe|KN8Q3ko(6UtG4}fnoLYL)bI&v!%TPOnp1Pyn)L@R{bfQ z8nXhRl>u?QeRW01k-p(@dttY8!+jpItJE2MadMCC0e^E~~ zTUZNU#(s7X2T(*@S|aDB_+v(ey}M3J2#dRvK6jagb_;Uh%ykyl^O*ELwJe<`;#2jI z5m>H&4F9;ScGDT)K;`_`(uP?;u;W>3f$tNRq7X?5dNvHx2mat*zv|*g*cUZu9d5Y^diYuH{>DX=oS+)ErL-aOi7+t8G{9G; z;ua5~LRI%&k?A5NE}TIzJMr*AsY`P`8&=bL4)6EVD`Vvt5j0R?0R$Svyk1EW61K1+ zyvKbwSj5nlcLfNXjX)v?zH>uXAHi1i6d6k9Y3o(gH#}zK2Z$%wNg|;Fi%-dTsJfVV z|F0*3%I9yes! z!cXf~Ky6Wrt_QHFSh^q+nC8Gwr0$?Xh&U_I7E%KT8+IDANIb5Jszh&bMMB(>?Jrv7 z_0r8LoF^MFFTm-B7`yiSJUp%v^emvY5U#&u&lp$eICIy)2c$oehJ#cQ8&WX6JlSek zsjO>IjpIjE(>wP5P<1v!)gMQpx|g?Noqfh*jx(>&2&n%31mHlP?TmS+&iA%phrH%{}9Ib6WvwKYd{PJ0uXBhmhRwkVw^2hB=#a$%6;1Bm|haM}hOWGI02%ia1Hs5P_SCQH=DnnIXE6{m#15 zD}*7+X~K!QGAxxUxx@EzIjl$)p11}G*@|EZ)_~zYz5(}&y%5BZfpOx%1616*wYKya*%!8_tLF%N%}ze0}^xn>B{iGWW>w6II!@`hn!*HVD-z<$Vv_ zXp~(z2aX=T!KU>28&lmJJh6{sTkoBSgFHU(ok$6Qu)T3(0pAx=con|mBrRH|kqN3A zY}@3cEae-NA85arb46O*LoQ=%QI=P{we8x$5TaqelX; z;vs-1e@e1)y0PoQL?Ky5asfYeDDp-4q%?`>l6WNyL_SD|DO@Y2%zLkU*b-dM@+PoQY@y}{Y~M-y*+-%@Wdo%qh4GN4s-8ldy7Q8~i771p| zJ}eN73^2bW;W&BTkp@cEi=KX8Nx)28com`Dqg#=rxhHU@e_eM{Gx71Q7f?515x6TF ze3|dwJstaoyQc{r*n2Cq>rtLTGiXTb0AVsPS-PCLPH7zph2wwz@DG?*!Cila7n8y- zIxG^zEcigJ#KfnQnM~$gT3Xa0=%kI=SX+Y%zM}m`M8umd>G}e>FO4hz_5|+#2P>JX@;*n2agbKo6e~x3K@%%z?fjupP3xN<{-Fd^P;G5$rOYGkfBwKr+;PZj_9uFtO=_X-_mgkGstw`?lc1^7p?-hlDK?m8zIpPxE~1uaG>jY zZOp?aopK-i%H1_NHiS`v%q6&rf%6lUZ?6)i^u*(qzXr?YVtczsKK^B~g7BVq?&c4_ zB_Dy>|NJKis$dPT_Fu!h$RHedbZNg5lR=b|h3#rC1SL3aQD7=TsWar5iPh}lfan2m z6nOC8t8%-5I4I>I#4SjdG3wifzsk#Zzv8XdB>27xS%KhADSep^N>u!0>@{7xS(%^kdbx{xjvQrgVKaQGG73i%z0?1BzeLh%7nN~*sC1;hj^!TJ9Q%P}x8)69FCmQY7bU)4tu??5tI z%V7{NuR@ZkIsp(guZYcNZj!n|d?jXQr!63HGGF&m{HUUWYN(Gz>q29YDD}DX(5N5K z{8|iQ2ZbO~jsr`-NR zq$mad@>#8t1tmlg61Ud_u;GrDhGTp6Myb(k6tbDRt^@tm1|G>%5FfH@M|z=OQ4mir)j>a&%Q$P` ze{ooF!Zq3`@zX(kgeDn^B2h3efZvG-obaU&xN|50PXfhY&4`7f@fiK>VkRt-=p!6X z!V5N_t>HTc@6AvqL^a{>2^EY7qsfT)ole@np$?UScWk2SH((Ztq(yodS~VY#lYl37 zLTN%hit$s>1!^z`&ofYe01B+Z<4`6F3`4zu-(h%$M>YfwjZi!oBdmkbSQL;K9FfV^)(h}9giiEjFKYZbj*Ap9pivrBo+tC z!-L$h6#bRm0{kE`mWl=AsVMa;9+gDylAR=mlg0~X8?XwW^}x_lgc5Vs;aa$XVFbEZ z7RLBz*h0b<66pvMj2IyrgYKs#BZQNHAAArA!%65q)S|x;ASZqU`3YhANXXHS!Vml( zRf{H}8!(&_2DGR@sB_4YfC8{uGz1iYzXULv0v?19c#bO=M-cG-68=w+Cj~sG8i+w| z0!BlOGjNpohyoP>%NPu20_!7RD;QB24E%_~*dqZVX{;$*M`pkeECWB2QNo(qhMt=q z00k5pNDcKH=1w#o0SGXvFt6YbunyJ6-@v>02YL&2kh}`6AvL4}YSbfWTmJ^ugycvV z3}P6%NE&%x(JO%y8*szNsDRIbwqbZYPLL~}3WkA}f8djs zEw}w(9p2y3k9&e`jJLrZ#Jc_+$7bfV{7{;L^UruQ<>msug$Jv(W9#?Nxu4)+y^zoA zdjEmX>-`e+U$q;3=RhA}zifmf39YLYAg<{ojNu~PZ;;a?-78}5(kr0#qI5C3}8 zDQVhXkAuAUw6h(27NNEZ!oiy~_9k^fPZ3(G+SHwJa3_r22^+X~f+IsHirp1B=!|#pd7xUyb0j2Tz>g$!wm015&4> z$yV}UvRx0wePL^nF`5B9xT6{e7LH598Ku6=0nY7?=UZ1^fLa+%A4PRA^!0BzCO6X` zquyTs?t!xyc}~oCWN0(ht>hB17x6ZvD-Mv{$mSPeOA9Ju6<0}OMt5mS#3h)l!PxnE z2&W1VKNUrz8#aaDxhT#4lO9HBicm5#f^k_0lUK0q!qZv*UUj>I<`6r&-mKx=!(x?+V`)=dxF9I)EA@}pEzN49g}bVXC_+n@ z-R&o9i%XLT9(G@c_gcS2L%Ooe!+w125aA~MU4IgxVvZm8A$$SE@C%Vp4GT_hdHn-3U=^76%sYJx?!yO=ZRQOxrnh}MLKZ?$S zuMMTV;C@hXIPvk1kR5ie6a^0c^~)F10q6n;r29R;5)a)Cp0|MaUddz27N5i$r~_e# z2=B^MQEOBl(#5^!^abakkg^V{+L0tRuUMJ(Cj(vqjK{rkW(IY{Nvj3oi~P!wLfcP}G6=$!9*YmtmHGn`n|G zxJ~c?d+1Z#xxs2q*f=Um` zV(2j!#Xv}s@+W3f`i5y;k#1OzF`byN7EfIXq@j|RW6t0TQPp=;pP)T+sN88R9m;i& z03{w7gR&lkGQ9UP0{aPHa1#VwJCN%J21!RiX|zh{1zXJVxVTgD04N=+U)KQY9=nIj1)paZ^JYeq>Dn6Usw6@~`~ErOF2y_eGGQbA(UrmZ3T|BW0-8zv z^_tRx5-U-aswv3>E?d6Fm3c<4aKl!LA#rkCXo+``=GG=CS+GE4iZDj;x|IMJ9->{E zqEdZuzR>qATex~i;8q^NZ-YlTz(^}Qp8e#!qh~C+GG6tk#7)^DAhFhhKLhOGv2x2p zTikHMMJ&A~^+0!GSVn=)qmdQTMB6pE(8Zah^#G$ei4yQ)S~+5_l18v#$#e!xqyRMeLrPuaD1f06T^G~zi$Dis zJtVMM|51PZrKlCKWHj%kXU_6WDJncPFeV04_3JCf?)~N8btXp4@)_MNYW0j#M0$pJ zFWHPo@2cVwS2EBSn$^AzC4&X`sSy+UC4g%c8ZaE3ua;KR07&YKrQ?V6imk3_v^j>b zF}mJP`vkQIjD!V9sfw9sX{CTrOIk<_(UT(Qxmg-|6js1jV}X!I5mbSV81NUu6HIz- z35Ph)uGO;J(nCVV%pO+YiNU62U$g{7Fe;HeLv##7tPX9d#~XyVPwTM%4t@&=m36Wx z{8-`FuYZ9r!9WvJ#&|O5x*YD;k*qf?q?plW=lw<_{7*gl9^rcVdhX z#09Thk&pn{O9zukM>_{Pg5&;Op^J=u|OE)W;#jJIKB~L&fz-J`SPcy3^ zK5J`+7R0UG{N}^UoJsxzjd*D;7DGfBVsJS_P!W@g+dT#)tF|sQtCCotvf>|ySK+^9 zScN=kE^8R(pajr*ym=|>s@yor{ z9#6L(3AB*h6jAu=73Cw^hOouMW)s&NR9~nevBaSf;=}2Y%(ei5NMC6&{tJXFwx&mb zYY>5`w;|q=UH)+fs+-VL`iwIV{tl|MsBRYH18N%Z*dJ^dlmPWv{c3XKi2=U;q+|6u zm#=Qgd<506D1mcU{x;*o7x3)K6bpC5bZmD-8~U`MBSoq-xWUG!BSN7>P>b+x#Lz5f zN*f5PMwG1q4CFw-2R6?>=9&=e8R1`1l%XNDDhIw;dCaJz`VPe-Qamoz75}hOwAg&N z6h+IwTPlk7n|~>^DT(w@0`%ed0hv^U12eq-awBSnpGq;j_5G51K5@tvO(csbLshnC zgXY}DD+{^inF>?5q#;Q`Whrsrh&1srJw{hJa3CBwV_iZ7G(0SfXzdsbefEE_$&I-s znh^?Ubv#R}cC!TMaPy2=WK`aVB|SG0P(jZ5Z2f_G%#}-G$A#sw4Lhs}k_b-uDwgmH zLR+$-^!Jg3Mp7Y2Kd~G1)sJ%WA`bXJ{Lc>;p8uu>U&qJ=t`j(Mh1#{nk8M(*-Ri~jgPs3p=#TeO7Z@hD@f6MwX-F@6z{nlK7Jen2Vrb+kMm7pE!;R3+7{y8 zQK#l{=-JZ9{(wwBex!=$(g_ zFSFY6iB;7+0)7>W7_rzyU9X^{XD#DicG4_IgL*|_9Clnasx}_Bu&1~-cjs7yXY_F~ zHtz(_;=ldfmz*GMXdLYi6<#I%Dd(%#J<9!{u;}NT-{b=c2548^kmP|_K=Jk?XhiMV z%hfaBW?wvX*XZj|>sQ&dwd)%2x=vUxaEa{poQM(DJ`*wy6%y^;93DcsjG))zft(Uz zjC@rV+?z$pldCQWD5ONC!f3=`j!4w);23He?k-sLd)Q%N0tp9!^xNWG#u>r79*VS}U~WQ{qxQvHhI0usz*ytPZzU{e=IkgnK3 z=R6CXqJr$3#tsvuv^qX^5*;yg@IkUX;ILRL`#1#PgM^ z5$_yPOmftv$9y|3{bc!lsQZTeI0sS6KcJgM5DolCVw&LbdJ*{uX8HQFbQJvruhI|a zt92hPi5ltyYc#Lu{F;=80v2+e?MZr=V=xSI3h*bkjwhORzezwT7o#jj)0@h(8Om3~ zqMTMLtdxXc&qs8paxFsxt^CN;js^wis4N-#0An0BXsI0>(%j+$$6i%egXuPMG&)Kj zacmg&eD8oZDa6?w*?vIPwzZjRT+1`=z7U*gR@SY zm@iWmPTU-ZMS#duO_H%?KFqqD$Zy7k75Q6Jh~tfj9^o+~AT;mcqJtDCN1BG#N-zXQ z@B#lt4eN!m4s;@c&|iPIn|iGRSa_!R7v|Re3pmEKM&VrSlX#pN3@8mWO^&XhK`k%| z%fL}YxMESF&|iv8G=WL!TV;-nlBXuGq|`n&;+ldYjm;%4FQl7JA#INatHT=8Q`W_; zvTgXoqzHEdLXOQaTB49FLH*B~@$!mJ;n=F*ev^p1Dc|KzBB5UNvaWl{rP_2OguPRF z5`ebCNoQ%fLVMSK%PEid>+!GUao5?wnb`_UJqh;9(s-jJb%TJOcLu_H2B{kiia10x46uF6- z47i9vY=$g$Y?DCLItE*G#=)I?y~x`u{&QeG59>0xRH#k2#0XHxhC+7zg~uK=ce;j2 z4bCyVaMWnyk%j_$>-&+2dk>Jy`V5oNj4suHkhtM9bjIge7g8 zR_iZ@4OAiJF|?hXT&wy9YLiFs)lXcR(U&3QMpT(!I4ojRgj3JW*my6GV2}|TK@uT} zcpT1C!>a{?kwwHd49r*Yii9yL17G#~h-M~9c0-^r7}9$R0(c`y6lBzr9w0f}q<|2+ z8j5gTj#?hX0qI0w389xK}HBT47-$E zg6siw0^ zLj&9|T2FFF0G2bh=p2N*(`WUdigVw&B6#3GzxDrL&vt>>f0oYzK8&VF@~yE7 zzHH>#GF3Z47^%#5QkhGO9yQfUg0R7L^bz(E4jH);*CVVL36$_0PO)!c6KjFL;7loT zu-KbYJyoUI_OOQJ%PjvJL=0SO{tlPdPP6E2jv8(BH@QQR1+Gr?iXol(vEc^t35)w1 z1joChjY10wk)I7}ePVQED3i zBaruTND9xN?3<5TB6gM8TqiP_L}O_$ob}?B^ah)aM|1+8%(5}#uYfwHHTF}!0rr+9 zA|(xCC|7+7I#L9p`hY8}igLnt1+ z`RUHai*_*kt`FC#Kf81B)*Z~H^Cdd-FR9=$F2nz%iCl6>ywsNlAQL2N>dT!iQIpvR zcecb$W{-8Ya#*VY(*bzOT9Hajc*Z{xw}RVt^2iEJR6$=8zAMS01_c_HNcoP7$v!qT zro@raF$MewC=kG{MEZ{pl}c0SVP%*JAx%017aPVb@@o0yBkGi|UP|{VgT1FR>Y7<7 zBal*vh_lcJTNn(PB_$Jtut3}jF0@q@@;c)(MJ2#Wh?d;KkwEYjOF;X;ysF@_4Gvtw zn~e%os<^Yt;w;eBi#{Eo1-weEI>STV^y&+g6}xrWTv3f^G40BtdnEt&-BFiJ{oPTIiVKzhov6#{`khh#w_t3u87ek)MJhBWJ0NG59o9p6oawk$ zrIY`XQ+>~}xs@M6Gn0&OO@8c1qB%(?$`f{9*j-6S;tgQVny|H_vlqOeBKQGl^6EEl z!I`4`$p)Mdomh7|?~Mir*dm+^HgHbwVL#}L!!633xYIGOv{SZ$vUQ55Iw4SX}7cf6t6$g7JR` zkw91D9p>&StJE};i^MTZW}2V+*H>C_``vXWHnf#5UYTCDGu~XK0`vwGldVhW8w?ts z!*5Co>HF=_+9F)>GCFbT8hL7tZP0+pK(~>gEOx7=t@j>T713| z?VyRT$VW_o0bmpaFDayHpvFme7kv#1*?`Y7Uqo=J-eN;+r2ST)P=c-J@q@r)O~n%| zG*maOIfL*wF`Ebu{$s4oL*PumOdzSK@D4!~TB5Lrc3~@cPEQ$8+Ws^sNW%PAl9q9> z#tJAcaniB1i1#rDRegVR+G$y!VS~HvLp6c5gLJ2_xF`@1(L>IFT3iLwIgf8c%SkT3 zFqI}aM9qO`Kpnb(+5Ght=D+T~7^4qt#{?H^oF@GVY~sUZ%yWZJ$U-y(VqE;eprkt=@aIS=zwWCkIU`CWi z%Ue@CEhaYY&3-%u5yAEKzR}j;5b(mG+)-e5rKMzODElPu`E5(YgcZ`{kK_|}3*6k#lB ze!^^#kGhdn6?CquC7KIh3;_v)D8h{rOL*8) zTudQ?=qS|_TVN{4W8x-3Y%-f~f=D-H$#B@(MKM8XEF(A`+qD z9SGx*&^zKS=iIC$umV#`q86QXmtsdD4sNg2ede62As?L8+z~#54qt*0?rNI z9#o{?f+YhKnwH%T!0!M;AfXOL6L<8dA~@Ek!#6_S2UX8 zg7l4$P%0pb*P?}*>=})UBs4{Ew|+5LjkLowU;c)S zucQ>%+Y1&E|K&a{%ZW&%Aoe%J*w@pnw9bKK37?Y|RS_-r<+tTpz-zS09d2P&|8p;YzM1O8{;oE zJNI?C8s$%s4w^wFAM9kL10DbuPaD8$1ry{f5Jg`H5CyvmhJK-#=&!Hc{s`V7gex~8 z0robeY@>EqUD5hC)*Wdq6tzr$*oSq7LgjdB11u<@5a}KlUQ~gLI2z8dePsm zyy$ON27SSL0VQ@YOVS=YiNW$XHZlo;>D)WY)t{{1-Cy88>$Xvl()2LOhiPZwFj4C? z2#<$gQ+Nsp>JWpWMST1^1LSd)OKgXe3JFge!jyujixfEl=tD1y=t~MC8U8M2UckW< z6VmMq6Oa&t(u9?odSJDTdYhrT|J9?)Nd(B{1GU5r1KcdeM5zp2a#NpbLIX^wCwxc= z2EmHnHo5qw((zn;Udfv)#3<}W3!>BE6&WMW+muNjcM_6c=HXBHA9d2;L>P-<02u{S zRTzdaKDtwc_S;1WcmE>77zA+GK1Z2uw2%qZ1WzD2N z{sVA}cw$Z!62_>IJx2>+h}XN2FzAaF62bstKj7gy(Bg_s)i*j-Wg0{(h%$yH3}27s z`86dazhUIx9(zuD?jaDGQSObi3FbkBFj8|-N7Be4(ev`)#{Xm0rhl(m_uHze=rVVo znM)_=uU~*L+yl#q=|3ZICJRRk)`a0zp=xHb=TJ7eW;;v>nDhUZG55z)iYq-SmFZ8y z!A+(Q_dg2%EPNC$9IA&jO_1^uTU2shwJ7~C8q3|eVjv?bbV(aar-{} z^*fP|hUI$!qp|p2z{GTVrxu6vps5!vXxcxO=23> zKw1#VMm{LzJ@V$;s(ZxXw^jE@XF&qS#9*lSTpBEHyHrX6*Y;$VyB|JOl85|?%mP)> z3O4Vnt#e*bZidnf__hs4eZit7F{ytp{YQ}|B1Gly8S!F|`d#}yD9XWp;Wub?Mhr1F zQa`);z&A*B^ibf{4>Px&@prJYw`9<&QPU>ikC@xIc+>0@*Ejp&9;LG%M|;4h;oFiP z!bowv{Mrz=o&0;-5IfWV);1tU={vwbst}J`9-0%>?DsVwe$zM?ybCVI2Db1exu>Uxp{TkGTg7r;%wF&;1DTTv@YW+t5 z13x1VwQ}yEf%i|qqfq@>_wZ{l+n&G`u>IeY@n8+!9`3Jz{J%#-A@mXAQ2ZW_hk}j% ze)D?>fUf4_{_o)+G`xU6SJmG`KOpG*6^z@rU}Fd`u3PaMhNn3foQF^$_DDf*i1~_b9pqJ0Sh`^dTIHehoSpsu9F{ zQXmOpz_RCV7{{vqAP0&l5(<9)XE6A$e}O~^-j=IDdM12B@0Rvg|N7TYKj1!p5ol+H zx`?KH$^FA`f9@p^;_csm{Qv%+|My3T=llJ~n|L`?UgY}2(b>zYUw^4Ix-a8yy7%Ls zfBfUO{jdA!0(%tuSNM&|&W}MVvKjyWBe6B1i@X(t;Mt$Mp+qQ{ z2>%j}#*)e8e~^%KLJ=n%`8k~YH5&O9_)Y%z;~)QkU%#z-gI{a;qHGSne*bZ}*(`o_ zoag7~U!J4C%vX<2IGs)-m`LPjDDm_90B3~vKhM_xLjX~5^8Ixe9I_1eSb{Biye8~o;of;Iq=YQz1_@j(I6f@{=Z z*ZmKOkDiQRyAxm9Tfhr~f)rFsmXKr+z!|Mn+k`Vqe~*U1DVm70^)JLHzjWtQXWw1` z0Yi=-;i1xLX$tg^qwHJp5ssBV+VqEdzvf_)ZRV>6D8@eo^OYtbRA8kJsli-5{+r`2 zW`_PZorTY0_x}L>8~!;Q`Zs!5(buNF>CYc?b6w%`YjE`cWN{tqYp-zZqy!M#M zW*!TfdL~=SWb#h(IcWKvi8Y`Ia)UN;K+=g#SV-96i<2Ks-` zg|qB)x026d#msZ*6v%Rx%Z#CWkoQ>1yUPiH*O?sj7Uu)Mz?rE;~y z@L)k|gAYu=wV@}X_1bUrVi=Z25>!*d|rvL0$}Dy@s` z>JW3P1p*kpYJ~1@Z;F%lO?cnCouqH>Bf~{|x>u^CM*uU?)H zj|&1AI;p-4&+Fq&xzUVQYm?sHO>5D)Er$EI;o9VW+MBm;7OT!_c-x7**L?zblAoO4 z+)U!5`{`oao!ut} z0_aNn8=p6)iOET~8t*0uU}ss}FVe}Sv$&lsN}-WIEyvut5{KG{}F&hk3yT%>k~jq{va5x}SuN<;^#Ot^NqP0j9|_%8C4 z?&MEem8z4;@7C4Cw0?54tMniH_p4mp30);lHj#02@z`&K;-y6WV!3TCE|!(_WKRGi zFQ+ee=dqXOu-08=m!&tLIiNd|z?vytI>xLZ#n246BcmTPJf> z3h!H4C$6h_<3^=Y&j7NdN(OgRmJ?mXwud(l=lKFWZ^DX!`#&Cba=2>g>-@ut_#$A_Wn zOLlQcJk2-h{IWQTUyS`v}xvwWj^9(Aso7yY|*V>F$vJEze`c%Hm(wh3VKWV1+K zulD)P=`OO!-mH4%+@f_dsK(>{rt^|bZEj8{iAwu6z3bj=Vwcm}>Tp#oT;$F}^TpG2 zQfY6mA{V>)%S&EJoBp!BIcZMfi|OQaI*(3A)6+FVY zt3mwcAF>1kJr(~$*eJ&JVy)rK`~Y?=XUqilWxPwh}X_zGC3lBy3x--h@yp5_2jB`QQb5bAgl;r8HDTXatS)< z=}?^~Zc>exa;1^I*e`ENXP~M2k02bvckS8v+!>eJ^UXRPK3|+na`Bs&`n=zocLvka zB+`k^F2pF;HltO1?^Fh<*x=$UKI-4@Lg$O!`PG%L&rxwm-WDT_rLoq0;dgZRUST>7`t5B$MHa_$>=jRvW`*f&&eNl@n z8oAXz>CDbv4*C0&`@!KQ6-`u^oAI&{9q$&A&AwVZNsY$k;$2*rBA59|sxUc?JYO6- z&aBwE?KK}mtJdzkzj{7AM{k~9HkJ0}#VXSuC%fnK@Ofl$c5&e(tGQM5$t9YIhORW< z&(`SrdcMCege)si$n=tTnAs)M}&tFgzOx7-#+h2iz{Wug0cksSB0 zE>^Wlu3tPaR+pLS)lkgkeWq8ho)vHQmxX@iteG0MZic7vV*7D$F}>LIH~CaGxgU(q zTfP1EIq}#(iCnD699W}G@Zw~OgH&oznoin_9(6f!-#grvwyUdF?EHCse%}XsH=Ms6 zbnj=+$*aR*be>yYg7R+nPYX|lain^l8>I6&XA*XHk)#tZoSkgz&Ujae4=Mz3=vSgX~?0BDc+6sa;#OFYZ^pmy20;+n%pxok4s2_)>gH^lvU&_4xLFk#6KG zXQQV>N=tU=wvRn@b2m9I(fI8 z>_dl}(@^SZ6F&)^#KQUOPKN;27k8^|E;j0))X$nX>C4dBZhjXY$JeDyA{%KAZ&$Zn z5XO~Q@~pWSyktWsox@{zv$&b&50TML^0q%~9Ii)~iD*lhbCcmsd*42Pyf}U8Wlvs4 zt9<1;l(;&iCWA?QxmcfuZ^7u=POop$tN8tPm1`$P+iI&^8pqbfSY-1&J6#^Cp;Wnb z|3nz}Zg!IcXt{FZ=6-NBomK|*m&46{Y7K}@F8kN#ozZzF)Y~3vhgJRp1o!>P)9G@y z2({|b+g>>puIA&>et0r$)Z+xOS}snLkq%IM@>1CkL$S(vzI)lN&6k6`vzzSJn_cW; zK6}~s>o*N&nqA~0z3^rK1T6Tgv+K!l6Tfe6@6T7|$UwLV>ZMg_QLoRy3aT}3L2TZ` zitlDR8cbJ%#j?7r<#i`!1Ixk{yO$CI%We{5f;XT5rK zH*G&Z4MXR5o&HVha$0Y{RA$eG(Z%7SIbIy%<0cr`cgryW9DwF*CKK^gJbJpS-_&0c zgL!WkAIx_5^ZD)7Ja=^w-#%TYueZh3b1e7tQYtPJkIjqeq;U6e;IelJwT!Y>!T{ar= zR_NsFbJKDz<2#|~r?&@~vy1+8HE)idPvfDJ zemzq=jXzz~7P)nJ6l(MmXB*`B!sXx)UWMcHUHtBl=oQbitNy5+?cess_r?1{F)9^( zZnCR12f6c@(;VHM!Q*$4i^VQpE+%`4-pOq`mY!7G)5dMOzg^7F=aHLw@e+L+)mHZG z*@=#x2CzH>dAkQ|i3a7a-=1uD<;kL2DR!gNghfu1q*gL%!5cQ{_ zY3Dw4k|{J#&RfaaXhk|;-5Q+k;^P6BIB}syVVxTpcAeBLKf6ubo+O@}R(^lAc6Q+9 z9qnH(qo;%V3~bC>=OP!4I-TakNepA>gu_F2FfXUoqBXq^UHV_5xTt} zq^}eA!YgvRaCY~D@KZV&IT<_KyFs{?KJ??)@!T-oU+-48;YI>h`JKgWV)t?zzG$v) zhqn_@&CPbZc;6bfYqg8m<@sqn^CFD)c6XEwS1v}|i{&7kIGk(-t?H_98{SR^ORyT7 zi#i;F?%y_wx7WAfrz(h!Y`0c_xt@+g?WS<4Nst&0-dzFJ>|TlM^QFswG7 z!4$bjZO#Xc^hN)w0b=txb<<3RZwTP*d@}DnUyL^8RtwA_%?(F?4bGjJb7;l)+uha4 zHd@)tujVh2R5*PlZ0u&Jx424Nt?Gs0FHuyO6SIBCz(O@)@g2G{~$EHJ##9jw}WZ-HYHZ{)tCH}Gbu+?hugztBJ0HWAW&PI zi`4XXvs?Bi)w|n#;_0%quDlddmlJTJWu9Bli$$w`5ub0vGmWQl)~NuO3V8?~nCfihEN?4KCvm-ca;8sLOQ#&$#X}(No_2?6=j8q}UW|G> zT8+<&&ec=uc^7X~obp7_a0HxpUfESU{YE7NQn51cjLsUX`c?b1R$t8%;CgLMDmhqK z70#}1!rAPhUV>FdGP6mb0#22Y$dssPXU-qGYrReFT-C3SY zc0jasG`vo&?(fFa(YCcrUSGeI7t>L*S;}6XK7u;i#3#d4G*YVyrj0t-OKq&yZC~({Y`7Q zXu%UO^J`d77q5k@D!I*PJ0QcKw$tAA__DGo&9BGla_i>g+BrmbkyPU41XMx&;-$V1 z-`>_bH{;g)t}~6-6T5rx5G-T&FNyVaYul|0@s+8rr`t$kb+)^#j26!MQw1(At)EPv>X*ayXYO-mDUhm)mSS6Ux6d7LmtI zClOzaC(hksu@S=Iese#qM|MDi(%r&YZb8z;!;iCGKN8=!&Y<7tC-ZhAzTY^Potx0; zDe#_Q~^MtPyh-fh25-LObE-uudSg!F!EP2Kd0K+9#ibjm*6B-&Q%cr z_kWRanzV%8n(r#XU`vj!%G+)r@ykw`ipym^8J`pi8DTU>1QbnIXTZ*UZ?Wr~vck^ODT*^(gIx>u-Y6#hkNL?(Kxp*%IlN9!4WLM6D_$Ugk?y$+(apY3sq`YU=OuZl#zECN|@WI$sutg+OT%819lizqku(i0Il8 z`$n<<3VWZZCui$o=7|ZLPyj_pEY;Ia9x~r{3b<|Sp zVY_>&=}EqFg4-!Ad8oDcX{D8%$Q^eqCgnG!PC44Glm_C8gBmYeftZleS2;IooTex9gfa@6znny(yR zBnC*Y@)0&5<+}2tFYQ7_o^NB)q$h0$!(A+wtK@{rlo8+F$~6jF=dnfDZfuv{Duaq zc4WKdl`yO74(EEM3|3RS7@6nn^Y&K$$(1jKch%6c^lQ9Ou2kl@lUe4()z7lzN(#Sz zNiMlB?SMSn)hp^kfL|K_k{eb6^0f7fP9eYOp@<|N9(IxIFU+eym+Mif?Y7H1S7th2 zA=>HA)UDjFwW{e_wN+gEBXy}>uT_Vmd@MQ%B92KE#`Cu58Y)bN;%e~|E)P=WVZYZ) z_qL13^hbg!~axza(+ADhq8 z>585*ozKhj*?ikB$lY|#zARJ*TDm6n*QM=GvFUDHg4LGXsvk~3J>9Zbv#IS`T8y|B z*V4wrUAL30PB+}ocFBc+ol#f{B?~$AmvLHajdGn)K+NV;q%nRL3R%jn$!RIR-KO2U zihZlBin(?1{ByJwTI5Dk@UF7%9xh;z}vDUHg}e z{YyLgYXCQOlB<&!O4={=bgGxpx87Fn6nz=t=S2buTz?d13Yzi@H-|DN$3Ww6zzjlSRHB72UPbLY{}qbEzcP?X~oFt-EupqP>MHuI@ZE=}f$T}t}nZm!mQM1GA#cZ z3`goQVKD2JXQ5TLzWCxV1w!-jR$GTFT0z~~JL%j+b?1asWmPTX-pW3g=gY~@yJakb zcv(T#w!&=#aY2vheWStH)y-s!Qu^n3G);-GT^AAlufE8_Uh}tq#$qlzsy0q-eyzrb zyL@X@3rO2!I@rlZBB8|eOF5U{wcM-fqN7uo4++!puZeW&%eL+wb_?5iP!1#mk(P{W z*kG{JNh-2CGHG+8?KZ~s%gJ8Mo(z|g{Z`qI>xC&7ZdF4{rPEP&Y`|${@?{PUf1T=Or**{+r@fvU|q5w9;pyKu|BTW>{QL@PwO z{$MhHA+%Wk@=2Lcp|?85QYWK)?RS+4F|IxIE~3TU zYrMO**L^^7B&1>DKdv`TrZ><_S-t)BVs>&=%!Y^0w~Ld@>Gpm%XYa|q9Bl8+VU1oN zhy7fQ{u0hMtuMcWtI>S3r2^+z&a`mamZknzzD{=TzyaagvexwFIC@y=F*VkpRqvS088afgq($*;Qp_71Y_Y{|h% zMNancg2yd8+zP8w{l2qts{9vr_Mf)@Vc&mJOB4_1_K4DVEulli*l*vWmW0B`TH+Js zfKQY-4F*M!WWULq#SH!XwuI+BlHd`9?^^PWYf0GspVSf@H#lpQ?^^P$Yl(8KCH`PA z7!C?*&>aZ#Vlen8Y>8aNaU)0`@w+V{XW5kGf8oUW?w5b%T>q9|{#Wb2==Mn3cPsgS zMgPCdyT;Ruc*c7FeBuA89Ms1cJ>2))=(nyV z;SU*fO$l)RFee5%Mbbj5VCH@Qz-=5d=t!T#mVCcw`R27mJ@#JzYAunt@AV&~Bj5Ik z^RY_kFV_+{u-{{x|FV|+b+>W9c^hFZlKr%ic_@8@HL_pbPsqF)68vFa38(>)`xDhK zJYVGCyQ|+b&&-hiHzU07d*t7*j<-0L`&;b~6=MFsbdRuVQ|Wu;^8FlHf5Yd98!yK3 z2YHEe^Qd{^IF<8D8lJpx2SR>T4QeK9mhJU#R#EaQRb-12uDZYHlmELO`S)|=&z&P5 zqgJ=3`rUYxA?On{e<=J%_Xzfd?rUL>e6I!hFP|fSI-CA61LpU0L4R09{V4C3!|MJ4 zvEOS+p(PqUwI-<^;kzaM=C$O*6Hs`=ci686eX3iP#E|lbpMa7b97kFr;Qsb|p7dMS z5;v#farwg&u&N*mst^bYJ~hY-?mwJOXIg@1TLgS-Jn`ybz)Y&nJgDzt1050(j57 zPvZW#_sVHS9?!Pmzu)W1zI9t7x-~we;Y%Vuy!Dpy0DLGA3UI!VDyfPr;>$r_Jv{Pn z|FR~}I-5xh@en05@liA*E#y6f!z7b`?uLOCX=l-x?g183x65fOV^566B z-@KN5c*}#I^NE^2ASxOkmIGnmA3bpt2aiY?U#!FP`}ktr_qY7~H*YZibXHA7sx=ta z_&`VsFu%ktg~KwhDM3}>W#tb?!q5`jPvDUVJcox@Lw$c^%(ty2zW=b6;H5F&bFbh0 ziSwaGRSo+6YFG*eL;g@m3;yBUtLESl2~+8zNBp0$C3r8K9%lU)-n8(it$z5!joV+o zQp*2O1>iTmQoIkv0-PcseZbz;=;!<)P4tCjcPQZYD}Okn1)y;2|V{OOzutA1XVG{LP1A@dCWJ$L@rmBM0?_4~e3{}GSkFJ37L*6;gD z{lQwZ-nO^ieDZGV#b&$dtVhc&z2f@!74+*ve!Qjl-+QI;{{`0n^!^OOTl9;ZqWQz& z5NaQMvJYQ6_9r_SPf3iaty)%>VaZ)Q>mq%W=Jbmf(|!^yB&Qq3e<5 zF-Gn#I=dO(A#c3xzKgfre-`V0HnOGbXCp7xqrqt2ng$Ou>~@0Y+}3ICpupiPHUV}SLxg|Q|FdbK3;rGK3 z=4x3M#qx4{W5x2nIl8{0AAYxtuK%9-!$SDY{$I^u5iltSE#bd5Ui$Esu3rrs`{X+a z|I#Mv!&Oj= zDiZZu*K+V1A1n!uX8*je{*@6l>&-Wi_~z5Em4JxIKOYA3n;en|b*eone7?Cg=oLo4 z_WpfS23kBnd1cY5ar6&uQ5|(qKAJ+u4!ykO6y5ZX*>Gqf(yCiTkUe=;J|NDDq)&hWX7-fyHzIt=fLz zR3Fz|wqq&oe={bh6`ziN7w`KaNahjGhDn@Bq0$@uzyFUxz6JdW{U64dExJ8#AXQ5k zof-VEyKPBc*?cAtDin;K4E3*jcA&^!x04wTQ{W8uue;84_5Rq~ME~mne(6o8i=RIB zH?aS@dz-e+$KE>fH#>j6%l3+3sun}Jg_jg(eL33*K49kti3 z^)DwHT#N_TQ6od2Kc`p6=7VAH58&1V^+veTGFjOR^*{2*Kig=3*@WLG`CX#?F0Sw5 z`dt$EU5&qM*LQLKE(!du#^1H;FB8`f4^KZY5%%}CC%9{PJp1YF$@`=2}zrbbI|DJG(XV zo?F(DD0caSfe$nM_=C+C%!KCMz;r}cP4jV&eRA4!!cxdRWZ_Tn>&Y1r7RnaR(7^`8 z{?{LW;7%Oe$)?kq_DHq1>ewm;rDCC`zBJ(Fa@04YQQIE8^ zTRNaKZvqZ<|O{a{E4J1h)zzBgguU?GI7>n&Ay-E%<)VvAx%+%G*$V8=bXHo z*SQiTr+}-+6J7urqQE%7a2ls-CmezTMP~}5aWW^Ls7_7NGz0fxICCa_4V}V4oD!l1 zO;S!I#pzZtF!3mJPFa)GJ&t-?aEe>z7%}LpXtGA_zQ$=JCxx}6zIaad1nob=Dbk1G zFzg2uM$i;ZS09t&&u}IeCcj(UQ|Jn=bIzU2e_bqRn+{W98N!qlY0oF)9m2+Qyn7tu z-Naexmylz@3LNod;tW}`zR)2wJRZ-$Svio6zMtVp&W1qb11TR-M?DSBKEr*K5wuTn zI|bQL0=K9ufx&8L1!GVWgQ;b50QtSTa2a zdARInb1@uXO;NZL+3m!Ize?mY*gE$fr#gut8ck$71zV8cGYA>Wcz%-!Mb@0Wictwi zZ9uIeL7)&MM%Y8g{IM1$9W;WVs3a4e&JVm0f3%7+Y^(s4v}|Pslc`|Q#F0u`aQkhG zzA(?M-Pbsa+M}ekG@p2iJt)hto zsl4jejj;tM<$R6Je}P9IXe2F>w-yGr+{5HkR5Qa5Rp< zhF1hZB-Ws07|YmQfZ47yVK$!|rzBW2aS9fMb3^Sooy9%uhADI#yVz`lgq;N4fkpt? zftH0}gC7-d`(aDP+F<$d-h6^J4K|WgMAB)+cFKLuHKeicqXSf@P8g_>@R~25j)oRLsPYN}`B>+6bH`5KSh$m+>A4Su&M#L$)GY7fIlm z+Ts}m(1GxG(hj#6T8(xI zd;=2)SXNX9s~XmB55v$(5EHRv;%L=Omk&5MZ2M;@2wi}QCaR5AkU5Mw))s>bx|N4x z3l#w#_L7J>m=iF=S#Wy+X^=IR){qVDWFAL26S;}A(5D)*wi0OKtg<%FF%6oeLW9ho zXla1MOUyu>v0RKH6K7clYKM>nOzc++C{5FuU@M~us7|6)HdX?#=7!RlFq1NN9HgKvXkk1;oixL?LX$wQAYxa6C1#&3@ZN@-I84p#Jf_lkg_$dT!49I_Z#R%9afYMC z78T^W^)pBx!+@=#B$lYno)!gL6Pk(@WhbM_q6rg=INmrnb^(!NIo=4z>%Jg6-tZ=8 z@~HNDM=%|_rq0n&gmc5mGI5-nf?2lujARqGl5D{-@e!=isY4{AFO5k)qzUWuK;e02 z11Q9fG)uMlZ|lJ^|NeJ zsDl#=Vma41H%t>HEG))zkF!`xhNDpI0}i4EiWyI8Vi;2vKj7_vPEj|m4Ayy3K>xu? zz>LHaSwY$t(+Ece@tc)+X4 z89}to_M*^jrwKx3_ovz(cSIq{`Iu&_^Ic9kM9Y4$iE>kJY;1cMcg^QYG^wB=Yc9(>;#KQKyB4JbRcF#NZE-rZ|)d6V?OS zLYNW|qPnq228dtx;fRSsw8N3%02y$d_lAOzfCKv2a9|R|1}2W$u=EDmON1Is$Ve1o z=~P-4ed8RfiB*F*5gt4vavzRxz)?U<($ZHSo{S!zFzIldK)&r>GP*X9H?&7_dYYPe z*Uhy7gZceQX0`!NH`i!Gi^-Ib%r#A8i9GaaK#H}AhyaT*OV*lr(F6a3xdu*xZN#8^ za}5-Nb0$G%t}zd>x0fhj-9BZh@o zSujHU(L5%+=g;&Z$)tl;0U14N!%Q}@2wehfQTXE}JX&2?Bun7I>;p#;+#x{G_lJSA z8fa>#>;K;6MH&bawpeYzDrIf=TNoA^N@&75OZXAn-NYdy4eeoL=w{o5t#;eM(W>o@ zG;nTM)lYE{yBUtq_|y(!*9|wPfJS{jvX#hkn)Dp@I{1(f2!lpL!wq>DmYYNYlA);w z%WdM0NYurBOycnpSXT!(476p<=4^H7CI-4};@IjOa3a{$EgInj77ZWaD2;%=DkVTT z+-gunwpUuf(3(BWR)n_&u6O=jD zkrHTd1esc^2US{3;N#vDT~&E<4~HVMbn~ zqlGtMW2fkSbR2dH-jG82LjILupy;&4Jc1td9u8#CB2g4(?s&k6KWMkngL~+s!?aaI ztglI%K*ySa)5V6l2nRi&Bai0R$VWCk5aQ8HO~Gr?$ANh|s0K|X!X-l&*cWVUz=kA| zsx+tG<4C%u+^H#fC7@cR!_<_zfrFxxR?+ciod2MNNkd>Uo=TLNoXNTi!*Ilfs7pgo zp*u{X;Le;!?{hr2NfQN6xOx=n;Dw87-Uo34{7wp%3>+uGoH44{b&v^SRm|HU14WXh z%OHIKLo;ZH8yK97#W zxcl26qK_gw6G!AT2i>?0GU4O7^)}E##u2PHWe<#-9+N|Y&D$WNj`Z=+2FVXSfz3uR zpbz{}3urC7m7);@J@C{0YEzB|FT@{PLmY3&(}A6XOODELTF(QE;NAeaua7dh;6jfopQju?xgF7FkmB}b~va( z5AKMlkKP8bXgDeC_%LBQ{PitrU?2rVIIt2JRU>!6^vVqwzaQLk6KDG6fCX|a_uB(h zU{({>Rhyz2%R!2H-3YR&4fD%M(uSSi`{jhQ=!(@8h}e-ht4TQU{B#QioLj#JU^r$+ z4IIc+vB|KgRF@hXdR= z-O-KiT#0GA$)%a72*eZ=!J;7)GS&Jx$o|kdYYJDyHK88ADk83gxC6`tY4)KurgU_! zLA!n+JE=H_UgvG$M+XviH-~CEi#@plew3uE6#AYO+4)y`H zBvjn7w-10xtIZYS0L$cm9<3N9Oss9-qw2RVhK1O}77JnEObY>8=%n0R2m?N{5GKyF z5THeXI3PYfYDdKl)_M=?%Y)>IuBiJqR8@tg1p$X}C+eL6-_%GxU0+ewa91BZN44611!r_46497W0mxv||-Vb5B(FQm@YzM6B5rdvV zrFrzwn8CV2fE37-DKL4OAeHX$NZ~OHF{2-DhqxU$!_zkI5Lq81W6HvIoxOuR=@320 zSD%&~WsBWLxtF3(q(|*0e8isK1|ra-cCd%LDyF-1g~-HcW~l)0*)#N;wE^)w)$owM zQ=*la(fb_qotU<);L+leSa8T$Q>_xJ709!+rdmxLblbc_MBN-!H86d*;>gzqIeM-Y zZ4_(bO`^Dn{eC#)B_v7cuFTx#fMuGW6b7oznJ^aCyh1c_Sk-+j#bIo!Rr?fY#3Ibv z8touL z#cggqjOW(%`w$m`Y~$9z!Z}-gq7MFssGlh$PCb8O!69b&N{ieb)9uf&KCK%#y z&VWAS^2dTB-x$URr@xFXq)V4>bJ!|aaB$q2UR%17Kf)Bjg2TRovK$Ww|L5ay5DQ8v zkI6$PyiflF?pSOX+eLt(&_^&lfkHVt)otX#u@*=EF#C@-_L zL0_F%Jrbs|2sX4&@1x_ejCv%DF<6D7sr{Ho(lerm9RgCwZ=ofniYE@GgeV9l+o?yw z22AR=kAyKUi**bfTN@K+M#7kjBcI81#fV2;Du?I*bJLC5p$%w(!wXmsh4H%~$wMf7 zz#WCcKvPl(WFJD|15OWx0UJg|4|7QzX1d%Ag~0}uzd#&D8?dU6tB1k{o8~;a*pKHv z(gmETv{NXiLln*;bQxMqX4Syy(lc=IDE8Ve8+|{+S^Cn3hNP)Vh$$Fl8qIn1nwG=n z!_;~X^RO|Do=5xf!)Qkg;bNBJ10#ZC6H#I2M>iIgi2}JFhU2d@xyK!*M-3$2m2|wf z4!DDPK^3Fbw`Ai{I|}zf3mMQ4I1AT%nm@xaKhwe@X}*YD9$lu;1rM=^DR9k+BhbK6 z^F0o?hk`LZ1c!7L8SPJS*1nj7Zg-BxGjNm!)ZiYnIgIf>!yy68gS;bBzD8Mlnw))x zvr=Ll5vVfLBwQ~c;V&vU<4F*}!CEmKD-}QmAg{tP#l-h1qcdLvl0>$X2amfq9QjF2Vw=J4+$0}1V|=~N8tsk zY+-$jHpthrSWKa+7sRsA0*#{LJxpfS>|?f}Tmb@q(5k`h!6Uw!Otm6dEF{>~J#5T_ z&pn{3#%O~Dr>iMa50W+H%u%iyl#(f>9v{_&q+)6iqAdZdf$boXp=TNdw?;<9XX2`D(O7-3^-!FgtYiu!Xrj4q0`|NMHxf2^ zd=$*VQw5#Iwq>;ARG{KL6US)B0Y@&Ti9>l3(p9V<-UkQanlKI<3Mhzw1k5%rU>pki z)G1aJrR;XcDbGbk@+CFB#7rKic2bp{h>rNr1?IL%?7 zwG%W)?WBI|LQe!xIf99!>VFA0Re1DApv>AHhL0t}P}3Uiag?1Uf1Q#fFh^wD=`zEZ zhG1mVSP!@+l>XZ{L83r|@q|?M5lq-Ri-|KS!59cb50rl3hRtJ64T^ZU^t8;NmMjtE z!BB8Ma9swY42w?}q$Vs_rrzUl9*~045M-<=*Uy4{b7})-Q&VCJht9qY4j)o-dWMRP zVZxSq;9#;gCN1<>j)3UIq;)SzgLaw+$_%@Vs&E`V$XCED6O(kTkSh!n3Mxm`VZ@YstU9>VGFT)9D)SO7SaG1+Eg4&fh^ZSk=Put zWt0Kix51eyLqh-yh-B!1L5&Xkow-n~4{&rXhc76#5@k8q%}5a|7*1>E7HLHPpj!tGG$$b!a^D6=Jm@CD;Isu* za75T>iYA(F6>+E5{;hJFk!N#a3l=oSQ`i#x9-%0 z!^%AmMx?~5!nO5 z2eSwiGLuXXm|27e!g6LHl57`1R8H;HgpH41@R5MM<{&;H7aN+u3?sZh9kv+8J88Ip@=)}E((af+adzdi@1H){vVLkEWfJ_%ihHcz~7UO8*AT?$k!7%PIn6tyy z)@0DSw!|Pkpkd;OQc4CBOx6)Fd)k@S*0heqv}FOUOAE2!PJ?>yts|Ub+$4y595pv_ z7E_3#b#`2Rf-*;AJ#pV9z&H8~2Z8Uc<9@i$a289rr{pu7wXeb1(HtMRwFpA5!-hW6 zlVXM+yT`#;P=O*9M61}y%*;@_5C!3s%Qs=t0xGJ;WxyVX`g##zEa?^-V-FkiF#R*y zSVhFf!FK-)M>NvYdB4J0_5_t_QnSxc z78NE+ShLS?RzVn)90}rpJ1}i|@;R+cj zoi`nY6eY!4ItphiTxDp-*Ema8k|81?>^ms((Jb&)aB7%1b4-Ri8q?_e8SbljsI>Hh zokB4l!@jgCNK%`ji4^NsYCeBV2hcex=6yAn?+{_ z9rPe@?@5y=2zO+rOq^+^3~^yT7BQP78lX-hTaZHwa!^3wegp%y8YwVNZH_6_h4UHC zH1@=axe-W@$rpg0k_>fip{ga=eFMiB2S9gLCJu$P2xVD6TvH%}bb#^ngmJHH;4lSy z&>W#Jt5INE2lkg>%3#v&GQ44`EF^MFoG$ZY5>4uE_17nWWRziismq z4OnI66b1}xP^e>6CLVAs3q^gX@&^Cn1?+wzot~WsEYOo4YymAesxQ^&#tef0bhAzU^U9$c+n9kU*~$ zz_7UXqw&e!GqQCUa%DTk_+8gKL%as=NaSRK%=rv)AJJgoOwpQ4!wUJ3tRs7BtS(y} z)GAV*(8TEyGH})t5d~v(FKZo^3eOnM7*FpD4WJYD6C5KGzQ5j1r{y!8wXeA+M5+Kk z_#%vSsxLX9*r*1ICO6MW6h~2>f(`lshovxcfm9Dh6_=l(tOtQH8flA}&!ciKBNK9P z7IZ?u-6yESfnjjPgkWS5k!n2Rl-M$bU=&z@6*D(Pbr^1BhlxAN4Y67da;Ehlh(J6y zZGudcKgAG7J8B?2;W5E+Yrh+i2QV%kR(xiT4oK@&C^q+1^o$0&u1O)y13j2Yby?js<= zQF)B9dPnODdqI8o@edVxP??R1W4dkNtQsmImWL^^sIiVY?nk#5hwPI+mX3q456Wl^ z_6f?W>?ReT;f}fzPsih1xjbSYP6zoYM*_gwe&8RMtdx+Tr9>H)Zbj(g6_Mv>ICD70 zFXiUx46|A^19wCt#?vDgi&&^2jaCisSukr)sPvARl&^3{qv6Jz82b!orNrFcRHL9L ziP-GS#!<-yohVk(8aOrtESt`t-uE+{weNl^gv7dzA9N0>etP!BN*QP1VD6BVGq2U5 z$CkcqdZb;y!l5sWJ-V{@keSWsvdBsiUf6;J;0N4cT7hb{bq;m%j`|{rPSbvdv$A1u zO*cR)j$+tr7%&nqRruhh*TB#;Pyn9pO!PLSUNWAhfKAru+S>x}FXQ$&>_RHorV%vU zvfyxJ2{p`tAuxvlll|CJV&G`zJ&sXF7$Tdld~hL5y>YFhzo`f#vRBoZID>9DL(;w- zlv|V#!J-Y`wZ&?ObeNnbTwM?q`!=XGqBpmJa!u8xA)ztBs1e5)xDzDZXMHRn8w^luq8!9N7dR*hK#z##Jo7Oe1*#4XliFLBF!dwG9`GuFUd8@N;`@{nYh2Z&jrhr5|l zA=L?wkw`|u&Zx@3nc{{4I>LSEYYvMsS-BNkUWkZ|iK~7pxifK0TriPtmTL0MSd^Yt0-6EPqHMSeh6HzosAKGJoS zj$vFtMe$KZ1A}`Dx0}uY}4e`+`1IOsFO4Ldk z5klID>nu^hvC5XnIHu8;-Nu+WgJ^blZ{p~>#Z700aZK-F%Q3yj8OJnW@&q6Wc1nW_ zoVEdZs(?fDbAJf>f>PAo^Q@ILQW}?``2zlvs8my1m2IV8@tiP=a#8aRLcZ;sp=%Hj2 zHmBjqI+<;t-ZHsIkPqdKab1TOJ+R+73YJ(O;OJQ^q$xytVv*#9cKTUQnGl!}%q3E8 zfl?Vbp9sct?ij~_**Fjt9wXi3NU&7MN#iOoBzqVvny(?**zYnKx(;d&F)J zlL6Yl%1v*AQ6{{AJa|HWIy-oiB^>c9k4mc)6*eQC2HUxmmL!(v>IGV|dGB=~e^x<9( zm;C5z!O`6sf+K5JhC<%!7>Bj`sw>%dW?Bxh8-{}lGSx6WY)mVoPWKpxt8fh!4Osd)(>>-$ zGDg48aBQrjN#JYm1xx1%y$p$7^mHt219v#e=v_3FWQMTK18s`V z7eCEU{yw1B>;K&A{NwM-#qtFI`^U)$-*Vjae*Ep1)BpCA1H7w!yIAAp@`t~cgEijY zZnM!#>+wBMd{TC;5B)hmmS!jHOSD#&UR8T7f6&o^#bQcd8fXR} z1@@C6U$X)A+y91c)~^H{MlNkf)6Ge5b@KP#yh|%W0^AGl&`zhI3kp6=b4# z{f4g#WWpq~nAT+9{TURgw4L_QDO$)klZ(NkNnd4f_Ldv= zE1L?FK#FLjxH!(mvI?pPCfJu^bhqYT@ZoWM2N{&eND%-@OG|<;uy1n!5ow<}jY`Yn>}sLQ&d)4H8D+lwq5YCUL|nX_eE3BQaqM;c)FPR z@{MG*)`&T5udUU6y4_t}r$lYmm84cMqb%JO$L3+JIk>WK;ueFoVbUA4^*zPzE{aVRlr};P zclNeez2(-Y?cCDa;gk92O|kMadiRPO^`>H5G@}badvZD5)5oy;6w`P$U-+!_e8=A{ z%3gmp^0aJu2CtXnr#3G*%0tgAQeCNuOljG-iPP)XZmq73X4{L6pt^6PjZ61PiM>Uu z4afOBv@X4s{KG-atwzK_SMoIc%R(*na*ZR^w&GqjX*kc+&$-go>t>yG^qyzSK;d~^ zaCDQ^VbRrSZYvde^|&~TSJn@)+9;owYj3{d{9+s|_Zq9s*fCnURC}=2x4+q@SCdI^ z5nJUQuF`$srWxZ)1x)j%-rry3n~$6JQ=^`!zjG`3^i@2&={}UV>F8|Jez+M6@r>(r z^SIeO*@|v|{H}59oVGRRZdm9?`kmImvD}<%bNkIrqgq(jDy>$9%h>y~yK$x1yLgbR zm}Wk5Jl{9eG)>(bKZ9=WsbE1e9@U_TJq_Vy?$@(fQc)`!DU!(pz*mOD|q#cY@b$ z7sSNNaJ~s*AGW+3)jlr``;owPEMC9CH!5tIhqI^QMz{`@)aCN!VHTW*-Lp|q9k0u+ zM18q?o3@69%G*$qHW}xtx8XO@;l*awzq7|Xi`DME5SiWa4;i&n@fyPp@%b87KvxpR)|QGWIivhD6-ZA{aD z3&o_X3YU8y4yqM*{7!Xfaogmr7@WT))%=-#m5d~%$E%3;Sct9$$>4o4T9pUI=lJAe z;S(Hz(PMkV&C8WRe|~d4udGuA?Pk3?eSeMCU2mr=uU5UsG;e2f`>6Stdc3RdLT^3% zHg&wL?;qshLv;`fu4dVkKQP-Qm)?i`>$2T;pDT7Lw(u7lsf$D)UJ~MW9<6#ePutJt zVNssW1%FbDB_rKUX}7zT!rehj#x&!p?AY`hUT-X#K27dk#ir+M{uVlIu1@C{;tMq9 z=}GI~d!9m@{wP0jPSf$b!n(4#t=4Q(JeX>GedCK(=ycb(Tra}wr-?6-o}?@H&Fkx% z=1n7;YP^!8HtJ;tS0inf8aRq?w>OdC&F!Lm8TL&hU4L|u>pO$x#@OCVM1~ix&A6z9 zl+o?xbv<{#-d(Kh6D6$PxklNmZ9N>j&&Bi8H;?PNSm@k3Ca!g(kclo|p30c!MS6aG zENCGvxXM>2J9V>Ll)B5d)CRk%JE&#e?HCUVz#93%rzawe78;2{nTi7g;B1f)Mt)Nm&%2%e+xAUqr^-di z#RV`;_a&B5tFK*Qe06rMyxpIr`Ke8C#M`rVq~#rUY|gi&tJ1$&JzU-l62jTK>yJ!M zZ?9Eu9=;vgnj>%7@7nhAPKS4>jcnE0c*wn1Hqwj4d(O)8*?BfK#5Bd&B9k55R2J{H zpkRA>SrqwxPU_jJnzLIvjqYak^XQ}FuHd{MrE8C{spqG!>GP{+n1a!3KrJR-%eLvg z`m*#FLf5_ai#p8THbzyCqx?8mPK$|K-}C{~WVlekud1?p*{pX$rN~vTepP$xz1lL3 zLb{&4Y`KDW?dWwxh^`t_zMn{W&nK(-^<^&cH092nnMmH=c}iFBs|}mIBt@I+%wn^v zWYwGWb>YboZ{AEt8BDX5r}oQ8qclvNr*oBlqW>OpO`AEl=dn7NK3|vfsdBVe;Ii{( z{W&_GFCNb9%9Z_YdHrx-UEQ8J9>UVa>AOuCUOzToov!?OCZ}D$_=_#uT9t0je9a5r z1+7i%#p62F9wth%UaOB9+hyY{ycq{e(cIDzQ6h!Z>&S5tN~racwyCeumx0u>GlYJ$ z@|m;KJm=>p<;9u2eQzzstzE9&N}h7v>1%Q^w8tbZTFX5I>zF1WS5rGBKKFF1i?-Lh z7NY*a>#7|+eK~i;+Ku?`+#}Z}7rXkXJc!V2g%#A8OOP%ZL!F@6YjZr&7Cs$9`wo%-9*?MZ9z2u56 z+l?oGbz84uT}f@HdlS`)dn81vcoj* z%A|JFQvL3mVY(tVJ4$w%h)%<$aVXNLd0&cge%G8!z6SvhCEkmxY&@$4&zpCzH%m=U zY?Jxf)aMHIn(E`$(O73fHHX%Jb(eda_l*?4subekLOg&Fw*bIDnXT!fm=*Lm@Jdzy>RZDKN&<+;L(^C9Wo zN$UG@_GS+%$+o}n5@?Cfj$I8ghixwB+r{g*cqMIH)O*g=b@McrElb;})*K{l$xtCN z>7Ltju4r@lke51-Z}IqPR*kfk_kj1R(uzhJgN%2Z8Fyz-iN|{8Jh;1c*>iRKV3>Ll z``*Ii(`^pZY;48J^gZQiRJ*T(Cy$cLhOX|Rv=`Op#r2)UC6xD<=a?+?f_+c^HrD9Q zt4cpP3Irq1Heq&kosDK)+1E+E+=@Kdqt(7Jb?^(&s@Aje)18ohtxU;J8@l7=NxhX< zLS11V%FpLY);sq!3Xd1r>N%F>B^grAuP%CXc@gZ#)3?{t2&Ql~`H-hk>okVff#_p% z5`AQ!#iUYl~UcG}9gu1_mc z@huxk1=opOv)oQ}5m(wyR|`j?Q1b+ukzk~-=|@BLYQ~#-h)s$;F;+RX7sF2FbR55$ z%uDZAw{rF^I+La^_6KfLkw@#$rR;XuBd6|HPiFn#ZU}ddSE=*7vh}N1{oAb^^*n7! z1@fo;`d!?a@J{aHFVCHe;h-M32bPaD&Z9m$@8i{`(sNmiX0=_q)Nr~k z9;&u=#B=es&fKb*UPF6&i9fyDy!=zHX_LHC%expnJY+NchW1T7T<$D~?zR7}x(Uwu zLH8^hUk#)7oft2r9tQ53E#K&ryQh(ME;Vr8ir&y=Evei~>cuecIzL^O+)WNSOG`Jg@b-BNSb8Kh^z zn|9$)UVEKH^zF>;6DRA}i*_Zw&0WSe7o+KIhj(7|afmfsnU~-&v)ScbQ-o9%pKai* zp5@Qm*QfanZBO@oFnD+FD7`dtoGlkW4V53)Ln+g-16s`tn@uJ}hs1nTLL*b{;*)H2tZ2 zC!MxKcXQXql}|ifJQSrDQS~$$4{vAp!CZ5*ernwH9ys5Xe-o4f;n-uHvpXFQrzh23 zv^>kirsvrPlbttLDSvjGgJn3~s*adaf}P3UuP?m)3Z}Ui%1K+R>?^yJK7DsDC6m|1QS$CIG7DbSgHHGS zfiGWrQj<%$S6-eqyziG+!{YcE)2OrHOZnB=Ef!MOWqy3|`mVf|Uu+@u!j|^CSA3(o zSv|ajqmxWI(s**z!so$I)O+3urRS?av=^1`t8RNFEWWlb3*F$U+7oBe`OVBZ==*Oj zAJ>^HElvrBnUbp&E~~QV`mHf3ihNE9ZEvooi*CaotX-WyF3*CiN<1$)&xMl8d7kFeOjG%xa<2#yJs8uqnXsyg^(lXek@;fUIZ>Jo#w|L&%;aQ zZMLr7)dlZe;r{hCbybWvaqDq?B%_! zYiZzWU(Z4_(R=y6@V@y*C9YWwU6mXD-o}2KR8rSh7n4!^rhHKnJnb9X@Z~u>xsGI0 z*V5gkD2vIM{oU)kdU{OwXLNdYx&!}J)_)o6#!KDiXyQotBTq%~Z5)=aI=1ZX%&FFU z>$_ER+iX3Dyf>+*m!AFZ$^F)8^%L9ohsLujTP|#F62qah@jm14YES1cXQ`R{bX8D% zjhydHAa~I9sxI13`TF+7yXz+|Zr^<)&qeNHF?KC#+t*mkdC@7_^1-064)9Oy^!jeo zIK6T5ovi4t#I6^&b6;!PUv=JN&Ku`t-?5!tx`h0==zqR=3aQ%T+_nh0FirpB`ni>S zobj1S{VLY?onP8p>QIfJFWxs7lV#JLedbHIkLUeZvQ>Ov^gWAN$S2K5QGX?LcDI~$ z@Y0RtjnebHNb&ZKI%zqiWPfw_SZl9tFRs?3#Px_$L)x;$DWmO~*Ow5kf*YTfb)Vl= zJeLh`-`UQr{a2^mU@#GC4s7rfypH=2>_&Rh^Mxmqa{bIcyI=B)yO-O!c<<|-s$x0l zdKgW^!Qe=}yYHUfNlyQWOs6u5K4ou$$#efIn(j5ltGn*flV0Q}>$koJmn}8x6em^n zrjcKl9!jbCLMcs>oBMoz8^090%UdxM?{+Syx6@Ii*O3F$%|$g`R#!z&^u4-?H$&x6 zf}*wZ`(4g?I&O%i*i`k`nu;3a8aErhnY>w?a<`?+(z?xcH-)~)XY)?!^7Sor)#$z` zo80Z)B2iqYeRr|({JgK!C&RO8Ja+HioNcPzXXnk?-K_KOeDZ16nC3kZ&$ew-*F$ao zV($vVT|5?2)o%K>-hXh))4baz=A^tg7FSPO_Gs*?SLRQh_Yc+A$ZB%7&Str#(4BkV zC+TtBR`ffT9^2y07foE}+-axy-kQZy8d-rrvzxsR2Abuor}@L{_Dt<8&kMbN;97Zn zmD^9X&Xq5-Yt?f1V*j0QoVonmmD{8JzI+wYg40`Wcx_s#^a3#mKJYS#RzPMk;wn!4w zq#oPO$iTT?K82y$wwnJoFnLifCaEdXo7tzGqg@e-r;X?K`ZnHtaOG}R<9w(($d=OU zo+7rY!RyWpJ?t-cjz{mTrCm-#<3zZSoP;LxLVV(@Wy0ig++W#Nf%iqP%}=ylu;9En zk2>0XWq!W0+eWu(`Ta@aF8f+yR?F?WHt8{Nw|L6GU0ye;!H{xV*AO|r`#qt}Q{bky zc)WZIX6=FKZB2zCZ>$TM!R_NSsX(+9cKDXg^W@}V>npaR%iL{%f4_d6*XPY=C4Bqf zY>eZ(>sxR6<|-4t$kjvFjm!JjqFk8us+}kK-0o;>r8jTkbf&y+-Py&h>%o?KoxOQZ zyUl!78Tcn;1v2$?w0$nO7WVP2+Ea_7;OO7g@{OSXh0IkE7PPm~3W~ zY5YtHCjw{f=lf`LoAg!J_wUjucIRlkuWG60&4aucV4Ah3vq){uvQj;^C@H1#?Q-QT zt(AT;o!-27- zP?gHC8?H{lmb0J9`3E`W<}l4m|Lj_@t$p$Oq#L_<9#_?;i|4aaam9;+#!|}oJTCFZ z(R1DxXP1+DeRLI`KS$PY$%{h8U#)l_J;~^FGahr|r4-7x)A>L^X=vVRt~?s%rN)^u z6U%f^RsKU zn+x7L9e2HQ@RGl@J=Cv@56hAhYw51n) z&VKC`Z;Rt)ps|i`Z|Uu@*5-IgOa&Hgy)y{dPDm*dlZ zzdTvrmF{lVHxN{=AICI7d&FN3O5AOt7kba!wwuLgp%=I>-_>Tdzu=a;92#cSbq=eTgSdx1{vc{ZBP7t70zH}pDq5M3*Y z)~3dHxk3meYsa>ZLM%4 zKe^s;B0t9XU@7=$<2psp+a|K82jhjucUeweM(_HShk3m8Ov!uq`7o=_%hO$Hd^T^a zp8H}j@=$O{-gjJel=HV@4iAJ?)z)fq+rU*wta;rn_RC7@{XO7R0?$4rB0UZ^$n$Zr z7h7LzyLaa{Vc85O&MvCg%Ba8f1<49D0xr!PYSxC8=tH>|5ZCur&2d*+rlwOtxPQD% zG^_Pf_x<{DDnHCyOWxs3HcvMzhZ;_2X1DXrT1h@V6t8*Z;>n+x=gw=7&XBXXmN$G9 zskInq8#~BV_XY}qw`)a167exGe|oK_<}b+Q@$u8^a8Ipi_2-EzkeuXE16a)u?(-5o`%vb(ys_^obx(HUT#}@(@mmYVsi`n?a;eJfTo$_*$y~>tax3xshEnnTZ zMc>=~?M?g6rM^Fp3+nTxQ^YjSHurGREvu34KvbJ4$79<67%d}};pk4dyJ0;%E;(YS zMb786%bm;Fdh4s6*Ie+!J-(IASsfHsx0&5re^L!sN=jg!kb)1fN68&O;@n_e^F>`H;y{I!na-{&`;pQc_f--j_Woq1>JDba0mXN@xd zIIon&;P^H==uzu9T>2`lSm@3h_iiT_-D*C4GkQkAPOf@Lc=er^`P*9I{zfUO*RGUrVn0iEVwDb@ z`eLP3DP0fdPu}-suF78p-zHmMF7lSpZZ45buQo=HgNwUFtDlk^d5`VXe&>7`Hgei! zsy%&_R)x2cBjluMy!Lv^A04h;-H3PP%av=7vU5Clz7#I9>$CdcqWPM<-}EOFSJyQS ztRk+?eSdnri%hbaTI%*{-MYv&a#!8N+j}V8EvL6{uY;?LyO->AlX|Z?Z^ChP_C!|^ zwUi^&SVV6l#fN{9N*AH`34-@|9ZuYO=;J4#-9Qc;dv48dQm#m zvE5wS1Iog`8C;g1a@x*jcZX})?7DU}f60$BLaX-57vWe=aq%=wRo z(`)}Ac9sp^Z0vW!bG@+k*X&D`^3bZ?FUC62Va)Nw$Mde1SDwDr=Bsx+DJS$wv4J!8 zHn}?+?{f9{rr_9hX8!+=q-$?Cl#Ak@B_-WZirl*>5ekJ=LKh;r9^e1n=KW`$GiPR= z<(S>tYyEEeO$7cbW^#Gd$<6+*O~OA>hR+DS{3vpXtBg>yHes164fee&VZQsnllCcJ z!q~j!&b@kYYKMv(`}YEAu!XM2c%}P|@Z{ptPP<(pJ&;2bzrU#Tm<63{xN4&gX+w2A zXghqJIOc#g>KY+_=Ke~6t7~+Ov#W++$@zgPr4GHI)usI1b1l*x%OOdv;Iu@fCnFjw zcE5wps>g83E};sy>n`Mmc=6qg~G&G7ST z_X>ENHYhXS`D1-&FYoQ%e$s^=VFThud2_Swr_bKSFd@2-%}U-u558$9xuPNLiyze< zxtoH|-`L$Kc}O6cwu&E)%` zg2Y}_+?E*e^?Y8}!{*f-Z(*mLhG|@k`U6RQ4Tl5F&HZxJDFml$ec|mrHLK!*o9MxcXbE_is*EWSI<_O?GN@p3I4}&fQA|l^=9_=)A$9zcTR}iPaly z@N7dKqIq_$&@AmA< z(5$jYXYbHiyxjEl$U$Q~`mJ$ZFOhMWhUUdDX?guvrwdd0r2>}4d9SyO!}5=eF-8Sy zcu;;PEp4UgEEYkhkF=9MFkb7l@D#kXUS{f}{37Weq1MLgz37C5<^O-nOlOPbnyftC zxw6_53%20RAoQ9=r`uAA^9J#lC>?r_4q5iE?TX*u<9US#rA|dm>Luik>bkLx3rqLO zP~!`|`lzq+fcEN5bsjO5L0Y0-)#EW?-jDvhE8FP(hjMho__C1PT8otF_1_SRN~&Z2 z1)sBcpV$;ZGNpe5)M?^GJsZKS$;(TxM6Oo8w+WM2bzX^YkJBO?1BqX62(J@rONobV zyef+!TgPPHR_pd7a^|h(`3Mh?bm+MoL%h}P!CqHC>8E-ed9KaKKgmduv>fN~t^Daj zCiQ)i^x!$ARXUknF=m*`FR9#sPL=cp7eCx(P>%xAcq(S;?BPps^`G_AiMN6^ETDjy~U+ihB3ZM5-b>mB(g z8&U@kLsq`d+qae|oW)alQebyTe5aew?68^NmhZ0rK`-3_y8s|bV=_NGJ3TDN!QB!U z-RJHSHu>UMP)EH!D6`QR=C6tj)1iQzmh*(@`7io|Qe9`CbfrsNZ3)`)ZSRQ#QTXP) zsq0KRYCq4*%egu{pLb$c8wmHL%auFk@)GBBE*5q>SANgitI8Bjn-47qWeOGTblY9! z7TVhmoK?hhTJhpI8ZNuh;U3DT%46R4WwM)ua(TFY2ODcLJiT((Sn1+!vgJ>5UrDP<6Dem(Za4-r63g|7#?E2PJm@TkQlUzv`{@@nrZ-|^Nl?SjaD>wy&}CR z_gar+SQ2*iF0=0~uh=#<4Hfs^*ro$c`gg|it}PdhdX|DRCvjA|^Y7;0p1g5GK|vox znsBs^(0|zcnYViv@P^`bM`?_MYPqW1eGe>8gBPwKE@_@>{LUB3ZE2~_ru?>nqJ9aN z>QW;Ug^MB4O^b__A5+-oNRi~R#X#`9)}h=2vcSQvlfFUIZ*^$#*r~J@1ctWu{mFOm zV0Ua9*t>?;f7Ky&vK7lu7BRRKQY7Px&q#I=tC`06@Z-4xkiEeZ`Qpa~rG;nU&CC6-+a4_#& z>;<)kad*2t3;&p>gHH7FXwuy5M4=#0k7`uoA8j2O&oigi@D`o!{`LU+B8faqTBWTBA6)FzbZ*J?#0N6s+jse6xGYwRdZbZc>hZ#*Y>>^MR7hP#O-EiTa%DQuw@IEXc zz`K>=;6#ho${#Mz@nbUJ7Yhk`2<;^=5!}<4Dp=@h#7$@W&BX<7wiokLt&FhskJe^+ zVmma#_Of{JvYJ&T4BZ4}gu7!k{Ffqm!fK`f=pnwpllk%DGE&iqh-c{r#jAMry!*`b zK-4?8v66TfQn8oT9KW9C`<|aF%EE#^fwY-{tVTgURH2jByeDCR!p~~|`XeM6kL%dR zY*nkgEvMka6JoccXQS74T$c_cU|dF(SvA1g*#yGLRiFGj!{)Wm8xMN{yy9g8NsxI_ zd{qHCqL~8u+$XOWG=B@d(0Uw8TbH7*KPqBz?~a?J)0krN=@<7-)Fv4}ZQ--qUN?h} z=V*>_K}GXZ$i+zl6&QY{46j{(`o3U@m$H7}>A7s{Xs+jt*&fka9@Jcr%;tMyaqqfM zYNJu(SH=u=PH%8QL$4wAm$nUh1QJ%S@Tex~=Sy%WSS$bHGiqqF^lVtPzj;+%QngfL zB^HJe4;xMDE)iZA2i|<+!`+js&*jAvhB(YNmc#p#Y$O6-pP>xih|wdZum8_#f3 z893SU`Ud0z!sU9_NQa#cbk;|Fi$bfp#I#$q;jNpe1z2)uE>^?k5`BQ(sn{SJ`;<;E zAEP|D)2cPs2YjK+{p39EwA-n;`QWsK6yvi5JA1hfM)pdKGks^JHiGA_oo@2mvYo># zjEei6gDvdTtCQ!({-~K@04QoE?WR&DV0~DY@K>RRoy)7Dxen^_YAnuv7eTl@R(a$8 z*j>}2x=ROahaOVx-n<}8n1ay3s-0eIeJ9O|3|{iOm|SA4T;{xdFhqGWq2*e^)V13&MHE5-4Q9y?u!`3GAE7oo5`>xPL`H0&u8I+ z@oqO~U>YXcN=~HnD>B9%XHA z;ZLSkbp!ff(=-EQw7XU{!O)6d&9X%SVEcT^Uwe=9vQc?sk(jlSqSY!w`U2laFc2Bq zST|jPt@HS4CanGVbpZeYamLt6%ye!v#1@TAxM_#F?~8El=siP8(E@%fA2!w$3h$+3 z&n~JPlETydaQPU|6A80~(-m zg=maLGnnilIOL3{rF<*?vNFG4*S9cw?0Zxr`^d26Y1;^bh#r-+VKCSIvAa{j7!hv! zpA3$(wika{m=az*mb5&mWr<-ms4?|f%xzABU9>&{=d`RzFlbxIT( zNs7(xn|euMUgKg<65y(5_Jhx-l}<>lbi9iP3fWJh-$?`LSl? zo}gOyeqI|NBagiPcF%_3K2F<-;(r8hfP*u8ow1Xuy;M`J875^4>a)GYIKSOpp?G1B z>JGT5pJ}?X6_GfhydTfQkwT9@{<@MI@6QpiVKsqLsYUBv6zx-}n!7tFV^()Ztba$9 z3vLAL@Rd#7*2XN}J%Us5lf!nq`QZrJ&6L{C=~^*f@xIIXm-P_eO1*bbMi0?)S8M$( zZx-v;=)c;wzWt{C?H#(ZvO%`l2lZQVcf#0ljHW7gI95Qzt`;U2j70lD)tfKB^y%_k z5_W!#VlCcR4pd1Imc>R%t6f&Db3NYF?!w?Z>h3%$TCacz$g8H%48mM+*L2bb(u$j| zFM~1#r;l=3=V_Ue=p09l)$LaFrA;@T4#@P?(BPp^4oV2(c?yfMpI*7Wpav)0TxFPF zzV$!e)D#DFsRL08^j?e`|F5`BvPR-}{d+EjP3Z?hV*3}aZDEUWJ;0E3?$^qk(0BB` zGnoY|MLKuZ^TL`~cO#1XQy;E&1>OeFxWw(Yp!m1;rLXWi`sR~B4ETgPgXQsgpIQR>{_jDaXc#DIJBFW+Ltgg;aabWE3Vc)lT+{5RH}=N znJj?x58~sIQty@1lf?g3D~wwcK$!&S%5Qv|VNyY#yw3J;{7nkrS5Ii02Q+P`;5GXz>b7*x&;WsQZiS`l_K$gmn=rq zy?)RBgv|&#;aOTLQ6+?MVL-F&R=GL)?pLm}m{&K*&qp9(&7+J09;r-f>S!gUOm||@ zW%9fR8bB@+!;}H+f1I?w70BkU!C&)sd${~@0B?he)BQ{jK)7O`Wz-^w1>cUlrQx+O ze&h8@<;~Xg!xfKzV9K%#d@f3*wfdvm3n+EH&*)wjire&fUU0=y4S}xUqQTSnUesYF zwJ+dwpXG8c^UY9Hu})j3t7$*gKlMe}Ei^~SZ05hZ~bR2T&gQt8cVz+$nv5MSlUXWEbJ`fz+(D1E87g0)mQG7r2uF`3nv$qDX= zI!BeBK!2=!Hst=pF0}vvttVTW0SiKVvX2iJ#QU1YOQfRDBWlpc-aXn!7B?DRc9pl3 zfl(Wjk)=hA>z|v_t0qXzE|B_;0VheqMXSGgeE`ks^+1me4sV@Hn!|4@5tHQxRHoP8 z+N;dd<#e@>r||TCfs2d;j2uggD7VIlJCM)q^LE0St=}4@l&Z0M%a z?bG{S<9eDRo_z%NtVi)&EsUCJKHW!As8*$|uuoWOP8 z-KiBW`e8N)mtT61#uWG%YUE`$c>0aR?ncvw>WbA71x=ch=>#Zw_tVyQGL?}Y@gt4- zKxO7p-lQsvt%-&EE4L=P`lV|j$1PbkC?xp8F8H7&)(ozVpU%d2Cgz9j5Laapkh*Az zC67HO#->Xgyc~|g$~QOEtTgUVKk}u=IR5C|tCY#jZ8A-$66LMK=LGqx)Ui?Y-c5jB zu(3uuu9H6b+xxH`)qOJ(iH?re~ za$Ihc1|2Q5+f_3RoL3#^T}G&I8}}62)LTH}r$C6{j34#mS?LV%+mtLT(r+A`ZFE)d z-qw#MA=u|G*_?=Dzvpgl&xi^82-@iP&}UNCsbga63I) zOeZ0jBHXa(Dz?83Ti}2Hu}zBa7WB7ybG-nR=?wmK;%+|o#%Az+6~rd3LBv1e}4vh}U08_Qk-{voyM=6dX| zYcsRG9R6Xh24JMdWD@YyWD>$}jHv9}*6?+{uC2bhixNs7k`DV5TpI7rtCb2 zP4I04DM996D-{$hU7mJ4-C+}Qt|hg>rkPCIpSk}42>0R8nDdRnUp3m0_YFF8o*Z4R zZ+CLMEpP4c*=tPql_NWE&xH2%chX+vVrrS*TFLGV8pYSV2AsJpZlPT5Q-2J#v{Um({mX^zS9|0+V@K->rRWhfkXuz-KJ546 z7?kl8yEN~B1+LNW;yf@w3;ti9dXjq&x~QS46HEOxc)0+gO9ZLdXs78wotD2)ak!+* zZ?kyYe0Pi%l*uXP-x5E^$8O_VbNTOCC>(=WSxSqa$0KP-QHrPDO _xjXBbI1;fd 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 diff --git a/include/Integraltransformationen/Integraltransformationen.tex b/include/Integraltransformationen/Integraltransformationen.tex index bacb074..28cf0a7 100644 --- a/include/Integraltransformationen/Integraltransformationen.tex +++ b/include/Integraltransformationen/Integraltransformationen.tex @@ -1,54 +1,126 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Includes + Defines +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%\usepackage{color, colortbl} +%\usepackage{trfsigns} +%\usepackage{graphicx} +%\definecolor{TabularBackgroundColor}{rgb}{0.83,0.96,0.96} +%\usepackage{mathrsfs} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Content +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Integraltransformationen} -\subsubsection*{Faltung} +\subsection{Faltung} +\begin{multicols}{2} + + $$y(t) = (x_1 * x_2)(t) = \int \limits _{-\infty} ^{\infty} x_1(\tau) \cdot x_2(t-\tau) d\tau$$ + \textbf{Eigenschaften:} \\ + \begin{tabular}{cc} + Kommutativ & ($f * g = g * f$) \\ + Assoziatiov & ($(f*(g*h)) = ((f*g)*h)$) \\ + Distributiv & ($f*(g+h)= f*g + f*h$) \\ + Stetigkeit & ist \textbf{immer} stetig + \end{tabular} + + \subsubsection*{Vorgehen} + \begin{enumerate} + \item $\tau$ bzw. $t-\tau$ in die Entsprechende Funktion Einsetzen + \item Bereiche Bestimmen an denen die Funktion $\neq 0$ + \item Bereiche bzw. eingesetzte Funktionen in Hilfsdiagramm einzechnen (siehe Bsp.) + \item Einzelne Integrationsbereiche mit Hilfe Diagramm bestimmen, + indem Zeit $t$ "raufgezählt" und übergänge der Grenzen beachtet wird + \item Integrale Bestimmen, Integralgrenzen = Eingezeichnete Grenzen im Diagramm. + \item Integrale auflösen + \end{enumerate} + \includegraphics[width = 4.5cm]{include/Integraltransformationen/img/Faltungsgrenzen.png} + \\\textbf{Beispiel} + \\$f(t)= \begin{cases} + 2 \textrm{ für } 0 0 = \sqrt{u_n^2 + v_n^2}$ $\varphi = arg(u_n - j \cdot v_n) $ \\ - Komplexe Form & + Komplexe Form & $x(t) = \sum \limits _{n= -\infty} ^{\infty} c_n \cdot e^{jn2\pi f_0 \cdot t}$ \newline $c_n =\overline{c_{-n}} = \frac{1}{T} \int \limits _{0} ^{T} x(t) \cdot e^{-j n 2 \pi f_0 \cdot t} dt$ - \newline $ 2\pi f_0$ wird auch als \textbf{Kreisfrequenz} $\omega$ bezeichnet, $f_0$ = Frequenz des Grundsignals $x(t)$. - \\[20pt] + \newline $ 2\pi f_0$ wird auch als \textbf{Kreisfrequenz} $\omega$ bezeichnet, \newline $f_0$ = Frequenz des Grundsignals $x(t)$. + \\ + \rowcolor{TabularBackgroundColor} Umrechnung Koeffizienten & $c_n =\overline{c_{-n}} = \frac{a_n - jb_n}{2} (n = 0,1,2,3,..., b_0 =0)$ - \newline $a_n = 2 \cdot Re(c_n); \; b_n = -2 \cdot Im(c_n) (n = 0,1,2,3,..., b_0 =0)$\\ + \newline $a_n = 2 \cdot Re(c_n); \; b_n = -2 \cdot Im(c_n) (n = 0,1,2,3,..., b_0 =0)$ \\ \end{tabular} +\begin{multicols}{2} -\subsubsection*{Fouriertransformation $\mathcal{F}(\omega)$} -$$ X(\omega) = \mathcal{F}[x(t)] = \int \limits _{-\infty} ^{+\infty} x(t) \cdot e^{-j \omega t} dt $$ -$$ x(t) = \mathcal{F}^{-1}[X(\omega)] = \frac{1}{2 \pi} \int \limits _{- \infty} ^{+ \infty} X(\omega) \cdot e^{j \omega t} d\omega$$ + \subsubsection*{Fouriertransformation $\mathcal{F}(\omega)$} + $$ X(\omega) = \mathcal{F}[x(t)] = \int \limits _{-\infty} ^{+\infty} x(t) \cdot e^{-j \omega t} dt $$ + $$ x(t) = \mathcal{F}^{-1}[X(\omega)] = \frac{1}{2 \pi} \int \limits _{- \infty} ^{+ \infty} X(\omega) \cdot e^{j \omega t} d\omega$$ + Rechenregeln Siehe Anhang. -\subsubsection*{Komplex sin/cos} -$$cos \varphi = \frac{e^{j\varphi}+ e^{-j\varphi}}{2}, \; sin \varphi = \frac{e^{j\varphi} - e^{-j\varphi}}{2j} $$ + \subsubsection*{Spektraldarstellung} + \includegraphics[width = 6cm]{include/Integraltransformationen/img/Spektrum.png} +\end{multicols} \subsection{Laplace-Transformation} -TODO: %LAPLAAAAAAAAACEEEE +\begin{multicols}{2} + + $$F(s) = \mathscr{L} {f(t)} = \int \limits _{0} ^{\infty} f(t) \cdot e^{-st} dt \textrm{ mit } s \in \mathbb{C}$$ + $$f(t) = \mathscr{L}^{-1} {f(t)} = \frac{1}{2\pi j} \int \limits _{p_0-j\infty} ^{p_0 + j\infty} F(s) \cdot e^{st} ds$$ + Rechenregeln Siehe Anhang. + \subsubsection*{Lineare Differenzialgleichungen lösen:} + DGL in Bildbereich Transformieren \\ $\Rightarrow$ DGL ist jetzt lineare Gleichung + \\Gleichung auflösen + \\Lösung Rücktransformieren + + \subsubsection*{Zusammenhänge} + \includegraphics[width = 7cm]{include/Integraltransformationen/img/Zusammenhang_Laplace.png} + + \subsubsection*{Konvergenzhalbebene} + Die Konvergenzhalbebene beginnt bei der Polstelle der Laplace-Transformierten mit dem Grössete Realteil und geht bis unendlich. + \newline Bsp: Bei $\frac{1}{s-2}$ ist die Polstelle bei $+2$, daraus folgt: Konvergenzhalbebene $= [2,\infty)$ +\end{multicols} \subsection{Hilbert-Transformation} -Hilbert Transformation ist die Anwendung eines Quadraturfilters. \\ -Definition im \textbf{Zeitbereich:} -$$\hat{x}(t) = x(t) * \frac{1}{\pi t} = \frac{1}{\pi} \int \limits _{-\infty} ^{\infty} \frac{x(\tau)}{t-\tau} d\tau$$ -Im \textbf{Frequenzbereich}: -$$\hat{X}(\omega) = X(\omega) \cdot H(\omega) = -j \cdot sgn(\omega) \cdot X(\omega)$$ +\begin{multicols}{2} + Im \textbf{Zeitbereich:} + $$\hat{x}(t) = x(t) * \frac{1}{\pi t} = \frac{1}{\pi} \int \limits _{-\infty} ^{\infty} \frac{x(\tau)}{t-\tau} d\tau$$ + Im \textbf{Frequenzbereich}: + $$\hat{X}(\omega) = X(\omega) \cdot H(\omega) = -j \cdot sgn(\omega) \cdot X(\omega)$$ +\end{multicols} diff --git a/include/Integraltransformationen/img/BiBo.png b/include/Integraltransformationen/img/BiBo.png new file mode 100644 index 0000000000000000000000000000000000000000..54579eba38c3b9b24e814bcef86d49e87edfc310 GIT binary patch literal 21540 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 literal 0 HcmV?d00001 diff --git a/include/Integraltransformationen/img/Faltungsgrenzen.png b/include/Integraltransformationen/img/Faltungsgrenzen.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e0f828587f3556c9a96b797ce3f0e5968bd92f GIT binary patch literal 14638 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 h->0+}{g9g@=BN=k!44@ir|&;tzd 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 b=q(->5PIj`GS<$0. - \end{cases} $$ - \\ - \includegraphics[width = 5cm, valign=t]{include/Wichtige Funktionen/img/Impulsfunktion.png} & - \textbf{Diracimpuls} \tiny (auch Impuls-/Deltafunktion, Delta-Distribution) - \footnotesize \newline - Unendlicher kurzer normierter Impuls mit unendlicher Amplitude - $$\int\limits _{-\infty} ^{+\infty} f(t) \cdot \delta (t-t_0) dt = f(t_0) \; - \int\limits _{-\infty} ^{+\infty} f(t) \cdot \delta (t) dt = f(0) \; - \int\limits _{-\infty} ^{+\infty} \delta (t) dt = 1$$ - TODO: \includegraphics[width=5cm]{include/Wichtige Funktionen/img/Eigenschaften _delta.png} \\ - \includegraphics[width = 5cm, valign=t]{include/Wichtige Funktionen/img/Signumfunktion.png} & - \textbf{Signumfunktion} (Vorzeichenfunktion) - \footnotesize - $$sgn(t) = \begin{cases} - -1 \textrm{ für } t<0, \\ - 0 \textrm{ für } t = 0, \\ - 1 \textrm{ für } t >0. - \end{cases} $$ \\ - \includegraphics[width=5cm, valign=t]{include/Wichtige Funktionen/img/Rampenfunktion.png} & - \textbf{Rampenfunktion} - \footnotesize - $$r(t) = \begin{cases} - 0 \textrm{ für } t \leq 0, \\ - t \textrm{ für } t > 0. - \end{cases}$$ \\ - \includegraphics[width=5cm, valign=t]{include/Wichtige Funktionen/img/Rechteckimpuls.png} & - \textbf{Rechteckimpuls} - \footnotesize - $$p_a(t) = u(t+a)-u(t-a)= \begin{cases} - 1 \textrm{ für } |t| < a, \\ - \frac{1}{2} \textrm{ für } |t| = a, \\ - 0 \textrm{ für } |t| > a. - \end{cases} $$ \\ - \includegraphics[width=5cm, valign=t]{include/Wichtige Funktionen/img/Dreieckimpuls.png} & - \textbf{Dreieckimpuls} - \footnotesize - $$\Lambda(t) = \begin{cases} - 1 - \frac{|t|}{a} \textrm{ für } |t| < a \\ - 0 \textrm{ für } |t| \geq a - \end{cases}$$ \\ - \includegraphics[width=5cm, valign=t]{include/Wichtige Funktionen/img/SincFunktion.png} & - \textbf{Sinc-Funktion} - \footnotesize - $$sinc(t) = \frac{sin(t)}{t} \forall t$$ \\ -\end{tabular} + +\small + +\subsubsection*{Diracimpuls \tiny (auch Impuls-/Deltafunktion,-Distribution)} + +\begin{multicols}{2} + + \includegraphics[width = 5cm]{include/Wichtige Funktionen/img/Impulsfunktion.png} + + {\footnotesize + Unendlich kurzer, normierter Impuls mit unendlicher Amplitude. } + + \resizebox{0.5\textwidth}{!}{% + \begin{tabular}{ccl} + \hline \rowcolor{TabularBackgroundColor} + 1. & $\delta(-t) = \delta(t) $ & gerade Funktion \\ + \hline + 2. & $\delta(-t+t_0) = \delta(t-t_0)$ & symmetrisch \\ + \hline \rowcolor{TabularBackgroundColor} + 3. & $\delta(at)= \frac{1}{|a|}\delta(t)$ & Skalierung \\ + \hline + 4. & $\delta(\frac{t-t_0}{a}) = |a| \cdot \delta(t-t_0)$ & Skalierung und Verschiebung \\ + \hline \rowcolor{TabularBackgroundColor} + 5. & $\delta(t-t_0)f(t) = f(t_0)\delta(t-t_0)$ & Abtastung \\ + \hline + 6. & $\int \limits _{-\infty} ^{\infty} \delta(t-t_0)f(t)dt = f(t_0)$ & Siebungseigenschaft \\ + \hline \rowcolor{TabularBackgroundColor} + 7. & $\int \limits _{-\infty} ^{\infty} A\cdot \delta(t)dt = A$ & Spezialfall Siebungseigenschaft \\ + \hline + 8. & $\delta(t-t_0) * f(t) = f(t-t_0)$ & Faltung \\ + \hline \rowcolor{TabularBackgroundColor} + 9. & $\delta(t-t_1) * \delta(t-t_2) = \delta(t-t_1-t_2)$ & Faltung \\ + \hline + 10. & $\delta(t) = \frac{du(t)}{dt}$ & Ableitung Einheitssprung \\ + \hline \rowcolor{TabularBackgroundColor} + 11. & $ \delta(t) = \lim _{\omega \to \infty} \frac{sin(\omega t)}{\pi t} $ & Definition \\ + \hline + 12. & $ \delta(t) = \lim _{\epsilon \to \infty} \frac{\epsilon}{\pi(t^2 + \epsilon^2)} $ & Definition \\ + \hline \rowcolor{TabularBackgroundColor} + 13. & $\delta(t) = \lim _{\epsilon \to 0} \frac{e^{-t^2/\epsilon}}{\sqrt{(\pi \epsilon)}} $ & Definition \\ + \hline + 14. & $t^n \frac{d^n \delta(t)}{dt^n} = (-1)^n n! \delta(t)$ & Ableitung \\ + \hline \rowcolor{TabularBackgroundColor} + 15. & $f(t) * \frac{d\delta(t-t_0)}{dt} = \frac{df(t-t_0)}{dt}$ & Faltung mit Ableitung \\ + \hline + 16. & $\frac{d\delta(t)}{dt} = \frac{\delta(t)}{-t} = \lim _{\epsilon \to 0} \frac{-2\epsilon t}{\pi(t^2 + \epsilon^2)^2}$ & 1. Ableitung $\delta(t)$ = ungerade F. \\ + \hline \rowcolor{TabularBackgroundColor} + 17. & $1$ \laplace $2\pi\delta(\omega)$ & Fourier \\ + \hline + 18. & $\delta(t)$ \laplace $1(\omega)$ & Fourier \\ + \end{tabular}} +\end{multicols} + \begin{tabular}{|p{3.5cm}|p{3.5cm}|p{2cm}|p{3cm}|p{3.5cm}|} + \hline + + \textbf{Name} + & + \textbf{Definition} + & + \laplace + & + \textbf{Formelzeichen} + & + \textbf{plot} + \\ + \hline + Sprungfunktion + \newline (Heaviside) + & + $\begin{cases} + 0 \textrm{ für } t<0, \\ + [\frac{1}{2} \textrm{ für } t = 0,] \\ + 1 \textrm{ für } t >0. + \end{cases}$ + \newline \tiny(machmal: 1 für $t=0$) + & + $\frac{1}{j\omega} + \pi\delta(\omega)$ + & + $u(t), \sigma(t), h(t)$ + & + \raisebox{-.5\height}{\includegraphics[width = 3.5cm]{include/Wichtige Funktionen/img/Sprungfunktion.png}} + \\ + Signumfunktion + \newline (Vorzeichenfunktion) + & + $\begin{cases} + -1 \textrm{ für } t<0, \\ + 0 \textrm{ für } t = 0, \\ + 1 \textrm{ für } t >0. + \end{cases} $ + & + $\frac{2}{j\omega}$ + & + $sgn(t)$ + & + \raisebox{-.5\height}{\includegraphics[width=3.5cm]{include/Wichtige Funktionen/img/Signumfunktion.png}} + \\ + Rampenfunktion + & + $\begin{cases} + 0 \textrm{ für } t \leq 0, \\ + t \textrm{ für } t > 0. + \end{cases}$ + & + $\frac{1}{s^2}$ + & + $r(t)$ + & + \raisebox{-.5\height}{\includegraphics[width=3.5cm]{include/Wichtige Funktionen/img/Rampenfunktion.png}} + \\ + Rechteckimpuls + & + $\begin{cases} + 1 \textrm{ für } |t| < a, \\ + \frac{1}{2} \textrm{ für } |t| = a, \\ + 0 \textrm{ für } |t| > a. + \end{cases} $ + & + $\frac{1}{s}- e^{-as}\frac{1}{s} $ + & + $p_a(t), \beta(t)$ + \newline $\sigma(t+a)-\sigma(t-a)$ + & + \raisebox{-.5\height}{\includegraphics[width=3.5cm]{include/Wichtige Funktionen/img/Rechteckimpuls.png}} + \\ + Dreieckimpuls + & + $\begin{cases} + 1 - \frac{|t|}{a} \textrm{ für } |t| < a \\ + 0 \textrm{ für } |t| \geq a + \end{cases}$ + & + $sinc^2(\omega)$ + & + $\Lambda(t)$ + & + \raisebox{-.5\height}{\includegraphics[width=3.5cm]{include/Wichtige Funktionen/img/Dreieckimpuls.png}} + \\ + Sinc-Funktion + & + $\frac{sin(t)}{t}\; \forall t$ + \newline {\tiny $\lim _{t \to 0} sinc(t) = 1$} + \newline {\tiny wenn normalisiert: $t \to \pi t$} + & + $\beta(\omega)$ + \newline{\tiny(Rechteckimpuls)} + & + sinc(t) + & + \raisebox{-.5\height}{\includegraphics[width=3.5cm]{include/Wichtige Funktionen/img/SincFunktion.png}} + \\ + \hline + \end{tabular} \ No newline at end of file diff --git a/include/Wichtige Werte & Vereinfachungen/Wichtige Werte & Vereinfachungen.tex b/include/Wichtige Werte & Vereinfachungen/Wichtige Werte & Vereinfachungen.tex index 3aa0bda..0f34ba7 100644 --- a/include/Wichtige Werte & Vereinfachungen/Wichtige Werte & Vereinfachungen.tex +++ b/include/Wichtige Werte & Vereinfachungen/Wichtige Werte & Vereinfachungen.tex @@ -2,6 +2,25 @@ \section*{Wichtige Werte \& Vereinfachungen} \subsubsection*{Integration über Periodendauer} -$\int_T (x \cdot sin(\omega t + \alpha))^2 dt = x^2 \cdot \int_T sin^2(\omega t +\alpha) dt = \frac{x^2}{2}$ -$\int_T (x \cdot cos(\omega t+\alpha))^2 dt = x^2 \cdot \int_T cos^2(\omega t+\alpha) dt = \frac{x^2}{2}$ -\end{document} \ No newline at end of file +$$\int_T (x \cdot sin(\omega t + \alpha))^2 dt = x^2 \cdot \int_T sin^2(\omega t +\alpha) dt = \frac{x^2}{2}$$ +$$\int_T (x \cdot cos(\omega t+\alpha))^2 dt = x^2 \cdot \int_T cos^2(\omega t+\alpha) dt = \frac{x^2}{2}$$ + + +\subsubsection*{Komplex sin/cos} + +$$cos \varphi = \frac{e^{j\varphi}+ e^{-j\varphi}}{2}, \; sin \varphi = \frac{e^{j\varphi} - e^{-j\varphi}}{2j} $$ + +\subsection*{Additionstheoreme} +\begin{multicols}{2} +$\sin(x\pm y) = \sin(x) \cdot \cos(y) \pm \cos(x) \cdot \sin(y)$ +\\$\cos(x \pm y)= \cos(x) \cdot \cos(y) \pm \sin(x) \cdot \sin(y)$ +\\$\sin(2x) = 2 \sin(x) \cdot cos(x)$ +\\$\cos(2x) = \cos^2(x)-\sin^2(x)$ +\\$\sin^2(x) + \cos^2(x) = 1 $ +\\$\sin x \; \sin y = \frac{1}{2}(\cos (x-y) - \cos (x+y))$ +\\$\cos x \; \cos y = \frac{1}{2}(\cos (x-y) + \cos (x+y)) \sin x\;\cos y={\frac {1}{2}}(\sin(x-y)+\sin(x+y))$ +\\$\sin x \; \cos y = \frac{1}{2}(\sin (x-y) + \sin (x+y))$ +\\$\sin^2 x = \frac{1}{2}\ (1 - \cos (2x)) $ +\\$\cos^2 x = \frac{1}{2}\ (1 + \cos (2x)) $ +\end{multicols} + diff --git a/matlab/PT2.m b/matlab/PT2.m new file mode 100644 index 0000000..daac8ac --- /dev/null +++ b/matlab/PT2.m @@ -0,0 +1,19 @@ +%% Variables + +T = 0.5; +D= 0.125; +K = 1; + + + +%% Function + +sys = tf(K,[(T^2) (2*D*T) (1)]); + +%% Plot + +step(sys); + +%% Export + +matlab2tikz('PT2Plot.tex'); \ No newline at end of file diff --git a/matlab/PT2.png b/matlab/PT2.png new file mode 100644 index 0000000000000000000000000000000000000000..780c4ae0ff07998ded04cbff0ee550d117a0c471 GIT binary patch literal 37212 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 LMoU&ae*XUe1GMV} literal 0 HcmV?d00001 diff --git a/matlab/PT2.svg b/matlab/PT2.svg new file mode 100644 index 0000000..c716004 --- /dev/null +++ b/matlab/PT2.svg @@ -0,0 +1,596 @@ + + + diff --git a/matlab/PT2Plot.tex b/matlab/PT2Plot.tex new file mode 100644 index 0000000..fadc94d --- /dev/null +++ b/matlab/PT2Plot.tex @@ -0,0 +1,300 @@ +% This file was created by matlab2tikz. +% +%The latest updates can be retrieved from +% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz +%where you can also make suggestions and rate matlab2tikz. +% +\definecolor{mycolor1}{rgb}{0.00000,0.44700,0.74100}% +% +\begin{tikzpicture} + +\begin{axis}[% +width=4.396in, +height=3.357in, +at={(0.883in,0.481in)}, +scale only axis, +separate axis lines, +every outer x axis line/.append style={white!40!black}, +every x tick label/.append style={font=\color{white!40!black}}, +every x tick/.append style={white!40!black}, +xmin=0, +xmax=25, +every outer y axis line/.append style={white!40!black}, +every y tick label/.append style={font=\color{white!40!black}}, +every y tick/.append style={white!40!black}, +ymin=0, +ymax=1.8, +axis background/.style={fill=white}, +legend style={legend cell align=left, align=left, draw=white!15!black} +] +\addplot [color=mycolor1, forget plot] + table[row sep=crcr]{% +0 0\\ +0.15707963267949 0.0476889893191881\\ +0.314159265358979 0.181428004737362\\ +0.471238898038469 0.382126857370547\\ +0.628318530717959 0.62583361634308\\ +0.785398163397448 0.886356715358635\\ +0.942477796076938 1.1378998422514\\ +1.09955742875643 1.35746059290878\\ +1.25663706143592 1.52678492014496\\ +1.41371669411541 1.63372693525277\\ +1.5707963267949 1.67293096470563\\ +1.72787595947439 1.64582284530216\\ +1.88495559215388 1.55996345374488\\ +2.04203522483337 1.42787350395643\\ +2.19911485751286 1.26548018540101\\ +2.35619449019234 1.09036044270531\\ +2.51327412287183 0.919961637915262\\ +2.67035375555132 0.769968813711621\\ +2.82743338823081 0.652961192776015\\ +2.9845130209103 0.577462545395498\\ +3.14159265358979 0.547445074599324\\ +3.29867228626928 0.562299267604084\\ +3.45575191894877 0.617237355155738\\ +3.61283155162826 0.704059643945907\\ +3.76991118430775 0.812184168719479\\ +3.92699081698724 0.929822841060253\\ +4.08407044966673 1.04518230458837\\ +4.24115008234622 1.14757457979623\\ +4.39822971502571 1.22833975451853\\ +4.5553093477052 1.28150805344917\\ +4.71238898038469 1.30415864427656\\ +4.86946861306418 1.29646430873232\\ +5.02654824574367 1.26144150125869\\ +5.18362787842316 1.20445157867555\\ +5.34070751110265 1.13251895118325\\ +5.49778714378214 1.05354417394344\\ +5.65486677646163 0.975493995791785\\ +5.81194640914112 0.905646355831549\\ +5.96902604182061 0.849957254757445\\ +6.1261056745001 0.812599898958547\\ +6.28318530717959 0.795706490588545\\ +6.44026493985908 0.799321665119317\\ +6.59734457253857 0.821555973107212\\ +6.75442420521806 0.858909846844179\\ +6.91150383789754 0.906724675581043\\ +7.06858347057703 0.959708923208798\\ +7.22566310325652 1.0124840904582\\ +7.38274273593601 1.0600976248433\\ +7.5398223686155 1.09845698871553\\ +7.69690200129499 1.12464997681514\\ +7.85398163397448 1.1371297201885\\ +8.01106126665397 1.13575718076482\\ +8.16814089933346 1.12170790048687\\ +8.32522053201295 1.0972620372916\\ +8.48230016469244 1.0655062702145\\ +8.63937979737193 1.02998229372926\\ +8.79645943005142 0.994319027040767\\ +8.95353906273091 0.961884392870504\\ +9.1106186954104 0.935487969703441\\ +9.26769832808989 0.917158667613041\\ +9.42477796076938 0.908012690758615\\ +9.58185759344887 0.908217397012215\\ +9.73893722612836 0.917047213466486\\ +9.89601685880785 0.933019390423153\\ +10.0530964914873 0.95409078316775\\ +10.2101761241668 0.977892526436171\\ +10.3672557568463 1.0019776466988\\ +10.5243353895258 1.02405732435964\\ +10.6814150222053 1.04220442106519\\ +10.8384946548848 1.05500758433263\\ +10.9955742875643 1.06166515495154\\ +11.1526539202438 1.06201458353677\\ +11.3097335529233 1.05649945820737\\ +11.4668131856027 1.04608195999103\\ +11.6238928182822 1.03211310965608\\ +11.7809724509617 1.01617620937248\\ +11.9380520836412 0.999920242595649\\ +12.0951317163207 0.984899674698885\\ +12.2522113490002 0.972435252320181\\ +12.4092909816797 0.963507319880652\\ +12.5663706143592 0.958689240465161\\ +12.7234502470387 0.958124159665372\\ +12.8805298797182 0.961544025977362\\ +13.0376095123976 0.968325885302438\\ +13.1946891450771 0.977577334399672\\ +13.3517687777566 0.988240886040532\\ +13.5088484104361 0.999205992259175\\ +13.6659280431156 1.00941760118395\\ +13.8230076757951 1.01797128955774\\ +13.9800873084746 1.02418702900949\\ +14.1371669411541 1.02765625548705\\ +14.2942465738336 1.02825982719276\\ +14.451326206513 1.02615737936033\\ +14.6084058391925 1.02175123856525\\ +14.765485471872 1.01563021537687\\ +14.9225651045515 1.00850008669351\\ +15.079644737231 1.00110831766495\\ +15.2367243699105 0.994170545121617\\ +15.39380400259 0.988305610432542\\ +15.5508836352695 0.98398461213188\\ +15.707963267949 0.981497715607954\\ +15.8650429006285 0.980940503172719\\ +16.0221225333079 0.98221967356193\\ +16.1792021659874 0.985076092750798\\ +16.3362817986669 0.98912171541433\\ +16.4933614313464 0.993885853466661\\ +16.6504410640259 0.998865729849986\\ +16.8075206967054 1.00357623466689\\ +16.9646003293849 1.00759425977874\\ +17.1216799620644 1.01059384764864\\ +17.2787595947439 1.01236953930017\\ +17.4358392274234 1.01284661475132\\ +17.5929188601028 1.01207825194537\\ +17.7499984927823 1.01023085974978\\ +17.9070781254618 1.00755985906871\\ +18.0641577581413 1.0043789135764\\ +18.2212373908208 1.00102600152456\\ +18.3783170235003 0.997829761290956\\ +18.5353966561798 0.995079258280425\\ +18.6924762888593 0.992999760943435\\ +18.8495559215388 0.99173635250237\\ +19.0066355542182 0.991346329337736\\ +19.1637151868977 0.991800437965143\\ +19.3207948195772 0.992992166531181\\ +19.4778744522567 0.994753607714673\\ +19.6349540849362 0.996875903302933\\ +19.7920337176157 0.999131999679683\\ +19.9491133502952 1.00129939742957\\ +20.1061929829747 1.00318075381666\\ +20.2632726156542 1.00462056076672\\ +20.4203522483337 1.00551662469493\\ +20.5774318810131 1.00582566008974\\ +20.7345115136926 1.00556291487908\\ +20.8915911463721 1.00479631365538\\ +21.0486707790516 1.00363608421856\\ +21.2057504117311 1.00222118517856\\ +21.3628300444106 1.00070405397744\\ +21.5199096770901 0.999235238045307\\ +21.6769893097696 0.997949364767029\\ +21.8340689424491 0.996953669944526\\ +21.9911485751286 0.996319971449676\\ +22.148228207808 0.996080583450395\\ +22.3053078404875 0.996228258201495\\ +22.462387473167 0.996719856659125\\ +22.6194671058465 0.997483120705058\\ +22.776546738526 0.998425675152639\\ +22.9336263712055 0.999445243643987\\ +23.090706003885 1.00044002500533\\ +23.2477856365645 1.00131824109225\\ +23.404865269244 1.00200601985559\\ +23.5619449019234 1.00245299725121\\ +23.7190245346029 1.00263528292675\\ +23.8761041672824 1.00255570961695\\ +24.0331837999619 1.0022415479434\\ +24.1902634326414 1.00174009320153\\ +24.3473430653209 1.00111270034113\\ +24.5044226980004 1.00042794591304\\ +24.6615023306799 0.999754626672455\\ +24.8185819633594 0.999155266300626\\ +24.9756615960389 0.99868070315265\\ +25.1327412287183 0.998366186895182\\ +25.2898208613978 0.998229237529665\\ +25.4469004940773 0.99826933523498\\ +25.6039801267568 0.998469331937784\\ +25.7610597594363 0.998798321672597\\ +25.9181393921158 0.999215589321663\\ +26.0752190247953 0.999675184538262\\ +26.2322986574748 1.00013064303335\\ +26.3893782901543 1.00053939962444\\ +26.5464579228338 1.00086650087727\\ +267035375555.132 1\\ +}; +\addlegendentry{sys} + +\addplot [color=black, dotted, forget plot] + table[row sep=crcr]{% +1e-99 1\\ +1e-96 1\\ +1e-93 1\\ +1e-90 1\\ +1e-87 1\\ +1e-84 1\\ +1e-81 1\\ +1e-78 1\\ +1e-75 1\\ +1e-72 1\\ +1e-69 1\\ +1e-66 1\\ +1e-63 1\\ +1e-60 1\\ +1e-57 1\\ +1e-54 1\\ +1e-51 1\\ +1e-48 1\\ +1e-45 1\\ +1e-42 1\\ +1e-39 1\\ +1e-36 1\\ +1e-33 1\\ +1e-30 1\\ +1e-27 1\\ +1e-24 1\\ +1e-21 1\\ +1e-18 1\\ +1e-15 1\\ +1e-12 1\\ +1e-09 1\\ +1e-06 1\\ +0.001 1\\ +1 1\\ +1000 1\\ +1000000 1\\ +1000000000 1\\ +1000000000000 1\\ +1e+15 1\\ +1e+18 1\\ +1e+21 1\\ +1e+24 1\\ +1e+27 1\\ +1e+30 1\\ +1e+33 1\\ +1e+36 1\\ +1e+39 1\\ +1e+42 1\\ +1e+45 1\\ +1e+48 1\\ +1e+51 1\\ +1e+54 1\\ +1e+57 1\\ +1e+60 1\\ +1e+63 1\\ +1e+66 1\\ +1e+69 1\\ +1e+72 1\\ +1e+75 1\\ +1e+78 1\\ +1e+81 1\\ +1e+84 1\\ +1e+87 1\\ +1e+90 1\\ +1e+93 1\\ +1e+96 1\\ +1e+99 1\\ +}; +\end{axis} + +\begin{axis}[% +width=4.521in, +height=3.566in, +at={(0.758in,0.481in)}, +scale only axis, +xmin=0, +xmax=1, +xtick={\empty}, +xlabel={Time (seconds)}, +ymin=0, +ymax=1, +ytick={\empty}, +ylabel={Amplitude}, +axis line style={draw=none}, +ticks=none, +title style={font=\bfseries}, +title={Step Response}, +axis x line*=bottom, +axis y line*=left, +legend style={legend cell align=left, align=left, draw=white!15!black} +] +\end{axis} +\end{tikzpicture}% \ No newline at end of file diff --git a/matlab/matlab2tikz-1.1.0/.gitignore b/matlab/matlab2tikz-1.1.0/.gitignore new file mode 100644 index 0000000..b819eb3 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/.gitignore @@ -0,0 +1,6 @@ +*.sublime-workspace +*.tap +test/*.test.* +*.asv +*.m~ +octave-workspace diff --git a/matlab/matlab2tikz-1.1.0/.travis.yml b/matlab/matlab2tikz-1.1.0/.travis.yml new file mode 100644 index 0000000..e8001d9 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/.travis.yml @@ -0,0 +1,16 @@ +language: c++ +before_install: + - sudo add-apt-repository -y ppa:octave/stable + - sudo apt-get update -qq + - sudo apt-get install gdb # to capture backtrace of eventual failures + - sudo apt-get install octave + - sudo apt-get purge libopenblas-base # fixes PPA Octave 4.0 crash on Travis +before_script: + - ulimit -c unlimited -S # enable core dumps for Octave crash debugging +script: + - ./runtests.sh /usr/bin/octave +notifications: + hipchat: f4c2c5f87adc85025545e5b59b3fbe@Matlab2tikz +after_failure: + - COREFILE=$(find . -maxdepth 1 -name "core*" | head -n 1) # find core file + - gdb -c "$COREFILE" -ex "thread apply all bt" -ex "set pagination 0" -batch /usr/bin/octave-cli # print stack trace diff --git a/matlab/matlab2tikz-1.1.0/AUTHORS.md b/matlab/matlab2tikz-1.1.0/AUTHORS.md new file mode 100644 index 0000000..fbdb097 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/AUTHORS.md @@ -0,0 +1,63 @@ +# Maintainer + * [Egon Geerardyn](https://github.com/egeerardyn) is the current maintainer (2015 - now). + * [Nico Schlömer](https://github.com/nschloe) designed and implemented the intial version and was the first maintainer (2008 - 2015). + +# Contributors +Thanks for patches, suggestions, and other contributions go to: + + * [Ben Abbott](https://github.com/bpabbott) + * Martijn Aben (The MathWorks) + * [Nicolas Alt](https://github.com/nalt) + * [Eshwar Andhavarapu](https://github.com/gontadu) + * Matt Bauman + * Eike Blechschmidt + * [Klaus Broelemann](https://github.com/Broele) + * [Katherine Elkington](https://github.com/kelkington) + * [Thomas Emmert](https://github.com/murmlgrmpf) + * Andreas Gäb + * [Egon Geerardyn](https://github.com/egeerardyn) + * Roman Gesenhues + * Michael Glasser (The MathWorks) + * [David Haberthür](https://github.com/habi) + * [Patrick Häcker](https://github.com/MagicMuscleMan) + * [Ulrich Herter](https://github.com/ulijh) + * [David Horsley](https://github.com/widdma) + * Kári Hreinsson + * [Lucas Jeub](https://github.com/LJeub) + * Martin Kiefel + * [Andreas Kloeckner](https://github.com/akloeckner) + * Mykel Kochenderfer + * [Oleg Komarov](https://github.com/okomarov) + * Henk Kortier + * [Tom Lankhorst](https://github.com/tomlankhorst) + * [Burkart Lingner](https://github.com/burkart) + * Theo Markettos + * [Dragan Mitrevski](https://github.com/nidrosianDeath) + * [Jason Monschke](https://github.com/jam4375) + * Francesco Montorsi + * Ricardo Santiago Mozos + * Johannes Mueller-Roemer + * [Ali Ozdagli](https://github.com/aliirmak) + * [Richard Peschke](https://github.com/RPeschke) + * [Peter Ploß](https://github.com/PeterPablo) + * Julien Ridoux + * [Christoph Rüdiger](https://github.com/mredd) + * Carlos Russo + * [Manuel Schiller](https://github.com/dachziegel) + * [Nico Schlömer](https://github.com/nschloe) + * Johannes Schmitz + * Michael Schoeberl + * [Jan Taro Svejda](https://github.com/JTSvejda) + * [José Vallet](https://github.com/josombio) + * [Thomas Wagner](https://github.com/Aikhjarto) + * Donghua Wang + * [Patrick Wang](https://github.com/patrickkwang) + * Robert Whittlesey + * Pooya Ziraksaz + * Bastiaan Zuurendonk (The MathWorks) + * GitHub users: [andreas12345](https://github.com/andreas12345), [theswitch](https://github.com/theswitch) + +# Acknowledgements +Matlab2tikz has once greatly profited from its ancestor: [Matfig2PGF](http://www.mathworks.com/matlabcentral/fileexchange/12962) written by Paul Wagenaars. + +Also, the authors would like to thank [Christian Feuersänger](https://github.com/cfeuersaenger) for the [Pgfplots](http://pgfplots.sourceforge.net) package which forms the basis for the matlab2tikz output on the LaTeX side. diff --git a/matlab/matlab2tikz-1.1.0/CHANGELOG.md b/matlab/matlab2tikz-1.1.0/CHANGELOG.md new file mode 100644 index 0000000..2529df2 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/CHANGELOG.md @@ -0,0 +1,439 @@ +# 2016-08-15 Version 1.1.0 [Egon Geerardyn](egon.geerardyn@gmail.com) + + * Added or improved support for: + - Octave 4.0 (#759) + - `scatter`, `quiver` and `errorbar` support in Octave (#669) + - `cleanfigure` has been improved: + * New and superior (Opheim) simplification algorithm + * Simplification for `plot3` (3D plots) (#790) + * Vectorized implementations (#756, #737) + * Overall clean-up of the code (#797, #787, #776, #744) + * Optional limitation of data precision (#791) + * Textbox removal is being phased out (#817) + - Quiver plots now translate to native pgfplots quivers (#679, #690) + - Legends, especially with `plotyy`, now use `\label` (#140, #760, #773) + - Tick labels with `datetime` (#383, #803) + - `contourf`/`contour` plots with matrix arguments and nonstandard line widths (#592, #721, #722, #871) + - Colored ticks and axes (#880, #908) + - Scatter plots with different marker colors and sizes (#859, #861) + - `colorbar` positioning and tick placement (#933, #937, #941) + - The self-updater has been improved + * New parameters: + - `arrowHeadSizeFactor` for tweaking the size of arrowheads + - `semanticLineWidths` for tweaking semantic line width conversion (e.g. `thick` instead of `0.8pt`) + * Extra requirements: + - Quiver plots require `\usetikzlibrary{arrows.meta}` + * Bug fixes: + - Errorbars without lines & markers (#813) + - `light`/`camera` objects are now ignored (#684) + - Draw baseline in bar/stem plots (#798) + - Multiple annotation containers (#728, #730) + - Legends of bode plots (#700, #702) + - Titles of bode plots (#715, #716, #753) + - Patch without fill/edge color (#682, #701, #740) + - Warn about usage of faceted interp shader (#699) + - Tick labels are properly escaped now (#711) + - Swapped image dimensions (#714) + - Width of bar plots was incorrect (#727, #696) + - Stacking and placement of bar plots (#851, #845, #840, #785, #903) + - Handling of tick labels when `parseStrings=false` (#86, #871) + - Properly escape tick labels for LaTeX (#710, #711, #820, #821) + - Respect edge color in `scatter` plots (#900) + - Output directory is created automatically (#889, #929) + - TikZ output format has been improved slightly (#936, #921, #801) + * For developers: + - Please check out the (guidelines)[CONTRIBUTING.md] + - We now use `allchild` and `findall` (#718) + - SublimeText project files + - Test hashes can be saved selectively (#720) + - Continuous testing for MATLAB and Octave 3.8 with Jenkins + - Test suite timing is tracked (#738) + - The testing reports have been improved for GitHub (#708) + - Testing can output to different directories (#818) + - A new tool to help track regressions (#814) + - A new tool to consistently format the code (#808, #809) + - `figure2dot` updated for HG2 + +# 2015-06-15 Version 1.0.0 [Egon Geerardyn](egon.geerardyn@gmail.com) + + * Added support for: + - Annotations (except arrows) in R2014b (#534) + - `Histogram` in R2014b (#525) + - Filled contour plots in R2014b (#379, #500) + - Contour plots with color maps in R2014b (#380, #500) + - Axes background color and overlap (#6, #509, #510) + - Horizontal/Vertical text alignment (#491) + * Extra requirements: + - Patch plots now require `\usepgfplotslibrary{patchplots}` (#386, #497) + * Bug fixes: + - Pgfplots 1.12 (`row sep=crcr`) in combination with `externalData==true` (#548) + - Updater has been fixed (#502) + - 3D plot sizing takes viewing angle into account (#560, #630, #631) + - Alpha channel (transparency) in images (#561) + - Colorbar labels in R2014b (#429, #488) + - Scaling of color data at axes level (#486) + - Text formatting (for `TeX` parser) is improved (#417) + - Support for `|` character in labels (#587, #589) + - Legends for `stairs` and `area` plots (#601, #602) + - `cleanfigure()` removes points outside of the axes for `stairs` plots (#226, #533) + - `cleanfigure()` removes points outside of the axes better (#392, #400, #547) + - Support `>` and `<` in text (#522) + - Better text positioning (#518) + - Text boxes on 3D graphs (#528) + - File closing is more robust (#496, #555) + - TikZ picture output, i.e.`imageAsPng==false`, improved (#581, #596) + - `standalone==true` sets the font and input encoding in LaTeX (#590) + - Legend text alignment in Octave (#668) + - Improved Octave legend if not all lines have an entry (#607, #619, #653) + - Legend without a drawn box in R2014b+ (#652) + - Misc. fixes: #426, #513, #520, #665 + * For developers: + - The testing framework has been revamped (see also `test/README.md`) + - A lot of the tests have been updated (#604, #614, #638, ...) + - Cyclomatic complexity of the code has been reduced (#391) + - Repository has been moved to [matlab2tikz/matlab2tikz](https://github.com/matlab2tikz/matlab2tikz) + - Extra files have been pruned (#616) + +# 2014-11-02 Version 0.6.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Annotation support in R2014a and earlier + * New subplot positioning approach (by Klaus Broelemann) that uses absolute instead of relative positions. + * Support stacked bar plots and others in the same axes (needs pgfplots 1.11). + * Support legends with multiline entries. + * Support for the alpha channel in PNG output. + * Test framework updated and doesn't display figures by default. + * Major code clean-up and code complexity checks. + * Bug fixes: + - Cycle paths only when needed (#317, #49, #404) + - Don't use infinite xmin/max, etc. (#436) + - Warn about the `noSize` parameter (#431) + - Images aren't flipped anymore (#401) + - No scientific notation in width/height (#396) + - Axes with custom colors (#376) + - Mesh plots are exported properly (#382) + - Legend colors are handled better (#389) + - Handle Z axis properties for quiver3 (#406) + - Better text handling, e.g. degrees (#402) + - Don't output absolute paths into TikZ by default + - ... + +# 2014-10-20 Version 0.5.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for MATLAB 2014b (with it's substantial graphics changes). + All credit goes to Egon Geerardyn. + * Bugfixes: + - single bar width + - invisible bar plots + - surface options + - patch plots and cycling + - patches with literal colors + +# 2014-03-07 Version 0.4.7 [Nico Schlömer](nico.schloemer@gmail.com) + + * Acid tests: Remove MATLAB-based `eps2pdf`. + * Bugfixes: + - multiple patches + - log plot with nonzero baseline + - marker options for scatter plots + - table data formatting + - several fixes for Octave + +# 2014-02-07 Version 0.4.6 [Nico Schlömer](nico.schloemer@gmail.com) + + * Set `externalData` default to `false`. + * Properly check for required Pgfplots version. + * Marker scaling in scatter plots. + +# 2014-02-02 Version 0.4.5 [Nico Schlömer](nico.schloemer@gmail.com) + + * Arrange data in tables. + * Optionally define custom colors. + * Allow for strict setting of font sizes. + * Bugfixes: + - tick labels for log plots + - tick labels with commas + +# 2014-01-02 Version 0.4.4 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for color maps with scatter plots. + * Support for different-length up-down error bars. + * Input options validation. + * Bugfixes: + - legends for both area and line plots + - invisible text fields + +# 2013-10-20 Version 0.4.3 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for 3D quiver plots. + * Extended support for colorbar axis options. + * New logo! + * Bugfixes: + - text generation + - extraCode option + - join strings + - ... + +# 2013-09-12 Version 0.4.2 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for explicit color specification in 3D plots. + * Better color handling for patch plots. + * Support for various unicode characters. + * Bugfixes: + - edge colors for bar plots + - multiple color bars + - ... + +# 2013-08-14 Version 0.4.1 [Nico Schlömer](nico.schloemer@gmail.com) + + * Replaced option `extraTikzpictureCode` by `extraCode` + for inserting code at the beginning of the file. + * Support for relative text positioning. + * Improved documentation. + * Code cleanup: moved all figure manipulations over to cleanfigure() + * Bugfixes: + - error bars + - empty tick labels + - ... + +# 2013-06-26 Version 0.4.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Added `cleanfigure()` for removing unwanted entities from a plot + before conversion + * Add option `floatFormat` to allow for custom specification of the format + of float numbers + * Bugfixes: + - linewidth for patches + - ... + +# 2013-04-13 Version 0.3.3 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for: + - pictures in LaTeX subfloats + * Bugfixes: + - axes labels + - extra* options + - logscaled axes + - ... + +# 2013-03-14 Version 0.3.2 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for: + - waterfall plots + * Bugfixes: + - axis locations + - color handling + - stacked bars + - ... + +# 2013-02-15 Version 0.3.1 [Nico Schlömer](nico.schloemer@gmail.com) + + * Use `table{}` for plots for cleaner output files. + * Support for: + - hg transformations + - pcolor plots + * Removed command line options: + - `minimumPointsDistance` + * Bugfixes: + - legend positioning and alignment + - tick labels + - a bunch of fixed for Octave + - line width for markers + - axis labels for color bars + - image trimming + - subplots with bars + - ... + +# 2012-11-19 Version 0.3.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for: + - area plots + - legend position + - inner color bars + - log-scaled color bars + * New command line options: + - `standalone` (create compilable TeX file) + - `checkForUpdates` + * `mlint` cleanups. + * Removed deprecated options. + * Bugfixes: + - colorbar-axis association + - option parsing + - automatic updater + - unit 'px' + - ... + +# 2012-09-01 Version 0.2.3 [Nico Schlömer](nico.schloemer@gmail.com) + + * Multiline text for all entities. + * Support for logical images. + * Support for multiple legends (legends in subplots). + * Fixed version check bug. + * Fix `minimumPointsDistance`. + +# 2012-07-19 Version 0.2.2 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for multiline titles and axis labels. + * Respect log-scaled axes for `minimumPointsDistance`. + * Add support for automatic graph labels via new option. + * About 5 bugfixes. + +# 2012-05-04 Version 0.2.1 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for color maps. + * Support for native color bars. + * Partial support for hist3 plots. + * Support for spectrogram plots. + * Support for rotated text. + * Native handling of `Inf`s and `NaN`s. + * Better info text. + * matlab2tikz version checking. + * Line plotting code cleanup. + * About 10 bugfixes. + +# 2012-03-17 Version 0.2.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Greatly overhauled text handling. (Burkhart Lingner) + * Added option `tikzFileComment`. + * Added option `parseStrings`. + * Added option `extraTikzpictureSettings`. + * Added proper documetion (for `help matlab2tikz`). + * Improved legend positioning, orientation. + * Support for horizontal bar plots. + * Get bar widths right. + * Doubles are plottet with 15-digit precision now. + * Support for rectangle objects. + * Better color handling. + * Testing framework improvements. + * Several bugfixes: + - ticks handled more concisely + - line splitting bugs + - ... + +# 2011-11-22 Version 0.1.4 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for scatter 3D plots. + * Support for 3D parameter curves. + * Support for 3D patches. + * Support for minor ticks. + * Add option `interpretTickLabelsAsTex` (default `false`). + * Several bugfixes: + - `%` sign in annotations + - fixed `\omega` and friends in annotations + - proper legend for bar plots + - don't override PNG files if there is more than one image plot + - don't always close patch paths + +# 2011-08-22 Version 0.1.3 [Nico Schlömer](nico.schloemer@gmail.com) + + * Greatly overhauled text handling. + * Better Octave compatibility. + * Several bugfixes: + - subplot order + - environment detection + + +# 2011-06-02 Version 0.1.2 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for logscaled color bar. + * Support for truecolor images. + * Initial support for text handles. + * Speed up processing for line plots. + * Several bugfixes: + - axis labels, tick labels, etc. for z-axis + - marker handling for scatter plots + - fix for unicolor scatter plots + +# 2011-04-06 Version 0.1.1 [Nico Schlömer](nico.schloemer@gmail.com) + + * Improved Octave compatibility. + * Several bugfixes: + - input parser + +# 2011-01-31 Version 0.1.0 [Nico Schlömer](nico.schloemer@gmail.com) + + * Basic Octave compatibility. + * Several bugfixes: + - bar plots fix (thanks to Christoph Rüdiger) + - fix legends with split graphs + +# 2010-09-10 Version 0.0.7 [Nico Schlömer](nico.schloemer@gmail.com) + + * Compatibility fixes for older MATLAB installations. + * Several bugfixes: + - line plots with only one point + - certain surface plots + - orientation of triangle markers (`<` vs. `>`) + - display of the color `purple` + +# 2010-05-06 Version 0.0.6 [Nico Schlömer](nico.schloemer@gmail.com) + + * Support for scatter plots. + * Preliminary support for surface plots; thanks to Pooya. + * Large changes in the codebase: + - next to `matlab2tikz.m`, the file `pgfplotsEnvironment.m` is now needed as well; it provides a much better structured approach to storing and writing environments when parsing the MATLAB(R) figure + * proper MATLAB(R) version check + * lots of small fixes + +# 2009-12-21 Version 0.0.5 [Nico Schlömer](nico.schloemer@ua.ac.be) + + * Improvements in axis handling: + - colored axes + - allow different left and right ordinates + * Improvements for line plots: + - far outliers are moved toward the plot, + avoiding `Dimension too large`-type errors in LaTeX + - optional point reduction by new option `minimumPointsDistance` + * Improvements for image handling: + - creation of a PNG file, added by `\addplot graphics` + - fixed axis orientation bug + * Bugfixes for: + - multiple axes + - CMYK colors + - legend text alignment (thanks Dragan Mitrevski) + - transparent patches (thanks Carlos Russo) + * Added support for: + - background color + - Bode plots + - zplane plots + - freqz plots + +# 2009-06-09 Version 0.0.4 [Nico Schlömer](nico.schloemer@ua.ac.be) + + * Added support for: + - error bars (thanks Robert Whittlesey for the suggestion) + * Improvents in: + - legends (thanks Theo Markettos for the patch), + - images, + - quiver plots (thanks Robert for spotting this). + * Improved options handling. + * Allow for custom file encoding (thanks Donghua Wang for the suggestion). + * Numerous bugfixes (thanks Andreas Gäb). + +# 2009-03-08 Version 0.0.3 [Nico Schlömer](nico.schloemer@ua.ac.be) + + * Added support for: + - subplots + - reverse axes + * Completed support for: + - images + +# 2009-01-08 Version 0.0.2 [Nico Schlömer](nico.schloemer@ua.ac.be) + + * Added support for: + - quiver (arrow) plots + - bar plots + - stem plots + - stairs plots + * Added preliminary support for: + - images + - rose plots + - compass plots + - polar plots + * Moreover, large code improvement have been introduced, notably: + - aspect ratio handling + - color handling + - plot options handling + +# 2008-11-07 Version 0.0.1 [Nico Schlömer](nico.schloemer@ua.ac.be) + + * Initial version diff --git a/matlab/matlab2tikz-1.1.0/CONTRIBUTING.md b/matlab/matlab2tikz-1.1.0/CONTRIBUTING.md new file mode 100644 index 0000000..d64abe9 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/CONTRIBUTING.md @@ -0,0 +1,66 @@ +# Contributing to matlab2tikz + +You can contribute in many ways to `matlab2tikz`: + + - report bugs, + - suggest new features, + - write documentation, + - fix some of our bugs and implement new features. + +The first part of this document is geared more towards users of `matlab2tikz`. +The latter part is only relevant if you want to write some code for `matlab2tikz`. + +## How to report a bug or ask for help + + 1. Make sure you are using the [latest release](https://github.com/matlab2tikz/matlab2tikz/releases/latest) or even the [development version](https://github.com/matlab2tikz/matlab2tikz/tree/develop) of `matlab2tikz` and check that the problem still exists. + 2. Also make sure you are using a recent version of the required LaTeX packages (especially [`pgfplots`](http://ctan.org/pkg/pgfplots) and the [`TikZ`](http://ctan.org/pkg/pgf) libraries) + 3. You can submit your bug report or question to our [issue tracker](https://github.com/matlab2tikz/matlab2tikz/issues). + Please, have a look at "[How to Ask Questions the Smart Way](http://www.catb.org/esr/faqs/smart-questions.html)" and "[Writing Better Bug Reports](http://martiancraft.com/blog/2014/07/good-bug-reports/)" for generic guidelines. In short: + - Mention the version of MATLAB/Octave, the operating system, `matlab2tikz`, `pgfplots` and which `LaTeX` compiler you are using. + - Choose a descriptive title for your issue report. + - A short MATLAB code snippet that generates a plot where the problem occurs. Please limit this to what is strictly necessary to show the issue! + - Explain what is wrong with the conversion of the figure (or what error messages you see). + - Often it can be useful to also include a figure, `TikZ` code, ... to illustrate your point. + +## How to request new features + +Please check first whether the feature hasn't been [requested](https://github.com/matlab2tikz/matlab2tikz/labels/feature%20request) before and do join the relevant topic in that case or maybe it has already been implemented in the [latest development version](https://github.com/matlab2tikz/matlab2tikz/tree/develop). + +If your feature is something new and graphical, please also have a look at the [`pgfplots`](https://www.ctan.org/pkg/pgfplots) manual to see if it supports the feature you want. +In some cases it is more constructive to request the feature in the [`pgfplots` bug tracker](https://sourceforge.net/p/pgfplots/bugs/). + +Please submit you feature request as any [bug report](https://github.com/matlab2tikz/matlab2tikz/labels/feature%20request) and make sure that you include enough details in your post, e.g.: + + - What are you trying to do? + - What should it look like or how should it work? + - Is there a relevant section in the `pgfplots` or `MATLAB` documentation? + +## Submitting pull requests (PRs) +Before you start working on a bug or new feature, you might want to check that nobody else has been assigned to the relevant issue report. +To avoid wasted hours, please just indicate your interest to tackle the issue. + +### Recommended workflow +[Our wiki](https://github.com/matlab2tikz/matlab2tikz/wiki/Recommended-git-workflow) contains more elaborate details on this process. Here is the gist: + + - It is highly recommended to start a feature branch for your work. + - Once you have finished the work, please try to run the test suite and report on the outcome in your PR (see below). + - Make sure that you file your pull request against the `develop` branch and *not* the `master` branch! + - Once you have filed your PR, the review process starts. Everybody is free to join this discussion. + - At least one other developer will review the code and signal their approval (often using a thumbs-up, :+1:) before the PR gets pulled into `develop`. + - Once you have addressed all comments, one of the developers will merge your code into the `develop` branch. + +If you still feel uncomfortable with `git`, please have a look at [this page](https://github.com/matlab2tikz/matlab2tikz/wiki/Learning-git) for a quick start. + +### Running the test suite +We know that at first the test suite can seem a bit intimidating, so we tend to be lenient during your first few PRs. However, we encourage you to run the test suite on your local computer and report on the results in your PR if any failures pop up. +To run the test suite, please consult its [README](https://github.com/matlab2tikz/matlab2tikz/blob/develop/test/README.md). + +## Becoming a member of [matlab2tikz](https://github.com/matlab2tikz) + +Once you have submitted your first pull request that is of reasonable quality, you may get invited to join the [Associate Developers](https://github.com/orgs/matlab2tikz/teams/associate-developers) group. +This group comes with *no* responsibility whatsoever and merely serves to make it easier for you to "claim" the features you want to work on. + +Once you have gained some experience (with `git`/GitHub, our codebase, ...) and have contributed your fair share of great material, you will get invited to join the [Developers](https://github.com/orgs/matlab2tikz/teams/developers) team. +This status gives you push access to our repository and hence comes with the responsibility to not abuse your push access. + +If you feel you should have gotten an invite for a team, feel free to contact one of the [owners](https://github.com/orgs/matlab2tikz/teams/owners). diff --git a/matlab/matlab2tikz-1.1.0/LICENSE.md b/matlab/matlab2tikz-1.1.0/LICENSE.md new file mode 100644 index 0000000..429a944 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/LICENSE.md @@ -0,0 +1,24 @@ +Copyright (c) 2008--2016 Nico Schlömer +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/matlab/matlab2tikz-1.1.0/README.md b/matlab/matlab2tikz-1.1.0/README.md new file mode 100644 index 0000000..9d467a0 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/README.md @@ -0,0 +1,95 @@ +**The updater in matlab2tikz 0.6.0 (and older) no longer works.** +**Please [update manually](http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz?download=true) if you are not using matlab2tikz 1.0.0 or newer!** + +[![Build Status](https://travis-ci.org/matlab2tikz/matlab2tikz.svg?branch=master)](https://travis-ci.org/matlab2tikz/matlab2tikz) [![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.18605.svg)](http://dx.doi.org/10.5281/zenodo.18605) +![matlab2tikz](https://raw.githubusercontent.com/wiki/matlab2tikz/matlab2tikz/matlab2tikz.png) + +`matlab2tikz` is a MATLAB(R) script to convert native MATLAB(R) figures to TikZ/Pgfplots figures that integrate seamlessly in LaTeX documents. + +To download the official releases and rate `matlab2tikz`, please visit its page on [FileExchange](http://www.mathworks.com/matlabcentral/fileexchange/22022). + +`matlab2tikz` converts most MATLAB(R) figures, including 2D and 3D plots. +For plots constructed with third-party packages, however, your mileage may vary. + +Installation +============ + +1. Extract the ZIP file (or clone the git repository) somewhere you can easily reach it. +2. Add the `src/` folder to your path in MATLAB/Octave: e.g. + - using the "Set Path" dialog in MATLAB, or + - by running the `addpath` function from your command window or `startup` script. + +Make sure that your LaTeX installation is up-to-date and includes: + +* [TikZ/PGF](http://www.ctan.org/pkg/pgf) version 3.0 or higher +* [Pgfplots](http://www.ctan.org/pkg/pgfplots) version 1.13 or higher +* [Amsmath](https://www.ctan.org/pkg/amsmath) version 2.14 or higher +* [Standalone](http://www.ctan.org/pkg/standalone) (optional) + +It is recommended to use the latest stable version of these packages. +Older versions may work depending on the actual MATLAB(R) figure you are converting. + +Usage +===== + +Typical usage of `matlab2tikz` consists of converting your MATLAB plot to a TikZ/LaTeX file and then running a LaTeX compiler to produce your document. + +MATLAB +------ + 1. Generate your plot in MATLAB(R). + + 2. Run `matlab2tikz`, e.g. using + +```matlab +matlab2tikz('myfile.tex'); +``` + +LaTeX +----- +Add the contents of `myfile.tex` into your LaTeX source code, for example using `\input{myfile.tex}`. +Make sure that the required packages (such as `pgfplots`) are loaded in the preamble of your document as in the example: + +```latex +\documentclass{article} + + \usepackage{pgfplots} + \pgfplotsset{compat=newest} + %% the following commands are needed for some matlab2tikz features + \usetikzlibrary{plotmarks} + \usetikzlibrary{arrows.meta} + \usepgfplotslibrary{patchplots} + \usepackage{grffile} + \usepackage{amsmath} + + %% you may also want the following commands + %\pgfplotsset{plot coordinates/math parser=false} + %\newlength\figureheight + %\newlength\figurewidth + +\begin{document} + \input{myfile.tex} +\end{document} +``` + +Remarks +------- +Most functions accept numerous options; you can check them out by inspecting their help: + +```matlab +help matlab2tikz +``` + +Sometimes, MATLAB(R) plots contain some features that impede conversion to LaTeX; e.g. points that are far outside of the actual bounding box. +You can invoke the `cleanfigure` function to remove such unwanted entities before calling `matlab2tikz`: + +```matlab +cleanfigure; +matlab2tikz('myfile.tex'); +``` + +More information +================ + +* For more information about `matlab2tikz`, have a look at our [GitHub repository](https://github.com/matlab2tikz/matlab2tikz). If you are a good MATLAB(R) programmer or LaTeX writer, you are always welcome to help improving `matlab2tikz`! +* Some common problems and pit-falls are documented in our [wiki](https://github.com/matlab2tikz/matlab2tikz/wiki/Common-problems). +* If you experience (other) bugs or would like to request a feature, please visit our [issue tracker](https://github.com/matlab2tikz/matlab2tikz/issues). diff --git a/matlab/matlab2tikz-1.1.0/logos/matlab2tikz.svg b/matlab/matlab2tikz-1.1.0/logos/matlab2tikz.svg new file mode 100644 index 0000000..42a4af9 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/logos/matlab2tikz.svg @@ -0,0 +1,102 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + MATLAB2TikZ + + diff --git a/matlab/matlab2tikz-1.1.0/matlab2tikz.sublime-project b/matlab/matlab2tikz-1.1.0/matlab2tikz.sublime-project new file mode 100644 index 0000000..e773d0c --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/matlab2tikz.sublime-project @@ -0,0 +1,49 @@ +{ + "folders": + [ + { + "path": "." + } + ], + "build_systems": + [ + { + "name": "CI tests (Octave)", + "selector": "source.matlab", + "working_dir": "${project_path}", + "cmd": ["./runtests.sh", "octave"] + }, + { + "name": "CI tests (MATLAB)", + "selector": "source.matlab", + "working_dir": "${project_path}", + "cmd": ["./runtests.sh", "matlab"] + }, + { + "name": "CI tests (MATLAB HG1)", + "selector": "source.matlab", + "working_dir": "${project_path}", + "cmd": ["./runtests.sh", "matlab-hg1"] + }, + { + "name": "CI tests (MATLAB HG2)", + "selector": "source.matlab", + "working_dir": "${project_path}", + "cmd": ["./runtests.sh", "matlab-hg2"] + }, + { + "name": "ACID: make", + "working_dir": "${project_path}/test/tex", + "cmd": ["make","-j8"] + }, + { + "name": "ACID: distclean", + "working_dir": "${project_path}/test/tex", + "cmd": ["make","distclean"] + } + ], + "settings": + { + "FuzzyFilePath":{} + } +} diff --git a/matlab/matlab2tikz-1.1.0/runtests.sh b/matlab/matlab2tikz-1.1.0/runtests.sh new file mode 100644 index 0000000..764e3d8 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/runtests.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# +# Test script runner for MATLAB2TIKZ continuous integration +# +# You can influence the execution by passing one or two parameters +# to this function, as +# +# ./runtests.sh RUNNER SWITCHES +# +# Arguments: +# - RUNNER: (path of) the binary you want to use to execute the tests +# default value: "octave" +# - SWITCHES: switches you want to pass to the executable +# default value: * "-nodesktop -r" if runner contains "matlab" +# * "--no-gui --eval" if runner contains "octave" and otherwise +# + +# Used resources: +# - http://askubuntu.com/questions/299710/how-to-determine-if-a-string-is-a-substring-of-another-in-bash +# - http://www.thegeekstuff.com/2010/07/bash-case-statement/ +# - http://stackoverflow.com/questions/229551/string-contains-in-bash +# - http://stackoverflow.com/questions/2870992/automatic-exit-from-bash-shell-script-on-error +# - http://www.davidpashley.com/articles/writing-robust-shell-scripts/ +# - http://stackoverflow.com/questions/13998941/how-can-i-propagate-an-exit-status-from-expect-to-its-parent-bash-script +# - http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html + +## Make sure some failures are detected by the CI runners +function exitIfError { + # pass "$?" as argument: i.e. the exit status of the last call + if [ "$1" -ne 0 ]; then + exit $1; + fi +} + +## Handle Runner and Switches variables +Runner=$1 +Switches=$2 +if [ -z "$Runner" ] ; then + Runner="octave" +fi +if [ -z "$Switches" ] ; then + case "$Runner" in + *matlab* ) + Switches="-nodesktop -r" + ;; + + *octave* ) + Switches="--no-gui --eval" + ;; + + * ) + # Fall back to Octave switches + Switches="--no-gui --eval" + ;; + esac +fi + +## Make sure MATLAB/Octave know the intent +# note: the export is required +export CONTINUOUS_INTEGRATION=true +export CI=true + +## Actually run the test suite +cd test +TESTDIR=`pwd` +# also CD in MATLAB/Octave to make sure that startup files +# cannot play any role in setting the path +${Runner} ${Switches} "cd('${TESTDIR}'); runMatlab2TikzTests" +exitIfError $? +cd .. + +## Post-processing + +# convert MD report into HTML using pandoc if available +MDFILE="test/results.test.md" +if [ ! -z `which pandoc` ]; then + if [ -f $MDFILE ]; then + HTMLFILE=${MDFILE/md/html} + # replace the emoji while we're at it + pandoc -f markdown -t html $MDFILE -o $HTMLFILE + sed -i -- 's/:heavy_exclamation_mark:/❗️/g' $HTMLFILE + sed -i -- 's/:white_check_mark:/✅/g' $HTMLFILE + sed -i -- 's/:grey_question:/❔/g' $HTMLFILE + fi +fi + diff --git a/matlab/matlab2tikz-1.1.0/src/cleanfigure.m b/matlab/matlab2tikz-1.1.0/src/cleanfigure.m new file mode 100644 index 0000000..e4c3fbf --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/cleanfigure.m @@ -0,0 +1,1294 @@ +function cleanfigure(varargin) +% CLEANFIGURE() removes the unnecessary objects from your MATLAB plot +% to give you a better experience with matlab2tikz. +% CLEANFIGURE comes with several options that can be combined at will. +% +% CLEANFIGURE('handle',HANDLE,...) explicitly specifies the +% handle of the figure that is to be stored. (default: gcf) +% +% CLEANFIGURE('pruneText',BOOL,...) explicitly specifies whether text +% should be pruned. (default: true) +% +% CLEANFIGURE('targetResolution',PPI,...) +% CLEANFIGURE('targetResolution',[W,H],...) +% Reduce the number of data points in line objects by applying +% unperceivable changes at the target resolution. +% The target resolution can be specificed as the number of Pixels Per +% Inch (PPI), e.g. 300, or as the Width and Heigth of the figure in +% pixels, e.g. [9000, 5400]. +% Use targetResolution = Inf or 0 to disable line simplification. +% (default: 600) +% +% CLEANFIGURE('scalePrecision',alpha,...) +% Scale the precision the data is represented with. Setting it to 0 +% or negative values disable this feature. +% (default: 1) +% +% CLEANFIGURE('normalizeAxis','xyz',...) +% EXPERIMENTAL: Normalize the data of the dimensions specified by +% 'normalizeAxis' to the interval [0, 1]. This might have side effects +% with hgtransform and friends. One can directly pass the axis handle to +% cleanfigure to ensure that only one axis gets normalized. +% Usage: Input 'xz' normalizes only x- and zData but not yData +% (default: '') +% +% Example +% x = -pi:pi/1000:pi; +% y = tan(sin(x)) - sin(tan(x)); +% plot(x,y,'--rs'); +% cleanfigure(); +% +% See also: matlab2tikz + + % Treat hidden handles, too. + shh = get(0, 'ShowHiddenHandles'); + set(0, 'ShowHiddenHandles', 'on'); + + % Keep track of the current axes. + meta.gca = []; + + % Set up command line options. + m2t.cmdOpts = m2tInputParser; + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'handle', gcf, @ishandle); + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'targetResolution', 600, @isValidTargetResolution); + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'pruneText', true, @islogical); + + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'minimumPointsDistance', 1.0e-10, @isnumeric); + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'scalePrecision', 1, @isnumeric); + m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'normalizeAxis', '', @isValidAxis); + + % Deprecated parameters + m2t.cmdOpts = m2t.cmdOpts.deprecateParam(m2t.cmdOpts, 'minimumPointsDistance', 'targetResolution'); + + % Finally parse all the elements. + m2t.cmdOpts = m2t.cmdOpts.parse(m2t.cmdOpts, varargin{:}); + + % Recurse down the tree of plot objects and clean up the leaves. + for h = m2t.cmdOpts.Results.handle(:)' + recursiveCleanup(meta, h, m2t.cmdOpts.Results); + end + + % Reset to initial state. + set(0, 'ShowHiddenHandles', shh); + + return; +end +% ========================================================================= +function recursiveCleanup(meta, h, cmdOpts) + % Recursive function, that cleans up the individual childs of a figure + + % Get the type of the current figure handle + type = get(h, 'Type'); + + %display(sprintf([repmat(' ',1,indent), type, '->'])) + + % Don't try to be smart about quiver groups. + % NOTE: + % A better way to write `strcmp(get(h,...))` would be to use + % isa(handle(h), 'specgraph.quivergroup'). + % The handle() function isn't supported by Octave, though, so let's stick + % with strcmp(). + if strcmp(type, 'specgraph.quivergroup') + %if strcmp(class(handle(h)), 'specgraph.quivergroup') + return; + end + + % Update the current axes. + if strcmp(type, 'axes') + meta.gca = h; + + if ~isempty(cmdOpts.normalizeAxis) + % If chosen transform the date axis + normalizeAxis(h, cmdOpts); + end + end + + children = get(h, 'Children'); + if ~isempty(children) + for child = children(:)' + recursiveCleanup(meta, child, cmdOpts); + end + else + if strcmp(type, 'line') + % Remove data points outside of the axes + % NOTE: Always remove invisible points before simplifying the + % line. Otherwise it will generate additional line segments + pruneOutsideBox(meta, h); + % Move some points closer to the box to avoid TeX:DimensionTooLarge + % errors. This may involve inserting extra points. + movePointsCloser(meta, h); + % Simplify the lines by removing superflous points + simplifyLine(meta, h, cmdOpts.targetResolution); + % Limit the precision of the output + limitPrecision(meta, h, cmdOpts.scalePrecision); + elseif strcmpi(type, 'stair') + % Remove data points outside of the visible axes + pruneOutsideBox(meta, h); + % Remove superfluous data points + simplifyStairs(meta, h); + % Limit the precision of the output + limitPrecision(meta, h, cmdOpts.scalePrecision); + elseif strcmp(type, 'text') && cmdOpts.pruneText + % Prune text that is outside of the axes + pruneOutsideText(meta, h); + end + end + + return; +end +% ========================================================================= +function pruneOutsideBox(meta, handle) + % Some sections of the line may sit outside of the visible box. + % Cut those off. + + % Extract the visual data from the current line handle. + [xData, yData] = getVisualData(meta, handle); + + % Merge the data into one matrix + data = [xData, yData]; + + % Dont do anything if the data is empty + if isempty(data) + return; + end + + % Check if the plot has lines + hasLines = ~strcmp(get(handle, 'LineStyle'),'none')... + && get(handle, 'LineWidth') > 0.0; + + % Extract the visual limits from the current line handle. + [xLim, yLim]= getVisualLimits(meta); + + tol = 1.0e-10; + relaxedXLim = xLim + [-tol, tol]; + relaxedYLim = yLim + [-tol, tol]; + + % Get which points are inside a (slightly larger) box. + dataIsInBox = isInBox(data, relaxedXLim, relaxedYLim); + + % Plot all the points inside the box + shouldPlot = dataIsInBox; + + if hasLines + % Check if the connecting line between two data points is visible. + segvis = segmentVisible(data, dataIsInBox, xLim, yLim); + + % Plot points which part of an visible line segment. + shouldPlot = shouldPlot | [false; segvis] | [segvis; false]; + end + + % Remove or replace points outside the box + id_replace = []; + id_remove = []; + if ~all(shouldPlot) + % For line plots, simply removing the data has the disadvantage + % that the line between two 'loose' ends may now appear in the figure. + % To avoid this, add a row of NaNs wherever a block of actual data is + % removed. + + % Get the indices of points that should be removed + id_remove = find(~shouldPlot); + + % If there are consecutive data points to be removed, only replace + % the first one by a NaN. Consecutive data points have + % diff(id_remove)==1, so replace diff(id_remove)>1 by NaN and remove + % the rest + idx = [true; diff(id_remove) >1]; + id_replace = id_remove(idx); + id_remove = id_remove(~idx); + end + % Replace the data points + replaceDataWithNaN(meta, handle, id_replace); + + % Remove the data outside the box + removeData(meta, handle, id_remove); + + % Remove possible NaN duplications + removeNaNs(meta, handle); + return; +end +% ========================================================================= +function movePointsCloser(meta, handle) + % Move all points outside a box much larger than the visible one + % to the boundary of that box and make sure that lines in the visible + % box are preserved. This typically involves replacing one point by + % two new ones and a NaN. + + % TODO: 3D simplification of frontal 2D projection. This requires the + % full transformation rather than the projection, as we have to calculate + % the inverse transformation to project back into 3D + if isAxis3D(meta.gca) + return; + end + + % Extract the visual data from the current line handle. + [xData, yData] = getVisualData(meta, handle); + + % Extract the visual limits from the current line handle. + [xLim, yLim] = getVisualLimits(meta); + + % Calculate the extension of the extended box + xWidth = xLim(2) - xLim(1); + yWidth = yLim(2) - yLim(1); + + % Don't choose the larger box too large to make sure that the values inside + % it can still be treated by TeX. + extendFactor = 0.1; + largeXLim = xLim + extendFactor * [-xWidth, xWidth]; + largeYLim = yLim + extendFactor * [-yWidth, yWidth]; + + % Put the data into one matrix + data = [xData, yData]; + + % Get which points are in an extended box (the limits of which + % don't exceed TeX's memory). + dataIsInLargeBox = isInBox(data, largeXLim, largeYLim); + + % Count the NaNs as being inside the box. + dataIsInLargeBox = dataIsInLargeBox | any(isnan(data), 2); + + % Find all points which are to be included in the plot yet do not fit + % into the extended box + id_replace = find(~dataIsInLargeBox); + + % Only try to replace points if there are some to replace + dataInsert = {}; + if ~isempty(id_replace) + % Get the indices of those points, that are the first point in a + % segment. The last data point at size(data, 1) cannot be the first + % point in a segment. + id_first = id_replace(id_replace < size(data, 1)); + + % Get the indices of those points, that are the second point in a + % segment. Similarly the first data point cannot be the second data + % point in a segment. + id_second = id_replace(id_replace > 1); + + % Define the vectors of data points for the segments X1--X2 + X1_first = data(id_first, :); + X2_first = data(id_first+1, :); + X1_second = data(id_second, :); + X2_second = data(id_second-1, :); + + % Move the points closer to the large box along the segment + newData_first = moveToBox(X1_first, X2_first, largeXLim, largeYLim); + newData_second= moveToBox(X1_second, X2_second, largeXLim, largeYLim); + + % Respect logarithmic scaling for the new points + isXlog = strcmp(get(meta.gca, 'XScale'), 'log'); + if isXlog + newData_first (:, 1) = 10.^newData_first (:, 1); + newData_second(:, 1) = 10.^newData_second(:, 1); + end + isYlog = strcmp(get(meta.gca, 'YScale'), 'log'); + if isYlog + newData_first (:, 2) = 10.^newData_first (:, 2); + newData_second(:, 2) = 10.^newData_second(:, 2); + end + + % If newData_* is infinite, the segment was not visible. However, as we + % move the point closer, it would become visible. So insert a NaN. + isInfinite_first = any(~isfinite(newData_first), 2); + isInfinite_second = any(~isfinite(newData_second), 2); + + newData_first (isInfinite_first, :) = NaN(sum(isInfinite_first), 2); + newData_second(isInfinite_second, :) = NaN(sum(isInfinite_second), 2); + + % If a point is part of two segments, that cross the border, we need to + % insert a NaN to prevent an additional line segment + [trash, trash, id_conflict] = intersect(id_first (~isInfinite_first), ... + id_second(~isInfinite_second)); + + % Cut the data into length(id_replace)+1 segments. + % Calculate the length of the segments + length_segments = [id_replace(1); + diff(id_replace); + size(data, 1)-id_replace(end)]; + + % Create an empty cell array for inserting NaNs and fill it at the + % conflict sites + dataInsert_NaN = cell(length(length_segments),1); + dataInsert_NaN(id_conflict) = mat2cell(NaN(length(id_conflict), 2),... + ones(size(id_conflict)), 2); + + % Create a cell array for the moved points + dataInsert_first = mat2cell(newData_first, ones(size(id_first)), 2); + dataInsert_second = mat2cell(newData_second, ones(size(id_second)), 2); + + % Add an empty cell at the end of the last segment, as we do not + % insert something *after* the data + dataInsert_first = [dataInsert_first; cell(1)]; + dataInsert_second = [dataInsert_second; cell(1)]; + + % If the first or the last point would have been replaced add an empty + % cell at the beginning/end. This is because the last data point + % cannot be the first data point of a line segment and vice versa. + if(id_replace(end) == size(data, 1)) + dataInsert_first = [dataInsert_first; cell(1)]; + end + if(id_replace(1) == 1) + dataInsert_second = [cell(1); dataInsert_second]; + end + + % Put the cells together, right points first, then the possible NaN + % and then the left points + dataInsert = cellfun(@(a,b,c) [a; b; c],... + dataInsert_second,... + dataInsert_NaN,... + dataInsert_first,... + 'UniformOutput',false); + end + + % Insert the data + insertData(meta, handle, id_replace, dataInsert); + + % Get the indices of the to be removed points accounting for the now inserted + % data points + numPointsInserted = cellfun(@(x) size(x,1), [cell(1);dataInsert(1:end-2)]); + id_remove = id_replace + cumsum(numPointsInserted); + + % Remove the data point that should be replaced. + removeData(meta, handle, id_remove); + + % Remove possible NaN duplications + removeNaNs(meta, handle); +end +% ========================================================================= +function simplifyLine(meta, handle, targetResolution) + % Reduce the number of data points in the line 'handle'. + % + % Aplies a path-simplification algorithm if there are no markers or + % pixelization otherwise. Changes are visually negligible at the target + % resolution. + % + % The target resolution is either specificed as the number of PPI or as + % the [Width, Heigth] of the figure in pixels. + % A scalar value of INF or 0 disables path simplification. + % (default = 600) + + % Do not simpify + if any(isinf(targetResolution) | targetResolution == 0) + return + end + + % Retrieve target figure size in pixels + [W, H] = getWidthHeightInPixels(targetResolution); + + % Extract the visual data from the current line handle. + [xData, yData] = getVisualData(meta, handle); + + % Only simplify if there are more than 2 points + if numel(xData) <= 2 || numel(yData) <= 2 + return; + end + + % Extract the visual limits from the current line handle. + [xLim, yLim] = getVisualLimits(meta); + + % Automatically guess a tol based on the area of the figure and + % the area and resolution of the output + xRange = xLim(2)-xLim(1); + yRange = yLim(2)-yLim(1); + + % Conversion factors of data units into pixels + xToPix = W/xRange; + yToPix = H/yRange; + + % Mask for removing data points + id_remove = []; + + % If the path has markers, perform pixelation instead of simplification + hasMarkers = ~strcmpi(get(handle,'Marker'),'none'); + hasLines = ~strcmpi(get(handle,'LineStyle'),'none'); + if hasMarkers && ~hasLines + % Pixelate data at the zoom multiplier + mask = pixelate(xData, yData, xToPix, yToPix); + id_remove = find(mask==0); + elseif hasLines && ~hasMarkers + % Get the width of a pixel + xPixelWidth = 1/xToPix; + yPixelWidth = 1/yToPix; + tol = min(xPixelWidth,yPixelWidth); + + % Split up lines which are seperated by NaNs + id_nan = isnan(xData) | isnan(yData); + + % If lines were separated by a NaN, diff(~id_nan) would give 1 for + % the start of a line and -1 for the index after the end of + % a line. + id_diff = diff([false; ~id_nan; false]); + lineStart = find(id_diff == 1); + lineEnd = find(id_diff == -1)-1; + numLines = numel(lineStart); + id_remove = cell(numLines, 1); + + % Simplify the line segments + for ii = 1:numLines + % Actual data that inherits the simplifications + x = xData(lineStart(ii):lineEnd(ii)); + y = yData(lineStart(ii):lineEnd(ii)); + + % Line simplification + if numel(x) > 2 + mask = opheimSimplify(x, y, tol); + % Remove all those with mask==0 respecting the number of + % data points in the previous segments + id_remove{ii} = find(mask==0) + lineStart(ii) - 1; + end + end + + % Merge the indices of the line segments + id_remove = cat(1, id_remove{:}); + end + + % Remove the data points + removeData(meta, handle, id_remove); +end +% ========================================================================= +function simplifyStairs(meta, handle) + % This function simplifies stair plots by removeing superflous data + % points + + % Some data might not lead to a new step in the stair. This is the case + % if the difference in one dimension is zero, e.g + % [(x_1, y_1), (x_2, y_1), ... (x_k, y_1), (x_{k+1} y_2)]. + % However, there is one exeption. If the monotonicity of the other + % dimension changes, e.g. the sequence [0, 1], [0, -1], [0, 2]. This + % sequence cannot be simplified. Therefore, we check for monoticity too. + % As an example, we can remove the data points marked with x in the + % following stair + % o--x--o + % | | + % x o --x--o + % | + % o--x--o + % | + % o + + % Extract the data + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + + % Do not do anything if the data is empty + if isempty(xData) || isempty(yData) + return; + end + + % Check for nonchanging data points + xNoDiff = [false, (diff(xData) == 0)]; + yNoDiff = [false, (diff(yData) == 0)]; + + % Never remove the last data point + xNoDiff(end) = false; + yNoDiff(end) = false; + + % Check for monotonicity (it changes if diff(sign)~=0) + xIsMonotone = [true, diff(sign(diff(xData)))==0, true]; + yIsMonotone = [true, diff(sign(diff(yData)))==0, true]; + + % Only remove points when there is no difference in one dimension and no + % change in monotonicity in the other + xRemove = xNoDiff & yIsMonotone; + yRemove = yNoDiff & xIsMonotone; + + % Plot only points, that generate a new step + id_remove = find(xRemove | yRemove); + + % Remove the superfluous data + removeData(meta, handle, id_remove); +end +% ========================================================================= +function limitPrecision(meta, handle, alpha) + % Limit the precision of the given data + + % If alpha is 0 or negative do nothing + if alpha<=0 + return + end + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if isAxis3D(meta.gca) + zData = get(handle, 'ZData'); + end + + % Check for log scaling + isXlog = strcmp(get(meta.gca, 'XScale'), 'log'); + isYlog = strcmp(get(meta.gca, 'YScale'), 'log'); + isZlog = strcmp(get(meta.gca, 'ZScale'), 'log'); + + % Put the data into a matrix and log bits into vector + if isAxis3D(meta.gca) + data = [xData(:), yData(:), zData(:)]; + isLog = [isXlog, isYlog, isZlog]; + else + data = [xData(:), yData(:)]; + isLog = [isXlog, isYlog]; + end + + % Only do something if the data is not empty + if isempty(data) || all(isinf(data(:))) + return + end + + % Scale to visual coordinates + data(:, isLog) = log10(data(:, isLog)); + + % Get the maximal value of the data, only considering finite values + maxValue = max(abs(data(isfinite(data)))); + + % The least significant bit is proportional to the numerical precision + % of the largest number. Scale it with a user defined value alpha + leastSignificantBit = eps(maxValue) * alpha; + + % Round to precision and scale back + data = round(data / leastSignificantBit) * leastSignificantBit; + + % Scale back in case of log scaling + data(:, isLog) = 10.^data(:, isLog); + + % Set the new data. + set(handle, 'XData', data(:, 1)); + set(handle, 'YData', data(:, 2)); + if isAxis3D(meta.gca) + set(handle, 'zData', data(:, 3)); + end +end +% ========================================================================= +function pruneOutsideText(meta, handle) + % Function to prune text outside of axis handles. + + % Ensure units of type 'data' (default) and restore the setting later + units_original = get(handle, 'Units'); + set(handle, 'Units', 'data'); + + % Check if text is inside bounds by checking if the position is inside + % the x, y and z limits. This works for both 2D and 3D plots. + xLim = get(meta.gca, 'XLim'); + yLim = get(meta.gca, 'YLim'); + zLim = get(meta.gca, 'ZLim'); + axLim = [xLim; yLim; zLim]; + + pos = get(handle, 'Position'); + % If the axis is 2D, ignore the z component and consider the extend of + % the textbox + if ~isAxis3D(meta.gca) + pos(3) = 0; + + % In 2D plots the 'extent' of the textbox is available and also + % considered to keep the textbox, if it is partially inside the axis + % limits. + extent = get(handle, 'Extent'); + + % Extend the actual axis limits by the extent of the textbox so that + % the textbox is not discarded, if it overlaps the axis. + axLim(1, 1) = axLim(1, 1) - extent(3); % x-limit is extended by width + axLim(2, 1) = axLim(2, 1) - extent(4); % y-limit is extended by height + end + + % Check if the (extended) textbox is inside the axis limits + bPosInsideLim = ( pos' >= axLim(:,1) ) & ( pos' <= axLim(:,2) ); + + % Restore original units (after reading all dimensions) + set(handle, 'Units', units_original); + + % Check if it is the title + isTitle = (handle == get(meta.gca, 'title')); + + % Disable visibility if it is outside the limits and it is not + % the title + if ~all(bPosInsideLim) && ~isTitle + % Warn about to be deprecated text removal + warning('cleanfigure:textRemoval', ... + 'Text removal by cleanfigure is planned to be deprecated'); + % Artificially disable visibility. m2t will check and skip. + set(handle, 'Visible', 'off'); + end +end +% ========================================================================= +function mask = isInBox(data, xLim, yLim) + % Returns a mask that indicates, whether a data point is within the + % limits + + mask = data(:, 1) > xLim(1) & data(:, 1) < xLim(2) ... + & data(:, 2) > yLim(1) & data(:, 2) < yLim(2); +end +% ========================================================================= +function mask = segmentVisible(data, dataIsInBox, xLim, yLim) + % Given a bounding box {x,y}Lim, determine whether the line between all + % pairs of subsequent data points [data(idx,:)<-->data(idx+1,:)] is + % visible. There are two possible cases: + % 1: One of the data points is within the limits + % 2: The line segments between the datapoints crosses the bounding box + n = size(data, 1); + mask = false(n-1, 1); + + % Only check if there is more than 1 point + if n>1 + % Define the vectors of data points for the segments X1--X2 + idx= 1:n-1; + X1 = data(idx, :); + X2 = data(idx+1, :); + + % One of the neighbors is inside the box and the other is finite + thisVisible = (dataIsInBox(idx) & all(isfinite(X2), 2)); + nextVisible = (dataIsInBox(idx+1) & all(isfinite(X1), 2)); + + % Get the corner coordinates + [bottomLeft, topLeft, bottomRight, topRight] = corners2D(xLim, yLim); + + % Check if data points intersect with the borders of the plot + left = segmentsIntersect(X1, X2, bottomLeft , topLeft); + right = segmentsIntersect(X1, X2, bottomRight, topRight); + bottom = segmentsIntersect(X1, X2, bottomLeft , bottomRight); + top = segmentsIntersect(X1, X2, topLeft , topRight); + + % Check the result + mask = thisVisible | nextVisible | left | right | top | bottom; + end +end +% ========================================================================= +function mask = segmentsIntersect(X1, X2, X3, X4) + % Checks whether the segments X1--X2 and X3--X4 intersect. + lambda = crossLines(X1, X2, X3, X4); + + % Check whether lambda is in bound + mask = 0.0 < lambda(:, 1) & lambda(:, 1) < 1.0 &... + 0.0 < lambda(:, 2) & lambda(:, 2) < 1.0; +end +% ========================================================================= +function mask = pixelate(x, y, xToPix, yToPix) + % Rough reduction of data points at a multiple of the target resolution + + % The resolution is lost only beyond the multiplier magnification + mult = 2; + + % Convert data to pixel units and magnify + dataPixel = round([x * xToPix * mult, ... + y * yToPix * mult]); + + % Sort the pixels + [dataPixelSorted, id_orig] = sortrows(dataPixel); + + % Find the duplicate pixels + mask_sorted = [true; diff(dataPixelSorted(:,1))~=0 | ... + diff(dataPixelSorted(:,2))~=0]; + + % Unwind the sorting + mask = false(size(x)); + mask(id_orig) = mask_sorted; + + % Set the first, last, as well as unique pixels to true + mask(1) = true; + mask(end) = true; + + % Set NaNs to true + inan = isnan(x) | isnan(y); + mask(inan) = true; +end +% ========================================================================= +function mask = opheimSimplify(x,y,tol) + % Opheim path simplification algorithm + % + % Given a path of vertices V and a tolerance TOL, the algorithm: + % 1. selects the first vertex as the KEY; + % 2. finds the first vertex farther than TOL from the KEY and links + % the two vertices with a LINE; + % 3. finds the last vertex from KEY which stays within TOL from the + % LINE and sets it to be the LAST vertex. Removes all points in + % between the KEY and the LAST vertex; + % 4. sets the KEY to the LAST vertex and restarts from step 2. + % + % The Opheim algorithm can produce unexpected results if the path + % returns back on itself while remaining within TOL from the LINE. + % This behaviour can be seen in the following example: + % + % x = [1,2,2,2,3]; + % y = [1,1,2,1,1]; + % tol < 1 + % + % The algorithm undesirably removes the second last point. See + % https://github.com/matlab2tikz/matlab2tikz/pull/585#issuecomment-89397577 + % for additional details. + % + % To rectify this issues, step 3 is modified to find the LAST vertex as + % follows: + % 3*. finds the last vertex from KEY which stays within TOL from the + % LINE, or the vertex that connected to its previous point forms + % a segment which spans an angle with LINE larger than 90 + % degrees. + + mask = false(size(x)); + mask(1) = true; + mask(end) = true; + + N = numel(x); + i = 1; + while i <= N-2 + % Find first vertex farther than TOL from the KEY + j = i+1; + v = [x(j)-x(i); y(j)-y(i)]; + while j < N && norm(v) <= tol + j = j+1; + v = [x(j)-x(i); y(j)-y(i)]; + end + v = v/norm(v); + + % Unit normal to the line between point i and point j + normal = [v(2);-v(1)]; + + % Find the last point which stays within TOL from the line + % connecting i to j, or the last point within a direction change + % of pi/2. + % Starts from the j+1 points, since all previous points are within + % TOL by construction. + while j < N + % Calculate the perpendicular distance from the i->j line + v1 = [x(j+1)-x(i); y(j+1)-y(i)]; + d = abs(normal.'*v1); + if d > tol + break + end + + % Calculate the angle between the line from the i->j and the + % line from j -> j+1. If + v2 = [x(j+1)-x(j); y(j+1)-y(j)]; + anglecosine = v.'*v2; + if anglecosine <= 0; + break + end + j = j + 1; + end + i = j; + mask(i) = true; + end +end +% ========================================================================= +function lambda = crossLines(X1, X2, X3, X4) + % Checks whether the segments X1--X2 and X3--X4 intersect. + % See https://en.wikipedia.org/wiki/Line-line_intersection for reference. + % Given four points X_k=(x_k,y_k), k\in{1,2,3,4}, and the two lines + % defined by those, + % + % L1(lambda) = X1 + lambda (X2 - X1) + % L2(lambda) = X3 + lambda (X4 - X3) + % + % returns the lambda for which they intersect (and Inf if they are parallel). + % Technically, one needs to solve the 2x2 equation system + % + % x1 + lambda1 (x2-x1) = x3 + lambda2 (x4-x3) + % y1 + lambda1 (y2-y1) = y3 + lambda2 (y4-y3) + % + % for lambda1 and lambda2. + + % Now X1 is a vector of all data points X1 and X2 is a vector of all + % consecutive data points X2 + % n is the number of segments (not points in the plot!) + n = size(X2, 1); + lambda = zeros(n, 2); + + % Calculate the determinant of A = [X2-X1, -(X4-X3)]; + % detA = -(X2(1)-X1(1))*(X4(2)-X3(2)) + (X2(2)-X1(2))*(X4(1)-X3(1)) + % NOTE: Vectorized this is equivalent to the matrix multiplication + % [nx2] * [2x2] * [2x1] = [nx1] + detA = -(X2(:, 1)-X1(:, 1)) .* (X4(2)-X3(2)) + (X2(:, 2)-X1(:, 2)) .* (X4(1)-X3(1)); + + % Get the indices for nonzero elements + id_detA = detA~=0; + + if any(id_detA) + % rhs = X3(:) - X1(:) + % NOTE: Originaly this was a [2x1] vector. However as we vectorize the + % calculation it is beneficial to treat it as an [nx2] matrix rather than a [2xn] + rhs = bsxfun(@minus, X3, X1); + + % Calculate the inverse of A and lambda + % invA=[-(X4(2)-X3(2)), X4(1)-X3(1);... + % -(X2(2)-X1(2)), X2(1)-X1(1)] / detA + % lambda = invA * rhs + + % Rotational matrix with sign flip. It transforms a given vector [a,b] by + % Rotate * [a,b] = [-b,a] as required for calculation of invA + Rotate = [0, -1; 1, 0]; + + + % Rather than calculating invA first and then multiply with rhs to obtain + % lambda, directly calculate the respective terms + % The upper half of the 2x2 matrix is always the same and is given by: + % [-(X4(2)-X3(2)), X4(1)-X3(1)] / detA * rhs + % This is a matrix multiplication of the form [1x2] * [2x1] = [1x1] + % As we have transposed rhs we can write this as: + % rhs * Rotate * (X4-X3) => [nx2] * [2x2] * [2x1] = [nx1] + lambda(id_detA, 1) = (rhs(id_detA, :) * Rotate * (X4-X3)')./detA(id_detA); + + % The lower half is dependent on (X2-X1) which is a matrix of size [nx2] + % [-(X2(2)-X1(2)), X2(1)-X1(1)] / detA * rhs + % As both (X2-X1) and rhs are matrices of size [nx2] there is no simple + % matrix multiplication leading to a [nx1] vector. Therefore, use the + % elementwise multiplication and sum over it + % sum( [nx2] * [2x2] .* [nx2], 2) = sum([nx2],2) = [nx1] + lambda(id_detA, 2) = sum(-(X2(id_detA, :)-X1(id_detA, :)) * Rotate .* rhs(id_detA, :), 2)./detA(id_detA); + end +end +% ========================================================================= +function minAlpha = updateAlpha(X1, X2, X3, X4, minAlpha) + % Checks whether the segments X1--X2 and X3--X4 intersect. + lambda = crossLines(X1, X2, X3, X4); + + % Check if lambda is in bounds and lambda1 large enough + id_Alpha = 0.0 < lambda(:,2) & lambda(:,2) < 1.0 ... + & abs(minAlpha) > abs(lambda(:,1)); + + % Update alpha when applicable + minAlpha(id_Alpha) = lambda(id_Alpha,1); +end +% ========================================================================= +function xNew = moveToBox(x, xRef, xLim, yLim) + % Takes a box defined by xlim, ylim, a vector of points x and a vector of + % reference points xRef. + % Returns the vector of points xNew that sits on the line segment between + % x and xRef *and* on the box. If several such points exist, take the + % closest one to x. + n = size(x, 1); + + % Find out with which border the line x---xRef intersects, and determine + % the smallest parameter alpha such that x + alpha*(xRef-x) + % sits on the boundary. Otherwise set Alpha to inf. + minAlpha = inf(n, 1); + + % Get the corner points + [bottomLeft, topLeft, bottomRight, topRight] = corners2D(xLim, yLim); + + % left boundary: + minAlpha = updateAlpha(x, xRef, bottomLeft, topLeft, minAlpha); + + % bottom boundary: + minAlpha = updateAlpha(x, xRef, bottomLeft, bottomRight, minAlpha); + + % right boundary: + minAlpha = updateAlpha(x, xRef, bottomRight, topRight, minAlpha); + + % top boundary: + minAlpha = updateAlpha(x, xRef, topLeft, topRight, minAlpha); + + % Create the new point + xNew = x + bsxfun(@times ,minAlpha, (xRef-x)); +end +% ========================================================================= +function [xData, yData] = getVisualData(meta, handle) + % Returns the visual representation of the data (Respecting possible + % log_scaling and projection into the image plane) + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if is3D + zData = get(handle, 'ZData'); + end + + % Get info about log scaling + isXlog = strcmp(get(meta.gca, 'XScale'), 'log'); + if isXlog + xData = log10(xData); + end + isYlog = strcmp(get(meta.gca, 'YScale'), 'log'); + if isYlog + yData = log10(yData); + end + isZlog = strcmp(get(meta.gca, 'ZScale'), 'log'); + if isZlog + zData = log10(zData); + end + + % In case of 3D plots, project the data into the image plane. + if is3D + % Get the projection matrix + P = getProjectionMatrix(meta); + + % Put the data into one matrix accounting for the canonical 4th + % dimension + data = [xData(:), yData(:), zData(:), ones(size(xData(:)))]; + + % Project the data into the image plane + dataProjected = P * data'; + + % Only consider the x and y coordinates and scale them correctly + xData = dataProjected(1, :) ./ dataProjected(4, :); + yData = dataProjected(2, :) ./ dataProjected(4, :); + end + + % Turn the data into a row vector + xData = xData(:); + yData = yData(:); +end +% ========================================================================= +function [xLim, yLim] = getVisualLimits(meta) + % Returns the visual representation of the axis limits (Respecting + % possible log_scaling and projection into the image plane) + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Get the axis limits + xLim = get(meta.gca, 'XLim'); + yLim = get(meta.gca, 'YLim'); + zLim = get(meta.gca, 'ZLim'); + + % Check for logarithmic scales + isXlog = strcmp(get(meta.gca, 'XScale'), 'log'); + if isXlog + xLim = log10(xLim); + end + isYlog = strcmp(get(meta.gca, 'YScale'), 'log'); + if isYlog + yLim = log10(yLim); + end + isZlog = strcmp(get(meta.gca, 'ZScale'), 'log'); + if isZlog + zLim = log10(zLim); + end + + % In case of 3D plots, project the limits into the image plane. Depending + % on the angles, any of the 8 corners of the 3D cube mit be relevant so + % check for all + if is3D + % Get the projection matrix + P = getProjectionMatrix(meta); + + % Get the coordinates of the 8 corners + corners = corners3D(xLim, yLim, zLim); + + % Add the canonical 4th dimension + corners = [corners, ones(8,1)]; + + % Project the corner points to 2D coordinates + cornersProjected = P * corners'; + + % Pick the x and y values of the projected corners and scale them + % correctly + xCorners = cornersProjected(1, :) ./ cornersProjected(4, :); + yCorners = cornersProjected(2, :) ./ cornersProjected(4, :); + + % Get the maximal and minimal values of the x and y coordinates as + % limits + xLim = [min(xCorners), max(xCorners)]; + yLim = [min(yCorners), max(yCorners)]; + end +end +% ========================================================================= +function replaceDataWithNaN(meta, handle, id_replace) + % Replaces data at id_replace with NaNs + + % Only do something if id_replace is not empty + if isempty(id_replace) + return + end + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if is3D + zData = get(handle, 'ZData'); + end + + % Update the data indicated by id_update + xData(id_replace) = NaN(size(id_replace)); + yData(id_replace) = NaN(size(id_replace)); + if is3D + zData(id_replace) = NaN(size(id_replace)); + end + + % Set the new (masked) data. + set(handle, 'XData', xData); + set(handle, 'YData', yData); + if is3D + set(handle, 'ZData', zData); + end +end +% ========================================================================= +function insertData(meta, handle, id_insert, dataInsert) + % Inserts the elements of the cell array dataInsert at position id_insert + + % Only do something if id_insert is not empty + if isempty(id_insert) + return + end + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if is3D + zData = get(handle, 'ZData'); + end + + length_segments = [id_insert(1); + diff(id_insert); + length(xData)-id_insert(end)]; + + % Put the data into one matrix + if is3D + data = [xData(:), yData(:), zData(:)]; + else + data = [xData(:), yData(:)]; + end + + % Cut the data into segments + dataCell = mat2cell(data, length_segments, size(data, 2)); + + % Merge the cell arrays + dataCell = [dataCell'; + dataInsert']; + + % Merge the cells back together + data = cat(1, dataCell{:}); + + % Set the new (masked) data. + set(handle, 'XData', data(:, 1)); + set(handle, 'YData', data(:, 2)); + if is3D + set(handle, 'ZData', data(:, 3)); + end +end +% ========================================================================= +function removeData(meta, handle, id_remove) + % Removes the data at position id_remove + + % Only do something if id_remove is not empty + if isempty(id_remove) + return + end + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if is3D + zData = get(handle, 'ZData'); + end + + % Remove the data indicated by id_remove + xData(id_remove) = []; + yData(id_remove) = []; + if is3D + zData(id_remove) = []; + end + + % Set the new data. + set(handle, 'XData', xData); + set(handle, 'YData', yData); + if is3D + set(handle, 'ZData', zData); + end +end +% ========================================================================= +function removeNaNs(meta, handle) + % Removes superflous NaNs in the data, i.e. those at the end/beginning of + % the data and consequtive ones. + + % Check whether this is a 3D plot + is3D = isAxis3D(meta.gca); + + % Extract the data from the current line handle. + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + if is3D + zData = get(handle, 'ZData'); + end + + % Put the data into one matrix + if is3D + data = [xData(:), yData(:), zData(:)]; + else + data = [xData(:), yData(:)]; + end + + % Remove consecutive NaNs + id_nan = any(isnan(data), 2); + id_remove = find(id_nan); + + % If a NaN is preceeded by another NaN, then diff(id_remove)==1 + id_remove = id_remove(diff(id_remove) == 1); + + % Make sure that there are no NaNs at the beginning of the data since + % this would be interpreted as column names by Pgfplots. + % Also drop all NaNs at the end of the data + id_first = find(~id_nan, 1, 'first'); + id_last = find(~id_nan, 1, 'last'); + + % If there are only NaN data points, remove the whole data + if isempty(id_first) + id_remove = 1:length(xData); + else + id_remove = [1:id_first-1, id_remove', id_last+1:length(xData)]'; + end + + % Remove the NaNs + data(id_remove,:) = []; + + % Set the new data. + set(handle, 'XData', data(:, 1)); + set(handle, 'YData', data(:, 2)); + if is3D + set(handle, 'ZData', data(:, 3)); + end +end +% ========================================================================== +function [bottomLeft, topLeft, bottomRight, topRight] = corners2D(xLim, yLim) + % Determine the corners of the axes as defined by xLim and yLim + bottomLeft = [xLim(1), yLim(1)]; + topLeft = [xLim(1), yLim(2)]; + bottomRight = [xLim(2), yLim(1)]; + topRight = [xLim(2), yLim(2)]; +end +% ========================================================================== +function corners = corners3D(xLim, yLim, zLim) + % Determine the corners of the 3D axes as defined by xLim, yLim, and + % zLim + + % Lower square of the cube + lowerBottomLeft = [xLim(1), yLim(1), zLim(1)]; + lowerTopLeft = [xLim(1), yLim(2), zLim(1)]; + lowerBottomRight = [xLim(2), yLim(1), zLim(1)]; + lowerTopRight = [xLim(2), yLim(2), zLim(1)]; + + % Upper square of the cube + upperBottomLeft = [xLim(1), yLim(1), zLim(2)]; + upperTopLeft = [xLim(1), yLim(2), zLim(2)]; + upperBottomRight = [xLim(2), yLim(1), zLim(2)]; + upperTopRight = [xLim(2), yLim(2), zLim(2)]; + + % Put the into one matrix + corners = [lowerBottomLeft; + lowerTopLeft; + lowerBottomRight; + lowerTopRight; + upperBottomLeft; + upperTopLeft; + upperBottomRight; + upperTopRight]; +end +% ========================================================================== +function P = getProjectionMatrix(meta) + % Calculate the projection matrix from a 3D plot into the image plane + + % Get the projection angle + [az, el] = view(meta.gca); + + % Convert from degrees to radians. + az = az*pi/180; + el = el*pi/180; + + % The transformation into the image plane is done in a two-step process. + % First: rotate around the z-axis by -az (in radians) + rotationZ = [ cos(-az) -sin(-az) 0 0 + sin(-az) cos(-az) 0 0 + 0 0 1 0 + 0 0 0 1]; + + % Second: rotate around the x-axis by (el - pi/2) radians. + % NOTE: There are some trigonometric simplifications, as we use + % (el-pi/2) + % cos(x - pi/2) = sin(x) + % sin(x - pi/2) = -cos(x) + rotationX = [ 1 0 0 0 + 0 sin(el) cos(el) 0 + 0 -cos(el) sin(el) 0 + 0 0 0 1]; + + % Get the data aspect ratio. This is necessary, as the axes usually do + % not have the same scale (xRange~=yRange) + aspectRatio = get(meta.gca, 'DataAspectRatio'); + scaleMatrix = diag([1./aspectRatio, 1]); + + % Calculate the projection matrix + P = rotationX * rotationZ * scaleMatrix; +end +% ========================================================================= +function [W, H] = getWidthHeightInPixels(targetResolution) + % Retrieves target figure width and height in pixels + % TODO: If targetResolution is a scalar, W and H are determined + % differently on different environments (octave, local vs. Travis). + % It is unclear why, as this even happens, if `Units` and `Position` + % are matching. Could it be that the `set(gcf,'Units','Inches')` is not + % taken into consideration for `Position`, directly after setting it? + + % targetResolution is PPI + if isscalar(targetResolution) + % Query figure size in inches and convert W and H to target pixels + oldunits = get(gcf,'Units'); + set(gcf,'Units','Inches'); + figSizeIn = get(gcf,'Position'); + W = figSizeIn(3) * targetResolution; + H = figSizeIn(4) * targetResolution; + set(gcf,'Units', oldunits) % restore original unit + + % It is already in the format we want + else + W = targetResolution(1); + H = targetResolution(2); + end +end +% ========================================================================= +function bool = isValidTargetResolution(val) + bool = isnumeric(val) && ~any(isnan(val)) && (isscalar(val) || numel(val) == 2); +end +% ========================================================================= +function bool = isValidAxis(val) + bool = length(val) <= 3; + for i=1:length(val) + bool = bool && ... + (strcmpi(val(i), 'x') || ... + strcmpi(val(i), 'y') || ... + strcmpi(val(i), 'z')); + end +end +% ======================================================================== +function normalizeAxis(handle, cmdOpts) + % Normalizes data from a given axis into the interval [0, 1] + + % Warn about normalizeAxis being experimental + warning('cleanfigure:normalizeAxis', ... + 'Normalization of axis data is experimental!'); + + for axis = cmdOpts.normalizeAxis(:)' + % Get the scale needed to set xyz-lim to [0, 1] + dateLimits = get(handle, [upper(axis), 'Lim']); + dateScale = 1/diff(dateLimits); + + % Set the TickLabelMode to manual to preserve the labels + set(handle, [upper(axis), 'TickLabelMode'], 'manual'); + + % Project the ticks + ticks = get(handle, [upper(axis), 'Tick']); + ticks = (ticks - dateLimits(1))*dateScale; + + % Set the data + set(handle, [upper(axis), 'Tick'], ticks); + set(handle, [upper(axis), 'Lim'], [0, 1]); + + % Traverse the children + children = get(handle, 'Children'); + for child = children(:)' + if isprop(child, [upper(axis), 'Data']) + % Get the data and transform it + data = get(child, [upper(axis), 'Data']); + data = (data - dateLimits(1))*dateScale; + % Set the data again + set(child, [upper(axis), 'Data'], data); + end + end + end +end +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/src/dev/formatWhitespace.m b/matlab/matlab2tikz-1.1.0/src/dev/formatWhitespace.m new file mode 100644 index 0000000..763d123 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/dev/formatWhitespace.m @@ -0,0 +1,87 @@ +function formatWhitespace(filename) + % FORMATWHITESPACE Formats whitespace and indentation of a document + % + % FORMATWHITESPACE(FILENAME) + % Indents currently active document if FILENAME is empty or not + % specified. FILENAME must be the name of an open document in the + % editor. + % + % Rules: + % - Smart-indent with all function indent option + % - Indentation is 4 spaces + % - Remove whitespace in empty lines + % - Preserve indentantion after line continuations, i.e. ... + % + import matlab.desktop.editor.* + + if nargin < 1, filename = ''; end + + d = getDoc(filename); + oldLines = textToLines(d.Text); + + % Smart indent as AllFunctionIndent + % Using undocumented feature from http://undocumentedmatlab.com/blog/changing-system-preferences-programmatically + editorProp = 'EditorMFunctionIndentType'; + oldVal = com.mathworks.services.Prefs.getStringPref(editorProp); + com.mathworks.services.Prefs.setStringPref(editorProp, 'AllFunctionIndent'); + restoreSettings = onCleanup(@() com.mathworks.services.Prefs.setStringPref(editorProp, oldVal)); + d.smartIndentContents() + + % Preserve crafted continuations of line + lines = textToLines(d.Text); + iContinuation = ~cellfun('isempty',strfind(lines, '...')); + iComment = ~cellfun('isempty',regexp(lines, '^ *%([^%]|$)','once')); + pAfterDots = find(iContinuation & ~iComment)+1; + for ii = 1:numel(pAfterDots) + % Carry over the change in space due to smart-indenting from the + % first continuation line to the last + p = pAfterDots(ii); + nWhiteBefore = find(~isspace(oldLines{p-1}),1,'first'); + nWhiteAfter = find(~isspace(lines{p-1}),1,'first'); + df = nWhiteAfter - nWhiteBefore; + if df > 0 + lines{p} = [blanks(df) oldLines{p}]; + elseif df < 0 + df = min(abs(df)+1, find(~isspace(oldLines{p}),1,'first')); + lines{p} = oldLines{p}(df:end); + else + lines{p} = oldLines{p}; + end + end + + % Remove whitespace lines + idx = cellfun('isempty',regexp(lines, '[^ \t\n]','once')); + lines(idx) = {''}; + + d.Text = linesToText(lines); +end + +function d = getDoc(filename) + import matlab.desktop.editor.* + + if ~ischar(filename) + error('formatWhitespace:charFilename','The FILENAME should be a char.') + end + + try + isEditorAvailable(); + catch + error('formatWhitespace:noEditorApi','Check that the Editor API is available.') + end + + if isempty(filename) + d = getActive(); + else + % TODO: open file if it isn't open in the editor already + d = findOpenDocument(filename); + try + [~,filenameFound] = fileparts(d.Filename); + catch + filenameFound = ''; + end + isExactMatch = strcmp(filename, filenameFound); + if ~isExactMatch + error('formatWhitespace:filenameNotFound','Filename "%s" not found in the editor.', filename) + end + end +end \ No newline at end of file diff --git a/matlab/matlab2tikz-1.1.0/src/figure2dot.m b/matlab/matlab2tikz-1.1.0/src/figure2dot.m new file mode 100644 index 0000000..5a4b6db --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/figure2dot.m @@ -0,0 +1,123 @@ +function figure2dot(filename, varargin) +%FIGURE2DOT Save figure in Graphviz (.dot) file. +% FIGURE2DOT(filename) saves the current figure as dot-file. +% +% FIGURE2DOT(filename, 'object', HGOBJECT) constructs the graph representation +% of the specified object (default: gcf) +% +% You can visualize the constructed DOT file using: +% - [GraphViz](http://www.graphviz.org) on your computer +% - [WebGraphViz](http://www.webgraphviz.com) online +% - [Gravizo](http://www.gravizo.com) for your markdown files +% - and a lot of other software such as OmniGraffle +% +% See also: matlab2tikz, cleanfigure, uiinspect, inspect + + ipp = m2tInputParser(); + ipp = ipp.addRequired(ipp, 'filename', @ischar); + ipp = ipp.addParamValue(ipp, 'object', gcf, @ishghandle); + ipp = ipp.parse(ipp, filename, varargin{:}); + args = ipp.Results; + + filehandle = fopen(args.filename, 'w'); + finally_fclose_filehandle = onCleanup(@() fclose(filehandle)); + + % start printing + fprintf(filehandle, 'digraph simple_hierarchy {\n\n'); + fprintf(filehandle, 'node[shape=box];\n\n'); + + % define the root node + node_number = 0; + p = get(args.object, 'Parent'); + % define root element + type = get(p, 'Type'); + fprintf(filehandle, 'N%d [label="%s"]\n\n', node_number, type); + + % start recursion + plot_children(filehandle, p, node_number); + + % finish off + fprintf(filehandle, '}'); + + % ---------------------------------------------------------------------------- + function plot_children(fh, h, parent_node) + + children = allchild(h); + + for h = children(:)' + if shouldSkip(h), continue, end; + node_number = node_number + 1; + + label = {}; + label = addHGProperty(label, h, 'Type', ''); + try + hClass = class(handle(h)); + label = addProperty(label, 'Class', hClass); + catch + % don't do anything + end + label = addProperty(label, 'Handle', sprintf('%g', double(h))); + label = addHGProperty(label, h, 'Title', ''); + label = addHGProperty(label, h, 'Axes', []); + label = addHGProperty(label, h, 'String', ''); + label = addHGProperty(label, h, 'Tag', ''); + label = addHGProperty(label, h, 'DisplayName', ''); + label = addHGProperty(label, h, 'Visible', 'on'); + label = addHGProperty(label, h, 'HandleVisibility', 'on'); + + % print node + fprintf(fh, 'N%d [label="%s"]\n', ... + node_number, m2tstrjoin(label, '\n')); + + % connect to the child + fprintf(fh, 'N%d -> N%d;\n\n', parent_node, node_number); + + % recurse + plot_children(fh, h, node_number); + end + end +end +% ============================================================================== +function bool = shouldSkip(h) + % returns TRUE for objects that can be skipped + objType = get(h, 'Type'); + bool = ismember(lower(objType), guitypes()); +end +% ============================================================================== +function label = addHGProperty(label, h, propName, default) + % get a HG property and assign it to a GraphViz node label + if ~exist('default','var') || isempty(default) + shouldOmit = @isempty; + elseif isa(default, 'function_handle') + shouldOmit = default; + else + shouldOmit = @(v) isequal(v,default); + end + + if isprop(h, propName) + propValue = get(h, propName); + if numel(propValue) == 1 && ishghandle(propValue) && isprop(propValue, 'String') + % dereference Titles, labels, ... + propValue = get(propValue, 'String'); + elseif ishghandle(propValue) + % dereference other HG objects to their raw handle value (double) + propValue = double(propValue); + elseif iscell(propValue) + propValue = ['{' m2tstrjoin(propValue,',') '}']; + end + + if ~shouldOmit(propValue) + label = addProperty(label, propName, propValue); + end + end +end +function label = addProperty(label, propName, propValue) + % add a property to a GraphViz node label + if isnumeric(propValue) + propValue = num2str(propValue); + elseif iscell(propValue) + propValue = m2tstrjoin(propValue,sprintf('\n')); + end + label = [label, sprintf('%s: %s', propName, propValue)]; +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/src/m2tInputParser.m b/matlab/matlab2tikz-1.1.0/src/m2tInputParser.m new file mode 100644 index 0000000..79b3c6d --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/m2tInputParser.m @@ -0,0 +1,231 @@ +function parser = m2tInputParser() +%MATLAB2TIKZINPUTPARSER Input parsing for matlab2tikz. +% This implementation exists because Octave is lacking one. + + % Initialize the structure. + parser = struct (); + % Public Properties + parser.Results = {}; + % Enabel/disable parameters case sensitivity. + parser.CaseSensitive = false; + % Keep parameters not defined by the constructor. + parser.KeepUnmatched = false; + % Enable/disable warning for parameters not defined by the constructor. + parser.WarnUnmatched = true; + % Enable/disable passing arguments in a structure. + parser.StructExpand = true; + % Names of parameters defined in input parser constructor. + parser.Parameters = {}; + % Names of parameters not defined in the constructor. + parser.Unmatched = struct (); + % Names of parameters using default values. + parser.UsingDefaults = {}; + % Names of deprecated parameters and their alternatives + parser.DeprecatedParameters = struct(); + + % Handles for functions that act on the object. + parser.addRequired = @addRequired; + parser.addOptional = @addOptional; + parser.addParamValue = @addParamValue; + parser.deprecateParam = @deprecateParam; + parser.parse = @parse; + + % Initialize the parser plan + parser.plan = {}; +end +% ========================================================================= +function p = parser_plan (q, arg_type, name, default, validator) + p = q; + plan = p.plan; + if (isempty (plan)) + plan = struct (); + n = 1; + else + n = numel (plan) + 1; + end + plan(n).type = arg_type; + plan(n).name = name; + plan(n).default = default; + plan(n).validator = validator; + p.plan = plan; +end +% ========================================================================= +function p = addRequired (p, name, validator) + p = parser_plan (p, 'required', name, [], validator); +end +% ========================================================================= +function p = addOptional (p, name, default, validator) + p = parser_plan (p, 'optional', name, default, validator); +end +% ========================================================================= +function p = addParamValue (p, name, default, validator) + p = parser_plan (p, 'paramvalue', name, default, validator); +end +% ========================================================================= +function p = deprecateParam (p, name, alternatives) + if isempty(alternatives) + alternatives = {}; + elseif ischar(alternatives) + alternatives = {alternatives}; % make cellstr + elseif ~iscellstr(alternatives) + error('m2tInputParser:BadAlternatives',... + 'Alternatives for a deprecated parameter must be a char or cellstr'); + end + p.DeprecatedParameters.(name) = alternatives; +end +% ========================================================================= +function p = parse (p, varargin) + plan = p.plan; + results = p.Results; + using_defaults = {}; + if (p.CaseSensitive) + name_cmp = @strcmp; + else + name_cmp = @strcmpi; + end + if (p.StructExpand) + k = find (cellfun (@isstruct, varargin)); + for m = numel(k):-1:1 + n = k(m); + s = varargin{n}; + c = [fieldnames(s).'; struct2cell(s).']; + c = c(:).'; + if (n > 1 && n < numel (varargin)) + varargin = horzcat (varargin(1:n-1), c, varargin(n+1:end)); + elseif (numel (varargin) == 1) + varargin = c; + elseif (n == 1); + varargin = horzcat (c, varargin(n+1:end)); + else % n == numel (varargin) + varargin = horzcat (varargin(1:n-1), c); + end + end + end + if (isempty (results)) + results = struct (); + end + type = {plan.type}; + n = find( strcmp( type, 'paramvalue' ) ); + m = setdiff (1:numel( plan ), n ); + plan = plan ([n,m]); + for n = 1 : numel (plan) + found = false; + results.(plan(n).name) = plan(n).default; + if (~ isempty (varargin)) + switch plan(n).type + case 'required' + found = true; + if (strcmpi (varargin{1}, plan(n).name)) + varargin(1) = []; + end + value = varargin{1}; + varargin(1) = []; + case 'optional' + m = find (cellfun (@ischar, varargin)); + k = find (name_cmp (plan(n).name, varargin(m))); + if (isempty (k) && validate_arg (plan(n).validator, varargin{1})) + found = true; + value = varargin{1}; + varargin(1) = []; + elseif (~ isempty (k)) + m = m(k); + found = true; + value = varargin{max(m)+1}; + varargin(union(m,m+1)) = []; + end + case 'paramvalue' + m = find( cellfun (@ischar, varargin) ); + k = find (name_cmp (plan(n).name, varargin(m))); + if (~ isempty (k)) + found = true; + m = m(k); + value = varargin{max(m)+1}; + varargin(union(m,m+1)) = []; + end + otherwise + error( sprintf ('%s:parse', mfilename), ... + 'parse (%s): Invalid argument type.', mfilename ... + ) + end + end + if (found) + if (validate_arg (plan(n).validator, value)) + results.(plan(n).name) = value; + else + error( sprintf ('%s:invalidinput', mfilename), ... + '%s: Input argument ''%s'' has invalid value.\n', mfilename, plan(n).name ... + ); + end + p.Parameters = union (p.Parameters, {plan(n).name}); + elseif (strcmp (plan(n).type, 'required')) + error( sprintf ('%s:missinginput', mfilename), ... + '%s: input ''%s'' is missing.\n', mfilename, plan(n).name ... + ); + else + using_defaults = union (using_defaults, {plan(n).name}); + end + end + + if ~isempty(varargin) + % Include properties that do not match specified properties + for n = 1:2:numel(varargin) + if ischar(varargin{n}) + if p.KeepUnmatched + results.(varargin{n}) = varargin{n+1}; + end + if p.WarnUnmatched + warning(sprintf('%s:unmatchedArgument',mfilename), ... + 'Ignoring unknown argument "%s"', varargin{n}); + end + p.Unmatched.(varargin{n}) = varargin{n+1}; + else + error (sprintf ('%s:invalidinput', mfilename), ... + '%s: invalid input', mfilename) + end + end + end + + % Store the results of the parsing + p.Results = results; + p.UsingDefaults = using_defaults; + + warnForDeprecatedParameters(p); +end +% ========================================================================= +function result = validate_arg (validator, arg) + try + result = validator (arg); + catch %#ok + result = false; + end +end +% ========================================================================= +function warnForDeprecatedParameters(p) + usedDeprecatedParameters = intersect(p.Parameters, fieldnames(p.DeprecatedParameters)); + + for iParam = 1:numel(usedDeprecatedParameters) + oldParameter = usedDeprecatedParameters{iParam}; + alternatives = p.DeprecatedParameters.(oldParameter); + + switch numel(alternatives) + case 0 + replacements = ''; + case 1 + replacements = ['''' alternatives{1} '''']; + otherwise + replacements = deblank(sprintf('''%s'' and ',alternatives{:})); + replacements = regexprep(replacements,' and$',''); + end + if ~isempty(replacements) + replacements = sprintf('From now on, please use %s to control the output.\n',replacements); + end + + message = ['\n===============================================================================\n', ... + 'You are using the deprecated parameter ''%s''.\n', ... + '%s', ... + '===============================================================================']; + warning('matlab2tikz:deprecatedParameter', ... + message, oldParameter, replacements); + + end +end diff --git a/matlab/matlab2tikz-1.1.0/src/matlab2tikz.m b/matlab/matlab2tikz-1.1.0/src/matlab2tikz.m new file mode 100644 index 0000000..635da19 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/matlab2tikz.m @@ -0,0 +1,6805 @@ +function matlab2tikz(varargin) + %MATLAB2TIKZ Save figure in native LaTeX (TikZ/Pgfplots). + % MATLAB2TIKZ() saves the current figure as LaTeX file. + % MATLAB2TIKZ comes with several options that can be combined at will. + % + % MATLAB2TIKZ(FILENAME,...) or MATLAB2TIKZ('filename',FILENAME,...) + % stores the LaTeX code in FILENAME. + % + % MATLAB2TIKZ('filehandle',FILEHANDLE,...) stores the LaTeX code in the file + % referenced by FILEHANDLE. (default: []) + % + % MATLAB2TIKZ('figurehandle',FIGUREHANDLE,...) explicitly specifies the + % handle of the figure that is to be stored. (default: gcf) + % + % MATLAB2TIKZ('colormap',DOUBLE,...) explicitly specifies the colormap to be + % used. (default: current color map) + % + % MATLAB2TIKZ('strict',BOOL,...) tells MATLAB2TIKZ to adhere to MATLAB(R) + % conventions wherever there is room for relaxation. (default: false) + % + % MATLAB2TIKZ('strictFontSize',BOOL,...) retains the exact font sizes + % specified in MATLAB for the TikZ code. This goes against normal LaTeX + % practice. (default: false) + % + % MATLAB2TIKZ('showInfo',BOOL,...) turns informational output on or off. + % (default: true) + % + % MATLAB2TIKZ('showWarnings',BOOL,...) turns warnings on or off. + % (default: true) + % + % MATLAB2TIKZ('imagesAsPng',BOOL,...) stores MATLAB(R) images as (lossless) + % PNG files. This is more efficient than storing the image color data as TikZ + % matrix. (default: true) + % + % MATLAB2TIKZ('externalData',BOOL,...) stores all data points in external + % files as tab separated values (TSV files). (default: false) + % + % MATLAB2TIKZ('dataPath',CHAR, ...) defines where external data files + % and/or PNG figures are saved. It can be either an absolute or a relative + % path with respect to your MATLAB work directory. By default, data files are + % placed in the same directory as the TikZ output file. To place data files + % in your MATLAB work directory, you can use '.'. (default: []) + % + % MATLAB2TIKZ('relativeDataPath',CHAR, ...) tells MATLAB2TIKZ to use the + % given path to follow the external data files and PNG files. This is the + % relative path from your main LaTeX file to the data file directory. + % By default the same directory is used as the output (default: []) + % + % MATLAB2TIKZ('height',CHAR,...) sets the height of the image. This can be + % any LaTeX-compatible length, e.g., '3in' or '5cm' or '0.5\textwidth'. If + % unspecified, MATLAB2TIKZ tries to make a reasonable guess. + % + % MATLAB2TIKZ('width',CHAR,...) sets the width of the image. + % If unspecified, MATLAB2TIKZ tries to make a reasonable guess. + % + % MATLAB2TIKZ('noSize',BOOL,...) determines whether 'width', 'height', and + % 'scale only axis' are specified in the generated TikZ output. For compatibility with the + % tikzscale package set this to true. (default: false) + % + % MATLAB2TIKZ('extraCode',CHAR or CELLCHAR,...) explicitly adds extra code + % at the beginning of the output file. (default: []) + % + % MATLAB2TIKZ('extraCodeAtEnd',CHAR or CELLCHAR,...) explicitly adds extra + % code at the end of the output file. (default: []) + % + % MATLAB2TIKZ('extraAxisOptions',CHAR or CELLCHAR,...) explicitly adds extra + % options to the Pgfplots axis environment. (default: []) + % + % MATLAB2TIKZ('extraColors', {{'name',[R G B]}, ...} , ...) adds + % user-defined named RGB-color definitions to the TikZ output. + % R, G and B are expected between 0 and 1. (default: {}) + % + % MATLAB2TIKZ('extraTikzpictureOptions',CHAR or CELLCHAR,...) + % explicitly adds extra options to the tikzpicture environment. (default: []) + % + % MATLAB2TIKZ('encoding',CHAR,...) sets the encoding of the output file. + % + % MATLAB2TIKZ('floatFormat',CHAR,...) sets the format used for float values. + % You can use this to decrease the file size. (default: '%.15g') + % + % MATLAB2TIKZ('maxChunkLength',INT,...) sets maximum number of data points + % per \addplot for line plots (default: 4000) + % + % MATLAB2TIKZ('parseStrings',BOOL,...) determines whether title, axes labels + % and the like are parsed into LaTeX by MATLAB2TIKZ's parser. + % If you want greater flexibility, set this to false and use straight LaTeX + % for your labels. (default: true) + % + % MATLAB2TIKZ('parseStringsAsMath',BOOL,...) determines whether to use TeX's + % math mode for more characters (e.g. operators and figures). (default: false) + % + % MATLAB2TIKZ('showHiddenStrings',BOOL,...) determines whether to show + % strings whose were deliberately hidden. This is usually unnecessary, but + % can come in handy for unusual plot types (e.g., polar plots). (default: + % false) + % + % MATLAB2TIKZ('interpretTickLabelsAsTex',BOOL,...) determines whether to + % interpret tick labels as TeX. MATLAB(R) doesn't allow to do that in R2014a + % or before. In R2014b and later, please set the "TickLabelInterpreter" + % property of the relevant axis to get the same effect. (default: false) + % + % MATLAB2TIKZ('arrowHeadSize', FLOAT, ...) allows to resize the arrow heads + % in quiver plots by rescaling the arrow heads by a positive scalar. (default: 10) + % + % MATLAB2TIKZ('tikzFileComment',CHAR,...) adds a custom comment to the header + % of the output file. (default: '') + % + % MATLAB2TIKZ('addLabels',BOOL,...) add labels to plots: using Tag property + % or automatic names (where applicable) which make it possible to refer to + % them using \ref{...} (e.g., in the caption of a figure). (default: false) + % + % MATLAB2TIKZ('standalone',BOOL,...) determines whether to produce + % a standalone compilable LaTeX file. Setting this to true may be useful for + % taking a peek at what the figure will look like. (default: false) + % + % MATLAB2TIKZ('checkForUpdates',BOOL,...) determines whether to automatically + % check for updates of matlab2tikz. (default: true (if not using git)) + % + % MATLAB2TIKZ('semanticLineWidths',CELLMATRIX,...) allows you to customize + % the mapping of semantic "line width" values. + % A valid entry is an Nx2 cell array: + % - the first column contains the semantic names, + % - the second column contains the corresponding line widths in points. + % The entries you provide are used in addition to the pgf defaults: + % {'ultra thin', 0.1; 'very thin' , 0.2; 'thin', 0.4; 'semithick', 0.6; + % 'thick' , 0.8; 'very thick', 1.2; 'ultra thick', 1.6} + % or a single "NaN" can be provided to turn off this feature alltogether. + % If you specify the default names, their mapping will be overwritten. + % Inside your LaTeX document, you are responsible to make sure these TikZ + % styles are properly defined. + % (Default: NaN) + % + % Example + % x = -pi:pi/10:pi; + % y = tan(sin(x)) - sin(tan(x)); + % plot(x,y,'--rs'); + % matlab2tikz('myfile.tex'); + % + % See also: cleanfigure + + %% Check if we are in MATLAB or Octave. + minimalVersion = struct('MATLAB', struct('name','2014a', 'num',[8 3]), ... + 'Octave', struct('name','3.8', 'num',[3 8])); + checkDeprecatedEnvironment(minimalVersion); + + m2t.args = []; % For command line arguments + m2t.current = []; % For currently active objects + m2t.transform = []; % For hgtransform groups + m2t.pgfplotsVersion = [1,3]; + m2t.about.name = 'matlab2tikz'; + m2t.about.version = '1.1.0'; + m2t.about.years = '2008--2016'; + m2t.about.website = 'http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz-matlab2tikz'; + m2t.about.github = 'https://github.com/matlab2tikz/matlab2tikz'; + m2t.about.wiki = [m2t.about.github '/wiki']; + m2t.about.issues = [m2t.about.github '/issues']; + m2t.about.develop = [m2t.about.github '/tree/develop']; + VCID = VersionControlIdentifier(); + m2t.about.versionFull = strtrim(sprintf('v%s %s', m2t.about.version, VCID)); + + m2t.tol = 1.0e-15; % numerical tolerance (e.g. used to test equality of doubles) + + % the actual contents of the TikZ file go here + m2t.content = struct('name', '', ... + 'comment', [], ... + 'options', {opts_new()}, ... + 'content', {cell(0)}, ... + 'children', {cell(0)}); + m2t.preamble = sprintf(['\\usepackage[T1]{fontenc}\n', ... + '\\usepackage[utf8]{inputenc}\n', ... + '\\usepackage{pgfplots}\n', ... + '\\usepackage{grffile}\n', ... + '\\pgfplotsset{compat=newest}\n', ... + '\\usetikzlibrary{plotmarks}\n', ... + '\\usetikzlibrary{arrows.meta}\n', ... + '\\usepgfplotslibrary{patchplots}\n', ... + '\\usepackage{amsmath}\n']); + + %% scan the options + ipp = m2tInputParser; + + ipp = ipp.addOptional(ipp, 'filename', '', @(x) filenameValidation(x,ipp)); + ipp = ipp.addOptional(ipp, 'filehandle', [], @filehandleValidation); + + ipp = ipp.addParamValue(ipp, 'figurehandle', get(0,'CurrentFigure'), @ishandle); + ipp = ipp.addParamValue(ipp, 'colormap', [], @isnumeric); + ipp = ipp.addParamValue(ipp, 'strict', false, @islogical); + ipp = ipp.addParamValue(ipp, 'strictFontSize', false, @islogical); + ipp = ipp.addParamValue(ipp, 'showInfo', true, @islogical); + ipp = ipp.addParamValue(ipp, 'showWarnings', true, @islogical); + ipp = ipp.addParamValue(ipp, 'checkForUpdates', isempty(VCID), @islogical); + + ipp = ipp.addParamValue(ipp, 'semanticLineWidths', NaN, @isValidSemanticLineWidthDefinition); + + ipp = ipp.addParamValue(ipp, 'encoding' , '', @ischar); + ipp = ipp.addParamValue(ipp, 'standalone', false, @islogical); + ipp = ipp.addParamValue(ipp, 'tikzFileComment', '', @ischar); + ipp = ipp.addParamValue(ipp, 'extraColors', {}, @isColorDefinitions); + ipp = ipp.addParamValue(ipp, 'extraCode', {}, @isCellOrChar); + ipp = ipp.addParamValue(ipp, 'extraCodeAtEnd', {}, @isCellOrChar); + ipp = ipp.addParamValue(ipp, 'extraAxisOptions', {}, @isCellOrChar); + ipp = ipp.addParamValue(ipp, 'extraTikzpictureOptions', {}, @isCellOrChar); + ipp = ipp.addParamValue(ipp, 'floatFormat', '%.15g', @ischar); + ipp = ipp.addParamValue(ipp, 'automaticLabels', false, @islogical); + ipp = ipp.addParamValue(ipp, 'addLabels', false, @islogical); + ipp = ipp.addParamValue(ipp, 'showHiddenStrings', false, @islogical); + ipp = ipp.addParamValue(ipp, 'height', '', @ischar); + ipp = ipp.addParamValue(ipp, 'width' , '', @ischar); + ipp = ipp.addParamValue(ipp, 'imagesAsPng', true, @islogical); + ipp = ipp.addParamValue(ipp, 'externalData', false, @islogical); + ipp = ipp.addParamValue(ipp, 'dataPath', '', @ischar); + ipp = ipp.addParamValue(ipp, 'relativeDataPath', '', @ischar); + ipp = ipp.addParamValue(ipp, 'noSize', false, @islogical); + ipp = ipp.addParamValue(ipp, 'arrowHeadSize', 10, @(x) x>0); + + % Maximum chunk length. + % TeX parses files line by line with a buffer of size buf_size. If the + % plot has too many data points, pdfTeX's buffer size may be exceeded. + % As a work-around, the plot is split into several smaller chunks. + % + % What is a "large" array? + % TeX parser buffer is buf_size=200 000 char on Mac TeXLive, let's say + % 100 000 to be on the safe side. + % 1 point is represented by 25 characters (estimation): 2 coordinates (10 + % char), 2 brackets, comma and white space, + 1 extra char. + % That gives a magic arbitrary number of 4000 data points per array. + ipp = ipp.addParamValue(ipp, 'maxChunkLength', 4000, @isnumeric); + + % By default strings like axis labels are parsed to match the appearance of + % strings as closely as possible to that generated by MATLAB. + % If the user wants to have particular strings in the matlab2tikz output that + % can't be generated in MATLAB, they can disable string parsing. In that case + % all strings are piped literally to the LaTeX output. + ipp = ipp.addParamValue(ipp, 'parseStrings', true, @islogical); + + % In addition to regular string parsing, an additional stage can be enabled + % which uses TeX's math mode for more characters like figures and operators. + ipp = ipp.addParamValue(ipp, 'parseStringsAsMath', false, @islogical); + + % As opposed to titles, axis labels and such, MATLAB(R) does not interpret tick + % labels as TeX. matlab2tikz retains this behavior, but if it is desired to + % interpret the tick labels as TeX, set this option to true. + ipp = ipp.addParamValue(ipp, 'interpretTickLabelsAsTex', false, @islogical); + + %% deprecated parameters (will auto-generate warnings upon parse) + ipp = ipp.addParamValue(ipp, 'relativePngPath', '', @ischar); + ipp = ipp.deprecateParam(ipp, 'relativePngPath', 'relativeDataPath'); + ipp = ipp.deprecateParam(ipp, 'automaticLabels', 'addLabels'); + + %% Finally parse all the arguments + ipp = ipp.parse(ipp, varargin{:}); + m2t.args = ipp.Results; % store the input arguments back into the m2t data struct + + %% Inform users of potentially dangerous options + warnAboutParameter(m2t, 'parseStringsAsMath', @(opt)(opt==true), ... + ['This may produce undesirable string output. For full control over output\n', ... + 'strings please set the parameter "parseStrings" to false.']); + warnAboutParameter(m2t, 'noSize', @(opt)(opt==true), ... + 'This may impede both axes sizing and placement!'); + warnAboutParameter(m2t, 'imagesAsPng', @(opt)(opt==false), ... + ['It is highly recommended to use PNG data to store images.\n', ... + 'Make sure to set "imagesAsPng" to true.']); + + %% Do some global initialization + m2t.color = configureColors(m2t.args.extraColors); + m2t.semantic.LineWidth = configureSemanticLineWidths(m2t.args.semanticLineWidths); + + % define global counter variables + m2t.count.pngFile = 0; % number of PNG files + m2t.count.tsvFile = 0; % number of TSV files + m2t.count.autolabel = 0; % number of automatic labels + m2t.count.plotyylabel = 0; % number of plotyy labels + + %% shortcut + m2t.ff = m2t.args.floatFormat; + + %% add global elements + if isempty(m2t.args.figurehandle) + error('matlab2tikz:figureNotFound','MATLAB figure not found.'); + end + m2t.current.gcf = m2t.args.figurehandle; + if m2t.args.colormap + m2t.current.colormap = m2t.args.colormap; + else + m2t.current.colormap = get(m2t.current.gcf, 'colormap'); + end + + %% handle output file handle/file name + [m2t, fid, fileWasOpen] = openFileForOutput(m2t); + + % By default, reference the PNG (if required) from the TikZ file + % as the file path of the TikZ file itself. This works if the MATLAB script + % is executed in the same folder where the TeX file sits. + if isempty(m2t.args.relativeDataPath) + if ~isempty(m2t.args.relativePngPath) + %NOTE: eventually break backwards compatibility of relative PNG path + m2t.relativeDataPath = m2t.args.relativePngPath; + userWarning(m2t, ['Using "relativePngPath" for "relativeDataPath".', ... + ' This will stop working in a future release.']); + else + m2t.relativeDataPath = m2t.args.relativeDataPath; + end + else + m2t.relativeDataPath = m2t.args.relativeDataPath; + end + if isempty(m2t.args.dataPath) + m2t.dataPath = fileparts(m2t.tikzFileName); + else + m2t.dataPath = m2t.args.dataPath; + end + + %% print some version info to the screen + userInfo(m2t, ['(To disable info messages, pass [''showInfo'', false] to matlab2tikz.)\n', ... + '(For all other options, type ''help matlab2tikz''.)\n']); + + userInfo(m2t, '\nThis is %s %s.\n', m2t.about.name, m2t.about.versionFull) + + % In Octave, put a new line and some spaces in between the URLs for clarity. + % In MATLAB this is not necessary, since the URLs get (shorter) descriptions. + sep = switchMatOct('', sprintf('\n ')); + versionInfo = ['The latest developments can be retrieved from %s.\n', ... + 'You can find more documentation on %s and %s.\n', ... + 'If you encounter bugs or want a new feature, go to %s.\n', ... + 'Please visit %s to rate %s or download the stable release.\n']; + userInfo(m2t, versionInfo, ... + clickableUrl(m2t.about.develop, 'our development branch'), ... + [sep clickableUrl(m2t.about.github, 'our GitHub page') sep], ... + [sep clickableUrl(m2t.about.wiki, 'wiki')], ... + [sep clickableUrl(m2t.about.issues, 'our issue tracker')],... + [clickableUrl(m2t.about.website, 'FileExchange') sep],... + m2t.about.name); + + %% Save the figure as TikZ to file + m2t = saveToFile(m2t, fid, fileWasOpen); + + %% Check for a new matlab2tikz version outside version control + if m2t.args.checkForUpdates + m2tUpdater(m2t.about, m2t.args.showInfo); + end + +end +% ============================================================================== +function [m2t, counterValue] = incrementGlobalCounter(m2t, counterName) + % Increments a global counter value and returns its value + m2t.count.(counterName) = m2t.count.(counterName) + 1; + counterValue = m2t.count.(counterName); +end +% ============================================================================== +function colorConfig = configureColors(extraColors) + % Sets the global color options for matlab2tikz + colorConfig = struct(); + + % Set the color resolution. + colorConfig.depth = 48; %[bit] RGB color depth (typical values: 24, 30, 48) + colorConfig.precision = 2^(-colorConfig.depth/3); + colorConfig.format = sprintf('%%0.%df',ceil(-log10(colorConfig.precision))); + + % The following color RGB-values which will need to be defined: + % + % - 'extraNames' contains their designated names, + % - 'extraSpecs' their RGB specifications. + [colorConfig.extraNames, colorConfig.extraSpecs] = ... + dealColorDefinitions(extraColors); +end +% ============================================================================== +function [m2t, fid, fileWasOpen] = openFileForOutput(m2t) + % opens the output file and/or show a dialog to select one + if ~isempty(m2t.args.filehandle) + fid = m2t.args.filehandle; + fileWasOpen = true; + if ~isempty(m2t.args.filename) + userWarning(m2t, ... + 'File handle AND file name for output given. File handle used, file name discarded.') + end + m2t.tikzFileName = fopen(fid); + else + fid = []; + fileWasOpen = false; + % set filename + if ~isempty(m2t.args.filename) + filename = m2t.args.filename; + else + [filename, pathname] = uiputfile({'*.tex;*.tikz'; '*.*'}, 'Save File'); + filename = fullfile(pathname, filename); + end + m2t.tikzFileName = filename; + end + +end +% ============================================================================== +function l = filenameValidation(x, p) + % is the filename argument NOT another keyword? + l = ischar(x) && ~any(strcmp(x,p.Parameters)); %FIXME: See #471 +end +% ============================================================================== +function l = filehandleValidation(x) + % is the filehandle the handle to an opened file? + l = isnumeric(x) && any(x==fopen('all')); +end +% ============================================================================== +function bool = isCellOrChar(x) + bool = iscell(x) || ischar(x); +end +% ============================================================================== +function bool = isRGBTuple(color) + % Returns true when the color is a valid RGB tuple + bool = numel(color) == 3 && ... + all(isreal(color)) && ... + all( 0<=color & color<=1 ); % this also disallows NaN entries +end +% ============================================================================== +function bool = isColorDefinitions(colors) + % Returns true when the input is a cell array of color definitions, i.e. + % a cell array with in each cell a cell of the form {'name', [R G B]} + isValidEntry = @(e)( iscell(e) && ischar(e{1}) && isRGBTuple(e{2}) ); + + bool = iscell(colors) && all(cellfun(isValidEntry, colors)); +end +% ============================================================================== +function bool = isValidSemanticLineWidthDefinition(defMat) + % Returns true when the input is a cell array of shape Nx2 and + % contents in each column a set of string and numerical value as needed + % for the semanticLineWidth option. + bool = iscell(defMat) && size(defMat, 2) == 2; % Nx2 cell array + bool = bool && all(cellfun(@ischar , defMat(:,1))); % first column: names + bool = bool && all(cellfun(@isnumeric, defMat(:,2))); % second column: line width in points + + % alternatively: just 1 NaN to remove the defaults + bool = bool || (numel(defMat)==1 && isnan(defMat)); +end +% ============================================================================== +function fid = fileOpenForWrite(m2t, filename) + % Set the encoding of the output file. + % Currently only MATLAB supports different encodings. + fid = -1; + + [filepath] = fileparts(filename); + if ~exist(filepath,'dir') && ~isempty(filepath) + mkdir(filepath); + end + + switch getEnvironment() + case 'MATLAB' + fid = fopen(filename, 'w', ... + 'native', m2t.args.encoding); + case 'Octave' + fid = fopen(filename, 'w'); + otherwise + errorUnknownEnvironment(); + end + + if fid == -1 + error('matlab2tikz:fileOpenError', ... + 'Unable to open file ''%s'' for writing.', filename); + end +end +% ============================================================================== +function path = TeXpath(path) + path = strrep(path, filesep, '/'); + % TeX uses '/' as a file separator (as UNIX). Windows, however, uses + % '\' which is not supported by TeX as a file separator +end +% ============================================================================== +function m2t = saveToFile(m2t, fid, fileWasOpen) + % Save the figure as TikZ to a file. All other routines are called from here. + + % get all axes handles + [m2t, axesHandles] = findPlotAxes(m2t, m2t.current.gcf); + + % Turn around the handles vector to make sure that plots that appeared + % first also appear first in the vector. This makes sure the z-order of + % superimposed axes is respected and is fundamental for plotyy. + axesHandles = axesHandles(end:-1:1); + + % Alternative Positioning of axes. + % Select relevant Axes and draw them. + [m2t, axesBoundingBox] = getRelevantAxes(m2t, axesHandles); + + m2t.axesBoundingBox = axesBoundingBox; + m2t.axes = {}; + for relevantAxesHandle = m2t.relevantAxesHandles(:)' + m2t = drawAxes(m2t, relevantAxesHandle); + end + + % Handle color bars. + for cbar = m2t.cbarHandles(:)' + m2t = handleColorbar(m2t, cbar); + end + + % Draw annotations + m2t = drawAnnotations(m2t); + + % Add all axes containers to the file contents. + for axesContainer = m2t.axes + m2t.content = addChildren(m2t.content, axesContainer); + end + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % actually print the stuff + minimalPgfplotsVersion = formatPgfplotsVersion(m2t.pgfplotsVersion); + + m2t.content.comment = sprintf('This file was created by %s.\n', m2t.about.name); + + if m2t.args.showInfo + % disable this info if showInfo=false + m2t.content.comment = [m2t.content.comment, ... + sprintf(['\n',... + 'The latest updates can be retrieved from\n', ... + ' %s\n', ... + 'where you can also make suggestions and rate %s.\n'], ... + m2t.about.website, m2t.about.name ) ... + ]; + end + + userInfo(m2t, 'You will need pgfplots version %s or newer to compile the TikZ output.',... + minimalPgfplotsVersion); + + % Add custom comment. + if ~isempty(m2t.args.tikzFileComment) + m2t.content.comment = [m2t.content.comment, ... + sprintf('\n%s\n', m2t.args.tikzFileComment) + ]; + end + + m2t.content.name = 'tikzpicture'; + + % Add custom TikZ options if any given. + m2t.content.options = opts_append_userdefined(m2t.content.options, ... + m2t.args.extraTikzpictureOptions); + + m2t.content.colors = generateColorDefinitions(m2t.color); + + % Open file if was not open + if ~fileWasOpen + fid = fileOpenForWrite(m2t, m2t.tikzFileName); + finally_fclose_fid = onCleanup(@() fclose(fid)); + end + + % Finally print it to the file + addComments(fid, m2t.content.comment); + addStandalone(m2t, fid, 'preamble'); + addCustomCode(fid, '', m2t.args.extraCode, ''); + addStandalone(m2t, fid, 'begin'); + + printAll(m2t, m2t.content, fid); % actual plotting happens here + + addCustomCode(fid, '\n', m2t.args.extraCodeAtEnd, ''); + + addStandalone(m2t, fid, 'end'); +end +% ============================================================================== +function addStandalone(m2t, fid, part) + % writes a part of a standalone LaTeX file definition + if m2t.args.standalone + switch part + case 'preamble' + fprintf(fid, '\\documentclass[tikz]{standalone}\n%s\n', m2t.preamble); + case 'begin' + fprintf(fid, '\\begin{document}\n'); + case 'end' + fprintf(fid, '\n\\end{document}'); + otherwise + error('m2t:unknownStandalonePart', ... + 'Unknown standalone part "%s"', part); + end + end +end +% ============================================================================== +function str = generateColorDefinitions(colorConfig) + % Output the color definitions to LaTeX + str = ''; + names = colorConfig.extraNames; + specs = colorConfig.extraSpecs; + ff = colorConfig.format; + + if ~isempty(names) + colorDef = cell(1, length(names)); + for k = 1:length(names) + % Append with '%' to avoid spacing woes in LaTeX + FORMAT = ['\\definecolor{%s}{rgb}{' ff ',' ff ',' ff '}%%\n']; + colorDef{k} = sprintf(FORMAT, names{k}, specs{k}); + end + str = m2tstrjoin([colorDef, sprintf('%%\n')], ''); + end +end +% ============================================================================== +function [m2t, axesHandles] = findPlotAxes(m2t, fh) + % find axes handles that are not legends/colorbars + % store detected legends and colorbars in 'm2t' + % fh figure handle + axesHandles = findall(fh, 'type', 'axes'); + + % Remove all legend handles, as they are treated separately. + if ~isempty(axesHandles) + % TODO fix for octave + tagKeyword = switchMatOct('Tag', 'tag'); + % Find all legend handles. This is MATLAB-only. + m2t.legendHandles = findall(fh, tagKeyword, 'legend'); + m2t.legendHandles = m2t.legendHandles(:)'; + idx = ~ismember(axesHandles, m2t.legendHandles); + axesHandles = axesHandles(idx); + end + + % Remove all colorbar handles, as they are treated separately. + if ~isempty(axesHandles) + colorbarKeyword = switchMatOct('Colorbar', 'colorbar'); + % Find all colorbar handles. This is MATLAB-only. + cbarHandles = findall(fh, tagKeyword, colorbarKeyword); + % Octave also finds text handles here; no idea why. Filter. + m2t.cbarHandles = []; + for h = cbarHandles(:)' + if any(strcmpi(get(h, 'Type'),{'axes','colorbar'})) + m2t.cbarHandles = [m2t.cbarHandles, h]; + end + end + m2t.cbarHandles = m2t.cbarHandles(:)'; + idx = ~ismember(axesHandles, m2t.cbarHandles); + axesHandles = axesHandles(idx); + else + m2t.cbarHandles = []; + end + + % Remove scribe layer holding annotations (MATLAB < R2014b) + m2t.scribeLayer = findall(axesHandles, 'Tag','scribeOverlay'); + idx = ~ismember(axesHandles, m2t.scribeLayer); + axesHandles = axesHandles(idx); +end +% ============================================================================== +function addComments(fid, comment) + % prints TeX comments to file stream |fid| + if ~isempty(comment) + newline = sprintf('\n'); + newlineTeX = sprintf('\n%%'); + fprintf(fid, '%% %s\n', strrep(comment, newline, newlineTeX)); + end +end +% ============================================================================== +function addCustomCode(fid, before, code, after) + if ~isempty(code) + fprintf(fid, before); + if ischar(code) + code = {code}; + end + if iscellstr(code) + for str = code(:)' + fprintf(fid, '%s\n', str{1}); + end + else + error('matlab2tikz:saveToFile', 'Need str or cellstr.'); + end + fprintf(fid,after); + end +end +% ============================================================================== +function [m2t, pgfEnvironments] = handleAllChildren(m2t, h) + % Draw all children of a graphics object (if they need to be drawn). + % #COMPLEX: mainly a switch-case + str = ''; + children = allchild(h); + + % prepare cell array of pgfEnvironments + pgfEnvironments = cell(1, numel(children)); + envCounter = 1; + + % It's important that we go from back to front here, as this is + % how MATLAB does it, too. Significant for patch (contour) plots, + % and the order of plotting the colored patches. + for child = children(end:-1:1)' + + % Check if object has legend. Some composite objects need to determine + % their status at the root level. For detailed explanations check + % getLegendEntries(). + % TODO: could move this check into drawHggroup. Need to verify how + % hgtransform behaves though. (priority - LOW) + m2t = hasLegendEntry(m2t,child); + + switch char(get(child, 'Type')) + % 'axes' environments are treated separately. + + case 'line' + [m2t, str] = drawLine(m2t, child); + + case 'patch' + [m2t, str] = drawPatch(m2t, child); + + case 'image' + [m2t, str] = drawImage(m2t, child); + + case {'hggroup', 'matlab.graphics.primitive.Group', ... + 'scatter', 'bar', 'stair', 'stem' ,'errorbar', 'area', ... + 'quiver','contour'} + [m2t, str] = drawHggroup(m2t, child); + + case 'hgtransform' + % From http://www.mathworks.de/de/help/matlab/ref/hgtransformproperties.html: + % Matrix: 4-by-4 matrix + % Transformation matrix applied to hgtransform object and its + % children. The hgtransform object applies the transformation + % matrix to all its children. + % More information at http://www.mathworks.de/de/help/matlab/creating_plots/group-objects.html. + m2t.transform = get(child, 'Matrix'); + [m2t, str] = handleAllChildren(m2t, child); + m2t.transform = []; + + case 'surface' + [m2t, str] = drawSurface(m2t, child); + + case 'text' + [m2t, str] = drawVisibleText(m2t, child); + + case 'rectangle' + [m2t, str] = drawRectangle(m2t, child); + + case 'histogram' + [m2t, str] = drawHistogram(m2t, child); + + case guitypes() + % don't do anything for GUI objects and their children + str = ''; + + case 'light' + % These objects are not supported and should not/cannot be + % supported by matlab2tikz or pgfplots. + + case '' + % No children found for handle. (It has only a title and/or + % labels). Carrying on as if nothing happened + + otherwise + error('matlab2tikz:handleAllChildren', ... + 'I don''t know how to handle this object: %s\n', ... + get(child, 'Type')); + + end + + % A composite object might nest handleAllChildren calls that can + % modify the m2t.currentHandleHasLegend value. Re-instate the + % legend status. For detailed explanations check getLegendEntries(). + m2t = hasLegendEntry(m2t,child); + [m2t, legendLabel, labelRef] = addPlotyyReference(m2t, child); + legendInfo = addLegendInformation(m2t, child); + % Add labelRef BEFORE next plot to preserve color order + str = join(m2t, {labelRef, str, legendLabel, legendInfo}, ''); + + % append the environment + pgfEnvironments{envCounter} = str; + envCounter = envCounter +1; + end +end +% ============================================================================== +function [m2t, label, labelRef] = addPlotyyReference(m2t, h) + % Create labelled references to legend entries of the main plotyy axis + + % This ensures we are either on the main or secondary axis + label = ''; + labelRef = ''; + if ~isAxisPlotyy(m2t.current.gca) + return + end + + % Get current label counter + + if hasPlotyyReference(m2t,h) + % Label the plot to later reference it. Only legend entries on the main + % plotyy axis will have a label + [m2t, labelNum] = incrementGlobalCounter(m2t, 'plotyylabel'); + label = sprintf('\\label{%s}\n\n', plotyyLabelName(labelNum)); + + elseif m2t.currentHandleHasLegend && ~isempty(m2t.axes{end}.PlotyyReferences) + % We are on the secondary axis. + + % We have produced a number of labels we can refer to so far. + % Also, here we have a number of references that are to be recorded. + % So, we make the last references (assuming the other ones have been + % realized already) + nReferences = numel(m2t.axes{end}.PlotyyReferences); + nLabels = m2t.count.plotyylabel; + + % This is the range of labels, corresponding to the references + labelRange = (nLabels-nReferences+1):nLabels; + + labelRef = cell(1, numel(labelRange)); + % Create labelled references to legend entries of the main axis + for iRef = 1:nReferences + ref = m2t.axes{end}.PlotyyReferences(iRef); + lString = getLegendString(m2t,ref); + labelRef{iRef} = sprintf('\\addlegendimage{/pgfplots/refstyle=%s}\n\\addlegendentry{%s}\n',... + plotyyLabelName(labelRange(iRef)), lString); + end + labelRef = join(m2t, labelRef, ''); + + % Clear plotyy references. Ensures that references are created only once + m2t.axes{end}.PlotyyReferences = []; + else + % Do nothing: it's gonna be a legend entry. + % Not a label nor a referenced entry from the main axis. + end +end +% ============================================================================== +function label = plotyyLabelName(num) + % creates a LaTeX label for a plotyy trace + label = sprintf('plotyyref:leg%d', num); +end +% ============================================================================== +function legendInfo = addLegendInformation(m2t, h) + % Add the actual legend string + + legendInfo = ''; + if ~m2t.currentHandleHasLegend + return + end + legendString = getLegendString(m2t,h); + + % We also need a legend alignment option to make multiline + % legend entries work. This is added by default in getLegendOpts(). + legendInfo = sprintf('\\addlegendentry{%s}\n\n', legendString); +end +% ============================================================================== +function data = applyHgTransform(m2t, data) + if ~isempty(m2t.transform) + R = m2t.transform(1:3,1:3); + t = m2t.transform(1:3,4); + n = size(data, 1); + data = data * R' + kron(ones(n,1), t'); + end +end +% ============================================================================== +function m2t = drawAxes(m2t, handle) + % Input arguments: + % handle.................The axes environment handle. + + assertRegularAxes(handle); + + % Initialize empty environment. + % Use a struct instead of a custom subclass of hgsetget (which would + % facilitate writing clean code) as structs are more portable (old MATLAB(R) + % versions, GNU Octave). + m2t.axes{end+1} = struct('handle', handle, ... + 'name', '', ... + 'comment', [], ... + 'options', {opts_new()}, ... + 'content', {cell(0)}, ... + 'children', {cell(0)}); + + % update gca + m2t.current.gca = handle; + + % Check if axis is 3d + % In MATLAB, all plots are treated as 3D plots; it's just the view that + % makes 2D plots appear like 2D. + m2t.axes{end}.is3D = isAxis3D(handle); + + % Flag if axis contains barplot + m2t.axes{end}.barAddedAxisOption = false; + + % Get legend entries + m2t.axes{end}.LegendHandle = getAssociatedLegend(m2t, handle); + m2t.axes{end}.LegendEntries = getLegendEntries(m2t); + m2t = getPlotyyReferences(m2t, handle); + + m2t = retrievePositionOfAxes(m2t, handle); + + m2t = addAspectRatioOptionsOfAxes(m2t, handle); + + % Axis direction + for axis = 'xyz' + m2t.([axis 'AxisReversed']) = ... + strcmpi(get(handle,[upper(axis),'Dir']), 'reverse'); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Add color scaling + CLimMode = get(handle,'CLimMode'); + if strcmpi(CLimMode,'manual') || ~isempty(m2t.cbarHandles) + clim = caxis(handle); + m2t = m2t_addAxisOption(m2t, 'point meta min', sprintf(m2t.ff, clim(1))); + m2t = m2t_addAxisOption(m2t, 'point meta max', sprintf(m2t.ff, clim(2))); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Recurse into the children of this environment. + [m2t, childrenEnvs] = handleAllChildren(m2t, handle); + m2t.axes{end} = addChildren(m2t.axes{end}, childrenEnvs); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % The rest of this is handling axes options. + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Get other axis options (ticks, axis color, label,...). + % This is set here such that the axis orientation indicator in m2t is set + % before -- if ~isVisible(handle) -- the handle's children are called. + [m2t, xopts] = getAxisOptions(m2t, handle, 'x'); + [m2t, yopts] = getAxisOptions(m2t, handle, 'y'); + + m2t.axes{end}.options = opts_merge(m2t.axes{end}.options, xopts, yopts); + + m2t = add3DOptionsOfAxes(m2t, handle); + + if ~isVisible(handle) + % Setting hide{x,y} axis also hides the axis labels in Pgfplots whereas + % in MATLAB, they may still be visible. Instead use the following. + m2t = m2t_addAxisOption(m2t, 'axis line style', '{draw=none}'); + m2t = m2t_addAxisOption(m2t, 'ticks', 'none'); + % % An invisible axes container *can* have visible children, so don't + % % immediately bail out here. + % children = allchild(handle); + % for child = children(:)' + % if isVisible(child) + % % If the axes contain something that's visible, add an invisible + % % axes pair. + % m2t.axes{end}.name = 'axis'; + % m2t.axes{end}.options = {m2t.axes{end}.options{:}, ... + % 'hide x axis', 'hide y axis'}; + % NOTE: getTag was removed in 76d260d12e615602653d6f7b357393242b2430b3 + % m2t.axes{end}.comment = getTag(handle); + % break; + % end + % end + % % recurse into the children of this environment + % [m2t, childrenEnvs] = handleAllChildren(m2t, handle); + % m2t.axes{end} = addChildren(m2t.axes{end}, childrenEnvs); + % return + end + m2t.axes{end}.name = 'axis'; + + m2t = drawBackgroundOfAxes(m2t, handle); + m2t = drawTitleOfAxes(m2t, handle); + m2t = drawBoxAndLineLocationsOfAxes(m2t, handle); + m2t = drawGridOfAxes(m2t, handle); + m2t = drawLegendOptionsOfAxes(m2t); + + m2t.axes{end}.options = opts_append_userdefined(m2t.axes{end}.options, ... + m2t.args.extraAxisOptions); +end +% ============================================================================== +function m2t = drawGridOfAxes(m2t, handle) + % Draws the grids of an axis + options = opts_new(); + + % Check for major/minor grids + hasGrid = [isOn(get(handle, 'XGrid')); + isOn(get(handle, 'YGrid')); + isOn(get(handle, 'ZGrid')) && isAxis3D(handle)]; + + hasMinorGrid = [isOn(get(handle, 'XMinorGrid')); + isOn(get(handle, 'YMinorGrid')); + isOn(get(handle, 'ZMinorGrid')) && isAxis3D(handle)]; + + xyz = {'x', 'y', 'z'}; + + % Check for local grid options + % NOTE: for individual axis color options see the pfgmanual under + % major x grid style + for i=1:3 + if hasGrid(i) + grid = [xyz{i}, 'majorgrids']; + options = opts_add(options, grid); + end + if hasMinorGrid(i) + grid = [xyz{i}, 'minorgrids']; + options = opts_add(options, grid); + end + end + + % Check for global grid options + if any(hasGrid) + gridOpts = opts_new(); + % Get the line style and translate it to pgfplots + [gridLS, isDefault] = getAndCheckDefault(... + 'axes', handle, 'GridLineStyle', ':'); + if ~isDefault || m2t.args.strict + gridOpts = opts_add(gridOpts, translateLineStyle(gridLS)); + end + + % Get the color of the grid and translate it to pgfplots usable + % values + [gridColor, defaultColor] = getAndCheckDefault(... + 'axes', handle, 'GridColor', [0.15, 0.15, 0.15]); + if ~defaultColor + [m2t, gridColor] = getColor(m2t, handle, gridColor, 'patch'); + gridOpts = opts_add(gridOpts, gridColor); + end + + % Get the alpha of the grid and translate it to pgfplots + [gridAlpha, defaultAlpha] = getAndCheckDefault(... + 'axes', handle, 'GridAlpha', 0.1); + if ~defaultAlpha + gridOpts = opts_add(gridOpts, 'opacity', num2str(gridAlpha)); + end + + if ~isempty(gridOpts) + options = opts_addSubOpts(options, 'grid style', gridOpts); + end + end + + if any(hasMinorGrid) + minorGridOpts = opts_new(); + % Get the line style and translate it to pgfplots + [minorGridLS, isDefault] = getAndCheckDefault(... + 'axes', handle, 'MinorGridLineStyle', ':'); + if ~isDefault || m2t.args.strict + minorGridOpts = opts_add(minorGridOpts, translateLineStyle(minorGridLS)); + end + + % Get the color of the grid and translate it to pgfplots usable + % values + [minorGridColor, defaultColor] = getAndCheckDefault(... + 'axes', handle, 'MinorGridColor', [0.1, 0.1, 0.1]); + if ~defaultColor + [m2t, minorGridColor] = getColor(m2t, handle, minorGridColor, 'patch'); + minorGridOpts = opts_add(minorGridOpts, minorGridColor); + end + + % Get the alpha of the grid and translate it to pgfplots + [minorGridAlpha, defaultAlpha] = getAndCheckDefault(... + 'axes', handle, 'MinorGridAlpha', 0.1); + if ~defaultAlpha + minorGridOpts = opts_add(minorGridOpts, 'opacity', num2str(minorGridAlpha)); + end + + if ~isempty(minorGridOpts) + options = opts_addSubOpts(options, 'minor grid style', minorGridOpts); + end + end + + if ~any(hasGrid) && ~any(hasMinorGrid) + % When specifying 'axis on top', the axes stay above all graphs (which is + % default MATLAB behavior), but so do the grids (which is not default + % behavior). + %TODO: use proper grid ordering + if m2t.args.strict + options = opts_add(options, 'axis on top'); + end + % FIXME: axis background, axis grid, main, axis ticks, axis lines, axis tick labels, axis descriptions, axis foreground + end + + m2t.axes{end}.options = opts_merge(m2t.axes{end}.options, options); +end +% ============================================================================== +function m2t = add3DOptionsOfAxes(m2t, handle) + % adds 3D specific options of an axes object + if isAxis3D(handle) + [m2t, zopts] = getAxisOptions(m2t, handle, 'z'); + m2t.axes{end}.options = opts_merge(m2t.axes{end}.options, zopts); + + VIEWFORMAT = ['{' m2t.ff '}{' m2t.ff '}']; + m2t = m2t_addAxisOption(m2t, 'view', sprintf(VIEWFORMAT, get(handle, 'View'))); + end +end +% ============================================================================== +function legendhandle = getAssociatedLegend(m2t, axisHandle) + % Get legend handle associated with current axis + + legendhandle = []; + env = getEnvironment(); + switch env + case 'Octave' + % Make sure that m2t.legendHandles is a row vector. + for lhandle = m2t.legendHandles(:)' + ud = get(lhandle, 'UserData'); + % Empty if no legend and multiple handles if plotyy + if ~isempty(ud) && any(axisHandle == ud.handle) + legendhandle = lhandle; + break + end + end + case 'MATLAB' + legendhandle = legend(axisHandle); + end + + % NOTE: there is a BUG in HG1 and Octave. Setting the box off sets the + % legend visibility off too. We assume the legend is visible if it has + % a visible child. + isInvisibleHG2 = isHG2() && ~isVisible(legendhandle); + isInvisibleHG1orOctave = (~isHG2() || strcmpi(env,'Octave')) &&... + ~isVisibleContainer(legendhandle); + + % Do not return the handle if legend is invisible + if isInvisibleHG1orOctave || isInvisibleHG2; + legendhandle = []; + end +end +% ============================================================================== +function entries = getLegendEntries(m2t) + % Retrieve the handles of the objects that have a legend entry + + % Non-composite objects are straightforward, e.g. line, and have the + % legend entry at their same level, hence we return their handle. + % + % Hggroups behave differently depending on the environment and we might + % return the handle to the hgroot or to one of its children: + % 1) Matlab places the legend entry at the hgroot. + % + % Usually, the decision to place the legend is either unchanged from + % the first call to handleAllChildrena(axis) or delegated to a + % specialized drawing routine, e.g. drawContour(), if the group has to + % be drawn atomically. In this case, the legend entry stays with the + % hgroot. + % + % If the hggroup is a pure container like in a bodeplot, i.e. the + % `type` is not listed in drawHggroup(), a nested call to + % handleAllChildren(hgroot) follows. But, this second call cannot detect + % legend entries on the children. Hence, we pass down the legend entry + % from the hgroot to its first child. + % + % 2) Octave places the entry with one of the children of the hgroot. + % Hence, most of the hggroups are correctly dealt by a nested + % handleAllChildren() call which detects the entry on the child. + % However, when we can guess the type of hggroup with + % guessOctavePlotType(), the legend entry should be placed at the root + % level, hence we bubble it up from the child to the hgroot. + + entries = []; + legendHandle = m2t.axes{end}.LegendHandle; + + if isempty(legendHandle) + return + end + + switch getEnvironment() + case 'Octave' + % See set(hlegend, "deletefcn", {@deletelegend2, ca, [], [], t1, hplots}); in legend.m + delfun = get(legendHandle,'deletefcn'); + entries = delfun{6}; + + % Bubble-up legend entry properties from child to hggroup root + % for guessable objects + for ii = 1:numel(entries) + child = entries(ii); + anc = ancestor(child,'hggroup'); + if isempty(anc) % not an hggroup + continue + end + cl = guessOctavePlotType(anc); + if ~strcmpi(cl, 'unknown') % guessable hggroup, then bubble-up + legendString = get(child,'displayname'); + set(anc,'displayname',legendString); + entries(ii) = anc; + end + end + + case 'MATLAB' + % Undocumented property (exists at least since 2008a) + entries = get(legendHandle,'PlotChildren'); + + % Take only the first child from a pure hggroup (e.g. bodeplots) + for ii = 1:numel(entries) + entry = entries(ii); + % Note that class() is not supported in Octave + isHggroupClass = strcmpi(class(handle(entry)),'hggroup'); + if isHggroupClass + children = get(entry, 'Children'); + firstChild = children(1); + if isnumeric(firstChild) + firstChild = handle(firstChild); + end + % Inherits DisplayName from hggroup root + set(firstChild, 'DisplayName', get(entry, 'DisplayName')); + entries(ii) = firstChild; + end + end + end +end +% ============================================================================== +function m2t = getPlotyyReferences(m2t,axisHandle) + % Retrieve references to legend entries of the main plotyy axis + % + % A plotyy plot has a main and a secondary axis. The legend is associated + % with the main axis and hence m2t will only include the legend entries + % that belong to the \axis[] that has a legend. + % + % One way to include the legend entries from the secondary axis (in the + % same legend) is to first label the \addplot[] and then reference them. + % See https://tex.stackexchange.com/questions/42697/42752#42752 + % + % However, in .tex labels should come before they are referenced. Hence, + % we actually label the legend entries from the main axis and swap the + % legendhandle to the secondary axis. + % + % The legend will not be plotted with the main \axis[] and the labelled + % legend entries will be skipped until the secondary axis. Then, they will + % be listed before any legend entry from the secondary axis. + + % Retrieve legend handle + if isAxisMain(axisHandle) + legendHandle = m2t.axes{end}.LegendHandle; + else + legendHandle = getAssociatedLegend(m2t,getPlotyyPeer(axisHandle)); + m2t.axes{end}.LegendHandle = legendHandle; + end + + % Not a plotyy axis or no legend + if ~isAxisPlotyy(axisHandle) || isempty(legendHandle) + m2t.axes{end}.PlotyyReferences = []; + + elseif isAxisMain(axisHandle) + % Mark legend entries of the main axis for labelling + legendEntries = m2t.axes{end}.LegendEntries; + ancAxes = ancestor(legendEntries,'axes'); + idx = ismember([ancAxes{:}], axisHandle); + m2t.axes{end}.PlotyyReferences = legendEntries(idx); + + % Ensure no legend is created on the main axis + m2t.axes{end}.LegendHandle = []; + else + % Get legend entries associated to secondary plotyy axis. We can do + % this because we took the legendhandle from the peer (main axis) + legendEntries = getLegendEntries(m2t); + ancAxes = ancestor(legendEntries,'axes'); + if iscell(ancAxes) + ancAxes = [ancAxes{:}]; + end + idx = ismember(double(ancAxes), axisHandle); + m2t.axes{end}.LegendEntries = legendEntries(idx); + + % Recover referenced legend entries of the main axis + m2t.axes{end}.PlotyyReferences = legendEntries(~idx); + end +end +% ============================================================================== +function bool = isAxisMain(h) + % Check if it is the main axis e.g. in a plotyy plot + + if ~isAxisPlotyy(h) + bool = true; + return % an axis not constructed by plotyy is always(?) a main axis + end + + % If it is a Plotyy axis + switch getEnvironment() + case 'Octave' + plotyyAxes = get(h, '__plotyy_axes__'); + bool = find(plotyyAxes == h) == 1; + + case 'MATLAB' + bool = ~isempty(getappdata(h, 'LegendPeerHandle')); + end +end +% ============================================================================== +function bool = isAxisPlotyy(h) + % Check if handle is a plotyy axis + + switch getEnvironment() + case 'Octave' + % Cannot test hidden property with isfield(), is always false + try + get(h, '__plotyy_axes__'); + bool = true; + catch + bool = false; + end + + case 'MATLAB' + bool = ~isempty(getappdata(h, 'graphicsPlotyyPeer')); + end +end +% ============================================================================== +function peer = getPlotyyPeer(axisHandle) + % Get the other axis coupled in plotyy plots + + switch getEnvironment() + case 'Octave' + plotyyAxes = get(axisHandle, '__plotyy_axes__'); + peer = setdiff(plotyyAxes, axisHandle); + + case 'MATLAB' + peer = getappdata(axisHandle, 'graphicsPlotyyPeer'); + end +end +% ============================================================================== +function legendString = getLegendString(m2t, h) + % Retrieve the legend string for the given handle + str = getOrDefault(h, 'displayname', ''); + interpreter = get(m2t.axes{end}.LegendHandle,'interpreter'); + + % HG1: autogenerated legend strings, i.e. data1,..., dataN, do not populate + % the 'displayname' property. Go through 'userdata' + if isempty(str) + ud = get(m2t.axes{end}.LegendHandle,'userdata'); + idx = ismember(ud.handles, h); + str = ud.lstrings{idx}; + end + + % split string to cell, if newline character '\n' (ASCII 10) is present + delimeter = sprintf('\n'); + str = regexp(str, delimeter, 'split'); + str = prettyPrint(m2t, str, interpreter); + legendString = join(m2t, str, '\\'); +end +% ============================================================================== +function [m2t, bool] = hasLegendEntry(m2t, h) + % Check if the handle has a legend entry and track its legend status in m2t + legendEntries = m2t.axes{end}.LegendEntries; + if isnumeric(h) + legendEntries = double(legendEntries); + end + + % Should not have a legend reference + bool = any(ismember(h, legendEntries)) && ~hasPlotyyReference(m2t,h); + m2t.currentHandleHasLegend = bool; +end +% ============================================================================== +function bool = hasPlotyyReference(m2t,h) + % Check if the handle has a legend reference + plotyyReferences = m2t.axes{end}.PlotyyReferences; + if isnumeric(h) + plotyyReferences = double(plotyyReferences); + end + + bool = any(ismember(h, plotyyReferences)); +end +% ============================================================================== +function m2t = retrievePositionOfAxes(m2t, handle) + % This retrieves the position of an axes and stores it into the m2t data + % structure + + pos = getAxesPosition(m2t, handle, m2t.args.width, ... + m2t.args.height, m2t.axesBoundingBox); + % set the width + if (~m2t.args.noSize) + % optionally prevents setting the width and height of the axis + m2t = setDimensionOfAxes(m2t, 'width', pos.w); + m2t = setDimensionOfAxes(m2t, 'height', pos.h); + + m2t = m2t_addAxisOption(m2t, 'at', ... + ['{(' formatDim(pos.x.value, pos.x.unit) ','... + formatDim(pos.y.value, pos.y.unit) ')}']); + % the following is general MATLAB behavior: + m2t = m2t_addAxisOption(m2t, 'scale only axis'); + end +end +% ============================================================================== +function m2t = setDimensionOfAxes(m2t, widthOrHeight, dimension) + % sets the dimension "name" of the current axes to the struct "dim" + m2t = m2t_addAxisOption(m2t, widthOrHeight, ... + formatDim(dimension.value, dimension.unit)); +end +% ============================================================================== +function m2t = addAspectRatioOptionsOfAxes(m2t, handle) + % Set manual aspect ratio for current axes + % TODO: deal with 'axis image', 'axis square', etc. (#540) + if strcmpi(get(handle, 'DataAspectRatioMode'), 'manual') ||... + strcmpi(get(handle, 'PlotBoxAspectRatioMode'), 'manual') + % we need to set the plot box aspect ratio + if m2t.axes{end}.is3D + % Note: set 'plot box ratio' for 3D axes to avoid bug with + % 'scale mode = uniformly' (see #560) + aspectRatio = getPlotBoxAspectRatio(handle); + m2t = m2t_addAxisOption(m2t, 'plot box ratio', ... + formatAspectRatio(m2t, aspectRatio)); + end + end +end +% ============================================================================== +function m2t = drawBackgroundOfAxes(m2t, handle) + % draw the background color of the current axes + backgroundColor = get(handle, 'Color'); + if ~isNone(backgroundColor) && isVisible(handle) + [m2t, col] = getColor(m2t, handle, backgroundColor, 'patch'); + m2t = m2t_addAxisOption(m2t, 'axis background/.style', sprintf('{fill=%s}', col)); + end +end +% ============================================================================== +function m2t = drawTitleOfAxes(m2t, handle) + % processes the title of an axes object + [m2t, m2t.axes{end}.options] = getTitle(m2t, handle, m2t.axes{end}.options); +end +% ============================================================================== +function [m2t, opts] = getTitle(m2t, handle, opts) + % gets the title and its markup from an axes/colorbar/... + [m2t, opts] = getTitleOrLabel_(m2t, handle, opts, 'Title'); +end +function [m2t, opts] = getLabel(m2t, handle, opts, tikzKeyword) + % gets the label and its markup from an axes/colorbar/... + [m2t, opts] = getTitleOrLabel_(m2t, handle, opts, 'Label', tikzKeyword); +end +function [m2t, opts] = getAxisLabel(m2t, handle, axis, opts) + % convert an {x,y,z} axis label to TikZ + labelName = [upper(axis) 'Label']; + [m2t, opts] = getTitleOrLabel_(m2t, handle, opts, labelName); +end +function [m2t, opts] = getTitleOrLabel_(m2t, handle, opts, labelKind, tikzKeyword) + % gets a string element from an object + if ~exist('tikzKeyword', 'var') || isempty(tikzKeyword) + tikzKeyword = lower(labelKind); + end + object = get(handle, labelKind); + + str = get(object, 'String'); + if ~isempty(str) + interpreter = get(object, 'Interpreter'); + str = prettyPrint(m2t, str, interpreter); + [m2t, style] = getFontStyle(m2t, object); + if length(str) > 1 %multiline + style = opts_add(style, 'align', 'center'); + end + if ~isempty(style) + opts = opts_addSubOpts(opts, [tikzKeyword ' style'], style); + end + str = join(m2t, str, '\\[1ex]'); + opts = opts_add(opts, tikzKeyword, sprintf('{%s}', str)); + end +end +% ============================================================================== +function m2t = drawBoxAndLineLocationsOfAxes(m2t, h) + % draw the box and axis line location of an axes object + isBoxOn = isOn(get(h, 'box')); + xLoc = get(h, 'XAxisLocation'); + yLoc = get(h, 'YAxisLocation'); + isXaxisBottom = strcmpi(xLoc,'bottom'); + isYaxisLeft = strcmpi(yLoc,'left'); + + % Only flip the labels to the other side if not at the default + % left/bottom positions + if isBoxOn + if ~isXaxisBottom + m2t = m2t_addAxisOption(m2t, 'xticklabel pos','right'); + end + if ~isYaxisLeft + m2t = m2t_addAxisOption(m2t, 'yticklabel pos','right'); + end + + % Position axes lines (strips the box) + else + m2t = m2t_addAxisOption(m2t, 'axis x line*', xLoc); + m2t = m2t_addAxisOption(m2t, 'axis y line*', yLoc); + if m2t.axes{end}.is3D + % There's no such attribute as 'ZAxisLocation'. + % Instead, the default seems to be 'left'. + m2t = m2t_addAxisOption(m2t, 'axis z line*', 'left'); + end + end +end +% ============================================================================== +function m2t = drawLegendOptionsOfAxes(m2t) + legendHandle = m2t.axes{end}.LegendHandle; + if isempty(legendHandle) + return + end + + [m2t, key, legendOpts] = getLegendOpts(m2t, legendHandle); + m2t = m2t_addAxisOption(m2t, key, legendOpts); +end +% ============================================================================== +function m2t = handleColorbar(m2t, handle) + if isempty(handle) + return; + end + + % Find the axes environment that this colorbar belongs to. + parentAxesHandle = double(get(handle,'axes')); + parentFound = false; + for k = 1:length(m2t.axes) + if m2t.axes{k}.handle == parentAxesHandle + k0 = k; + parentFound = true; + break; + end + end + if parentFound + m2t.axes{k0}.options = opts_append(m2t.axes{k0}.options, ... + matlab2pgfplotsColormap(m2t, m2t.current.colormap), []); + % Append cell string. + m2t.axes{k0}.options = cat(1, m2t.axes{k0}.options, ... + getColorbarOptions(m2t, handle)); + else + warning('matlab2tikz:parentAxesOfColorBarNotFound',... + 'Could not find parent axes for color bar. Skipping.'); + end +end +% ============================================================================== +function [m2t, options] = getAxisOptions(m2t, handle, axis) + assertValidAxisSpecifier(axis); + + options = opts_new(); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % axis colors + [color, isDfltColor] = getAndCheckDefault('Axes', handle, ... + [upper(axis),'Color'], [ 0 0 0 ]); + if ~isDfltColor || m2t.args.strict + [m2t, col] = getColor(m2t, handle, color, 'patch'); + if isOn(get(handle, 'box')) + % If the axes are arranged as a box, make sure that the individual + % axes are drawn as four separate paths. This makes the alignment + % at the box corners somewhat less nice, but allows for different + % axis styles (e.g., colors). + options = opts_add(options, 'separate axis lines'); + end + % set color of axis lines + options = ... + opts_add(options, ... + ['every outer ', axis, ' axis line/.append style'], ... + ['{', col, '}']); + % set color of tick labels + options = ... + opts_add(options, ... + ['every ',axis,' tick label/.append style'], ... + ['{font=\color{',col,'}}']); + % set color of ticks + options = ... + opts_add(options, ... + ['every ',axis,' tick/.append style'], ... + ['{',col,'}']); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % handle the orientation + isAxisReversed = strcmpi(get(handle,[upper(axis),'Dir']), 'reverse'); + m2t.([axis 'AxisReversed']) = isAxisReversed; + if isAxisReversed + options = opts_add(options, [axis, ' dir'], 'reverse'); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + axisScale = getOrDefault(handle, [upper(axis) 'Scale'], 'lin'); + if strcmpi(axisScale, 'log'); + options = opts_add(options, [axis,'mode'], 'log'); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % get axis limits + options = setAxisLimits(m2t, handle, axis, options); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % get ticks along with the labels + [options] = getAxisTicks(m2t, handle, axis, options); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % get axis label + [m2t, options] = getAxisLabel(m2t, handle, axis, options); +end +% ============================================================================== +function [options] = getAxisTicks(m2t, handle, axis, options) + % Return axis tick marks Pgfplots style. Nice: Tick lengths and such + % details are taken care of by Pgfplots. + assertValidAxisSpecifier(axis); + + keywordTickMode = [upper(axis), 'TickMode']; + tickMode = get(handle, keywordTickMode); + keywordTick = [upper(axis), 'Tick']; + ticks = get(handle, keywordTick); + + % hidden properties are not caught by hasProperties + isDatetimeTicks = isAxisTicksDateTime(handle, axis); + + if isempty(ticks) + % If no ticks are present, we need to enforce this in any case. + pgfTicks = '\empty'; + elseif strcmpi(tickMode, 'auto') && ~m2t.args.strict && ~isDatetimeTicks + % Let pgfplots decide if the tickmode is auto or conversion is not + % strict and we are not dealing with datetime ticks + pgfTicks = []; + else % strcmpi(tickMode,'manual') || m2t.args.strict + pgfTicks = join(m2t, cellstr(num2str(ticks(:))), ', '); + end + + keywordTickLabelMode = [upper(axis), 'TickLabelMode']; + tickLabelMode = get(handle, keywordTickLabelMode); + if strcmpi(tickLabelMode, 'auto') && ~m2t.args.strict && ~isDatetimeTicks + pgfTickLabels = []; + else % strcmpi(tickLabelMode,'manual') || m2t.args.strict + % HG2 allows to set 'TickLabelInterpreter'. + % HG1 tacitly uses the interpreter 'none'. + % See http://www.mathworks.com/matlabcentral/answers/102053#comment_300079 + fallback = defaultTickLabelInterpreter(m2t); + interpreter = getOrDefault(handle, 'TickLabelInterpreter', fallback); + keywordTickLabel = [upper(axis), 'TickLabel']; + tickLabels = cellstr(get(handle, keywordTickLabel)); + tickLabels = prettyPrint(m2t, tickLabels, interpreter); + + keywordScale = [upper(axis), 'Scale']; + isAxisLog = strcmpi(getOrDefault(handle,keywordScale, 'lin'), 'log'); + [pgfTicks, pgfTickLabels] = ... + matlabTicks2pgfplotsTicks(m2t, ticks, tickLabels, isAxisLog, tickLabelMode); + end + + keywordMinorTick = [upper(axis), 'MinorTick']; + hasMinorTicks = isOn(getOrDefault(handle, keywordMinorTick, 'off')); + tickDirection = getOrDefault(handle, 'TickDir', 'in'); + + options = setAxisTicks(m2t, options, axis, pgfTicks, pgfTickLabels, ... + hasMinorTicks, tickDirection, isDatetimeTicks); + + options = setAxisTickLabelStyle(options, axis, handle); +end +% ============================================================================== +function options = setAxisTickLabelStyle(options, axis, handle) + % determine the style of tick labels + %TODO: translate the style of tick labels fully (font?, weight, ...) + kwRotation = [upper(axis), 'TickLabelRotation']; + rotation = getOrDefault(handle, kwRotation, 0); + if rotation ~= 0 + options = opts_add(options, [axis, 'ticklabel style'], ... + sprintf('{rotate=%d}', rotation)); + end +end +% ============================================================================== +function interpreter = defaultTickLabelInterpreter(m2t) + % determines the default tick label interpreter + % This is only relevant in HG1/Octave. In HG2, we use the interpreter + % set in the object (not the global default). + if m2t.args.interpretTickLabelsAsTex + interpreter = 'tex'; + else + interpreter = 'none'; + end +end +% ============================================================================== +function isDatetimeTicks = isAxisTicksDateTime(handle, axis) + % returns true when the axis has DateTime ticks + try + % Get hidden properties of the datetime axes manager + dtsManager = get(handle, 'DatetimeDurationPlotAxesListenersManager'); + oldState = warning('off','MATLAB:structOnObject'); + dtsManager = struct(dtsManager); + warning(oldState); + + isDatetimeTicks = dtsManager.([upper(axis) 'DateTicks']) == 1; + catch + isDatetimeTicks = false; + end +end +% ============================================================================== +function options = setAxisTicks(m2t, options, axis, ticks, tickLabels,hasMinorTicks, tickDir,isDatetimeTicks) + % set ticks options + + % According to http://www.mathworks.com/help/techdoc/ref/axes_props.html, + % the number of minor ticks is automatically determined by MATLAB(R) to + % fit the size of the axis. Until we know how to extract this number, use + % a reasonable default. + matlabDefaultNumMinorTicks = 3; + if ~isempty(ticks) + options = opts_add(options, [axis,'tick'], sprintf('{%s}', ticks)); + end + if ~isempty(tickLabels) + options = opts_add(options, ... + [axis,'ticklabels'], sprintf('{%s}', tickLabels)); + end + if hasMinorTicks + options = opts_add(options, [axis,'minorticks'], 'true'); + if m2t.args.strict + options = opts_add(options, ... + sprintf('minor %s tick num', axis), ... + sprintf('{%d}', matlabDefaultNumMinorTicks)); + end + end + + if strcmpi(tickDir,'out') + options = opts_add(options, 'tick align', 'outside'); + elseif strcmpi(tickDir,'both') + options = opts_add(options, 'tick align', 'center'); + end + + if isDatetimeTicks + options = opts_add(options, ['scaled ' axis ' ticks'], 'false'); + end +end +% ============================================================================== +function assertValidAxisSpecifier(axis) + % assert that axis is a valid axis specifier + if ~ismember(axis, {'x','y','z'}) + error('matlab2tikz:illegalAxisSpecifier', ... + 'Illegal axis specifier "%s".', axis); + end +end +% ============================================================================== +function assertRegularAxes(handle) + % assert that the (axes) object specified by handle is a regular axes and not a + % colorbar or a legend + tag = lower(get(handle,'Tag')); + if ismember(tag,{'colorbar','legend'}) + error('matlab2tikz:notARegularAxes', ... + ['The object "%s" is not a regular axes object. ' ... + 'It cannot be handled with drawAxes!'], handle); + end +end +% ============================================================================== +function options = setAxisLimits(m2t, handle, axis, options) + % set the upper/lower limit of an axis + limits = get(handle, [upper(axis),'Lim']); + if isfinite(limits(1)) + options = opts_add(options, [axis,'min'], sprintf(m2t.ff, limits(1))); + end + if isfinite(limits(2)) + options = opts_add(options, [axis,'max'], sprintf(m2t.ff, limits(2))); + end +end +% ============================================================================== +function bool = isVisibleContainer(axisHandle) + if ~isVisible(axisHandle) + % An invisible axes container *can* have visible children, so don't + % immediately bail out here. Also it *can* have a visible title, + % labels or children + + bool = false; + for prop = {'Children', 'Title', 'XLabel', 'YLabel', 'ZLabel'} + property = prop{1}; + if strcmpi(property, 'Children') + children = allchild(axisHandle); + elseif isprop(axisHandle, property) + children = get(axisHandle, property); + else + continue; % don't check non-existent properties + end + for child = children(:)' + if isVisible(child) + bool = true; + return; + end + end + end + else + bool = true; + end +end +% ============================================================================== +function [m2t, str] = drawLine(m2t, h) + % Returns the code for drawing a regular line and error bars. + % This is an extremely common operation and takes place in most of the + % not too fancy plots. + str = ''; + if ~isLineVisible(h) + return; % there is nothing to plot + end + + % Color + color = get(h, 'Color'); + [m2t, xcolor] = getColor(m2t, h, color, 'patch'); + % Line and marker options + [m2t, lineOptions] = getLineOptions(m2t, h); + [m2t, markerOptions] = getMarkerOptions(m2t, h); + + drawOptions = opts_new(); + drawOptions = opts_add(drawOptions, 'color', xcolor); + drawOptions = opts_merge(drawOptions, lineOptions, markerOptions); + + % Check for "special" lines, e.g.: + if strcmpi(get(h, 'Tag'), 'zplane_unitcircle') + [m2t, str] = specialDrawZplaneUnitCircle(m2t, drawOptions); + return + end + + % build the data matrix + data = getXYZDataFromLine(m2t, h); + yDeviation = getYDeviations(h); + if ~isempty(yDeviation) + data = [data, yDeviation]; + end + + % Check if any value is infinite/NaN. In that case, add appropriate option. + m2t = jumpAtUnboundCoords(m2t, data); + + [m2t, dataString] = writePlotData(m2t, data, drawOptions); + [m2t, labelString] = addLabel(m2t, h); + + str = [dataString, labelString]; +end +% ============================================================================== +function [m2t, str] = specialDrawZplaneUnitCircle(m2t, drawOptions) + % Draw unit circle and axes. + + % TODO Don't hardcode "10", but extract from parent axes of |h| + opts = opts_print(drawOptions); + str = [sprintf('\\draw[%s] (axis cs:0,0) circle[radius=1];\n', opts), ... + sprintf('\\draw[%s] (axis cs:-10,0)--(axis cs:10,0);\n', opts), ... + sprintf('\\draw[%s] (axis cs:0,-10)--(axis cs:0,10);\n', opts)]; +end +% ============================================================================== +function bool = isLineVisible(h) + % check if a line object is actually visible (has markers and so on) + + lineStyle = get(h, 'LineStyle'); + lineWidth = get(h, 'LineWidth'); + marker = getOrDefault(h, 'Marker','none'); + hasLines = ~isNone(lineStyle) && lineWidth > 0; + hasMarkers = ~isNone(marker); + hasDeviations = ~isempty(getYDeviations(h)); + + bool = isVisible(h) && (hasLines || hasMarkers || hasDeviations); +end +% ============================================================================== +function [m2t, str] = writePlotData(m2t, data, drawOptions) + % actually writes the plot data to file + str = ''; + + is3D = m2t.axes{end}.is3D; + if is3D + % Don't try to be smart in parametric 3d plots: Just plot all the data. + [m2t, table, tableOptions] = makeTable(m2t, {'','',''}, data); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot3 [%s]\n table[%s] {%s};\n ', ... + drawOpts, tabOpts, table); + else + % split the data into logical chunks + dataCell = splitLine(m2t, data); + + % plot them + strPart = cell(1, length(dataCell)); + for k = 1:length(dataCell) + % If the line has a legend string, make sure to only include a legend + % entry for the *last* occurrence of the plot series. + % Hence the condition k m2t.tol) + lineOpts = opts_add(lineOpts, translateLineStyle(lineStyle)); + end + + % Take over the line width in any case when in strict mode. If not, don't add + % anything in case of default line width and effectively take Pgfplots' + % default. + % Also apply the line width if no actual line is there; the markers make use + % of this, too. + matlabDefaultLineWidth = 0.5; + if ~isempty(m2t.semantic.LineWidth) + if ismember(lineWidth, [m2t.semantic.LineWidth{:,2}]) + semStrID = lineWidth == [m2t.semantic.LineWidth{:,2}]; + lineOpts = opts_add(lineOpts, m2t.semantic.LineWidth{semStrID,1}); + else + warning('matlab2tikz:semanticLineWidthNotFound',... + ['No semantic correspondance for lineWidth of ''%f'' found.'... + 'Falling back to explicit export in points.'], lineWidth); + lineOpts = opts_add(lineOpts, 'line width', sprintf('%.1fpt', lineWidth)); + end + elseif m2t.args.strict || ~abs(lineWidth-matlabDefaultLineWidth) <= m2t.tol + lineOpts = opts_add(lineOpts, 'line width', sprintf('%.1fpt', lineWidth)); + end + + % print no lines + if isNone(lineStyle) || lineWidth==0 + lineOpts = opts_add(lineOpts, 'draw', 'none'); + end +end +% ============================================================================== +function list = configureSemanticLineWidths(semanticLineWidths) + % Defines the default semantic options of pgfplots and updates it when applicable + + if isnan(semanticLineWidths) + % Remove the list + list = {}; + return; + end + + % Pgf/TikZ defaults (see pgfmanual 3.0.1a section 15.3.1 / page 166) + list = {'ultra thin', 0.1; + 'very thin', 0.2; + 'thin', 0.4; + 'semithick', 0.6; + 'thick', 0.8; + 'very thick', 1.2; + 'ultra thick', 1.6 }; + + % Update defaults or append the user provided setting + for ii = 1:size(semanticLineWidths, 1) + % Check for redefinitions of defaults + [isOverride, idx] = ismember(semanticLineWidths{ii, 1}, list{:, 1}) + if isOverride + list{idx, 2} = semanticLineWidths{ii, 2}; + else + list{end+1} = semanticLineWidths{ii, :}; + end + end +end +% ============================================================================== +function [m2t, drawOptions] = getMarkerOptions(m2t, h) + % Handles the marker properties of a line (or any other) plot. + drawOptions = opts_new(); + + marker = getOrDefault(h, 'Marker', 'none'); + + if ~isNone(marker) + markerSize = get(h, 'MarkerSize'); + lineStyle = get(h, 'LineStyle'); + lineWidth = get(h, 'LineWidth'); + + [tikzMarkerSize, isDefault] = ... + translateMarkerSize(m2t, marker, markerSize); + + % take over the marker size in any case when in strict mode; + % if not, don't add anything in case of default marker size + % and effectively take Pgfplots' default. + if m2t.args.strict || ~isDefault + drawOptions = opts_add(drawOptions, 'mark size', ... + sprintf('%.1fpt', tikzMarkerSize)); + end + + markOptions = opts_new(); + % make sure that the markers get painted in solid (and not dashed) + % if the 'lineStyle' is not solid (otherwise there is no problem) + if ~strcmpi(lineStyle, 'solid') + markOptions = opts_add(markOptions, 'solid'); + end + + % get the marker color right + markerInfo = getMarkerInfo(m2t, h, markOptions); + + [m2t, markerInfo.options] = setColor(m2t, h, markerInfo.options, 'fill', markerInfo.FaceColor); + + if ~strcmpi(markerInfo.EdgeColor,'auto') + [m2t, markerInfo.options] = setColor(m2t, h, markerInfo.options, '', markerInfo.EdgeColor); + else + if isprop(h,'EdgeColor') + color = get(h, 'EdgeColor'); + else + color = get(h, 'Color'); + end + [m2t, markerInfo.options] = setColor(m2t, h, markerInfo.options, '', color); + end + + % add it all to drawOptions + drawOptions = opts_add(drawOptions, 'mark', markerInfo.tikz); + + if ~isempty(markOptions) + drawOptions = opts_addSubOpts(drawOptions, 'mark options', ... + markerInfo.options); + end + end +end +% ============================================================================== +function [tikzMarkerSize, isDefault] = ... + translateMarkerSize(m2t, matlabMarker, matlabMarkerSize) + % The markersizes of Matlab and TikZ are related, but not equal. This + % is because + % + % 1.) MATLAB uses the MarkerSize property to describe something like + % the diameter of the mark, while TikZ refers to the 'radius', + % 2.) MATLAB and TikZ take different measures (e.g. the + % edge of a square vs. its diagonal). + if(~ischar(matlabMarker)) + error('matlab2tikz:translateMarkerSize', ... + 'Variable matlabMarker is not a string.'); + end + + if(~isnumeric(matlabMarkerSize)) + error('matlab2tikz:translateMarkerSize', ... + 'Variable matlabMarkerSize is not a numeral.'); + end + + % 6pt is the default MATLAB marker size for all markers + defaultMatlabMarkerSize = 6; + isDefault = abs(matlabMarkerSize(1)-defaultMatlabMarkerSize)'} + % for triangles, matlab takes the height + % and tikz the circumcircle radius; + % the triangles are always equiangular + tikzMarkerSize = matlabMarkerSize(:) / 2 * (2/3); + otherwise + error('matlab2tikz:translateMarkerSize', ... + 'Unknown matlabMarker ''%s''.', matlabMarker); + end +end +% ============================================================================== +function [tikzMarker, markOptions] = ... + translateMarker(m2t, matlabMarker, markOptions, faceColorToggle) + % Translates MATLAB markers to their Tikz equivalents + % #COMPLEX: inherently large switch-case + if ~ischar(matlabMarker) + error('matlab2tikz:translateMarker:MarkerNotAString',... + 'matlabMarker is not a string.'); + end + + switch (matlabMarker) + case 'none' + tikzMarker = ''; + case '+' + tikzMarker = '+'; + case 'o' + if faceColorToggle + tikzMarker = '*'; + else + tikzMarker = 'o'; + end + case '.' + tikzMarker = '*'; + case 'x' + tikzMarker = 'x'; + otherwise % the following markers are only available with PGF's + % plotmarks library + signalDependency(m2t, 'tikzlibrary', 'plotmarks'); + hasFilledVariant = true; + switch (matlabMarker) + + case '*' + tikzMarker = 'asterisk'; + hasFilledVariant = false; + + case {'s','square'} + tikzMarker = 'square'; + + case {'d','diamond'} + tikzMarker = 'diamond'; + + case '^' + tikzMarker = 'triangle'; + + case 'v' + tikzMarker = 'triangle'; + markOptions = opts_add(markOptions, 'rotate', '180'); + + case '<' + tikzMarker = 'triangle'; + markOptions = opts_add(markOptions, 'rotate', '90'); + + case '>' + tikzMarker = 'triangle'; + markOptions = opts_add(markOptions, 'rotate', '270'); + + case {'p','pentagram'} + tikzMarker = 'star'; + + case {'h','hexagram'} + userWarning(m2t, 'MATLAB''s marker ''hexagram'' not available in TikZ. Replacing by ''star''.'); + tikzMarker = 'star'; + + otherwise + error('matlab2tikz:translateMarker:unknownMatlabMarker',... + 'Unknown matlabMarker ''%s''.',matlabMarker); + end + if faceColorToggle && hasFilledVariant + tikzMarker = [tikzMarker '*']; + end + end +end +% ============================================================================== +function [m2t, str] = drawPatch(m2t, handle) + % Draws a 'patch' graphics object (as found in contourf plots, for example). + % + str = ''; + if ~isVisible(handle) + return + end + + % This is for a quirky workaround for stacked bar plots. + m2t.axes{end}.nonbarPlotsPresent = true; + + % Each row of the faces matrix represents a distinct patch + % NOTE: pgfplot uses zero-based indexing into vertices and interpolates + % counter-clockwise + Faces = get(handle,'Faces')-1; + Vertices = get(handle,'Vertices'); + + % 3D vs 2D + is3D = m2t.axes{end}.is3D; + if is3D + columnNames = {'x', 'y', 'z'}; + plotCmd = 'addplot3'; + Vertices = applyHgTransform(m2t, Vertices); + else + columnNames = {'x', 'y'}; + plotCmd = 'addplot'; + Vertices = Vertices(:,1:2); + end + + % Process fill, edge colors and shader + [m2t,patchOptions, s] = shaderOpts(m2t,handle,'patch'); + + % Return empty axes if no face or edge colors + if isNone(s.plotType) + return + end + + % ----------------------------------------------------------------------- + % gather the draw options + % Make sure that legends are shown in area mode. + drawOptions = opts_add(opts_new,'area legend'); + verticesTableOptions = opts_new(); + + % Marker options + [m2t, markerOptions] = getMarkerOptions(m2t, handle); + drawOptions = opts_merge(drawOptions, markerOptions); + + % Line options + [m2t, lineOptions] = getLineOptions(m2t, handle); + drawOptions = opts_merge(drawOptions, lineOptions); + + % If the line is not visible, set edgeColor to none. Otherwise pgfplots + % draws it by default + if ~isLineVisible(handle) + s.edgeColor = 'none'; + end + + % No patch: if one patch and single face/edge color + isFaceColorFlat = isempty(strfind(opts_get(patchOptions, 'shader'),'interp')); + if size(Faces,1) == 1 && s.hasOneEdgeColor && isFaceColorFlat + ptType = ''; + cycle = conditionallyCyclePath(Vertices); + + [m2t, drawOptions] = setColor(m2t, handle, drawOptions, 'draw', ... + s.edgeColor, 'none'); + [m2t, drawOptions] = setColor(m2t, handle, drawOptions, 'fill', ... + s.faceColor); + + [drawOptions] = opts_copy(patchOptions, 'draw opacity', drawOptions); + [drawOptions] = opts_copy(patchOptions, 'fill opacity', drawOptions); + + else % Multiple patches + + % Patch table type + ptType = 'patch table'; + cycle = ''; + drawOptions = opts_add(drawOptions,'table/row sep','crcr'); + % TODO: is the above "crcr" compatible with pgfplots 1.12 ? + % TODO: is a "patch table" externalizable? + + % Enforce 'patch' or cannot use 'patch table=' + if strcmpi(s.plotType,'mesh') + drawOptions = opts_add(drawOptions,'patch'); + end + drawOptions = opts_add(drawOptions,s.plotType); % Eventually add mesh, but after patch! + + drawOptions = getPatchShape(m2t, handle, drawOptions, patchOptions); + + [m2t, drawOptions, Vertices, Faces, verticesTableOptions, ptType, ... + columnNames] = setColorsOfPatches(m2t, handle, drawOptions, ... + Vertices, Faces, verticesTableOptions, ptType, columnNames, ... + isFaceColorFlat, s); + end + + drawOptions = maybeShowInLegend(m2t.currentHandleHasLegend, drawOptions); + m2t = jumpAtUnboundCoords(m2t, Faces(:)); + + % Add Faces table + if ~isempty(ptType) + [m2t, facesTable] = makeTable(m2t, repmat({''},1,size(Faces,2)), Faces); + drawOptions = opts_add(drawOptions, ptType, sprintf('{%s}', facesTable)); + end + + % Plot the actual data. + [m2t, verticesTable, tableOptions] = makeTable(m2t, columnNames, Vertices); + tableOptions = opts_merge(tableOptions, verticesTableOptions); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\n\\%s[%s]\ntable[%s] {%s}%s;\n',... + plotCmd, drawOpts, tabOpts, verticesTable, cycle); +end +% ============================================================================== +function [m2t, drawOptions, Vertices, Faces, verticesTableOptions, ptType, ... + columnNames] = setColorsOfPatches(m2t, handle, drawOptions, ... + Vertices, Faces, verticesTableOptions, ptType, columnNames, isFaceColorFlat, s) + % this behemoth does the color setting for patches + + % TODO: this function can probably be split further, just look at all those + % parameters being passed. + + fvCData = get(handle,'FaceVertexCData'); + rowsCData = size(fvCData,1); + + % We have CData for either all faces or vertices + if rowsCData > 1 + + % Add the color map + m2t = m2t_addAxisOption(m2t, matlab2pgfplotsColormap(m2t, m2t.current.colormap)); + + % Determine if mapping is direct or scaled + CDataMapping = get(handle,'CDataMapping'); + if strcmpi(CDataMapping, 'direct') + drawOptions = opts_add(drawOptions, 'colormap access','direct'); + end + + % Switch to face CData if not using interpolated shader + isVerticesCData = rowsCData == size(Vertices,1); + if isFaceColorFlat && isVerticesCData + % Take first vertex color (see FaceColor in Patch Properties) + fvCData = fvCData(Faces(:,1)+ 1,:); + rowsCData = size(fvCData,1); + isVerticesCData = false; + end + + % Point meta as true color CData, i.e. RGB in [0,1] + if size(fvCData,2) == 3 + % Create additional custom colormap + m2t.axes{end}.options(end+1,:) = ... + {matlab2pgfplotsColormap(m2t, fvCData, 'patchmap'), []}; + drawOptions = opts_append(drawOptions, 'colormap name','patchmap'); + + % Index into custom colormap + fvCData = (0:rowsCData-1)'; + end + + % Add pointmeta data to vertices or faces + if isVerticesCData + columnNames{end+1} = 'c'; + verticesTableOptions = opts_add(verticesTableOptions, 'point meta','\thisrow{c}'); + Vertices = [Vertices, fvCData]; + else + ptType = 'patch table with point meta'; + Faces = [Faces fvCData]; + end + + else + % Scalar FaceVertexCData, i.e. one color mapping for all patches, + % used e.g. by Octave in drawing barseries + + [m2t,xFaceColor] = getColor(m2t, handle, s.faceColor, 'patch'); + drawOptions = opts_add(drawOptions, 'fill', xFaceColor); + end +end +% ============================================================================== +function [drawOptions] = maybeShowInLegend(showInLegend, drawOptions) + % sets the appropriate options to show/hide the plot in the legend + if ~showInLegend + % No legend entry found. Don't include plot in legend. + drawOptions = opts_add(drawOptions, 'forget plot'); + end +end +% ============================================================================== +function [m2t, options] = setColor(m2t, handle, options, property, color, noneValue) + % assigns the MATLAB color of the object identified by "handle" to the LaTeX + % property stored in the options array. An optional "noneValue" can be provided + % that is set when the color == 'none' (if it is omitted, the property will not + % be set). + % TODO: probably this should be integrated with getAndCheckDefault etc. + if opts_has(options,property) && isNone(opts_get(options,property)) + return + end + if ~isNone(color) + [m2t, xcolor] = getColor(m2t, handle, color, 'patch'); + if ~isempty(xcolor) + % this may happen when color == 'flat' and CData is Nx3, e.g. in + % scatter plot or in patches + if isempty(property) + options = opts_add(options, xcolor); + else + options = opts_add(options, property, xcolor); + end + end + else + if exist('noneValue','var') + options = opts_add(options, property, noneValue); + end + end +end +% ============================================================================== +function drawOptions = getPatchShape(m2t, h, drawOptions, patchOptions) + % Retrieves the shape options (i.e. number of vertices) of patch objects + % Depending on the number of vertices, patches can be triangular, rectangular + % or polygonal + % See pgfplots 1.12 manual section 5.8.1 "Additional Patch Types" and the + % patchplots library + vertexCount = size(get(h, 'Faces'), 2); + + switch vertexCount + case 3 % triangle (default) + % do nothing special + + case 4 % rectangle + drawOptions = opts_add(drawOptions,'patch type', 'rectangle'); + + otherwise % generic polygon + userInfo(m2t, '\nMake sure to load \\usepgfplotslibrary{patchplots} in the preamble.\n'); + + % Default interpolated shader,not supported by polygon, to faceted + isFaceColorFlat = isempty(strfind(opts_get(patchOptions, 'shader'),'interp')); + if ~isFaceColorFlat + % NOTE: check if pgfplots supports this (or specify version) + userInfo(m2t, '\nPgfplots does not support interpolation for polygons.\n Use patches with at most 4 vertices.\n'); + patchOptions = opts_remove(patchOptions, 'shader'); + patchOptions = opts_add(patchOptions, 'shader', 'faceted'); + end + + % Add draw options + drawOptions = opts_add(drawOptions, 'patch type', 'polygon'); + drawOptions = opts_add(drawOptions, 'vertex count', ... + sprintf('%d', vertexCount)); + end + + drawOptions = opts_merge(drawOptions, patchOptions); +end +% ============================================================================== +function [cycle] = conditionallyCyclePath(data) + % returns "--cycle" when the path should be cyclic in pgfplots + % Mostly, this is the case UNLESS the data record starts or ends with a NaN + % record (i.e. a break in the path) + if any(~isfinite(data([1 end],:))) + cycle = ''; + else + cycle = '--cycle'; + end +end +% ============================================================================== +function m2t = jumpAtUnboundCoords(m2t, data) + % signals the axis to allow discontinuities in the plot at unbounded + % coordinates (i.e. Inf and NaN). + % See also pgfplots 1.12 manual section 4.5.13 "Interrupted Plots". + if any(~isfinite(data(:))) + m2t = needsPgfplotsVersion(m2t, [1 4]); + m2t = m2t_addAxisOption(m2t, 'unbounded coords', 'jump'); + end +end +% ============================================================================== +function [m2t, str] = drawImage(m2t, handle) + str = ''; + if ~isVisible(handle) + return + end + + % read x-, y-, and color-data + xData = get(handle, 'XData'); + yData = get(handle, 'YData'); + cData = get(handle, 'CData'); + + if (m2t.args.imagesAsPng) + [m2t, str] = imageAsPNG(m2t, handle, xData, yData, cData); + else + [m2t, str] = imageAsTikZ(m2t, handle, xData, yData, cData); + end + + % Make sure that the axes are still visible above the image. + m2t = m2t_addAxisOption(m2t, 'axis on top'); +end +% ============================================================================== +function [m2t, str] = imageAsPNG(m2t, handle, xData, yData, cData) + [m2t, fileNum] = incrementGlobalCounter(m2t, 'pngFile'); + % ------------------------------------------------------------------------ + % draw a png image + [pngFileName, pngReferencePath] = externalFilename(m2t, fileNum, '.png'); + + % Get color indices for indexed images and truecolor values otherwise + if ndims(cData) == 2 %#ok don't use ismatrix (cfr. #143) + [m2t, colorData] = cdata2colorindex(m2t, cData, handle); + else + colorData = cData; + end + + m = size(cData, 1); + n = size(cData, 2); + + alphaData = normalizedAlphaValues(m2t, get(handle,'AlphaData'), handle); + if numel(alphaData) == 1 + alphaData = alphaData(ones(size(colorData(:,:,1)))); + end + [colorData, alphaData] = flipImageIfAxesReversed(m2t, colorData, alphaData); + + % Write an indexed or a truecolor image + hasAlpha = true; + if isfloat(alphaData) && all(alphaData(:) == 1) + alphaOpts = {}; + hasAlpha = false; + else + alphaOpts = {'Alpha', alphaData}; + end + if (ndims(colorData) == 2) %#ok don't use ismatrix (cfr. #143) + if size(m2t.current.colormap, 1) <= 256 && ~hasAlpha + % imwrite supports maximum 256 values in a colormap (i.e. 8 bit) + % and no alpha channel for indexed PNG images. + imwrite(colorData, m2t.current.colormap, ... + pngFileName, 'png'); + else % use true-color instead + imwrite(ind2rgb(colorData, m2t.current.colormap), ... + pngFileName, 'png', alphaOpts{:}); + end + else + imwrite(colorData, pngFileName, 'png', alphaOpts{:}); + end + % ----------------------------------------------------------------------- + % dimensions of a pixel in axes units + if n == 1 + xLim = get(m2t.current.gca, 'XLim'); + xw = xLim(2) - xLim(1); + else + xw = (xData(end)-xData(1)) / (n-1); + end + if m == 1 + yLim = get(m2t.current.gca, 'YLim'); + yw = yLim(2) - yLim(1); + else + yw = (yData(end)-yData(1)) / (m-1); + end + + opts = opts_new(); + opts = opts_add(opts, 'xmin', sprintf(m2t.ff, xData(1 ) - xw/2)); + opts = opts_add(opts, 'xmax', sprintf(m2t.ff, xData(end) + xw/2)); + opts = opts_add(opts, 'ymin', sprintf(m2t.ff, yData(1 ) - yw/2)); + opts = opts_add(opts, 'ymax', sprintf(m2t.ff, yData(end) + yw/2)); + + % Print out + drawOpts = opts_print(opts); + str = sprintf('\\addplot [forget plot] graphics [%s] {%s};\n', ... + drawOpts, pngReferencePath); + + userInfo(m2t, ... + ['\nA PNG file is stored at ''%s'' for which\n', ... + 'the TikZ file contains a reference to ''%s''.\n', ... + 'You may need to adapt this, depending on the relative\n', ... + 'locations of the master TeX file and the included TikZ file.\n'], ... + pngFileName, pngReferencePath); +end +% ============================================================================== +function [m2t, str] = imageAsTikZ(m2t, handle, xData, yData, cData) + % writes an image as raw TikZ commands (STRONGLY DISCOURAGED) + + % set up cData + if ndims(cData) == 3 + cData = cData(end:-1:1,:,:); + else + cData = cData(end:-1:1,:); + end + + % Generate uniformly distributed X, Y, although xData and yData may be + % non-uniform. + % This is MATLAB(R) behavior. + [X, hX] = constructUniformXYDataForImage(xData, size(cData, 2)); + [Y, hY] = constructUniformXYDataForImage(yData, size(cData, 1)); + [m2t, xcolor] = getColor(m2t, handle, cData, 'image'); + + % The following section takes pretty long to execute, although in + % principle it is discouraged to use TikZ for those; LaTeX will take + % forever to compile. + % Still, a bug has been filed on MathWorks to allow for one-line + % sprintf'ing with (string+num) cells (Request ID: 1-9WHK4W); + % . + % An alternative approach could be to use 'surf' or 'patch' of pgfplots + % with inline tables. + str = ''; + m = length(X); + n = length(Y); + imageString = cell(1, m); + for i = 1:m + subString = cell(1, n); + for j = 1:n + subString{j} = sprintf(['\t\\fill [%s] ', ... + '(axis cs:', m2t.ff,',', m2t.ff,') rectangle ', ... + '(axis cs:', m2t.ff,',',m2t.ff,');\n'], ... + xcolor{n-j+1,i}, ... + X(i)-hX/2, Y(j)-hY/2, ... + X(i)+hX/2, Y(j)+hY/2); + end + imageString{i} = join(m2t, subString, ''); + end + str = join(m2t, [str, imageString], ''); +end +function [XY, delta] = constructUniformXYDataForImage(XYData, expectedLength) + % Generate uniformly distributed X, Y, although xData/yData may be + % non-uniform. Dimension indicates the corresponding dimension in the cData matrix. + switch length(XYData) + case 2 % only the limits given; common for generic image plots + delta = 1; + case expectedLength % specific x/y-data is given + delta = (XYData(end)-XYData(1)) / (length(XYData)-1); + otherwise + error('drawImage:arrayLengthMismatch', ... + 'CData length (%d) does not match X/YData length (%d).', ... + expectedLength, length(XYData)); + end + XY = XYData(1):delta:XYData(end); +end +% ============================================================================== +function [colorData, alphaData] = flipImageIfAxesReversed(m2t, colorData, alphaData) + % flip the image if reversed + if m2t.xAxisReversed + colorData = colorData(:, end:-1:1, :); + alphaData = alphaData(:, end:-1:1); + end + if ~m2t.yAxisReversed % y-axis direction is reversed normally for images, flip otherwise + colorData = colorData(end:-1:1, :, :); + alphaData = alphaData(end:-1:1, :); + end +end +% ============================================================================== +function alpha = normalizedAlphaValues(m2t, alpha, handle) + alphaDataMapping = getOrDefault(handle, 'AlphaDataMapping', 'none'); + switch lower(alphaDataMapping) + case 'none' % no rescaling needed + case 'scaled' + ALim = get(m2t.current.gca, 'ALim'); + AMax = ALim(2); + AMin = ALim(1); + if ~isfinite(AMax) + AMax = max(alpha(:)); %NOTE: is this right? + end + alpha = (alpha - AMin)./(AMax - AMin); + case 'direct' + alpha = ind2rgb(alpha, get(m2t.current.gcf, 'Alphamap')); + otherwise + error('matlab2tikz:UnknownAlphaMapping', ... + 'Unknown alpha mapping "%s"', alphaMapping); + end + + if isfloat(alpha) %important, alpha data can have integer type which should not be scaled + alpha = min(1,max(alpha,0)); % clip at range [0, 1] + end +end +% ============================================================================== +function [m2t, str] = drawContour(m2t, h) + if isHG2() + [m2t, str] = drawContourHG2(m2t, h); + else + % Save legend state for the contour group + hasLegend = m2t.currentHandleHasLegend; + + % Plot children patches + children = allchild(h); + N = numel(children); + str = cell(N,1); + for ii = 1:N + % Plot in reverse order + child = children(N-ii+1); + isContourLabel = strcmpi(get(child,'type'),'text'); + if isContourLabel + [m2t, str{ii}] = drawText(m2t,child); + else + [m2t, str{ii}] = drawPatch(m2t,child); + end + + % Only first child can be in the legend + m2t.currentHandleHasLegend = false; + end + str = strcat(str,sprintf('\n')); + str = [str{:}]; + + % Restore group's legend state + m2t.currentHandleHasLegend = hasLegend; + end +end +% ============================================================================== +function [m2t, str] = drawContourHG2(m2t, h) + str = ''; + if ~isVisible(h) + return + end + + % Retrieve ContourMatrix + contours = get(h,'ContourMatrix')'; + [istart, nrows] = findStartOfContourData(contours); + + % Scale negative contours one level down (for proper coloring) + Levels = contours(istart,1); + LevelList = get(h,'LevelList'); + ineg = Levels < 0; + if any(ineg) && min(LevelList) < min(Levels) + [idx,pos] = ismember(Levels, LevelList); + idx = idx & ineg; + contours(istart(idx)) = LevelList(pos(idx)-1); + end + + % Draw a contour group (MATLAB R2014b and newer only) + isFilled = isOn(get(h,'Fill')); + if isFilled + [m2t, str] = drawFilledContours(m2t, h, contours, istart, nrows); + else + % Add colormap + cmap = m2t.current.colormap; + m2t = m2t_addAxisOption(m2t, matlab2pgfplotsColormap(m2t, cmap)); + + % Contour table in Matlab format + plotOptions = opts_new(); + plotOptions = opts_add(plotOptions,'contour prepared'); + plotOptions = opts_add(plotOptions,'contour prepared format','matlab'); + + % Labels + if isOff(get(h,'ShowText')) + plotOptions = opts_add(plotOptions,'contour/labels','false'); + end + + % Get line properties + [m2t, lineOptions] = getLineOptions(m2t, h); + + % Check for special color settings + [lineColor, isDefaultColor] = getAndCheckDefault('contour', h, 'LineColor', 'flat'); + if ~isDefaultColor + [m2t, lineOptions] = setColor(m2t, h, lineOptions, 'contour/draw color', lineColor, 'none'); + end + + % Merge the line options with the contour plot options + plotOptions = opts_merge(plotOptions, lineOptions); + + % Make contour table + [m2t, table, tableOptions] = makeTable(m2t, {'',''}, contours); + + % Print out + plotOpts = opts_print(plotOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s] {%%\n%s};\n', ... + plotOpts, tabOpts, table); + end +end +% ============================================================================== +function [istart, nrows] = findStartOfContourData(contours) + % Index beginning of contour data (see contourc.m for details) + nrows = size(contours,1); + istart = false(nrows,1); + pos = 1; + while pos < nrows + istart(pos) = true; + pos = pos + contours(pos, 2) + 1; + end + istart = find(istart); +end +% ============================================================================== +function [m2t, str] = drawFilledContours(m2t, h, contours, istart, nrows) + % Loop each contour and plot a filled region + % + % NOTE: + % - we cannot plot from inner to outer contour since the last + % filled area will cover the inner regions. Therefore, we need to + % invert the plotting order in those cases. + % - we need to distinguish between contour groups. A group is + % defined by inclusion, i.e. its members are contained within one + % outer contour. The outer contours of two groups cannot include + % each other. + str = ''; + if ~isVisible(h) + return + end + + % Split contours in cell array + cellcont = mat2cell(contours, diff([istart; nrows+1])); + ncont = numel(cellcont); + + % Determine contour groups and the plotting order. + % The ContourMatrix lists the contours in ascending order by level. + % Hence, if the lowest (first) contour contains any others, then the + % group will be a peak. Otherwise, the group will be a valley, and + % the contours will have to be plotted in reverse order, i.e. from + % highest (largest) to lowest (narrowest). + + %FIXME: close the contours over the border of the domain, see #723. + order = NaN(ncont,1); + ifree = true(ncont,1); + from = 1; + while any(ifree) + % Select peer with lowest level among the free contours, i.e. + % those which do not belong to any group yet + pospeer = find(ifree,1,'first'); + peer = cellcont{pospeer}; + igroup = false(ncont,1); + + % Loop through all contours + for ii = 1:numel(cellcont) + if ~ifree(ii), continue, end + + curr = cellcont{ii}; + % Current contour contained in the peer + if inpolygon(curr(2,1),curr(2,2), peer(2:end,1),peer(2:end,2)) + igroup(ii) = true; + isinverse = false; + % Peer contained in the current + elseif inpolygon(peer(2,1),peer(2,2),curr(2:end,1),curr(2:end,2)) + igroup(ii) = true; + isinverse = true; + end + end + % Order members of group according to the inclusion principle + nmembers = nnz(igroup ~= 0); + if isinverse + order(igroup) = nmembers+from-1:-1:from; + else + order(igroup) = from:nmembers+from-1; + end + + % Continue numbering + from = from + nmembers; + ifree = ifree & ~igroup; + end + + % Reorder the contours + cellcont(order,1) = cellcont; + + % Add zero level fill + xdata = get(h,'XData'); + ydata = get(h,'YData'); + %FIXME: determine the contour at the zero level not just its bounding box + % See also: #721 + zerolevel = [0, 4; + min(xdata(:)), min(ydata(:)); + min(xdata(:)), max(ydata(:)); + max(xdata(:)), max(ydata(:)); + max(xdata(:)), min(ydata(:))]; + cellcont = [zerolevel; cellcont]; + + % Plot + columnNames = {'x','y'}; + for ii = 1:ncont + 1 + drawOptions = opts_new(); + + % Get fill color + zval = cellcont{ii}(1,1); + [m2t, xcolor] = getColor(m2t,h,zval,'image'); + drawOptions = opts_add(drawOptions,'fill',xcolor); + + % Get line properties + lineColor = get(h, 'LineColor'); + + [m2t, drawOptions] = setColor(m2t, h, drawOptions, 'draw', lineColor, 'none'); + + [m2t, lineOptions] = getLineOptions(m2t, h); + drawOptions = opts_merge(drawOptions, lineOptions); + + % Toggle legend entry + hasLegend = ii == 1 && m2t.currentHandleHasLegend; + drawOptions = maybeShowInLegend(hasLegend, drawOptions); + + % Print table + [m2t, table, tableOptions] = makeTable(m2t, columnNames, cellcont{ii}(2:end,:)); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('%s\\addplot[%s] table[%s] {%%\n%s};\n', ... + str, drawOpts, tabOpts, table); + end +end +% ============================================================================== +function [m2t, str] = drawHggroup(m2t, h) + % Continue according to the plot type. Since the function `handle` is + % not available in Octave, the plot type will be guessed or the fallback type + % 'unknown' used. + % #COMPLEX: big switch-case + switch getEnvironment() + case 'MATLAB' + cl = class(handle(h)); + + case 'Octave' + % Function `handle` is not yet implemented in Octave + % Consequently the plot type needs to be guessed. See #645. + cl = guessOctavePlotType(h); + + otherwise + errorUnknownEnvironment(); + end + + switch(cl) + case {'specgraph.barseries', 'matlab.graphics.chart.primitive.Bar'} + % hist plots and friends + [m2t, str] = drawBarseries(m2t, h); + + case {'specgraph.stemseries', 'matlab.graphics.chart.primitive.Stem'} + % stem plots + [m2t, str] = drawStemSeries(m2t, h); + + case {'specgraph.stairseries', 'matlab.graphics.chart.primitive.Stair'} + % stair plots + [m2t, str] = drawStairSeries(m2t, h); + + case {'specgraph.areaseries', 'matlab.graphics.chart.primitive.Area'} + % scatter plots + [m2t,str] = drawAreaSeries(m2t, h); + + case {'specgraph.quivergroup', 'matlab.graphics.chart.primitive.Quiver'} + % quiver arrows + [m2t, str] = drawQuiverGroup(m2t, h); + + case {'specgraph.errorbarseries', 'matlab.graphics.chart.primitive.ErrorBar'} + % error bars + [m2t,str] = drawErrorBars(m2t, h); + + case {'specgraph.scattergroup','matlab.graphics.chart.primitive.Scatter'} + % scatter plots + [m2t,str] = drawScatterPlot(m2t, h); + + case {'specgraph.contourgroup', 'matlab.graphics.chart.primitive.Contour'} + [m2t,str] = drawContour(m2t, h); + + case {'hggroup', 'matlab.graphics.primitive.Group'} + % handle all those the usual way + [m2t, str] = handleAllChildren(m2t, h); + + case 'unknown' + % Octave only: plot type could not be determined + % Fall back to basic plotting + [m2t, str] = handleAllChildren(m2t, h); + + otherwise + userWarning(m2t, 'Don''t know class ''%s''. Default handling.', cl); + try + m2tBackup = m2t; + [m2t, str] = handleAllChildren(m2t, h); + catch ME + userWarning(m2t, 'Default handling for ''%s'' failed. Continuing as if it did not occur. \n Original Message:\n %s', cl, getReport(ME)); + [m2t, str] = deal(m2tBackup, ''); % roll-back + end + end +end +% ============================================================================== +% Function `handle` is not yet implemented in Octave. +% Consequently the plot type needs to be guessed. See #645. +% If the type can not be determined reliably, 'unknown' will be set. +function cl = guessOctavePlotType(h) + % scatter plots + if hasProperties(h, {'marker','sizedata','cdata'}, {}) + cl = 'specgraph.scattergroup'; + + % error bars + elseif hasProperties(h, {'udata','ldata'}, {}) + cl = 'specgraph.errorbarseries'; + + % quiver plots + elseif hasProperties(h, {'udata','vdata'}, {'ldata'}) + cl = 'specgraph.quivergroup'; + + % bar plots + elseif hasProperties(h, {'bargroup','barwidth', 'barlayout'}, {}) + cl = 'specgraph.barseries'; + % unknown plot type + else + cl = 'unknown'; + end +end +% ============================================================================== +function bool = hasProperties(h, fieldsExpectedPresent, fieldsExpectedAbsent) + % Check if object has all of the given properties (case-insensitive). + % h handle to object (e.g. `gcf` or `gca`) + % fieldsExpectedPresent cell array of strings with property names to be present + % fieldsExpectedPresent cell array of strings with property names to be absent + fields = lower(fieldnames(get(h))); + present = all(ismember(lower(fieldsExpectedPresent), fields)); + absent = ~any(ismember(lower(fieldsExpectedAbsent), fields)); + bool = present && absent; +end +% ============================================================================== +function m2t = drawAnnotations(m2t) + % Draws annotation in Matlab (Octave not supported). + + % In HG1 annotations are children of an invisible axis called scribeOverlay. + % In HG2 annotations are children of annotationPane object which does not + % have any axis properties. Hence, we cannot simply handle it with a + % drawAxes() call. + + % Octave + if strcmpi(getEnvironment,'Octave') + return + end + + % Get annotation handles + if isHG2 + annotPanes = findall(m2t.current.gcf,'Tag','scribeOverlay'); + children = allchild(annotPanes); + %TODO: is this dead code? + if iscell(children) + children = [children{:}]; + end + annotHandles = findall(children,'Visible','on'); + else + annotHandles = findall(m2t.scribeLayer,'-depth',1,'Visible','on'); + end + + % There are no anotations + if isempty(annotHandles) + return + end + + % Create fake simplified axes overlay (no children) + warning('off', 'matlab2tikz:NoChildren') + scribeLayer = axes('Units','Normalized','Position',[0,0,1,1],'Visible','off'); + m2t = drawAxes(m2t, scribeLayer); + warning('on', 'matlab2tikz:NoChildren') + + % Plot in reverse to preserve z-ordering and assign the converted + % annotations to the converted fake overlay + for ii = numel(annotHandles):-1:1 + m2t = drawAnnotationsHelper(m2t,annotHandles(ii)); + end + + % Delete fake overlay graphics object + delete(scribeLayer) +end +% ============================================================================== +function m2t = drawAnnotationsHelper(m2t,h) + % Get class name + try + cl = class(handle(h)); + catch + cl = 'unknown'; + end + + switch cl + + % Line + case {'scribe.line', 'matlab.graphics.shape.Line'} + [m2t, str] = drawLine(m2t, h); + + % Ellipse + case {'scribe.scribeellipse','matlab.graphics.shape.Ellipse'} + [m2t, str] = drawEllipse(m2t, h); + + % Arrows + case {'scribe.arrow', 'scribe.doublearrow'}%,... + %'matlab.graphics.shape.Arrow', 'matlab.graphics.shape.DoubleEndArrow'} + % Annotation: single and double Arrow, line + % TODO: + % - write a drawArrow(). Handle all info info directly + % without using handleAllChildren() since HG2 does not have + % children (so no shortcut). + % - It would be good if drawArrow() was callable on a + % matlab.graphics.shape.TextArrow object to draw the arrow + % part. + [m2t, str] = handleAllChildren(m2t, h); + + % Text box + case {'scribe.textbox','matlab.graphics.shape.TextBox'} + [m2t, str] = drawText(m2t, h); + + % Tetx arrow + case {'scribe.textarrow'}%,'matlab.graphics.shape.TextArrow'} + % TODO: rewrite drawTextarrow. Handle all info info directly + % without using handleAllChildren() since HG2 does not + % have children (so no shortcut) as used for + % scribe.textarrow. + [m2t, str] = drawTextarrow(m2t, h); + + % Rectangle + case {'scribe.scriberect', 'matlab.graphics.shape.Rectangle'} + [m2t, str] = drawRectangle(m2t, h); + + otherwise + userWarning(m2t, 'Don''t know annotation ''%s''.', cl); + return + end + + % Add annotation to scribe overlay + m2t.axes{end} = addChildren(m2t.axes{end}, str); +end +% ============================================================================== +function [m2t,str] = drawSurface(m2t, h) + + [m2t, opts, s] = shaderOpts(m2t, h,'surf'); + tableOptions = opts_new(); + + % Allow for empty surf + if isNone(s.plotType) + str = ''; + return + end + + [dx, dy, dz, numrows] = getXYZDataFromSurface(h); + m2t = jumpAtUnboundCoords(m2t, [dx(:); dy(:); dz(:)]); + + [m2t, opts] = addZBufferOptions(m2t, h, opts); + + % Check if 3D + is3D = m2t.axes{end}.is3D; + if is3D + columnNames = {'x','y','z','c'}; + plotCmd = 'addplot3'; + data = applyHgTransform(m2t, [dx(:), dy(:), dz(:)]); + else + columnNames = {'x','y','c'}; + plotCmd = 'addplot'; + data = [dx(:), dy(:)]; + end + + % There are several possibilities of how colors are specified for surface + % plots: + % * explicitly by RGB-values, + % * implicitly through a color map with a point-meta coordinate, + % * implicitly through a color map with a given coordinate (e.g., z). + % + + % Check if we need extra CData. + CData = get(h, 'CData'); + if length(size(CData)) == 3 && size(CData, 3) == 3 + + % Create additional custom colormap + nrows = size(data,1); + CData = reshape(CData, nrows,3); + m2t.axes{end}.options(end+1,:) = ... + {matlab2pgfplotsColormap(m2t, CData, 'patchmap'), []}; + + % Index into custom colormap + color = (0:nrows-1)'; + + tableOptions = opts_add(tableOptions, 'colormap name','surfmap'); + else + opts = opts_add(opts,matlab2pgfplotsColormap(m2t, m2t.current.colormap),''); + % If NaNs are present in the color specifications, don't use them for + % Pgfplots; they may be interpreted as strings there. + % Note: + % Pgfplots actually does a better job than MATLAB in determining what + % colors to use for the patches. The circular test case on + % http://www.mathworks.de/de/help/matlab/ref/pcolor.html, for example + % yields a symmetric setup in Pgfplots (and doesn't in MATLAB). + needsPointmeta = any(xor(isnan(dz(:)), isnan(CData(:)))) ... + || any(abs(CData(:) - dz(:)) > 1.0e-10); + if needsPointmeta + color = CData(:); + else + color = dz(:); % Fallback on the z-values, especially if 2D view + end + end + tableOptions = opts_add(tableOptions, 'point meta','\thisrow{c}'); + + data = [data, color]; + + % Add mesh/rows= for specifying the row data instead of empty + % lines in the data list below. This makes it possible to reduce the + % data writing to one single sprintf() call. + opts = opts_add(opts,'mesh/rows',sprintf('%d', numrows)); + + % Print the addplot options + str = sprintf('\n\\%s[%%\n%s,\n%s]', plotCmd, s.plotType, opts_print(opts)); + + % Print the data + [m2t, table, tabOptsExtra] = makeTable(m2t, columnNames, data); + tableOptions = opts_merge(tabOptsExtra, tableOptions); + tabOpts = opts_print(tableOptions); + + % Here is where everything is put together + str = sprintf('%s\ntable[%s] {%%\n%s};\n', ... + str, tabOpts, table); + + % TODO: + % - remove grids in spectrogram by either removing grid command + % or adding: 'grid=none' from/in axis options + % - handling of huge data amounts in LaTeX. + + [m2t, labelString] = addLabel(m2t, h); + str = [str, labelString]; +end +% ============================================================================== +function [m2t, opts] = addZBufferOptions(m2t, h, opts) + % Enforce 'z buffer=sort' if shader is flat and is a 3D plot. It is to + % avoid overlapping e.g. sphere plots and to properly mimic Matlab's + % coloring of faces. + % NOTE: + % - 'z buffer=sort' is computationally more expensive for LaTeX, we + % could try to avoid it in some default situations, e.g. when dx and + % dy are rank-1-matrices. + % - hist3D plots should not be z-sorted or the highest bars will cover + % the shortest one even if positioned in the back + isShaderFlat = isempty(strfind(opts_get(opts, 'shader'), 'interp')); + isHist3D = strcmpi(get(h,'tag'), 'hist3'); + is3D = m2t.axes{end}.is3D; + if is3D && isShaderFlat && ~isHist3D + opts = opts_add(opts, 'z buffer', 'sort'); + % Pgfplots 1.12 contains a bug fix that fixes legend entries when + % 'z buffer=sort' has been set. So, it's easier to always require that + % version anyway. See #504 for more information. + m2t = needsPgfplotsVersion(m2t, [1,12]); + end +end +% ============================================================================== +function [dx, dy, dz, numrows] = getXYZDataFromSurface(h) + % retrieves X, Y and Z data from a Surface plot. The data gets returned in a + % wastefull format where the dimensions of these data vectors is equal, akin + % to the format used by meshgrid. + dx = get(h, 'XData'); + dy = get(h, 'YData'); + dz = get(h, 'ZData'); + [numcols, numrows] = size(dz); + + % If dx or dy are given as vectors, convert them to the (wasteful) matrix + % representation first. This makes sure we can treat the data with one + % single sprintf() command below. + if isvector(dx) + dx = ones(numcols,1) * dx(:)'; + end + if isvector(dy) + dy = dy(:) * ones(1,numrows); + end +end +% ============================================================================== +function [m2t, str] = drawVisibleText(m2t, handle) + % Wrapper for drawText() that only draws visible text + + % There may be some text objects floating around a MATLAB figure which are + % handled by other subfunctions (labels etc.) or don't need to be handled at + % all. + % The HandleVisibility says something about whether the text handle is + % visible as a data structure or not. Typically, a handle is hidden if the + % graphics aren't supposed to be altered, e.g., axis labels. Most of those + % entities are captured by matlab2tikz one way or another, but sometimes they + % are not. This is the case, for example, with polar plots and the axis + % descriptions therein. Also, Matlab treats text objects with a NaN in the + % position as invisible. + if any(isnan(get(handle, 'Position')) | isnan(get(handle, 'Rotation'))) ... + || isOff(get(handle, 'Visible')) ... + || (isOff(get(handle, 'HandleVisibility')) && ... + ~m2t.args.showHiddenStrings) + + str = ''; + return; + end + + [m2t, str] = drawText(m2t, handle); + +end +% ============================================================================== +function [m2t, str] = drawText(m2t, handle) + % Adding text node anywhere in the axes environment. + % Not that, in Pgfplots, long texts get cut off at the axes. This is + % Different from the default MATLAB behavior. To fix this, one could use + % /pgfplots/after end axis/.code. + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % get required properties + content = get(handle, 'String'); + Interpreter = get(handle, 'Interpreter'); + content = prettyPrint(m2t, content, Interpreter); + % Concatenate multiple lines + content = join(m2t, content, '\\'); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % translate them to pgf style + style = opts_new(); + + bgColor = get(handle,'BackgroundColor'); + [m2t, style] = setColor(m2t, handle, style, 'fill', bgColor); + + style = getXYAlignmentOfText(handle, style); + + style = getRotationOfText(m2t, handle, style); + + [m2t, fontStyle] = getFontStyle(m2t, handle); + style = opts_merge(style, fontStyle); + + EdgeColor = get(handle, 'EdgeColor'); + [m2t, style] = setColor(m2t, handle, style, 'draw', EdgeColor); + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % plot the thing + [m2t, posString] = getPositionOfText(m2t, handle); + + styleOpts = opts_print(style); + str = sprintf('\\node[%s]\nat %s {%s};\n', ... + styleOpts, posString, content); +end +% ============================================================================== +function [style] = getXYAlignmentOfText(handle, style) + % sets the horizontal and vertical alignment options of a text object + VerticalAlignment = get(handle, 'VerticalAlignment'); + HorizontalAlignment = get(handle, 'HorizontalAlignment'); + + horizontal = ''; + vertical = ''; + switch VerticalAlignment + case {'top', 'cap'} + vertical = 'below'; + case {'baseline', 'bottom'} + vertical = 'above'; + end + switch HorizontalAlignment + case 'left' + horizontal = 'right'; + case 'right' + horizontal = 'left'; + end + alignment = strtrim(sprintf('%s %s', vertical, horizontal)); + if ~isempty(alignment) + style = opts_add(style, alignment); + end + + % Set 'align' option that is needed for multiline text + style = opts_add(style, 'align', HorizontalAlignment); +end +% ============================================================================== +function [style] = getRotationOfText(m2t, handle, style) + % Add rotation, if existing + defaultRotation = 0.0; + rot = getOrDefault(handle, 'Rotation', defaultRotation); + if rot ~= defaultRotation + style = opts_add(style, 'rotate', sprintf(m2t.ff, rot)); + end +end +% ============================================================================== +function [m2t,posString] = getPositionOfText(m2t, h) + % makes the tikz position string of a text object + pos = get(h, 'Position'); + units = get(h, 'Units'); + is3D = m2t.axes{end}.is3D; + + % Deduce if text or textbox + type = get(h,'type'); + if isempty(type) || strcmpi(type,'hggroup') + type = get(h,'ShapeType'); % Undocumented property valid from 2008a + end + + switch type + case 'text' + if is3D + pos = applyHgTransform(m2t, pos); + npos = 3; + else + pos = pos(1:2); + npos = 2; + end + case {'textbox','textboxshape'} + % TODO: + % - size of the box (e.g. using node attributes minimum width / height) + % - Alignment of the resized box + pos = pos(1:2); + npos = 2; + + otherwise + error('matlab2tikz:drawText', 'Unrecognized text type: %s.', type); + end + + % Format according to units + switch units + case 'normalized' + type = 'rel axis cs:'; + fmtUnit = ''; + case 'data' + type = 'axis cs:'; + fmtUnit = ''; + % Let Matlab do the conversion of any unit into cm + otherwise + type = ''; + fmtUnit = 'cm'; + if ~strcmpi(units, 'centimeters') + % Save old pos, set units to cm, query pos, reset + % NOTE: cannot use copyobj since it is buggy in R2014a, see + % http://www.mathworks.com/support/bugreports/368385 + oldPos = get(h, 'Position'); + set(h,'Units','centimeters') + pos = get(h, 'Position'); + pos = pos(1:npos); + set(h,'Units',units,'Position',oldPos) + end + end + posString = cell(1,npos); + for ii = 1:npos + posString{ii} = formatDim(pos(ii), fmtUnit); + end + + posString = sprintf('(%s%s)',type,join(m2t,posString,',')); + m2t = disableClippingInCurrentAxes(m2t, pos); + +end +% ============================================================================== +function m2t = disableClippingInCurrentAxes(m2t, pos) + % Disables clipping in the current axes if the `pos` vector lies outside + % the limits of the axes. + xlim = getOrDefault(m2t.current.gca, 'XLim',[-Inf +Inf]); + ylim = getOrDefault(m2t.current.gca, 'YLim',[-Inf +Inf]); + zlim = getOrDefault(m2t.current.gca, 'ZLim',[-Inf +Inf]); + is3D = m2t.axes{end}.is3D; + + xOutOfRange = pos(1) < xlim(1) || pos(1) > xlim(2); + yOutOfRange = pos(2) < ylim(1) || pos(2) > ylim(2); + zOutOfRange = is3D && (pos(3) < zlim(1) || pos(3) > zlim(2)); + if xOutOfRange || yOutOfRange || zOutOfRange + m2t = m2t_addAxisOption(m2t, 'clip', 'false'); + end +end +% ============================================================================== +function [m2t, str] = drawRectangle(m2t, h) + str = ''; + + % there may be some text objects floating around a Matlab figure which + % are handled by other subfunctions (labels etc.) or don't need to be + % handled at all + if ~isVisible(h) || isOff(get(h, 'HandleVisibility')) + return; + end + + % TODO handle Curvature = [0.8 0.4] + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Get draw options. + [m2t, lineOptions] = getLineOptions(m2t, h); + [m2t, lineOptions] = getRectangleFaceOptions(m2t, h, lineOptions); + [m2t, lineOptions] = getRectangleEdgeOptions(m2t, h, lineOptions); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + pos = pos2dims(get(h, 'Position')); + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % plot the thing + lineOpts = opts_print(lineOptions); + str = sprintf(['\\draw[%s] (axis cs:',m2t.ff,',',m2t.ff, ')', ... + ' rectangle (axis cs:',m2t.ff,',',m2t.ff,');\n'], ... + lineOpts, pos.left, pos.bottom, pos.right, pos.top); +end +% ============================================================================== +function [m2t, drawOptions] = getRectangleFaceOptions(m2t, h, drawOptions) + % draws the face (i.e. fill) of a Rectangle + faceColor = get(h, 'FaceColor'); + isAnnotation = strcmpi(get(h,'type'),'rectangleshape') || ... + strcmpi(getOrDefault(h,'ShapeType',''),'rectangle'); + isFlatColor = strcmpi(faceColor, 'flat'); + if ~(isNone(faceColor) || (isAnnotation && isFlatColor)) + [m2t, xFaceColor] = getColor(m2t, h, faceColor, 'patch'); + drawOptions = opts_add(drawOptions, 'fill', xFaceColor); + end +end +% ============================================================================== +function [m2t, drawOptions] = getRectangleEdgeOptions(m2t, h, drawOptions) + % draws the edges of a rectangle + edgeColor = get(h, 'EdgeColor'); + lineStyle = get(h, 'LineStyle'); + if isNone(lineStyle) || isNone(edgeColor) + drawOptions = opts_add(drawOptions, 'draw', 'none'); + else + [m2t, drawOptions] = setColor(m2t, h, drawOptions, 'draw', edgeColor); + end +end +% ============================================================================== +function [m2t,opts,s] = shaderOpts(m2t, handle, selectedType) + % SHADEROPTS Returns the shader, fill and draw options for patches, surfs and meshes + % + % SHADEROPTS(M2T, HANDLE, SELECTEDTYPE) Where SELECTEDTYPE should either + % be 'surf' or 'patch' + % + % + % [...,OPTS, S] = SHADEROPTS(...) + % OPTS is a M by 2 cell array with Key/Value pairs + % S is a struct with fields, e.g. 'faceColor', to be re-used by the + % caller + + % Initialize + opts = opts_new; + s.hasOneEdgeColor = false; + s.hasOneFaceColor = false; + + % Get relevant Face and Edge color properties + s.faceColor = get(handle, 'FaceColor'); + s.edgeColor = get(handle, 'EdgeColor'); + + if isNone(s.faceColor) && isNone(s.edgeColor) + s.plotType = 'none'; + s.hasOneEdgeColor = true; + elseif isNone(s.faceColor) + s.plotType = 'mesh'; + s.hasOneFaceColor = true; + [m2t, opts, s] = shaderOptsMesh(m2t, handle, opts, s); + else + s.plotType = selectedType; + [m2t, opts, s] = shaderOptsSurfPatch(m2t, handle, opts, s); + end +end +% ============================================================================== +function [m2t, opts, s] = shaderOptsMesh(m2t, handle, opts, s) + + % Edge 'interp' + if strcmpi(s.edgeColor, 'interp') + opts = opts_add(opts,'shader','flat'); + + % Edge RGB + else + s.hasOneEdgeColor = true; + [m2t, xEdgeColor] = getColor(m2t, handle, s.edgeColor, 'patch'); + opts = opts_add(opts,'color',xEdgeColor); + end +end +% ============================================================================== +function [m2t, opts, s] = shaderOptsSurfPatch(m2t, handle, opts, s) + % gets the shader options for surface patches + + % Set opacity if FaceAlpha < 1 in MATLAB + s.faceAlpha = get(handle, 'FaceAlpha'); + if isnumeric(s.faceAlpha) && s.faceAlpha ~= 1.0 + opts = opts_add(opts,'fill opacity',sprintf(m2t.ff,s.faceAlpha)); + end + + % Set opacity if EdgeAlpha < 1 in MATLAB + s.edgeAlpha = get(handle, 'EdgeAlpha'); + if isnumeric(s.edgeAlpha) && s.edgeAlpha ~= 1.0 + opts = opts_add(opts,'draw opacity',sprintf(m2t.ff,s.edgeAlpha)); + end + + if isNone(s.edgeColor) % Edge 'none' + [m2t, opts, s] = shaderOptsSurfPatchEdgeNone(m2t, handle, opts, s); + + elseif strcmpi(s.edgeColor, 'interp') % Edge 'interp' + [m2t, opts, s] = shaderOptsSurfPatchEdgeInterp(m2t, handle, opts, s); + + elseif strcmpi(s.edgeColor, 'flat') % Edge 'flat' + [m2t, opts, s] = shaderOptsSurfPatchEdgeFlat(m2t, handle, opts, s); + + else % Edge RGB + [m2t, opts, s] = shaderOptsSurfPatchEdgeRGB(m2t, handle, opts, s); + end +end +% ============================================================================== +function [m2t, opts, s] = shaderOptsSurfPatchEdgeNone(m2t, handle, opts, s) + % gets the shader options for surface patches without edges + s.hasOneEdgeColor = true; % consider void as true + if strcmpi(s.faceColor, 'flat') + opts = opts_add(opts,'shader','flat'); + elseif strcmpi(s.faceColor, 'interp'); + opts = opts_add(opts,'shader','interp'); + else + s.hasOneFaceColor = true; + [m2t,xFaceColor] = getColor(m2t, handle, s.faceColor, 'patch'); + opts = opts_add(opts,'fill',xFaceColor); + end +end +function [m2t, opts, s] = shaderOptsSurfPatchEdgeInterp(m2t, handle, opts, s) + % gets the shader options for surface patches with interpolated edge colors + if strcmpi(s.faceColor, 'interp') + opts = opts_add(opts,'shader','interp'); + elseif strcmpi(s.faceColor, 'flat') + opts = opts_add(opts,'shader','faceted'); + else + s.hasOneFaceColor = true; + [m2t,xFaceColor] = getColor(m2t, handle, s.faceColor, 'patch'); + opts = opts_add(opts,'fill',xFaceColor); + end +end +function [m2t, opts, s] = shaderOptsSurfPatchEdgeFlat(m2t, handle, opts, s) + % gets the shader options for surface patches with flat edge colors, i.e. the + % vertex color + if strcmpi(s.faceColor, 'flat') + opts = opts_add(opts,'shader','flat corner'); + elseif strcmpi(s.faceColor, 'interp') + warnFacetedInterp(m2t); + opts = opts_add(opts,'shader','faceted interp'); + else + s.hasOneFaceColor = true; + opts = opts_add(opts,'shader','flat corner'); + [m2t,xFaceColor] = getColor(m2t, handle, s.faceColor, 'patch'); + opts = opts_add(opts,'fill',xFaceColor); + end +end +function [m2t, opts, s] = shaderOptsSurfPatchEdgeRGB(m2t, handle, opts, s) + % gets the shader options for surface patches with fixed (RGB) edge color + s.hasOneEdgeColor = true; + [m2t, xEdgeColor] = getColor(m2t, handle, s.edgeColor, 'patch'); + if isnumeric(s.faceColor) + s.hasOneFaceColor = true; + [m2t, xFaceColor] = getColor(m2t, handle, s.faceColor, 'patch'); + opts = opts_add(opts,'fill',xFaceColor); + opts = opts_add(opts,'faceted color',xEdgeColor); + elseif strcmpi(s.faceColor,'interp') + warnFacetedInterp(m2t); + opts = opts_add(opts,'shader','faceted interp'); + opts = opts_add(opts,'faceted color',xEdgeColor); + else + opts = opts_add(opts,'shader','flat corner'); + opts = opts_add(opts,'draw',xEdgeColor); + end +end +% ============================================================================== +function warnFacetedInterp(m2t) + % warn the user about the space implications of "shader=faceted interp" + userWarning(m2t, ... + ['A 3D plot with "shader = faceted interp" is being produced.\n', ... + 'This may produce big and sluggish PDF files.\n', ... + 'See %s and Section 4.6.6 of the pgfplots manual for workarounds.'], ... + issueUrl(m2t, 693, true)); +end +% ============================================================================== +function url = issueUrl(m2t, number, forOutput) + % Produces the URL for an issue report in the GitHub repository. + % When the `forOutput` flag is set, this format the URL for printing to the + % MATLAB terminal. + if ~exist('forOutput','var') || isempty(forOutput) + forOutput = false; + end + url = sprintf('%s/%d', m2t.about.issues, number); + if forOutput + url = clickableUrl(url, sprintf('#%d', number)); + end +end +% ============================================================================== +function url = clickableUrl(url, title) + % Produce a clickable URL for outputting to the MATLAB terminal + if ~exist('title','var') || isempty(title) + title = url; + end + switch getEnvironment() + case 'MATLAB' + url = sprintf('%s', url, title); + case 'Octave' + % just use the URL and discard the title since Octave doesn't + % support HTML tags in its output. + otherwise + errorUnknownEnvironment(); + end +end +% ============================================================================== +function [m2t, str] = drawScatterPlot(m2t, h) + % DRAWSCATTERPLOT Draws a scatter plot + % + % A scatter plot is a plot containing only markers and where the + % size and/or color of each marker can be changed independently. + % + % References for TikZ code: + % - http://tex.stackexchange.com/questions/197270/how-to-plot-scatter-points-using-pgfplots-with-color-defined-from-table-rgb-valu + % - http://tex.stackexchange.com/questions/98646/multiple-different-meta-for-marker-color-and-marker-size + % + % See also: scatter + str = ''; + if ~isVisible(h) + return; % there is nothing to plot + end + + dataInfo = getDataInfo(h, 'X','Y','Z','C','Size'); + markerInfo = getMarkerInfo(m2t, h); + + if isempty(dataInfo.C) && strcmpi(getEnvironment(), 'Octave') + dataInfo.C = get(h, 'MarkerEdgeColor'); + end + + %TODO: check against getMarkerOptions() for duplicated code + + dataInfo.Size = tryToMakeScalar(dataInfo.Size, m2t.tol); + + % Rescale marker size (not definitive, follow discussion in #316) + % Prescale marker size for octave + if strcmpi(getEnvironment(), 'Octave') + dataInfo.Size = dataInfo.Size.^2/2; + end + dataInfo.Size = translateMarkerSize(m2t, markerInfo.style, sqrt(dataInfo.Size)/2); + + drawOptions = opts_new(); + + %% Determine if we are drawing an actual scatter plot + hasDifferentSizes = numel(dataInfo.Size) ~= 1; + hasDifferentColors = numel(dataInfo.C) ~= 3; + isaScatter = hasDifferentSizes || hasDifferentColors; + if isaScatter + drawOptions = opts_add(drawOptions, 'scatter'); + end + %TODO: we need to set the scatter source + drawOptions = opts_add(drawOptions, 'only marks'); + drawOptions = opts_add(drawOptions, 'mark', markerInfo.tikz); + + if length(dataInfo.C) == 3 + % gets options specific to scatter plots with a single color + % No special treatment for the colors or markers are needed. + % All markers have the same color. + [m2t, xcolor, hasFaceColor] = getColorOfMarkers(m2t, h, 'MarkerFaceColor', dataInfo.C); + [m2t, ecolor, hasEdgeColor] = getColorOfMarkers(m2t, h, 'MarkerEdgeColor', dataInfo.C); + + if length(dataInfo.Size) == 1; + drawOptions = opts_addSubOpts(drawOptions, 'mark options', ... + markerInfo.options); + drawOptions = opts_add(drawOptions, 'mark size', ... + sprintf('%.4fpt', dataInfo.Size)); % FIXME: investigate whether to use `m2t.ff` + if hasEdgeColor + drawOptions = opts_add(drawOptions, 'draw', ecolor); + else + drawOptions = opts_add(drawOptions, 'color', xcolor); %TODO: why do we even need this one? + end + if hasFaceColor + drawOptions = opts_add(drawOptions, 'fill', xcolor); + end + else % if changing marker size but same color on all marks + markerOptions = opts_new(); + markerOptions = opts_addSubOpts(markerOptions, 'mark options', ... + markerInfo.options); + if hasEdgeColor + markerOptions = opts_add(markerOptions, 'draw', ecolor); + else + markerOptions = opts_add(markerOptions, 'draw', xcolor); + end + if hasFaceColor + markerOptions = opts_add(markerOptions, 'fill', xcolor); + end + % for changing marker size, the 'scatter' option has to be added + drawOptions = opts_add(drawOptions, 'color', xcolor); + drawOptions = opts_addSubOpts(drawOptions, 'mark options', ... + markerInfo.options); + + if ~hasFaceColor + drawOptions = opts_add(drawOptions, ... + 'scatter/use mapped color', xcolor); + else + drawOptions = opts_addSubOpts(drawOptions, ... + 'scatter/use mapped color', markerOptions); + end + end + elseif size(dataInfo.C,2) == 3 + % scatter plots with each marker a different RGB color (not yet supported!) + userWarning(m2t, 'Pgfplots cannot handle RGB scatter plots yet.'); + % TODO Get this in order as soon as Pgfplots can do "scatter rgb". + % See e.g. http://tex.stackexchange.com/questions/197270 and #433 + else + % scatter plot where the colors are set using a color map + markerOptions = opts_new(); + markerOptions = opts_addSubOpts(markerOptions, 'mark options', ... + markerInfo.options); + if markerInfo.hasEdgeColor && markerInfo.hasFaceColor + [m2t, ecolor] = getColor(m2t, h, markerInfo.EdgeColor, 'patch'); + markerOptions = opts_add(markerOptions, 'draw', ecolor); + else + markerOptions = opts_add(markerOptions, 'draw', 'mapped color'); + end + if markerInfo.hasFaceColor + markerOptions = opts_add(markerOptions, 'fill', 'mapped color'); + end + + if numel(dataInfo.Size) == 1 + drawOptions = opts_add(drawOptions, 'mark size', ... + sprintf('%.4fpt', dataInfo.Size)); % FIXME: investigate whether to use `m2t.ff` + else + %TODO: warn the user about this. It is not currently supported. + end + + drawOptions = opts_add(drawOptions, 'scatter src', 'explicit'); + drawOptions = opts_addSubOpts(drawOptions, 'scatter/use mapped color', ... + markerOptions); + % Add color map. + m2t = m2t_addAxisOption(m2t, matlab2pgfplotsColormap(m2t, m2t.current.colormap), []); + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % Plot the thing. + [env, data, metaPart, columns] = organizeScatterData(m2t, dataInfo); + + if hasDifferentSizes + drawOptions = opts_append(drawOptions, 'visualization depends on', ... + '{\thisrow{size} \as \perpointmarksize}'); + drawOptions = opts_add(drawOptions, ... + 'scatter/@pre marker code/.append style', ... + '{/tikz/mark size=\perpointmarksize}'); + end + + % The actual printing. + [m2t, table, tableOptions] = makeTable(m2t, columns, data); + tableOptions = opts_merge(tableOptions, metaPart); + + % Print + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\%s[%s] table[%s]{%s};\n',... + env, drawOpts, tabOpts, table); +end +% ============================================================================== +function dataInfo = getDataInfo(h, varargin) + % retrieves the "*Data fields from a HG object + % When no names are specified, it assumes 'X','Y','Z' is requested + if nargin == 1 + fields = {'X','Y','Z'}; + else + fields = varargin; + end + dataInfo = struct(); + for iField = 1:numel(fields) + name = fields{iField}; + dataInfo.(name) = get(h, [name 'Data']); + end +end +% ============================================================================== +function value = tryToMakeScalar(value, tolerance) + % make a vector into a scalar when all its components are equal + if ~exist('tolerance','var') + tolerance = 0; % do everything perfectly + end + if all(abs(value - value(1)) <= tolerance) + value = value(1); + end +end +% ============================================================================== +function marker = getMarkerInfo(m2t, h, markOptions) + % gets marker-related options as a struct + if ~exist('markOptions','var') || isempty(markOptions) + markOptions = opts_new(); + end + marker = struct(); + marker.style = get(h, 'Marker'); + marker.FaceColor = get(h, 'MarkerFaceColor'); + marker.EdgeColor = get(h, 'MarkerEdgeColor'); + marker.hasFaceColor = ~isNone(marker.FaceColor); + marker.hasEdgeColor = ~isNone(marker.EdgeColor); + [marker.tikz, marker.options] = translateMarker(m2t, marker.style, ... + markOptions, marker.hasFaceColor); +end +% ============================================================================== +function [env, data, metaOptions, columns] = organizeScatterData(m2t, dataInfo) + % reorganizes the {X,Y,Z,S} data into a single matrix + metaOptions = opts_new(); + + + xData = dataInfo.X; + yData = dataInfo.Y; + zData = dataInfo.Z; + cData = dataInfo.C; + sData = dataInfo.Size; + + % add the actual data + if ~m2t.axes{end}.is3D + env = 'addplot'; + columns = {'x','y'}; + data = [xData(:), yData(:)]; + else + env = 'addplot3'; + columns = {'x','y','z'}; + data = applyHgTransform(m2t, [xData(:), yData(:), zData(:)]); + end + + % add marker sizes + if length(sData) ~= 1 + columns = [columns, {'size'}]; + data = [data, sData(:)]; + end + + % add color data + if length(cData) == 3 + % If size(cData,1)==1, then all the colors are the same and have + % already been accounted for above. + + elseif size(cData,2) == 3 + %TODO Hm, can't deal with this? + %[m2t, col] = rgb2colorliteral(m2t, cData(k,:)); + %str = strcat(str, sprintf(' [%s]\n', col)); + columns = [columns, {'R','G','B'}]; + data = [data, cData(:,1), cData(:,2), cData(:,3)]; + else + columns = [columns, {'color'}]; + metaOptions = opts_add(metaOptions, 'meta', 'color'); + data = [data, cData(:)]; + end +end +% ============================================================================== +function [m2t, xcolor, hasColor] = getColorOfMarkers(m2t, h, name, cData) + color = get(h, name); + hasColor = ~isNone(color); + if hasColor && ~strcmpi(color,'flat'); + [m2t, xcolor] = getColor(m2t, h, color, 'patch'); + else + [m2t, xcolor] = getColor(m2t, h, cData, 'patch'); + end +end +% ============================================================================== +function [m2t, str] = drawHistogram(m2t, h) + % Takes care of plots like the ones produced by MATLAB's histogram function. + % The main pillar is Pgfplots's '{x,y}bar' plot. + % + % TODO Get rid of code duplication with 'drawAxes'. + + % Do nothing if plot is invisible + str = ''; + if ~isVisible(h) + return; + end + + % Init drawOptions + drawOptions = opts_new(); + + % Data + binEdges = get(h, 'BinEdges'); + binValue = get(h, 'Values'); + data = [binEdges(:), [binValue(:); binValue(end)]]; + + % Check for orientation of the bars + isHorizontal = ~strcmpi(get(h, 'Orientation'), 'vertical'); + if isHorizontal + drawOptions = opts_add(drawOptions, 'xbar interval'); + data = fliplr(data); + else + drawOptions = opts_add(drawOptions, 'ybar interval'); + end + + % Get the draw options for the bars + [m2t, drawOptions] = getPatchDrawOptions(m2t, h, drawOptions); + + % Make table + [m2t, table, tableOptions] = makeTable(m2t, {'x','y'},data); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s] {%s};\n', ... + drawOpts, tabOpts, table); +end +% ============================================================================== +function [m2t, str] = drawBarseries(m2t, h) + % Takes care of plots like the ones produced by MATLAB's bar function. + % The main pillar is Pgfplots's '{x,y}bar' plot. + % + % TODO Get rid of code duplication with 'drawAxes'. + + % Do nothing if plot is invisible + str = ''; + if ~isVisible(h) + return; + end + + % Init drawOptions + drawOptions = opts_new(); + + % Check for orientation of the bars and their layout + isHorizontal = isOn(get(h, 'Horizontal')); + if isHorizontal + barType = 'xbar'; + else + barType = 'ybar'; + end + + % Get the draw options for the layout + [m2t, drawOptions] = setBarLayoutOfBarSeries(m2t, h, barType, drawOptions); + + % Get the draw options for the bars + [m2t, drawOptions] = getPatchDrawOptions(m2t, h, drawOptions); + + % Add 'log origin = infty' if BaseValue differs from zero (log origin=0 is + % the default behaviour since Pgfplots v1.5). + baseValue = get(h, 'BaseValue'); + if baseValue ~= 0.0 + m2t = m2t_addAxisOption(m2t, 'log origin', 'infty'); + %TODO: wait for pgfplots to implement other base values (see #438) + end + + % Generate the tikz table + xData = get(h, 'XData'); + yData = get(h, 'YData'); + if isHorizontal + [yDataPlot, xDataPlot] = deal(xData, yData); % swap values + else + [xDataPlot, yDataPlot] = deal(xData, yData); + end + [m2t, table, tableOptions] = makeTable(m2t, '', xDataPlot, '', yDataPlot); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s] {%s};\n', ... + drawOpts, tabOpts, table); + % Add a baseline if appropriate + [m2t, baseline] = drawBaseline(m2t,h,isHorizontal); + str = [str, baseline]; +end +% ============================================================================== +function BarWidth = getBarWidthInAbsolutUnits(h) + % determines the width of a bar in a bar plot + XData = get(h,'XData'); + BarWidth = get(h, 'BarWidth'); + if length(XData) > 1 + BarWidth = min(diff(XData)) * BarWidth; + end +end +% ============================================================================== +function [m2t, drawOptions] = setBarLayoutOfBarSeries(m2t, h, barType, drawOptions) + % sets the options specific to a bar layour (grouped vs stacked) + barlayout = get(h, 'BarLayout'); + + switch barlayout + case 'grouped' % grouped bar plots + + % Get number of bars series and bar series id + [numBarSeries, barSeriesId] = getNumBarAndId(h); + + % Maximum group width relative to the minimum distance between two + % x-values. See /toolbox/matlab/specgraph/makebars.m + maxGroupWidth = 0.8; + if numBarSeries == 1 + groupWidth = 1.0; + else + groupWidth = min(maxGroupWidth, numBarSeries/(numBarSeries+1.5)); + end + + % Calculate the width of each bar and the center point shift as in + % makebars.m + % Get the shifts of the bar centers. + % In case of numBars==1, this returns 0, + % In case of numBars==2, this returns [-1/4, 1/4], + % In case of numBars==3, this returns [-1/3, 0, 1/3], + % and so forth. + % assumedBarWidth = groupWidth/numBarSeries; % assumption + % barShift = (barSeriesId - 0.5) * assumedBarWidth - groupWidth/2; + % FIXME #785: The previous version of barshift lead to + % regressions, as the bars were stacked. + % Instead remove the calculation of barShift and add x/ybar to + % the axis so that pgf determines it automatically. + + % From http://www.mathworks.com/help/techdoc/ref/bar.html: + % bar(...,width) sets the relative bar width and controls the + % separation of bars within a group. The default width is 0.8, so if + % you do not specify X, the bars within a group have a slight + % separation. If width is 1, the bars within a group touch one + % another. The value of width must be a scalar. + assumedBarWidth = groupWidth/numBarSeries; % assumption + barWidth = getBarWidthInAbsolutUnits(h) * assumedBarWidth; + + % Bar type + drawOptions = opts_add(drawOptions, barType); + + % Bar width + drawOptions = opts_add(drawOptions, 'bar width', formatDim(barWidth, '')); + + % The bar shift auto feature was introduced in pgfplots 1.13 + m2t = needsPgfplotsVersion(m2t, [1,13]); + m2t = m2t_addAxisOption(m2t, 'bar shift auto'); + case 'stacked' % stacked plots + % Pass option to parent axis & disallow anything but stacked plots + % Make sure this happens exactly *once*. + + if ~m2t.axes{end}.barAddedAxisOption; + barWidth = getBarWidthInAbsolutUnits(h); + m2t = m2t_addAxisOption(m2t, 'bar width', formatDim(barWidth,'')); + m2t.axes{end}.barAddedAxisOption = true; + end + + % Somewhere between pgfplots 1.5 and 1.8 and starting + % again from 1.11, the option {x|y}bar stacked can be applied to + % \addplot instead of the figure and thus allows to combine stacked + % bar plots and other kinds of plots in the same axis. + % Thus, it is advisable to use pgfplots 1.11. In older versions, the + % plot will only contain a single bar series, but should compile fine. + m2t = needsPgfplotsVersion(m2t, [1,11]); + drawOptions = opts_add(drawOptions, [barType ' stacked']); + otherwise + error('matlab2tikz:drawBarseries', ... + 'Don''t know how to handle BarLayout ''%s''.', barlayout); + end +end +% ============================================================================== +function [numBarSeries, barSeriesId] = getNumBarAndId(h) + % Get number of bars series and bar series id + prop = switchMatOct('BarPeers', 'bargroup'); + bargroup = get(h, prop); + numBarSeries = numel(bargroup); + + if isHG2 + % In HG2, BarPeers are sorted in reverse order wrt HG1 + bargroup = bargroup(end:-1:1); + + elseif strcmpi(getEnvironment, 'MATLAB') + % In HG1, h is a double but bargroup a graphic object. Cast h to a + % graphic object + h = handle(h); + + else + % In Octave, the bargroup is a replicated cell array. Pick first + if iscell(bargroup) + bargroup = bargroup{1}; + end + end + + % Get bar series Id + [dummy, barSeriesId] = ismember(h, bargroup); +end +% ============================================================================== +function [m2t,str] = drawBaseline(m2t,hparent,isVertical) + % DRAWBASELINE Draws baseline for bar and stem plots + % + % Notes: + % - In HG2, the baseline is a specific object child of a bar or stem + % plot. So, handleAllChildren() won't find a line in the axes to plot as + % the baseline. + % - The baseline is horizontal for vertical bar and stem plots and is + % vertical for horixontal barplots. The ISVERTICAL input refers to the + % baseline. + % - We do not plot baselines with a BaseValue different from 0 because + % pgfplots does not support shifts in the BaseValue, e.g. see #438. + % We either implement our own data shifting or wait for pgfplots. + + if ~exist('isVertical','var') + isVertical = false; + end + + str = ''; + baseValue = get(hparent, 'BaseValue'); + if isOff(get(hparent,'ShowBaseLine')) || ~isHG2() || baseValue ~= 0 + return + end + + hBaseLine = get(hparent,'BaseLine'); + + % Line options of the baseline + [m2t, lineOptions] = getLineOptions(m2t, hparent); + color = get(hBaseLine, 'Color'); + [m2t, lineColor] = getColor(m2t, hBaseLine, color, 'patch'); + + drawOptions = opts_new(); + drawOptions = opts_add(drawOptions, 'forget plot'); + drawOptions = opts_add(drawOptions, 'color', lineColor); + drawOptions = opts_merge(drawOptions, lineOptions); + + % Get data + if isVertical + xData = repmat(baseValue,1,2); + yData = get(m2t.current.gca,'Ylim'); + else + xData = get(m2t.current.gca,'Xlim'); + yData = repmat(baseValue,1,2); + end + + [m2t, table, tableOptions] = makeTable(m2t, '', xData, '', yData); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s] {%s};\n', ... + drawOpts, tabOpts, table); +end +% ============================================================================== +function [m2t, str] = drawAreaSeries(m2t, h) + % Takes care of MATLAB's area plots. + % + % TODO Get rid of code duplication with 'drawAxes'. + + % Do nothing if plot is invisible + str = ''; + if ~isVisible(h) + return; + end + + % Init drawOptions + drawOptions = opts_new(); + + % Get the draw options for the bars + [m2t, drawOptions] = getPatchDrawOptions(m2t, h, drawOptions); + + if ~isfield(m2t, 'addedAreaOption') || isempty(m2t.addedAreaOption) || ~m2t.addedAreaOption + % Add 'area style' to axes options. + m2t = m2t_addAxisOption(m2t, 'area style'); + m2t = m2t_addAxisOption(m2t, 'stack plots', 'y'); + m2t.addedAreaOption = true; + end + + % Toggle legend entry + drawOptions = maybeShowInLegend(m2t.currentHandleHasLegend, drawOptions); + + % Generate the tikz table + xData = get(h, 'XData'); + yData = get(h, 'YData'); + [m2t, table, tableOptions] = makeTable(m2t, '', xData, '', yData); + + % Print out + drawOpts = opts_print(drawOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s]{%s}\n\\closedcycle;\n',... + drawOpts, tabOpts, table); + %TODO: shouldn't this be "\addplot[] table[] {}" instead? +end +% ============================================================================== +function [m2t, str] = drawStemSeries(m2t, h) + [m2t, str] = drawStemOrStairSeries_(m2t, h, 'ycomb'); + + % TODO: handle baseplane with stem3() + if m2t.axes{end}.is3D + return + end + [m2t, baseline] = drawBaseline(m2t,h); + str = [str, baseline]; +end +function [m2t, str] = drawStairSeries(m2t, h) + [m2t, str] = drawStemOrStairSeries_(m2t, h, 'const plot'); +end +function [m2t, str] = drawStemOrStairSeries_(m2t, h, plotType) + + % Do nothing if plot is invisible + str = ''; + if ~isLineVisible(h) + return % nothing to plot! + end + + % deal with draw options + color = get(h, 'Color'); + [m2t, plotColor] = getColor(m2t, h, color, 'patch'); + + [m2t, lineOptions] = getLineOptions(m2t, h); + [m2t, markerOptions] = getMarkerOptions(m2t, h); + + drawOptions = opts_new(); + drawOptions = opts_add(drawOptions, plotType); + drawOptions = opts_add(drawOptions, 'color', plotColor); + drawOptions = opts_merge(drawOptions, lineOptions, markerOptions); + + % Toggle legend entry + drawOptions = maybeShowInLegend(m2t.currentHandleHasLegend, drawOptions); + + drawOpts = opts_print(drawOptions); + + % Generate the tikz table + xData = get(h, 'XData'); + yData = get(h, 'YData'); + if m2t.axes{end}.is3D + % TODO: account for hgtransform + zData = get(h, 'ZData'); + [m2t, table, tableOptions] = makeTable(m2t, '', xData, '', yData, '', zData); + % Print out + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot3 [%s]\n table[%s] {%s};\n ', ... + drawOpts, tabOpts, table); + else + [m2t, table, tableOptions] = makeTable(m2t, '', xData, '', yData); + % Print out + tabOpts = opts_print(tableOptions); + str = sprintf('\\addplot[%s] table[%s] {%s};\n', ... + drawOpts, tabOpts, table); + end + +end +% ============================================================================== +function [m2t, str] = drawQuiverGroup(m2t, h) + % Takes care of MATLAB's quiver plots. + str = ''; + + [x,y,z,u,v,w] = getAndRescaleQuivers(m2t,h); + is3D = m2t.axes{end}.is3D; + + % prepare output + if is3D + name = 'addplot3'; + else % 2D plotting + name = 'addplot'; + end + + variables = {'x', 'y', 'z', 'u', 'v', 'w'}; + data = NaN(numel(x),6); + data(:,1) = x; + data(:,2) = y; + data(:,3) = z; + data(:,4) = u; + data(:,5) = v; + data(:,6) = w; + + if ~is3D + data(:,[3 6]) = []; % remove Z-direction + variables([3 6]) = []; + end + + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + % gather the arrow options + showArrowHead = get(h, 'ShowArrowHead'); + if ~isLineVisible(h) && ~showArrowHead + return + end + + plotOptions = opts_new(); + if showArrowHead + plotOptions = opts_add(plotOptions, '-Straight Barb'); + signalDependency(m2t, 'tikzlibrary', 'arrows.meta'); + else + plotOptions = opts_add(plotOptions, '-'); + end + + % Append the arrow style to the TikZ options themselves. + color = get(h, 'Color'); + [m2t, lineOptions] = getLineOptions(m2t, h); + [m2t, arrowcolor] = getColor(m2t, h, color, 'patch'); + plotOptions = opts_add(plotOptions, 'color', arrowcolor); + plotOptions = opts_merge(plotOptions, lineOptions); + + % Define the quiver settings + quiverOptions = opts_new(); + quiverOptions = opts_add(quiverOptions, 'u', '\thisrow{u}'); + quiverOptions = opts_add(quiverOptions, 'v', '\thisrow{v}'); + if is3D + quiverOptions = opts_add(quiverOptions, 'w', '\thisrow{w}'); + arrowLength = '{sqrt((\thisrow{u})^2+(\thisrow{v})^2+(\thisrow{w})^2)}'; + else + arrowLength = '{sqrt((\thisrow{u})^2+(\thisrow{v})^2)}'; + end + plotOptions = opts_add(plotOptions, 'point meta', arrowLength); + plotOptions = opts_add(plotOptions, 'point meta min', '0'); + + if showArrowHead + arrowHeadOptions = opts_new(); + + % In MATLAB (HG1), the arrow head is constructed to have an angle of + % approximately 18.263 degrees in 2D as can be derived from the + % |quiver| function. + % In 3D, the angle is no longer constant but it is approximately + % the same as for 2D quiver plots. So let's make our life easy. + % |test/examples/example_quivers.m| covers the calculations. + arrowHeadOptions = opts_add(arrowHeadOptions, 'angle''', '18.263'); + + %TODO: scale the arrows more rigorously to match MATLAB behavior + % Currently, this is quite hard to do, since the size of the arrows + % is defined in pgfplots in absolute units (here we specify that those + % should be scaled up/down according to the data), while the data itself + % is in axis coordinates (or some scaled variant). I.e. we need the + % physical dimensions of the axis to compute the correct scaling! + % + % There is a "MaxHeadSize" property that plays a role. + % MaxHeadSize is said to be relative to the length of the quiver in the + % MATLAB documentation. However, in practice, there seems to be a SQRT + % involved somewhere (e.g. if u.^2 + v.^2 == 2, all MHS values > + % 1/sqrt(2) are capped to 1/sqrt(2)). + % + % NOTE: `set(h, 'MaxHeadSize')` is bugged in HG1 (not in HG2 or Octave) + % according to http://www.mathworks.com/matlabcentral/answers/96754 + + userInfo(m2t, ['Please change the "arrowHeadSize" option', ... + ' if the size of the arrows is incorrect.']); + arrowHeadSize = sprintf(m2t.ff, abs(m2t.args.arrowHeadSize)); + + % Write out the actual scaling for TikZ. + % `\pgfplotspointsmetatransformed` is in the range [0, 1000], so + % divide by this span (as is done in the pgfplots manual) to normalize + % the arrow head size. First divide to avoid overflows. + arrowHeadOptions = opts_add(arrowHeadOptions, 'scale', ... + ['{' arrowHeadSize '/1000*\pgfplotspointmetatransformed}']); + + headStyle = ['-{Straight Barb[' opts_print(arrowHeadOptions) ']}']; + quiverOptions = opts_add(quiverOptions, 'every arrow/.append style', ... + ['{' headStyle '}']); + end + plotOptions = opts_addSubOpts(plotOptions, 'quiver', quiverOptions); + + [m2t, table, tableOptions] = makeTable(m2t, variables, data); + + % Print out + plotOpts = opts_print(plotOptions); + tabOpts = opts_print(tableOptions); + str = sprintf('\\%s[%s]\n table[%s] {%s};\n', ... + name, plotOpts, tabOpts, table); +end +% ============================================================================== +function [x,y,z,u,v,w] = getAndRescaleQuivers(m2t, h) + % get and rescale the arrows from a quivergroup object + x = get(h, 'XData'); + y = get(h, 'YData'); + z = getOrDefault(h, 'ZData', []); + + u = get(h, 'UData'); + v = get(h, 'VData'); + w = getOrDefault(h, 'WData', []); + + is3D = m2t.axes{end}.is3D; + if ~is3D + z = 0; + w = 0; + end + + % MATLAB uses a scaling algorithm to determine the size of the arrows. + % Before R2014b, the processed coordinates were available. This is no longer + % the case, so we have to re-implement it. In MATLAB it is implemented in + % the |quiver3| (and |quiver|) function. + if any(size(x)==1) + nX = sqrt(numel(x)); nY = nX; + else + [nY, nX] = size(x); + end + range = @(xyzData)(max(xyzData(:)) - min(xyzData(:))); + euclid = @(x,y,z)(sqrt(x.^2 + y.^2 + z.^2)); + dx = range(x)/nX; + dy = range(y)/nY; + dz = range(z)/max(nX,nY); + dd = euclid(dx, dy, dz); + if dd > 0 + vectorLength = euclid(u/dd,v/dd,w/dd); + maxLength = max(vectorLength(:)); + else + maxLength = 1; + end + if isOn(getOrDefault(h, 'AutoScale', 'on')) + scaleFactor = getOrDefault(h,'AutoScaleFactor', 0.9) / maxLength; + else + scaleFactor = 1; + end + x = x(:).'; u = u(:).'*scaleFactor; + y = y(:).'; v = v(:).'*scaleFactor; + z = z(:).'; w = w(:).'*scaleFactor; +end +% ============================================================================== +function [m2t, str] = drawErrorBars(m2t, h) + % Takes care of MATLAB's error bar plots. + % Octave's error bar plots are handled as well. + [m2t, str] = drawLine(m2t, h); + % Even though this only calls |drawLine|, let's keep this wrapper + % such that the code is easier to read where it is called. +end +% ============================================================================== +function [yDeviations] = getYDeviations(h) + % Retrieves upper/lower uncertainty data + + upDev = getOrDefault(h, 'UData', []); + loDev = getOrDefault(h, 'LData', []); + + yDeviations = [upDev(:), loDev(:)]; +end +% ============================================================================== +function [m2t, str] = drawEllipse(m2t, handle) + % Takes care of MATLAB's ellipse annotations. + + drawOptions = opts_new(); + + p = get(handle,'position'); + radius = p([3 4]) / 2; + center = p([1 2]) + radius; + + color = get(handle, 'Color'); + [m2t, xcolor] = getColor(m2t, handle, color, 'patch'); + [m2t, lineOptions] = getLineOptions(m2t, handle); + + filling = get(handle, 'FaceColor'); + + % Has a filling? + if isNone(filling) + drawOptions = opts_add(drawOptions, xcolor); + drawCommand = '\draw'; + else + [m2t, xcolorF] = getColor(m2t, handle, filling, 'patch'); + drawOptions = opts_add(drawOptions, 'draw', xcolor); + drawOptions = opts_add(drawOptions, 'fill', xcolorF); + + drawCommand = '\filldraw'; + end + drawOptions = opts_merge(drawOptions, lineOptions); + + opt = opts_print(drawOptions); + + str = sprintf('%s [%s] (axis cs:%g,%g) ellipse [x radius=%g, y radius=%g];\n', ... + drawCommand, opt, center, radius); +end +% ============================================================================== +function [m2t, str] = drawTextarrow(m2t, handle) + % Takes care of MATLAB's textarrow annotations. + + % handleAllChildren to draw the arrow + [m2t, str] = handleAllChildren(m2t, handle); + + % handleAllChildren ignores the text, unless hidden strings are shown + if ~m2t.args.showHiddenStrings + child = findall(handle, 'type', 'text'); + [m2t, str{end+1}] = drawText(m2t, child); + end +end +% ============================================================================== +function [m2t, drawOptions] = getPatchDrawOptions(m2t, h, drawOptions) + % Determines the reoccurring draw options usually applied when drawing + % a patch/area/bar. These include EdgeColor, LineType, FaceColor/Alpha + + % Get object for color; + if ~isempty(allchild(h)) + % quite oddly, before MATLAB R2014b this value is stored in a child + % patch and not in the object itself + obj = allchild(h); + else % R2014b and newer + obj = h; + end + + % Get the object type + type = get(h, 'Type'); + + % Face Color (inside of area) + faceColor = get(obj, 'FaceColor'); + [m2t, drawOptions] = setColor(m2t, h, drawOptions, 'fill', faceColor, 'none'); + + % FaceAlpha (Not applicable for MATLAB2014a/b) + faceAlpha = getOrDefault(h, 'FaceAlpha', 'none'); + if ~isNone(faceColor) && isnumeric(faceAlpha) && faceAlpha ~= 1.0 + drawOptions = opts_add(drawOptions, 'fill opacity', sprintf(m2t.ff,faceAlpha)); + end + + % Define linestyle + [lineStyle, isDefaultLS] = getAndCheckDefault(type, h, 'LineStyle', '-'); + if isNone(lineStyle) + drawOptions = opts_add(drawOptions, 'draw', 'none'); + elseif ~isDefaultLS + drawOptions = opts_add(drawOptions, translateLineStyle(lineStyle)); + end + + % Check for the edge color. Only plot it if it is different from the + % face color and if there is a linestyle + edgeColor = get(h, 'EdgeColor'); + if ~isNone(lineStyle) && ~isNone(edgeColor) && ~strcmpi(edgeColor,faceColor) + [m2t, drawOptions] = setColor(m2t, h, drawOptions, 'draw', edgeColor, 'none'); + end + + % Add 'area legend' to the options as otherwise the legend indicators + % will just highlight the edges. + if strcmpi(type, 'bar') || strcmpi(type, 'histogram') + drawOptions = opts_add(drawOptions, 'area legend'); + end +end +% ============================================================================== +function out = linearFunction(X, Y) + % Return the linear function that goes through (X[1], Y[1]), (X[2], Y[2]). + out = @(x) (Y(2,:)*(x-X(1)) + Y(1,:)*(X(2)-x)) / (X(2)-X(1)); +end +% ============================================================================== +function matlabColormap = pgfplots2matlabColormap(points, rgb, numColors) + % Translates a Pgfplots colormap to a MATLAB color map. + matlabColormap = zeros(numColors, 3); + % Point indices between which to interpolate. + I = [1, 2]; + f = linearFunction(points(I), rgb(I,:)); + for k = 1:numColors + x = (k-1)/(numColors-1) * points(end); + if x > points(I(2)) + I = I + 1; + f = linearFunction(points(I), rgb(I,:)); + end + matlabColormap(k,:) = f(x); + end +end +% ============================================================================== +function pgfplotsColormap = matlab2pgfplotsColormap(m2t, matlabColormap, name) + % Translates a MATLAB color map into a Pgfplots colormap. + + if nargin < 3 || isempty(name), name = 'mymap'; end + + % First check if we could use a default Pgfplots color map. + % Unfortunately, MATLAB and Pgfplots color maps will never exactly coincide + % except to the most simple cases such as blackwhite. This is because of a + % slight incompatibility of Pgfplots and MATLAB colormaps: + % In MATLAB, indexing goes from 1 through 64, whereas in Pgfplots you can + % specify any range, the default ones having something like + % (0: red, 1: yellow, 2: blue). + % To specify this exact color map in MATLAB, one would have to put 'red' at + % 1, blue at 64, and yellow in the middle of the two, 32.5 that is. + % Not really sure how MATLAB rounds here: 32, 33? Anyways, it will be + % slightly off and hence not match the Pgfplots color map. + % As a workaround, build the MATLAB-formatted colormaps of Pgfplots default + % color maps, and check if matlabColormap is close to it. If yes, take it. + + % For now, comment out the color maps which haven't landed yet in Pgfplots. + pgfmaps = { %struct('name', 'colormap/autumn', ... + % 'points', [0,1], ... + % 'values', [[1,0,0];[1,1,0]]), ... + %struct('name', 'colormap/bled', ... + % 'points', 0:6, ... + % 'values', [[0,0,0];[43,43,0];[0,85,0];[0,128,128];[0,0,170];[213,0,213];[255,0,0]]/255), ... + %struct('name', 'colormap/bright', ... + % 'points', 0:7, ... + % 'values', [[0,0,0];[78,3,100];[2,74,255];[255,21,181];[255,113,26];[147,213,114];[230,255,0];[255,255,255]]/255), ... + %struct('name', 'colormap/bone', ... + % 'points', [0,3,6,8], ... + % 'values', [[0,0,0];[84,84,116];[167,199,199];[255,255,255]]/255), ... + %struct('name', 'colormap/cold', ... + % 'points', 0:3, ... + % 'values', [[0,0,0];[0,0,1];[0,1,1];[1,1,1]]), ... + %struct('name', 'colormap/copper', ... + % 'points', [0,4,5], ... + % 'values', [[0,0,0];[255,159,101];[255,199,127]]/255), ... + %struct('name', 'colormap/copper2', ... + % 'points', 0:4, ... + % 'values', [[0,0,0];[68,62,63];[170,112,95];[207,194,138];[255,255,255]]/255), ... + %struct('name', 'colormap/hsv', ... + % 'points', 0:6, ... + % 'values', [[1,0,0];[1,1,0];[0,1,0];[0,1,1];[0,0,1];[1,0,1];[1,0,0]]), ... + struct('name', 'colormap/hot', ... + 'points', 0:3, ... + 'values', [[0,0,1];[1,1,0];[1,0.5,0];[1,0,0]]), ... % TODO check this + struct('name', 'colormap/hot2', ... + 'points', [0,3,6,8], ... + 'values', [[0,0,0];[1,0,0];[1,1,0];[1,1,1]]), ... + struct('name', 'colormap/jet', ... + 'points', [0,1,3,5,7,8], ... + 'values', [[0,0,128];[0,0,255];[0,255,255];[255,255,0];[255,0,0];[128,0,0]]/255), ... + struct('name', 'colormap/blackwhite', ... + 'points', [0,1], ... + 'values', [[0,0,0];[1,1,1]]), ... + struct('name', 'colormap/bluered', ... + 'points', 0:5, ... + 'values', [[0,0,180];[0,255,255];[100,255,0];[255,255,0];[255,0,0];[128,0,0]]/255), ... + struct('name', 'colormap/cool', ... + 'points', [0,1,2], ... + 'values', [[255,255,255];[0,128,255];[255,0,255]]/255), ... + struct('name', 'colormap/greenyellow', ... + 'points', [0,1], ... + 'values', [[0,128,0];[255,255,0]]/255), ... + struct('name', 'colormap/redyellow', ... + 'points', [0,1], ... + 'values', [[255,0,0];[255,255,0]]/255), ... + struct('name', 'colormap/violet', ... + 'points', [0,1,2], ... + 'values', [[25,25,122];[255,255,255];[238,140,238]]/255) ... + }; + + % The tolerance is a subjective matter of course. + % Some figures: + % * The norm-distance between MATLAB's gray and bone is 6.8e-2. + % * The norm-distance between MATLAB's jet and Pgfplots's jet is 2.8e-2. + % * The norm-distance between MATLAB's hot and Pgfplots's hot2 is 2.1e-2. + tol = 5.0e-2; + + for map = pgfmaps + numColors = size(matlabColormap, 1); + mmap = pgfplots2matlabColormap(map{1}.points, map{1}.values, numColors); + alpha = norm(matlabColormap - mmap) / sqrt(numColors); + if alpha < tol + userInfo(m2t, 'Found %s to be a pretty good match for your color map (||diff||=%g).', ... + map{1}.name, alpha); + pgfplotsColormap = map{1}.name; + return + end + end + + % Build a custom color map. + % Loop over the data, stop at each spot where the linear + % interpolation is interrupted, and set a color mark there. + m = size(matlabColormap, 1); + steps = [1, 2]; + % A colormap with a single color is valid in MATLAB but an error in + % pgfplots. Repeating the color produces the desired effect in this + % case. + if m==1 + colors=[matlabColormap(1,:);matlabColormap(1,:)]; + else + colors = [matlabColormap(1,:); matlabColormap(2,:)]; + f = linearFunction(steps, colors); + k = 3; + while k <= m + if norm(matlabColormap(k,:) - f(k)) > 1.0e-10 + % Add the previous step to the color list + steps(end) = k-1; + colors(end,:) = matlabColormap(k-1,:); + steps = [steps, k]; + colors = [colors; matlabColormap(k,:)]; + f = linearFunction(steps(end-1:end), colors(end-1:end,:)); + end + k = k+1; + end + steps(end) = m; + colors(end,:) = matlabColormap(m,:); + end + + % Get it in Pgfplots-readable form. + unit = 'pt'; + colSpecs = cell(length(steps), 1); + for k = 1:length(steps) + x = steps(k)-1; + colSpecs{k} = sprintf('rgb(%d%s)=(%g,%g,%g)', x, unit, colors(k,:)); + end + pgfplotsColormap = sprintf('colormap={%s}{[1%s] %s}',name, unit, join(m2t, colSpecs, '; ')); +end +% ============================================================================== +function [m2t, fontStyle] = getFontStyle(m2t, handle) + fontStyle = ''; + if strcmpi(get(handle, 'FontWeight'),'Bold') + fontStyle = sprintf('%s\\bfseries',fontStyle); + end + if strcmpi(get(handle, 'FontAngle'), 'Italic') + fontStyle = sprintf('%s\\itshape',fontStyle); + end + if ~all(get(handle, 'Color')==0) + color = get(handle, 'Color'); + [m2t, col] = getColor(m2t, handle, color, 'patch'); + fontStyle = sprintf('%s\\color{%s}', fontStyle, col); + end + if m2t.args.strictFontSize + fontSize = get(handle,'FontSize'); + fontUnits = matlab2texUnits(get(handle,'FontUnits'), 'pt'); + fontStyle = sprintf('\\fontsize{%d%s}{1em}%s\\selectfont',fontSize,fontUnits,fontStyle); + else + % don't try to be smart and "translate" MATLAB font sizes to proper LaTeX + % ones: it cannot be done. LaTeX uses semantic sizes (e.g. \small) + % whose actual dimensions depend on the document style, context, ... + end + + if ~isempty(fontStyle) + fontStyle = opts_add(opts_new, 'font', fontStyle); + else + fontStyle = opts_new(); + end +end +% ============================================================================== +function axisOptions = getColorbarOptions(m2t, handle) + + % begin collecting axes options + axisOptions = opts_new(); + cbarStyleOptions = opts_new(); + + [cbarTemplate, cbarStyleOptions] = getColorbarPosOptions(handle, ... + cbarStyleOptions); + + % axis label and direction + if isHG2 + % VERSION: Starting from R2014b there is only one field `label`. + % The colorbar's position determines, if it should be a x- or y-label. + + if strcmpi(cbarTemplate, 'horizontal') + labelOption = 'xlabel'; + else + labelOption = 'ylabel'; + end + [m2t, cbarStyleOptions] = getLabel(m2t, handle, cbarStyleOptions, labelOption); + + % direction + dirString = get(handle, 'Direction'); + if ~strcmpi(dirString, 'normal') % only if not 'normal' + if strcmpi(cbarTemplate, 'horizontal') + dirOption = 'x dir'; + else + dirOption = 'y dir'; + end + cbarStyleOptions = opts_add(cbarStyleOptions, dirOption, dirString); + end + + % TODO HG2: colorbar ticks and colorbar tick labels + + else + % VERSION: Up to MATLAB R2014a and OCTAVE + [m2t, xo] = getAxisOptions(m2t, handle, 'x'); + [m2t, yo] = getAxisOptions(m2t, handle, 'y'); + xyo = opts_merge(xo, yo); + xyo = opts_remove(xyo, 'xmin','xmax','xtick','ymin','ymax','ytick'); + + cbarStyleOptions = opts_merge(cbarStyleOptions, xyo); + end + + % title + [m2t, cbarStyleOptions] = getTitle(m2t, handle, cbarStyleOptions); + + if m2t.args.strict + % Sampled colors. + numColors = size(m2t.current.colormap, 1); + axisOptions = opts_add(axisOptions, 'colorbar sampled'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'samples', ... + sprintf('%d', numColors+1)); + + if ~isempty(cbarTemplate) + userWarning(m2t, ... +- 'Pgfplots cannot deal with more than one colorbar option yet.'); + %FIXME: can we get sampled horizontal color bars to work? + %FIXME: sampled colorbars should be inferred, not by using strict! + end + end + + % Merge them together in axisOptions. + axisOptions = opts_add(axisOptions, strtrim(['colorbar ', cbarTemplate])); + + if ~isempty(cbarStyleOptions) + axisOptions = opts_addSubOpts(axisOptions, ... + 'colorbar style', cbarStyleOptions); + end + + % do _not_ handle colorbar's children +end +% ============================================================================== +function [cbarTemplate, cbarStyleOptions] = getColorbarPosOptions(handle, cbarStyleOptions) + % set position, ticks etc. of a colorbar + loc = get(handle, 'Location'); + cbarTemplate = ''; + + switch lower(loc) % case insensitive (MATLAB: CamelCase, Octave: lower case) + case 'north' + cbarTemplate = 'horizontal'; + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + '{(0.5,0.97)}'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... + 'north'); + cbarStyleOptions = opts_add(cbarStyleOptions,... + 'xticklabel pos', 'lower'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... + '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); + case 'south' + cbarTemplate = 'horizontal'; + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + '{(0.5,0.03)}'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor', ... + 'south'); + cbarStyleOptions = opts_add(cbarStyleOptions, ... + 'xticklabel pos','upper'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... + '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); + case 'east' + cbarTemplate = 'right'; + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + '{(0.97,0.5)}'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor', ... + 'east'); + cbarStyleOptions = opts_add(cbarStyleOptions, ... + 'xticklabel pos','left'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... + '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); + case 'west' + cbarTemplate = 'left'; + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + '{(0.03,0.5)}'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... + 'west'); + cbarStyleOptions = opts_add(cbarStyleOptions,... + 'xticklabel pos', 'right'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... + '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); + case 'eastoutside' + %cbarTemplate = 'right'; + case 'westoutside' + cbarTemplate = 'left'; + case 'northoutside' + % TODO move to top + cbarTemplate = 'horizontal'; + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + '{(0.5,1.03)}'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... + 'south'); + cbarStyleOptions = opts_add(cbarStyleOptions,... + 'xticklabel pos', 'upper'); + case 'southoutside' + cbarTemplate = 'horizontal'; + case 'manual' + origUnits = get(handle,'Units'); + assocAxes = get(handle,'Axes'); + origAxesUnits = get(assocAxes,'Units'); + set(handle,'Units','centimeters'); % Make sure we have + set(assocAxes,'Units','centimeters'); % same units + cbarDim = pos2dims(get(handle,'Position')); + cbarAxesDim = pos2dims(get(assocAxes,'Position')); + set(handle,'Units',origUnits); % Restore original + set(assocAxes,'Units',origAxesUnits); % units + + center = @(dims) (dims.left + dims.right)/2; + centerCbar = center(cbarDim); + centerAxes = center(cbarAxesDim); + + % Cases of colorbar axis locations (in or out) depending on center + % of colorbar relative to the center it's associated axes. + % According to matlab manual (R2016a) colorbars with Location 'manual' + % can only be vertical. + axisLoc = getOrDefault(handle, 'AxisLocation', 'out'); + if centerCbar < centerAxes + if strcmp(axisLoc,'in') + cbarTemplate = 'right'; + else + cbarTemplate = 'left'; + end + else + if strcmp(axisLoc,'in') + cbarTemplate = 'left'; + else + cbarTemplate = 'right'; + end + end + + % Using positions relative to associated axes + calcRelPos = @(pos1,pos2,ext2) (pos1-pos2)/ext2; + cbarRelPosX = calcRelPos(cbarDim.left,cbarAxesDim.left,cbarAxesDim.width); + cbarRelPosY = calcRelPos(cbarDim.bottom,cbarAxesDim.bottom,cbarAxesDim.height); + cbarRelHeight = cbarDim.height/cbarAxesDim.height; + + cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... + 'south west'); + cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... + ['{(' formatDim(cbarRelPosX) ','... + formatDim(cbarRelPosY) ')}']); + cbarStyleOptions = opts_add(cbarStyleOptions, 'height',... + [formatDim(cbarRelHeight),... + '*\pgfkeysvalueof{/pgfplots/parent axis height}']); + + otherwise + error('matlab2tikz:getColorOptions:unknownLocation',... + 'getColorbarOptions: Unknown ''Location'' %s.', loc) + end +end +% ============================================================================== +function [m2t, xcolor] = getColor(m2t, handle, color, mode) + % Handles MATLAB colors and makes them available to TikZ. + % This includes translation of the color value as well as explicit + % definition of the color if it is not available in TikZ by default. + % + % The variable 'mode' essentially determines what format 'color' can + % have. Possible values are (as strings) 'patch' and 'image'. + + % check if the color is straight given in rgb + % -- notice that we need the extra NaN test with respect to the QUIRK + % below + if isRGBTuple(color) + % everything alright: rgb color here + [m2t, xcolor] = rgb2colorliteral(m2t, color); + else + switch lower(mode) + case 'patch' + [m2t, xcolor] = patchcolor2xcolor(m2t, color, handle); + case 'image' + + m = size(color,1); + n = size(color,2); + xcolor = cell(m, n); + + if ndims(color) == 3 + for i = 1:m + for j = 1:n + [m2t, xc] = rgb2colorliteral(m2t, color(i,j, :)); + xcolor{i, j} = xc; + end + end + elseif ndims(color) <= 2 + [m2t, colorindex] = cdata2colorindex(m2t, color, handle); + for i = 1:m + for j = 1:n + [m2t, xc] = rgb2colorliteral(m2t, m2t.current.colormap(colorindex(i,j), :)); + xcolor{i, j} = xc; + end + end + else + error('matlab2tikz:getColor:image:colorDims',... + 'Image color data cannot have more than 3 dimensions'); + end + otherwise + error(['matlab2tikz:getColor', ... + 'Argument ''mode'' has illegal value ''%s''.'], ... + mode); + end + end +end +% ============================================================================== +function [m2t, xcolor] = patchcolor2xcolor(m2t, color, patchhandle) + % Transforms a color of the edge or the face of a patch to an xcolor literal. + if isnumeric(color) + [m2t, xcolor] = rgb2colorliteral(m2t, color); + elseif ischar(color) + switch color + case 'flat' + cdata = getCDataWithFallbacks(patchhandle); + color1 = cdata(1,1); + % RGB cdata + if ndims(cdata) == 3 && all(size(cdata) == [1,1,3]) + [m2t,xcolor] = rgb2colorliteral(m2t, cdata); + % All same color + elseif all(isnan(cdata) | abs(cdata-color1)<1.0e-10) + [m2t, colorindex] = cdata2colorindex(m2t, color1, patchhandle); + [m2t, xcolor] = rgb2colorliteral(m2t, m2t.current.colormap(colorindex, :)); + else + % Don't return anything meaningful and count on the caller + % to make something of it. + xcolor = []; + end + + case 'auto' + try + color = get(patchhandle, 'Color'); + catch + % From R2014b use an undocumented property if Color is + % not present + color = get(patchhandle, 'AutoColor'); + end + [m2t, xcolor] = rgb2colorliteral(m2t, color); + + case 'none' + % Before, we used to throw an error here. However, probably this + % is not necessary and actually harmful (#739). + xcolor = 'none'; + + otherwise + error('matlab2tikz:anycolor2rgb:UnknownColorModel',... + 'Don''t know how to handle the color model ''%s''.',color); + end + else + error('patchcolor2xcolor:illegalInput', ... + 'Input argument ''color'' not a string or numeric.'); + end +end +% ============================================================================== +function cdata = getCDataWithFallbacks(patchhandle) + % Looks for CData at different places + cdata = getOrDefault(patchhandle, 'CData', []); + + if isempty(cdata) || ~isnumeric(cdata) + child = allchild(patchhandle); + cdata = get(child, 'CData'); + end + if isempty(cdata) || ~isnumeric(cdata) + % R2014b+: CData is implicit by the ordering of the siblings + siblings = allchild(get(patchhandle, 'Parent')); + cdata = find(siblings(end:-1:1)==patchhandle); + end +end +% ============================================================================== +function [m2t, colorindex] = cdata2colorindex(m2t, cdata, imagehandle) + % Transforms a color in CData format to an index in the color map. + % Only does something if CDataMapping is 'scaled', really. + + if ~isnumeric(cdata) && ~islogical(cdata) + error('matlab2tikz:cdata2colorindex:unknownCDataType',... + 'Don''t know how to handle CData ''%s''.',cdata); + end + + axeshandle = m2t.current.gca; + + % ----------------------------------------------------------------------- + % For the following, see, for example, the MATLAB help page for 'image', + % section 'Image CDataMapping'. + try + mapping = get(imagehandle, 'CDataMapping'); + catch + mapping = 'scaled'; + end + switch mapping + case 'scaled' + % need to scale within clim + % see MATLAB's manual page for caxis for details + clim = get(axeshandle, 'clim'); + m = size(m2t.current.colormap, 1); + colorindex = zeros(size(cdata)); + idx1 = cdata <= clim(1); + idx2 = cdata >= clim(2); + idx3 = ~idx1 & ~idx2; + colorindex(idx1) = 1; + colorindex(idx2) = m; + % cdata may be of type uint8. Convert to double to avoid + % getting binary indices + colorindex(idx3) = fix(double(cdata(idx3)-clim(1)) / (clim(2)-clim(1)) *m) ... + + 1; + case 'direct' + % direct index + colorindex = cdata; + + otherwise + error('matlab2tikz:anycolor2rgb:unknownCDataMapping',... + 'Unknown CDataMapping ''%s''.',cdatamapping); + end +end +% ============================================================================== +function [m2t, key, legendOpts] = getLegendOpts(m2t, handle) + lStyle = opts_new(); + + lStyle = getLegendPosition(m2t, handle, lStyle); + lStyle = getLegendOrientation(m2t, handle, lStyle); + lStyle = getLegendEntryAlignment(m2t, handle, lStyle); + + % If the plot has 'legend boxoff', we have the 'not visible' + % property, so turn off line and background fill. + if ~isVisible(handle) || isOff(get(handle,'box')) + lStyle = opts_add(lStyle, 'fill', 'none'); + lStyle = opts_add(lStyle, 'draw', 'none'); + else + % handle colors + [edgeColor, isDfltEdge] = getAndCheckDefault('Legend', handle, ... + 'EdgeColor', [1 1 1]); + if isNone(edgeColor) + lStyle = opts_add(lStyle, 'draw', 'none'); + + elseif ~isDfltEdge + [m2t, col] = getColor(m2t, handle, edgeColor, 'patch'); + lStyle = opts_add(lStyle, 'draw', col); + end + + [fillColor, isDfltFill] = getAndCheckDefault('Legend', handle, ... + 'Color', [1 1 1]); + if isNone(fillColor) + lStyle = opts_add(lStyle, 'fill', 'none'); + + elseif ~isDfltFill + [m2t, col] = getColor(m2t, handle, fillColor, 'patch'); + lStyle = opts_add(lStyle, 'fill', col); + end + end + % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + key = 'legend style'; + legendOpts = opts_print(lStyle); + legendOpts = ['{', legendOpts, '}']; + %TODO: just pass out the `lStyle` instead of `legendOpts` +end +% ============================================================================== +function [lStyle] = getLegendOrientation(m2t, handle, lStyle) + % handle legend orientation + ori = get(handle, 'Orientation'); + switch lower(ori) + case 'horizontal' + numLegendEntries = sprintf('%d',length(get(handle, 'String'))); + lStyle = opts_add(lStyle, 'legend columns', numLegendEntries); + + case 'vertical' + % Use default. + otherwise + userWarning(m2t, [' Unknown legend orientation ''',ori,'''' ... + '. Choosing default (vertical).']); + end +end +% ============================================================================== +function [lStyle] = getLegendPosition(m2t, handle, lStyle) + % handle legend location + % #COMPLEX: just a big switch-case + loc = get(handle, 'Location'); + dist = 0.03; % distance to to axes in normalized coordinates + % MATLAB(R)'s keywords are camel cased (e.g., 'NorthOutside'), in Octave + % small cased ('northoutside'). Hence, use lower() for uniformity. + switch lower(loc) + case 'northeast' + return % don't do anything in this (default) case + case 'northwest' + position = [dist, 1-dist]; + anchor = 'north west'; + case 'southwest' + position = [dist, dist]; + anchor = 'south west'; + case 'southeast' + position = [1-dist, dist]; + anchor = 'south east'; + case 'north' + position = [0.5, 1-dist]; + anchor = 'north'; + case 'east' + position = [1-dist, 0.5]; + anchor = 'east'; + case 'south' + position = [0.5, dist]; + anchor = 'south'; + case 'west' + position = [dist, 0.5]; + anchor = 'west'; + case 'northoutside' + position = [0.5, 1+dist]; + anchor = 'south'; + case 'southoutside' + position = [0.5, -dist]; + anchor = 'north'; + case 'eastoutside' + position = [1+dist, 0.5]; + anchor = 'west'; + case 'westoutside' + position = [-dist, 0.5]; + anchor = 'east'; + case 'northeastoutside' + position = [1+dist, 1]; + anchor = 'north west'; + case 'northwestoutside' + position = [-dist, 1]; + anchor = 'north east'; + case 'southeastoutside' + position = [1+dist, 0]; + anchor = 'south west'; + case 'southwestoutside' + position = [-dist, 0]; + anchor = 'south east'; + case 'none' + legendPos = get(handle, 'Position'); + unit = get(handle, 'Units'); + if isequal(unit, 'normalized') + position = legendPos(1:2); + else + % Calculate where the legend is located w.r.t. the axes. + axesPos = get(m2t.current.gca, 'Position'); + axesUnit = get(m2t.current.gca, 'Units'); + % Convert to legend unit + axesPos = convertUnits(axesPos, axesUnit, unit); + % By default, the axes position is given w.r.t. to the figure, + % and so is the legend. + position = (legendPos(1:2)-axesPos(1:2)) ./ axesPos(3:4); + end + anchor = 'south west'; + case {'best','bestoutside'} + % TODO: Implement these. + % The position could be determined by means of 'Position' and/or + % 'OuterPosition' of the legend handle; in fact, this could be made + % a general principle for all legend placements. + userWarning(m2t, [sprintf(' Option ''%s'' not yet implemented.',loc), ... + ' Choosing default.']); + return % use defaults + + otherwise + userWarning(m2t, [' Unknown legend location ''',loc,'''' ... + '. Choosing default.']); + return % use defaults + end + + % set legend position + %TODO: shouldn't this include units? + lStyle = opts_add(lStyle, 'at', sprintf('{(%s,%s)}', ... + formatDim(position(1)), formatDim(position(2)))); + lStyle = opts_add(lStyle, 'anchor', anchor); + +end +% ============================================================================== +function [lStyle] = getLegendEntryAlignment(m2t, handle, lStyle) + % determines the text and picture alignment inside a legend + textalign = ''; + pictalign = ''; + switch getEnvironment + case 'Octave' + % Octave allows to change the alignment of legend text and + % pictograms using legend('left') and legend('right') + textpos = get(handle, 'textposition'); + switch lower(textpos) + case 'left' + % pictogram right of flush right text + textalign = 'right'; + pictalign = 'right'; + case 'right' + % pictogram left of flush left text (default) + textalign = 'left'; + pictalign = 'left'; + otherwise + userWarning(m2t, ... + ['Unknown legend text position ''',... + textpos, '''. Choosing default.']); + end + case 'MATLAB' + % does not specify text/pictogram alignment in legends + otherwise + errorUnknownEnvironment(); + end + + % set alignment of legend text and pictograms, if available + if ~isempty(textalign) && ~isempty(pictalign) + lStyle = opts_add(lStyle, 'legend cell align', textalign); + lStyle = opts_add(lStyle, 'align', textalign); + lStyle = opts_add(lStyle, 'legend plot pos', pictalign); + else + % Make sure the entries are flush left (default MATLAB behavior). + % This is also import for multiline legend entries: Without alignment + % specification, the TeX document won't compile. + % 'legend plot pos' is not set explicitly, since 'left' is default. + lStyle = opts_add(lStyle, 'legend cell align', 'left'); + lStyle = opts_add(lStyle, 'align', 'left'); + end +end +% ============================================================================== +function [pTicks, pTickLabels] = ... + matlabTicks2pgfplotsTicks(m2t, ticks, tickLabels, isLogAxis, tickLabelMode) + % Converts MATLAB style ticks and tick labels to pgfplots style (if needed) + if isempty(ticks) + pTicks = '\empty'; + pTickLabels = []; + return + end + + % set ticks + labels + pTicks = join(m2t, num2cell(ticks), ','); + + % if there's no specific labels, return empty + if isempty(tickLabels) || (length(tickLabels)==1 && isempty(tickLabels{1})) + pTickLabels = '\empty'; + return + end + + % sometimes tickLabels are cells, sometimes plain arrays + % -- unify this to cells + if ischar(tickLabels) + tickLabels = strtrim(mat2cell(tickLabels, ... + ones(size(tickLabels,1), 1), ... + size(tickLabels, 2) ... + ) ... + ); + end + + ticks = removeSuperfluousTicks(ticks, tickLabels); + + isNeeded = isTickLabelsNecessary(m2t, ticks, tickLabels, isLogAxis); + + pTickLabels = formatPgfTickLabels(m2t, isNeeded, tickLabels, ... + isLogAxis, tickLabelMode); +end +% ============================================================================== +function bool = isTickLabelsNecessary(m2t, ticks, tickLabels, isLogAxis) + % Check if tickLabels are really necessary (and not already covered by + % the tick values themselves). + bool = false; + + k = find(ticks ~= 0.0, 1); % get an index with non-zero tick value + if isLogAxis || isempty(k) % only a 0-tick + scalingFactor = 1; + else + % When plotting axis, MATLAB might scale the axes by a factor of ten, + % say 10^n, and plot a 'x 10^k' next to the respective axis. This is + % common practice when the tick marks are really large or small + % numbers. + % Unfortunately, MATLAB doesn't contain the information about the + % scaling anywhere in the plot, and at the same time the {x,y}TickLabels + % are given as t*10^k, thus no longer corresponding to the actual + % value t. + % Try to find the scaling factor here. This is then used to check + % whether or not explicit {x,y}TickLabels are really necessary. + s = str2double(tickLabels{k}); + scalingFactor = ticks(k)/s; + % check if the factor is indeed a power of 10 + S = log10(scalingFactor); + if abs(round(S)-S) > m2t.tol + scalingFactor = 1.0; + end + end + + for k = 1:min(length(ticks),length(tickLabels)) + % Don't use str2num here as then, literal strings as 'pi' get + % legally transformed into 3.14... and the need for an explicit + % label will not be recognized. str2double returns a NaN for 'pi'. + if isLogAxis + s = 10^(str2double(tickLabels{k})); + else + s = str2double(tickLabels{k}); + end + if isnan(s) || abs(ticks(k)-s*scalingFactor) > m2t.tol + bool = true; + return; + end + end +end +% ============================================================================== +function pTickLabels = formatPgfTickLabels(m2t, plotLabelsNecessary, ... + tickLabels, isLogAxis, tickLabelMode) + % formats the tick labels for pgfplots + if plotLabelsNecessary + for k = 1:length(tickLabels) + % Turn tickLabels from cells containing a cell into + % cells containing strings + if isnumeric(tickLabels{k}) + tickLabels(k) = num2str(tickLabels{k}); + elseif iscell(tickLabels{k}) + tickLabels(k) = tickLabels{k}; + end + % If the axis is logscaled, MATLAB does not store the labels, + % but the exponents to 10 + if isLogAxis && strcmpi(tickLabelMode,'auto') + tickLabels{k} = sprintf('$10^{%s}$', str); + end + end + tickLabels = cellfun(@(l)(sprintf('{%s}',l)), tickLabels, ... + 'UniformOutput', false); + pTickLabels = join(m2t, tickLabels, ','); + else + pTickLabels = []; + end +end +% ============================================================================== +function ticks = removeSuperfluousTicks(ticks, tickLabels) + % What MATLAB does when the number of ticks and tick labels is not the same, + % is somewhat unclear. Cut of the first entries to fix bug + % https://github.com/matlab2tikz/matlab2tikz/issues/161, + m = length(ticks); + n = length(tickLabels); + if n < m + ticks = ticks(m-n+1:end); + end +end +% ============================================================================== +function tikzLineStyle = translateLineStyle(matlabLineStyle) + if(~ischar(matlabLineStyle)) + error('matlab2tikz:translateLineStyle:NotAString',... + 'Variable matlabLineStyle is not a string.'); + end + + switch (matlabLineStyle) + case 'none' + tikzLineStyle = ''; + case '-' + tikzLineStyle = 'solid'; + case '--' + tikzLineStyle = 'dashed'; + case ':' + tikzLineStyle = 'dotted'; + case '-.' + tikzLineStyle = 'dashdotted'; + otherwise + error('matlab2tikz:translateLineStyle:UnknownLineStyle',... + 'Unknown matlabLineStyle ''%s''.', matlabLineStyle); + end +end +% ============================================================================== +function [m2t, table, opts] = makeTable(m2t, varargin) + % [m2t,table,opts] = makeTable(m2t, 'name1', data1, 'name2', data2, ...) + % [m2t,table,opts] = makeTable(m2t, {'name1','name2',...}, {data1, data2, ...}) + % [m2t,table,opts] = makeTable(m2t, {'name1','name2',...}, [data1(:), data2(:), ...]) + % + % Returns m2t structure, formatted table and table options. + % When all the names are empty, no header is printed + [variables, data] = parseInputsForTable_(varargin{:}); + opts = opts_new(); + + COLSEP = sprintf('\t'); + if m2t.args.externalData + ROWSEP = sprintf('\n'); + else + ROWSEP = sprintf('\\\\\n'); + opts = opts_add(opts, 'row sep','crcr'); + end + + nColumns = numel(data); + nRows = cellfun(@numel, data); + if ~all(nRows==nRows(1)) + error('matlab2tikz:makeTableDifferentNumberOfRows',... + 'Different data lengths [%s].', num2str(nRows)); + end + nRows = nRows(1); + + FORMAT = repmat({m2t.ff}, 1, nColumns); + FORMAT(cellfun(@isCellOrChar, data)) = {'%s'}; + FORMAT = join(m2t, FORMAT, COLSEP); + if all(cellfun(@isempty, variables)) + header = {}; + else + header = {join(m2t, variables, COLSEP)}; + end + + table = cell(nRows,1); + for iRow = 1:nRows + thisData = cell(1,nColumns); + for jCol = 1:nColumns + thisData{1,jCol} = data{jCol}(iRow); + end + table{iRow} = sprintf(FORMAT, thisData{:}); + end + table = lower(table); % convert NaN and Inf to lower case for TikZ + table = [join(m2t, [header;table], ROWSEP) ROWSEP]; + + if m2t.args.externalData + % output data to external file + [m2t, fileNum] = incrementGlobalCounter(m2t, 'tsvFile'); + [filename, latexFilename] = externalFilename(m2t, fileNum, '.tsv'); + + % write the data table to an external file + fid = fileOpenForWrite(m2t, filename); + finally_fclose_fid = onCleanup(@() fclose(fid)); + + fprintf(fid, '%s', table); + + % put the filename in the TikZ output + table = latexFilename; + else + % output data with "%newline" prepended for formatting consistency + % do NOT prepend another newline in the output: LaTeX will crash. + table = sprintf('%%\n%s', table); + end +end +% ============================================================================== +function [variables, data] = parseInputsForTable_(varargin) + % parse input arguments for |makeTable| + if numel(varargin) == 2 % cell syntax + variables = varargin{1}; + data = varargin{2}; + if ischar(variables) + % one variable, one data vector -> (cell, cell) + variables = {variables}; + data = {data}; + elseif iscellstr(variables) && ~iscell(data) + % multiple variables, one data matrix -> (cell, cell) by column + data = num2cell(data, 1); + end + else % key-value syntax + variables = varargin(1:2:end-1); + data = varargin(2:2:end); + end +end +% ============================================================================== +function [path, texpath] = externalFilename(m2t, counter, extension) + % generates a file name for an external data file and its relative TeX path + + [dummy, name] = fileparts(m2t.tikzFileName); %#ok + baseFilename = [name '-' num2str(counter) extension]; + path = fullfile(m2t.dataPath, baseFilename); + texpath = TeXpath(fullfile(m2t.relativeDataPath, baseFilename)); +end +% ============================================================================== +function [names,definitions] = dealColorDefinitions(mergedColorDefs) + if isempty(mergedColorDefs) + mergedColorDefs = {}; + end + [names,definitions] = cellfun(@(x)(deal(x{:})), mergedColorDefs, ... + 'UniformOutput', false); +end +% ============================================================================== +function [m2t, colorLiteral] = rgb2colorliteral(m2t, rgb) + % Translates an rgb value to an xcolor literal + % + % Possible outputs: + % - xcolor literal color, e.g. 'blue' + % - mixture of 2 previously defined colors, e.g. 'red!70!green' + % - a newly defined color, e.g. 'mycolor10' + + % Take a look at xcolor.sty for the color definitions. + % In xcolor.sty some colors are defined in CMYK space and approximated + % crudely for RGB color space. So it is better to redefine those colors + % instead of using xcolor's: + % 'cyan' , 'magenta', 'yellow', 'olive' + % [0,1,1], [1,0,1] , [1,1,0] , [0.5,0.5,0] + + xcolColorNames = {'white', 'black', 'red', 'green', 'blue', ... + 'brown', 'lime', 'orange', 'pink', ... + 'purple', 'teal', 'violet', ... + 'darkgray', 'gray', 'lightgray'}; + xcolColorSpecs = {[1,1,1], [0,0,0], [1,0,0], [0,1,0], [0,0,1], ... + [0.75,0.5,0.25], [0.75,1,0], [1,0.5,0], [1,0.75,0.75], ... + [0.75,0,0.25], [0,0.5,0.5], [0.5,0,0.5], ... + [0.25,0.25,0.25], [0.5,0.5,0.5], [0.75,0.75,0.75]}; + + colorNames = [xcolColorNames, m2t.color.extraNames]; + colorSpecs = [xcolColorSpecs, m2t.color.extraSpecs]; + + %% check if rgb is a predefined color + for kColor = 1:length(colorSpecs) + Ck = colorSpecs{kColor}(:); + if max(abs(Ck - rgb(:))) < m2t.color.precision + colorLiteral = colorNames{kColor}; + return % exact color was predefined + end + end + + %% check if the color is a linear combination of two already defined colors + for iColor = 1:length(colorSpecs) + for jColor = iColor+1:length(colorSpecs) + Ci = colorSpecs{iColor}(:); + Cj = colorSpecs{jColor}(:); + + % solve color mixing equation `Ck = p * Ci + (1-p) * Cj` for p + p = (Ci-Cj) \ (rgb(:)-Cj); + p = round(100*p)/100; % round to a percentage + Ck = p * Ci + (1-p)*Cj; % approximated mixed color + + if p <= 1 && p >= 0 && max(abs(Ck(:) - rgb(:))) < m2t.color.precision + colorLiteral = sprintf('%s!%d!%s', colorNames{iColor}, round(p*100), ... + colorNames{jColor}); + return % linear combination found + end + end + end + + %% Define colors that are not a linear combination of two known colors + colorLiteral = sprintf('mycolor%d', length(m2t.color.extraNames)+1); + m2t.color.extraNames{end+1} = colorLiteral; + m2t.color.extraSpecs{end+1} = rgb; +end +% ============================================================================== +function newstr = join(m2t, cellstr, delimiter) + % This function joins a cell of strings to a single string (with a + % given delimiter in between two strings, if desired). + % + % Example of usage: + % join(m2t, cellstr, ',') + newstr = m2tstrjoin(cellstr, delimiter, m2t.ff); +end +% ============================================================================== +function [width, height, unit] = getNaturalFigureDimension(m2t) + % Returns the size of figure (in inch) + % To stay compatible with getNaturalAxesDimensions, the unit 'in' is + % also returned. + + % Get current figure size + figuresize = get(m2t.current.gcf, 'Position'); + figuresize = figuresize([3 4]); + figureunit = get(m2t.current.gcf, 'Units'); + + % Convert Figure Size + unit = 'in'; + figuresize = convertUnits(figuresize, figureunit, unit); + + % Split size into width and height + width = figuresize(1); + height = figuresize(2); + +end +% ============================================================================== +function dimension = getFigureDimensions(m2t, widthString, heightString) + % Returns the physical dimension of the figure. + + [width, height, unit] = getNaturalFigureDimension(m2t); + + % get the natural width-height ration of the plot + axesWidthHeightRatio = width / height; + % check matlab2tikz arguments + if ~isempty(widthString) + width = extractValueUnit(widthString); + end + if ~isempty(heightString) + height = extractValueUnit(heightString); + end + + % prepare the output + if ~isempty(widthString) && ~isempty(heightString) + dimension.x.unit = width.unit; + dimension.x.value = width.value; + dimension.y.unit = height.unit; + dimension.y.value = height.value; + elseif ~isempty(widthString) + dimension.x.unit = width.unit; + dimension.x.value = width.value; + dimension.y.unit = width.unit; + dimension.y.value = width.value / axesWidthHeightRatio; + elseif ~isempty(heightString) + dimension.y.unit = height.unit; + dimension.y.value = height.value; + dimension.x.unit = height.unit; + dimension.x.value = height.value * axesWidthHeightRatio; + else % neither width nor height given + dimension.x.unit = unit; + dimension.x.value = width; + dimension.y.unit = unit; + dimension.y.value = height; + end +end +% ============================================================================== +function position = getAxesPosition(m2t, handle, widthString, heightString, axesBoundingBox) + % Returns the physical position of the axes. This includes - in difference + % to the Dimension - also an offset to shift the axes inside the figure + % An optional bounding box can be used to omit empty borders. + + % Deal with optional parameter + if nargin < 4 + axesBoundingBox = [0 0 1 1]; + end + + % First get the whole figures size + figDim = getFigureDimensions(m2t, widthString, heightString); + + % Get the relative position of the axis + relPos = getRelativeAxesPosition(m2t, handle, axesBoundingBox); + + position.x.value = relPos(1) * figDim.x.value; + position.x.unit = figDim.x.unit; + position.y.value = relPos(2) * figDim.y.value; + position.y.unit = figDim.y.unit; + position.w.value = relPos(3) * figDim.x.value; + position.w.unit = figDim.x.unit; + position.h.value = relPos(4) * figDim.y.value; + position.h.unit = figDim.y.unit; +end +% ============================================================================== +function [position] = getRelativeAxesPosition(m2t, axesHandles, axesBoundingBox) + % Returns the relative position of axes within the figure. + % Position is an (n,4) matrix with [minX, minY, width, height] for each + % handle. All these values are relative to the figure size, which means + % that [0, 0, 1, 1] covers the whole figure. + % It is possible to add a second parameter with the relative coordinates of + % a bounding box around all axes of the figure (see getRelevantAxes()). In + % this case, relative positions are rescaled so that the bounding box is + % [0, 0, 1, 1] + + % Get Figure Dimension + [figWidth, figHeight, figUnits] = getNaturalFigureDimension(m2t); + + % Initialize position + position = zeros(numel(axesHandles), 4); + % Iterate over all handles + for i = 1:numel(axesHandles) + axesHandle = axesHandles(i); + axesPos = get(axesHandle, 'Position'); + axesUnits = get(axesHandle, 'Units'); + if isequal(lower(axesUnits), 'normalized') + % Position is already relative + position(i,:) = axesPos; + else + % Convert figure size into axes units + figureSize = convertUnits([figWidth, figHeight], figUnits, axesUnits); + % Figure size into axes units to get the relative size + position(i,:) = axesPos ./ [figureSize, figureSize]; + + end + + if strcmpi(get(axesHandle, 'DataAspectRatioMode'), 'manual') ... + || strcmpi(get(axesHandle, 'PlotBoxAspectRatioMode'), 'manual') + + if strcmpi(get(axesHandle,'Projection'),'Perspective') + userWarning(m2t,'Perspective projections are not currently supported') + end + + % project vertices of 3d plot box (this results in 2d coordinates in + % an absolute coordinate system that is scaled proportionally by + % Matlab to fit the axes position box) + switch getEnvironment() + case 'MATLAB' + projection = view(axesHandle); + + case 'Octave' + % Unfortunately, Octave does not have the full `view` + % interface implemented, but the projection matrices are + % available: http://octave.1599824.n4.nabble.com/Implementing-view-td3032041.html + + projection = get(axesHandle, 'x_viewtransform'); + + otherwise + errorUnknownEnvironment(); + end + + + vertices = projection * [0, 1, 0, 0, 1, 1, 0, 1; + 0, 0, 1, 0, 1, 0, 1, 1; + 0, 0, 0, 1, 0, 1, 1, 1; + 1, 1, 1, 1, 1, 1, 1, 1]; + + % each of the columns of vertices represents a vertex of the 3D axes + % but we only need their XY coordinates + verticesXY = vertices([1 2], :); + + % the size of the projected plot box is limited by the long diagonals + % The matrix A determines the connectivity, e.g. the first diagonal runs from vertices(:,3) -> vertices(:,4) + A = [ 0, 0, 0, -1, +1, 0, 0, 0; + 0, 0, -1, 0, 0, +1, 0, 0; + 0, -1, 0, 0, 0, 0, +1, 0; + -1, 0, 0, 0, 0, 0, 0, +1]; + diagonals = verticesXY * A'; + % each of the columns of this matrix contains a the X and Y distance of a diagonal + dimensions = max(abs(diagonals), [], 2); + + % find limiting dimension and adjust position + aspectRatio = dimensions(2) * figWidth / (dimensions(1) * figHeight); + axesAspectRatio = position(i,4) / position(i,3); + if aspectRatio > axesAspectRatio + newWidth = position(i,4) / aspectRatio; + % Center Axis + offset = (position(i,3) - newWidth) / 2; + position(i,1) = position(i,1) + offset; + % Store new width + position(i,3) = newWidth; + else + newHeight = position(i,3) * aspectRatio; + offset = (position(i,4) - newHeight) / 2; + position(i,2) = position(i,2) + offset; + % Store new height + position(i,4) = newHeight; + end + end + end + + %% Rescale if axesBoundingBox is given + if exist('axesBoundingBox','var') + % shift position so that [0, 0] is the lower left corner of the + % bounding box + position(:,1) = position(:,1) - axesBoundingBox(1); + position(:,2) = position(:,2) - axesBoundingBox(2); + % Recale + position(:,[1 3]) = position(:,[1 3]) / max(axesBoundingBox([3 4])); + position(:,[2 4]) = position(:,[2 4]) / max(axesBoundingBox([3 4])); + end +end +% ============================================================================== +function aspectRatio = getPlotBoxAspectRatio(axesHandle) + limits = axis(axesHandle); + if any(isinf(limits)) + aspectRatio = get(axesHandle,'PlotBoxAspectRatio'); + else + % DataAspectRatio has priority + dataAspectRatio = get(axesHandle,'DataAspectRatio'); + nlimits = length(limits)/2; + limits = reshape(limits, 2, nlimits); + aspectRatio = abs(limits(2,:) - limits(1,:))./dataAspectRatio(1:nlimits); + aspectRatio = aspectRatio/min(aspectRatio); + end +end +% ============================================================================== +function texUnits = matlab2texUnits(matlabUnits, fallbackValue) + switch matlabUnits + case 'pixels' + texUnits = 'px'; % only in pdfTex/LuaTeX + case 'centimeters' + texUnits = 'cm'; + case 'characters' + texUnits = 'em'; + case 'points' + texUnits = 'pt'; + case 'inches' + texUnits = 'in'; + otherwise + texUnits = fallbackValue; + end +end +% ============================================================================== +function dstValue = convertUnits(srcValue, srcUnit, dstUnit) + % Converts values between different units. + % srcValue stores a length (or vector of lengths) in srcUnit. + % The resulting dstValue is the converted length into dstUnit. + % + % Currently supported units are: in, cm, px, pt + + % Use tex units, if possible (to make things simple) + srcUnit = matlab2texUnits(lower(srcUnit),lower(srcUnit)); + dstUnit = matlab2texUnits(lower(dstUnit),lower(dstUnit)); + + if isequal(srcUnit, dstUnit) + dstValue = srcValue; + return % conversion to the same unit => factor = 1 + end + + units = {srcUnit, dstUnit}; + factor = ones(1,2); + for ii = 1:numel(factor) % Same code for srcUnit and dstUnit + % Use inches as intermediate unit + % Compute the factor to convert an inch into another unit + switch units{ii} + case 'cm' + factor(ii) = 2.54; + case 'px' + factor(ii) = get(0, 'ScreenPixelsPerInch'); + case 'in' + factor(ii) = 1; + case 'pt' + factor(ii) = 72; + otherwise + warning('MATLAB2TIKZ:UnknownPhysicalUnit',... + 'Can not convert unit ''%s''. Using conversion factor 1.', units{ii}); + end + end + + dstValue = srcValue * factor(2) / factor(1); +end +% ============================================================================== +function out = extractValueUnit(str) + % Decompose m2t.args.width into value and unit. + + % Regular expression to match '4.12cm', '\figurewidth', ... + fp_regex = '[-+]?\d*\.?\d*(?:e[-+]?\d+)?'; + pattern = strcat('(', fp_regex, ')?', '(\\?[a-zA-Z]+)'); + + [dummy,dummy,dummy,dummy,t,dummy] = regexp(str, pattern, 'match'); %#ok + + if length(t)~=1 + error('getAxesDimensions:illegalLength', ... + 'The width string ''%s'' could not be decomposed into value-unit pair.', str); + end + + if length(t{1}) == 1 + out.value = 1.0; % such as in '1.0\figurewidth' + out.unit = strtrim(t{1}{1}); + elseif length(t{1}) == 2 && isempty(t{1}{1}) + % MATLAB(R) does this: + % length(t{1})==2 always, but the first field may be empty. + out.value = 1.0; + out.unit = strtrim(t{1}{2}); + elseif length(t{1}) == 2 + out.value = str2double(t{1}{1}); + out.unit = strtrim(t{1}{2}); + else + error('getAxesDimensions:illegalLength', ... + 'The width string ''%s'' could not be decomposed into value-unit pair.', str); + end +end +% ============================================================================== +function str = escapeCharacters(str) + % Replaces "%" and "\" with respectively "%%" and "\\" + str = strrep(str, '%' , '%%'); + str = strrep(str, '\' , '\\'); +end +% ============================================================================== +function bool = isNone(value) + % Checks whether a value is 'none' + bool = strcmpi(value, 'none'); +end +% ============================================================================== +function bool = isOn(value) + % Checks whether a value is 'on' + bool = strcmpi(value, 'on'); +end +% ============================================================================== +function bool = isOff(value) + % Checks whether a value is 'off'. + % Note that some options are not be solely an on/off boolean, such that `isOn` + % and isOff don't always return the complement of each other and such that we + % need both functions to check the value. + % E.g. `set(0, 'HandleVisibility')` allows the value 'callback'. + bool = strcmpi(value, 'off'); +end +% ============================================================================== +function val = getOrDefault(handle, key, default) + % gets the value or returns the default value if no such property exists + if all(isprop(handle, key)) + val = get(handle, key); + else + val = default; + end +end +% ============================================================================== +function val = getFactoryOrDefault(type, key, fallback) + % get factory default value for a certain type of HG object + % this CANNOT be done using |getOrDefault| as |isprop| doesn't work for + % factory/default settings. Hence, we use a more expensive try-catch instead. + try + groot = 0; + val = get(groot, ['Factory' type key]); + catch + val = fallback; + end +end +% ============================================================================== +function [val, isDefault] = getAndCheckDefault(type, handle, key, default) + % gets the value from a handle of certain type and check the default values + default = getFactoryOrDefault(type, key, default); + val = getOrDefault(handle, key, default); + isDefault = isequal(val, default); +end +% ============================================================================== +function bool = isVisible(handles) + % Determines whether an object is actually visible or not. + bool = isOn(get(handles,'Visible')); + % There's another handle property, 'HandleVisibility', that is unrelated + % to the "physical" visibility of an object. Rather, it sets whether an + % object should be visitable by |findobj|. Hence, it is often switched off + % for non-data objects such as custom axes/grid objects. +end +% ============================================================================== +function [m2t, axesBoundingBox] = getRelevantAxes(m2t, axesHandles) + % Returns relevant axes. These are defines as visible axes that are no + % colorbars. Function 'findPlotAxes()' ensures that 'axesHandles' does not + % contain colorbars. In addition, a bounding box around all relevant Axes is + % computed. This can be used to avoid undesired borders. + % This function is the remaining code of alignSubPlots() in the alternative + % positioning system. + + % List only visible axes + N = numel(axesHandles); + idx = false(N,1); + for ii = 1:N + idx(ii) = isVisibleContainer(axesHandles(ii)); + end + % Store the relevant axes in m2t to simplify querying e.g. positions + % of subplots + m2t.relevantAxesHandles = axesHandles(idx); + + % Compute the bounding box if width or height of the figure are set by + % parameter + if ~isempty(m2t.args.width) || ~isempty(m2t.args.height) + % TODO: check if relevant Axes or all Axes are better. + axesBoundingBox = getRelativeAxesPosition(m2t, m2t.relevantAxesHandles); + % Compute second corner from width and height for each axes + axesBoundingBox(:,[3 4]) = axesBoundingBox(:,[1 2]) + axesBoundingBox(:,[3 4]); + % Combine axes corners to get the bounding box + axesBoundingBox = [min(axesBoundingBox(:,[1 2]),[],1), max(axesBoundingBox(:,[3 4]), [], 1)]; + % Compute width and height of the bounding box + axesBoundingBox(:,[3 4]) = axesBoundingBox(:,[3 4]) - axesBoundingBox(:,[1 2]); + else + % Otherwise take the whole figure as bounding box => lengths are + % not changed in tikz + axesBoundingBox = [0, 0, 1, 1]; + end +end +% ============================================================================== +function userInfo(m2t, message, varargin) + % Display usage information. + if m2t.args.showInfo + mess = sprintf(message, varargin{:}); + + mess = strrep(mess, sprintf('\n'), sprintf('\n *** ')); + fprintf(' *** %s\n', mess); + end +end +% ============================================================================== +function userWarning(m2t, message, varargin) + % Drop-in replacement for warning(). + if m2t.args.showWarnings + warning('matlab2tikz:userWarning', message, varargin{:}); + end +end +% ============================================================================== +function signalDependency(m2t, dependencyType, name) + % Signals an (optional) dependency to the user + switch lower(dependencyType) + case 'tikzlibrary' + message = 'Make sure to add "\\usetikzlibrary{%s}" to the preamble.'; + otherwise + message = 'Please make sure to load the "%s" dependency'; + end + userInfo(m2t, message, name); +end +% ============================================================================== +function warnAboutParameter(m2t, parameter, isActive, message) + % warn the user about the use of a dangerous parameter + line = ['\n' repmat('=',1,80) '\n']; + if isActive(m2t.args.(parameter)) + userWarning(m2t, [line, 'You are using the "%s" parameter.\n', ... + message line], parameter); + end +end +% ============================================================================== +function parent = addChildren(parent, children) + if isempty(children) + return; + elseif iscell(children) + for k = 1:length(children) + parent = addChildren(parent, children{k}); + end + else + if isempty(parent.children) + parent.children = {children}; + else + parent.children = [parent.children children]; + end + end +end +% ============================================================================== +function printAll(m2t, env, fid) + if isfield(env, 'colors') && ~isempty(env.colors) + fprintf(fid, '%s', env.colors); + end + + if isempty(env.options) + fprintf(fid, '\\begin{%s}\n', env.name); + else + fprintf(fid, '\\begin{%s}[%%\n%s\n]\n', env.name, ... + opts_print(env.options, sprintf(',\n'))); + end + + for item = env.content + fprintf(fid, '%s', char(item)); + end + + for k = 1:length(env.children) + if ischar(env.children{k}) + fprintf(fid, escapeCharacters(env.children{k})); + else + fprintf(fid, '\n'); + printAll(m2t, env.children{k}, fid); + end + end + + % End the tikzpicture environment with an empty comment and no newline + % so no additional space is generated after the tikzpicture in TeX. + if strcmp(env.name, 'tikzpicture') % LaTeX is case sensitive + fprintf(fid, '\\end{%s}%%', env.name); + else + fprintf(fid, '\\end{%s}\n', env.name); + end +end +% ============================================================================== +function c = prettyPrint(m2t, strings, interpreter) + % Some resources on how MATLAB handles rich (TeX) markup: + % http://www.mathworks.com/help/techdoc/ref/text_props.html#String + % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 + % http://www.mathworks.com/help/techdoc/ref/text_props.html#Interpreter + % http://www.mathworks.com/help/techdoc/ref/text.html#f68-481120 + + % If the user set the matlab2tikz parameter 'parseStrings' to false, no + % parsing of strings takes place, thus making the user 100% responsible. + if ~m2t.args.parseStrings + % If strings is an actual string (labels etc) we need to return a + % cell containing the string + c = cellstr(strings); + return + end + + % Make sure we have a valid interpreter set up + if ~any(strcmpi(interpreter, {'latex', 'tex', 'none'})) + userWarning(m2t, 'Don''t know interpreter ''%s''. Default handling.', interpreter); + interpreter = 'tex'; + end + + strings = cellstrOneLinePerCell(strings); + + % Now loop over the strings and return them pretty-printed in c. + c = cell(1, length(strings)); + for k = 1:length(strings) + % linear indexing for independence of cell array dimensions + s = strings{k}; + + % The interpreter property of the text element defines how the string + % is parsed + switch lower(interpreter) + case 'latex' % Basic subset of the LaTeX markup language + + % Replace $$...$$ with $...$ for groups, but otherwise leave + % untouched. + % Displaymath \[...\] seems to be unsupported by TikZ/PGF. + % If this changes, use '\\[$2\\]' as replacement below. + % Do not escape dollar in replacement string (e.g., "\$$2\$"), + % since this is not properly handled by octave 3.8.2. + string = regexprep(s, '(\$\$)(.*?)(\$\$)', '$$2$'); + + case 'tex' % Subset of plain TeX markup language + + % Deal with UTF8 characters. + string = s; + + % degree symbol following "^" or "_" needs to be escaped + string = regexprep(string, '([\^\_])°', '$1{{}^\\circ}'); + string = strrep(string, '°', '^\circ'); + string = strrep(string, '∞', '\infty'); + + % Parse string piece-wise in a separate function. + string = parseTexString(m2t, string); + + case 'none' % Literal characters + % Make special characters TeX compatible + + string = strrep(s, '\', '\textbackslash{}'); + % Note: '{' and '}' can't be converted to '\{' and '\}', + % respectively, via strrep(...) as this would lead to + % backslashes converted to '\textbackslash\{\}' because + % the backslash was converted to '\textbackslash{}' in + % the previous step. Using regular expressions with + % negative look-behind makes sure any braces in 'string' + % were not introduced by escaped backslashes. + % Also keep in mind that escaping braces before backslashes + % would not remedy the issue -- in that case 'string' would + % contain backslashes introduced by brace escaping that are + % not supposed to be printable characters. + repl = switchMatOct('\\{', '\{'); + string = regexprep(string, '(?= sCmd(i) & bracesPos <= eCmd(i)) = []; + end + + % Exclude braces that are preceded by an odd number of backslashes which + % means the brace is escaped and thus to be printed, not a grouping brace + expr = '(? $ \text {(non-}) } $<-end + % ...or when the parsed string is empty + parsed = regexprep(parsed, '^\$\$$', ''); + + % Ensure math mode for pipe symbol (issue #587) + parsed = strrep(parsed, '|', '$|$'); +end +% ============================================================================== +function string = parseTexSubstring(m2t, string) + origstr = string; % keep this for warning messages + + % Font families (italic, bold, etc.) get a trailing '{}' because they may be + % followed by a letter which would produce an error in (La)TeX. + for i = {'it', 'bf', 'rm', 'sl'} + string = strrep(string, ['\' i{:}], ['\' i{:} '{}']); + end + + % The same holds true for special characters like \alpha + % The list of MATLAB-supported TeX characters was taken from + % http://www.mathworks.com/help/techdoc/ref/text_props.html#String + named = {'alpha', 'angle', 'ast', 'beta', 'gamma', 'delta', ... + 'epsilon', 'zeta', 'eta', 'theta', 'vartheta', 'iota', ... + 'kappa', 'lambda', 'mu', 'nu', 'xi', 'pi', 'rho', ... + 'sigma', 'varsigma', 'tau', 'equiv', 'Im', 'otimes', ... + 'cap', 'int', 'rfloor', 'lfloor', 'perp', 'wedge', ... + 'rceil', 'vee', 'langle', 'upsilon', 'phi', 'chi', ... + 'psi', 'omega', 'Gamma', 'Delta', 'Theta', 'Lambda', ... + 'Xi', 'Pi', 'Sigma', 'Upsilon', 'Phi', 'Psi', 'Omega', ... + 'forall', 'exists', 'ni', 'cong', 'approx', 'Re', ... + 'oplus', 'cup', 'subseteq', 'lceil', 'cdot', 'neg', ... + 'times', 'surd', 'varpi', 'rangle', 'sim', 'leq', ... + 'infty', 'clubsuit', 'diamondsuit', 'heartsuit', ... + 'spadesuit', 'leftrightarrow', 'leftarrow', ... + 'Leftarrow', 'uparrow', 'rightarrow', 'Rightarrow', ... + 'downarrow', 'circ', 'pm', 'geq', 'propto', 'partial', ... + 'bullet', 'div', 'neq', 'aleph', 'wp', 'oslash', ... + 'supseteq', 'nabla', 'ldots', 'prime', '0', 'mid', ... + 'copyright' }; + for i = named + string = strrep(string, ['\' i{:}], ['\' i{:} '{}']); + % FIXME: Only append '{}' if there's an odd number of backslashes + % in front of the items from 'named'. If it's an even + % number instead, that means there's an escaped (printable) + % backslash and some text like "alpha" after that. + end + % Some special characters' names are subsets of others, e.g. '\o' is + % a subset of '\omega'. This would produce undesired double-escapes. + % For example if '\o' was converted to '\o{}' after '\omega' has been + % converted to '\omega{}' this would result in '\o{}mega{}' instead of + % '\omega{}'. Had '\o' been converted to '\o{}' _before_ '\omega' is + % converted then the result would be '\o{}mega' and thus also wrong. + % To circumvent the problem all those special character names that are + % subsets of others are now converted using a regular expression that + % uses negative lookahead. The special handling of the backslash is + % required for MATLAB/Octave compatibility. + string = regexprep(string, '(\\)o(?!mega|times|plus|slash)', '$1o{}'); + string = regexprep(string, '(\\)in(?!t|fty)', '$1in{}'); + string = regexprep(string, '(\\)subset(?!eq)', '$1subset{}'); + string = regexprep(string, '(\\)supset(?!eq)', '$1supset{}'); + + % Convert '\0{}' (TeX text mode) to '\emptyset{}' (TeX math mode) + string = strrep(string, '\0{}', '\emptyset{}'); + + % Add skip to \fontsize + % This is required for a successful LaTeX run on the output as in contrast + % to MATLAB/Octave it requires the skip parameter (even if it's zero) + string = regexprep(string, '(\\fontsize\{[^}]*\})', '$1{0}'); + + % Put '\o{}' inside \text{...} as it is a text mode symbol that does not + % exist in math mode (and LaTeX gives a warning if you use it in math mode) + string = strrep(string, '\o{}', '\text{\o{}}'); + + % Put everything that isn't a TeX command inside \text{...} + expr = '(\\[a-zA-Z]+(\[[^\]]*\])?(\{[^}]*\}){1,2})'; + % |( \cmd )( [...]? )( {...}{1,2} )| + % ( subset $1 ) + repl = '}$1\\text{'; + string = regexprep(string, expr, repl); + % ...\alpha{}... -> ...}\alpha{}\text{... + string = ['\text{' string '}']; + % ...}\alpha{}\text{... -> \text{...}\alpha{}\text{...} + + % '_' has to be in math mode so long as it's not escaped as '\_' in which + % case it remains as-is. Extra care has to be taken to make sure any + % backslashes in front of the underscore are not themselves escaped and + % thus printable backslashes. This is the case if there's an even number + % of backslashes in a row. + repl = '$1}_\\text{'; + string = regexprep(string, '(?' has to be either in math mode or needs to be typeset as + % '\textless' and '\textgreater' in textmode + % This is handled better, if 'parseStringsAsMath' is activated + if m2t.args.parseStringsAsMath == 0 + string = regexprep(string, '<', '\\textless{}'); + string = regexprep(string, '>', '\\textgreater{}'); + end + + % Move font styles like \bf into the \text{} command. + expr = '(\\bf|\\it|\\rm|\\fontname)({\w*})+(\\text{)'; + while regexp(string, expr) + string = regexprep(string, expr, '$3$1$2'); + end + + % Replace Fontnames + [dummy, dummy, dummy, dummy, fonts, dummy, subStrings] = regexp(string, '\\fontname{(\w*)}'); %#ok + fonts = fonts2tex(fonts); + subStrings = [subStrings; fonts, {''}]; + string = cell2mat(subStrings(:)'); + + % Merge adjacent \text fields: + string = mergeAdjacentTexCmds(string, '\text'); + + % '\\' has to be escaped to '\textbackslash{}' + % This cannot be done with strrep(...) as it would replace e.g. 4 backslashes + % with three times the replacement string because it finds overlapping matches + % (see http://www.mathworks.de/help/techdoc/ref/strrep.html) + % Note: Octave's backslash handling is broken. Even though its output does + % not resemble MATLAB's, the same m2t code is used for either software. That + % way MATLAB-compatible code produces the same matlab2tikz output no matter + % which software it's executed in. So long as this MATLAB incompatibility + % remains in Octave you're probably better off not using backslashes in TeX + % text anyway. + string = regexprep(string, '(\\)\\', '$1textbackslash{}'); + + % '_', '^', '{', and '}' are already escaped properly, even in MATLAB's TeX + % dialect (and if they're not, that's intentional) + + % Escape "$", "%", and "#" to make them compatible to true TeX while in + % MATLAB/Octave they are not escaped + string = strrep(string, '$', '\$'); + string = strrep(string, '%', '\%'); + string = strrep(string, '#', '\#'); + + % Escape "§" as "\S" since it can give UTF-8 problems otherwise. + % The TeX string 'a_§' in particular lead to problems in Octave 3.6.0. + % m2t transcoded that string into '$\text{a}_\text{*}\text{#}$' with + % * = 0xC2 and # = 0xA7 which corresponds with the two-byte UTF-8 + % encoding. Even though this looks like an Octave bug that shows + % during the '..._\text{abc}' to '..._\text{a}\text{bc}' conversion, + % it's best to include the workaround here. + string = strrep(string, '§', '\S{}'); + + string = escapeAmpersands(m2t, string, origstr); + string = escapeTildes(m2t, string, origstr); + + % Convert '..._\text{abc}' and '...^\text{abc}' to '..._\text{a}\text{bc}' + % and '...^\text{a}\text{bc}', respectively. + % Things get a little more complicated if instead of 'a' it's e.g. '$'. The + % latter has been converted to '\$' by now and simply extracting the first + % character from '\text{\$bc}' would result in '\text{$}\text{$bc}' which + % is syntactically wrong. Instead the whole command '\$' has to be moved in + % front of the \text{...} block, e.g. '..._\text{\$bc}' -> '..._\$\text{bc}'. + % Note that the problem does not occur for the majority of special characters + % like '\alpha' because they use math mode and therefore are never inside a + % \text{...} block to begin with. This means that the number of special + % characters affected by this issue is actually quite small: + % $ # % & _ { } \o § ~ \ ^ + expr = ['(_|\^)(\\text)\{([^}\\]|\\\$|\\#|\\%|\\&|\\_|\\\{|\\\}|', ... + ... % (_/^)(\text) {(non-}\| \$ | \#| \%| \&| \_| \{ | \} | + ... % ($1)( $2 ) ( $3 -> + '\\o\{\}|\\S\{\}|\\textasciitilde\{\}|\\textbackslash\{\}|', ... + ... % \o{} | \S{} | \textasciitilde{} | \textbackslash{} | + ... % <- $3 -> + '\\textasciicircum\{\})']; + % \textasciicircum{} ) + % <- $3 ) + string = regexprep(string, expr, '$1$2{$3}$2{'); + + string = parseStringsAsMath(m2t, string); + + % Clean up: remove empty \text{} + string = strrep(string, '\text{}', ''); + % \text{}\alpha{}\text{...} -> \alpha{}\text{...} + + % Clean up: convert '{}\' to '\' unless it's prefixed by a backslash which + % means the opening brace is escaped and thus a printable character instead + % of a grouping brace. + string = regexprep(string, '(? \alpha\text{...} + + % Clean up: convert '{}}' to '}' unless it's prefixed by a backslash + string = regexprep(string, '(? 'abc ef' + % 'abc&\deltaef' -> 'abc ef' + % 'abc&$ef' -> 'abc ef' + % 'abcdef&' -> 'abcdef' + % Don't remove closing brace after '&' as this would result in + % unbalanced braces + string = regexprep(string, '(?0-9 + expr = '(\\text)\{([^}=\-+/,.()<>0-9]*)([=\-+/,.()<>0-9]+)([^}]*)\}'; + % \text {(any non-"x"/'}'char)( any "x" char )(non-}) } + % ( $1 ) ( $2 )( $3 )( $4) + while regexp(string, expr) + % Iterating is necessary to catch all occurrences. See above. + string = regexprep(string, expr, '$1{$2}$3$1{$4}'); + end + + % \text{ } should be a math-mode space + string = regexprep(string, '\\text\{(\s+)}', '$1'); + + % '<<' probably means 'much smaller than', i.e. '\ll' + repl = switchMatOct('$1\\ll{}$2', '$1\ll{}$2'); + string = regexprep(string, '([^<])<<([^<])', repl); + + % '>>' probably means 'much greater than', i.e. '\gg' + repl = switchMatOct('$1\\gg{}$2', '$1\gg{}$2'); + string = regexprep(string, '([^>])>>([^>])', repl); + + % Single letters are most likely variables and thus should be in math mode + string = regexprep(string, '\\text\{([a-zA-Z])\}', '$1'); + + end +end +% ============================================================================== +function tex = fonts2tex(fonts) + % Returns a tex command for each fontname in the cell array fonts. + if ~iscell(fonts) + error('matlab2tikz:fonts2tex', ... + 'Expecting a cell array as input.'); + end + tex = cell(size(fonts)); + + for ii = 1:numel(fonts) + font = fonts{ii}{1}; + + % List of known fonts. + switch lower(font) + case 'courier' + tex{ii} = '\ttfamily{}'; + case 'times' + tex{ii} = '\rmfamily{}'; + case {'arial', 'helvetica'} + tex{ii} = '\sffamily{}'; + otherwise + warning('matlab2tikz:fonts2tex', ... + 'Unknown font ''%s''. Using tex default font.',font); + % Unknown font -> Switch to standard font. + tex{ii} = '\rm{}'; + end + end +end +% ============================================================================== +function string = mergeAdjacentTexCmds(string, cmd) + % Merges adjacent tex commands like \text into one command + % If necessary, add a backslash + if cmd(1) ~= '\' + cmd = ['\' cmd]; + end + % Link each bracket to the corresponding bracket + link = zeros(size(string)); + pos = [regexp([' ' string], '([^\\]{)'), ... + regexp([' ' string], '([^\\]})')]; + pos = sort(pos); + ii = 1; + while ii <= numel(pos) + if string(pos(ii)) == '}' + link(pos(ii-1)) = pos(ii); + link(pos(ii)) = pos(ii - 1); + pos([ii-1, ii]) = []; + ii = ii - 1; + else + ii = ii + 1; + end + end + % Find dispensable commands + pos = regexp(string, ['}\' cmd '{']); + delete = zeros(0,1); + len = numel(cmd); + for p = pos + l = link(p); + if l > len && isequal(string(l-len:l-1), cmd) + delete(end+1,1) = p; + end + end + % 3. Remove these commands (starting from the back + delete = repmat(delete, 1, len+2) + repmat(0:len+1,numel(delete), 1); + string(delete(:)) = []; +end +function dims = pos2dims(pos) + % Position quadruplet [left, bottom, width, height] to dimension structure + dims = struct('left' , pos(1), 'bottom', pos(2)); + if numel(pos) == 4 + dims.width = pos(3); + dims.height = pos(4); + dims.right = dims.left + dims.width; + dims.top = dims.bottom + dims.height; + end +end +% OPTION ARRAYS ================================================================ +function opts = opts_new() + % create a new options array + opts = cell(0,2); +end +function opts = opts_add(opts, key, value) + % add a key-value pair to an options array (with duplication check) + if ~exist('value','var') + value = ''; + end + value = char(value); + + % Check if the key already exists. + if opts_has(opts, key) + oldValue = opts_get(opts, key); + if isequal(value, oldValue) + return; % no action needed: value already present + else + error('matlab2tikz:opts_add', ... + ['Trying to add (%s, %s) to options, but it already ' ... + 'contains the conflicting key-value pair (%s, %s).'], ... + key, value, key, oldValue); + end + end + opts = opts_append(opts, key, value); +end +function opts = opts_addSubOpts(opts, key, subOpts) + % add a key={Opts} pair to an options array + formatted = ['{' opts_print(subOpts) '}']; + opts = opts_add(opts, key, formatted); +end +function bool = opts_has(opts, key) + % returns true if the options array contains the key + bool = ~isempty(opts) && ismember(key, opts(:,1)); +end +function value = opts_get(opts, key) + % returns the value(s) stored for a key in an options array + idx = find(ismember(opts(:,1), key)); + switch numel(idx) + case 1 + value = opts{idx,2}; % just the value + otherwise + value = opts(idx,2); % as cell array + end +end +function opts = opts_append(opts, key, value) + % append a key-value pair to an options array (duplicate keys allowed) + if ~exist('value','var') + value = ''; + end + value = char(value); + if ~(opts_has(opts, key) && isequal(opts_get(opts, key), value)) + opts = cat(1, opts, {key, value}); + end +end +function opts = opts_append_userdefined(opts, userDefined) + % appends user-defined options to an options array + % the userDefined options can come either as a single string or a cellstr that + % is already TikZ-formatted. The internal 2D cell format is NOT supported. + if ~isempty(userDefined) + if ischar(userDefined) + userDefined = {userDefined}; + end + for k = 1:length(userDefined) + opts = opts_append(opts, userDefined{k}); + end + end +end +function opts = opts_copy(opts_from, name_from, opts, name_to) + % copies an option (if it exists) from one option array to another one + if ~exist('name_to', 'var') || isempty(name_to) + name_to = name_from; + end + if opts_has(opts_from, name_from) + value = opts_get(opts_from, name_from); + opts = opts_append(opts, name_to, value); + end +end +function opts = opts_remove(opts, varargin) + % remove some key-value pairs from an options array + keysToDelete = varargin; + idxToDelete = ismember(opts(:,1), keysToDelete); + opts(idxToDelete, :) = []; +end +function opts = opts_merge(opts, varargin) + % merge multiple options arrays + for jArg = 1:numel(varargin) + opts2 = varargin{jArg}; + for k = 1:size(opts2, 1) + opts = opts_append(opts, opts2{k,1}, opts2{k,2}); + end + end +end +function str = opts_print(opts, sep) + % pretty print an options array + if ~exist('sep','var') || ~ischar(sep) + sep = ', '; + end + nOpts = size(opts,1); + c = cell(1,nOpts); + for k = 1:nOpts + if isempty(opts{k,2}) + c{k} = sprintf('%s', opts{k,1}); + else + c{k} = sprintf('%s=%s', opts{k,1}, opts{k,2}); + end + end + str = m2tstrjoin(c, sep); +end +% ============================================================================== +function m2t = m2t_addAxisOption(m2t, key, value) + % Adds an option to the last axesContainer + if ~exist('value','var') + value = ''; + end + m2t.axes{end}.options = opts_add(m2t.axes{end}.options, key, value); +end +% ============================================================================== +function bool = isHG2() + % Checks if graphics system is HG2 (true) or HG1 (false). + % HG1 : MATLAB up to R2014a and currently all OCTAVE versions + % HG2 : MATLAB starting from R2014b (version 8.4) + [env, envVersion] = getEnvironment(); + bool = strcmpi(env,'MATLAB') && ~isVersionBelow(envVersion, [8,4]); +end +% ============================================================================== +function str = formatAspectRatio(m2t, values) + % format the aspect ratio. Behind the scenes, formatDim is used + strs = arrayfun(@formatDim, values, 'UniformOutput', false); + str = join(m2t, strs, ' '); +end +% ============================================================================== +function str = formatDim(value, unit) + % format the value for use as a TeX dimension + if ~exist('unit','var') || isempty(unit) + unit = ''; + end + tolerance = 1e-7; + value = round(value/tolerance)*tolerance; + if value == 1 && ~isempty(unit) && unit(1) == '\' + str = unit; % just use the unit + else + % LaTeX has support for single precision (about 6.5 decimal places), + % but such accuracy is overkill for positioning. We clip to three + % decimals to overcome numerical rounding issues that tend to be very + % platform and version dependent. See also #604. + str = sprintf('%.3f', value); + str = regexprep(str, '(\d*\.\d*?)0+$', '$1'); % remove trailing zeros + str = regexprep(str, '\.$', ''); % remove trailing period + str = [str unit]; + end +end +% ============================================================================== +function [retval] = switchMatOct(matlabValue, octaveValue) + % Returns a different value for MATLAB and Octave + switch getEnvironment + case 'MATLAB' + retval = matlabValue; + case 'Octave' + retval = octaveValue; + otherwise + errorUnknownEnvironment(); + end +end +% ============================================================================== +function checkDeprecatedEnvironment(minimalVersions) + [env, envVersion] = getEnvironment(); + if isfield(minimalVersions, env) + minVersion = minimalVersions.(env); + envWithVersion = sprintf('%s %s', env, minVersion.name); + + if isVersionBelow(envVersion, minVersion.num) + ID = 'matlab2tikz:deprecatedEnvironment'; + + warningMessage = ['\n', repmat('=',1,80), '\n\n', ... + ' matlab2tikz is tested and developed on %s and newer.\n', ... + ' This script may still be able to handle your plots, but if you\n', ... + ' hit a bug, please consider upgrading your environment first.\n', ... + ' Type "warning off %s" to suppress this warning.\n', ... + '\n', repmat('=',1,80), ]; + warning(ID, warningMessage, envWithVersion, ID); + + end + else + errorUnknownEnvironment(); + end +end +% ============================================================================== +function m2t = needsPgfplotsVersion(m2t, minVersion) + if isVersionBelow(m2t.pgfplotsVersion, minVersion) + m2t.pgfplotsVersion = minVersion; + end +end +% ============================================================================== +function str = formatPgfplotsVersion(version) + version = versionArray(version); + if all(isfinite(version)) + str = sprintf('%d.',version); + str = str(1:end-1); % remove the last period + else + str = 'newest'; + end +end +% ============================================================================== +function [formatted,treeish] = VersionControlIdentifier() + % This function gives the (git) commit ID of matlab2tikz + % + % This assumes the standard directory structure as used by Nico's master branch: + % SOMEPATH/src/matlab2tikz.m with a .git directory in SOMEPATH. + % + % The HEAD of that repository is determined from file system information only + % by following dynamic references (e.g. ref:refs/heds/master) in branch files + % until an absolute commit hash (e.g. 1a3c9d1...) is found. + % NOTE: Packed branch references are NOT supported by this approach + MAXITER = 10; % stop following dynamic references after a while + formatted = ''; + REFPREFIX = 'ref:'; + isReference = @(treeish)(any(strfind(treeish, REFPREFIX))); + treeish = [REFPREFIX 'HEAD']; + try + % get the matlab2tikz directory + m2tDir = fileparts(mfilename('fullpath')); + gitDir = fullfile(m2tDir,'..','.git'); + + nIter = 1; + while isReference(treeish) + refName = treeish(numel(REFPREFIX)+1:end); + branchFile = fullfile(gitDir, refName); + + if exist(branchFile, 'file') && nIter < MAXITER + % The FID is reused in every iteration, so `onCleanup` cannot + % be used to `fclose(fid)`. But since there is very little that + % can go wrong in a single `fscanf`, it's probably best to leave + % this part as it is for the time being. + fid = fopen(branchFile,'r'); + treeish = fscanf(fid,'%s'); + fclose(fid); + nIter = nIter + 1; + else % no branch file or iteration limit reached + treeish = ''; + return; + end + end + catch + treeish = ''; + end + if ~isempty(treeish) + formatted = sprintf('(commit %s)',treeish); + end +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/src/private/errorUnknownEnvironment.m b/matlab/matlab2tikz-1.1.0/src/private/errorUnknownEnvironment.m new file mode 100644 index 0000000..d0e2775 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/errorUnknownEnvironment.m @@ -0,0 +1,5 @@ +function errorUnknownEnvironment() +% Throw an error to indicate an unknwon environment (i.e. not MATLAB/Octave). + error('matlab2tikz:unknownEnvironment',... + 'Unknown environment "%s". Need MATLAB(R) or Octave.', getEnvironment); +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/getEnvironment.m b/matlab/matlab2tikz-1.1.0/src/private/getEnvironment.m new file mode 100644 index 0000000..4717cb5 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/getEnvironment.m @@ -0,0 +1,25 @@ +function [env, versionString] = getEnvironment() +% Determine environment (Octave, MATLAB) and version string +% TODO: Unify private `getEnvironment` functions + persistent cache + + if isempty(cache) + isOctave = exist('OCTAVE_VERSION', 'builtin') ~= 0; + if isOctave + env = 'Octave'; + versionString = OCTAVE_VERSION; + else + env = 'MATLAB'; + vData = ver(env); + versionString = vData.Version; + end + + % store in cache + cache.env = env; + cache.versionString = versionString; + + else + env = cache.env; + versionString = cache.versionString; + end +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/guitypes.m b/matlab/matlab2tikz-1.1.0/src/private/guitypes.m new file mode 100644 index 0000000..b539181 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/guitypes.m @@ -0,0 +1,13 @@ +function types = guitypes() +% GUITYPES returns a cell array of MATLAB/Octave GUI object types +% +% Syntax +% types = guitypes() +% +% These types are ignored by matlab2tikz and figure2dot. +% +% See also: matlab2tikz, figure2dot + +types = {'uitoolbar', 'uimenu', 'uicontextmenu', 'uitoggletool',... + 'uitogglesplittool', 'uipushtool', 'hgjavacomponent'}; +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/isAxis3D.m b/matlab/matlab2tikz-1.1.0/src/private/isAxis3D.m new file mode 100644 index 0000000..084d7a8 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/isAxis3D.m @@ -0,0 +1,5 @@ +function bool = isAxis3D(axisHandle) +% Check if elevation is not orthogonal to xy plane + axisView = get(axisHandle,'view'); + bool = ~ismember(axisView(2),[90,-90]); +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/isVersionBelow.m b/matlab/matlab2tikz-1.1.0/src/private/isVersionBelow.m new file mode 100644 index 0000000..dfdc827 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/isVersionBelow.m @@ -0,0 +1,13 @@ +function isBelow = isVersionBelow(versionA, versionB) +% Checks if versionA is smaller than versionB + vA = versionArray(versionA); + vB = versionArray(versionB); + n = min(length(vA), length(vB)); + deltaAB = vA(1:n) - vB(1:n); + difference = find(deltaAB, 1, 'first'); + if isempty(difference) + isBelow = false; % equal versions + else + isBelow = (deltaAB(difference) < 0); + end +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/m2tUpdater.m b/matlab/matlab2tikz-1.1.0/src/private/m2tUpdater.m new file mode 100644 index 0000000..33ff757 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/m2tUpdater.m @@ -0,0 +1,310 @@ +function m2tUpdater(about, verbose) +%UPDATER Auto-update matlab2tikz. +% Only for internal usage. + +% Copyright (c) 2012--2014, Nico Schlömer +% All rights reserved. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are +% met: +% +% * Redistributions of source code must retain the above copyright +% notice, this list of conditions and the following disclaimer. +% * Redistributions in binary form must reproduce the above copyright +% notice, this list of conditions and the following disclaimer in +% the documentation and/or other materials provided with the distribution +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE. +% ========================================================================= + fileExchangeUrl = about.website; + version = about.version; + + mostRecentVersion = determineLatestRelease(version, fileExchangeUrl); + if askToUpgrade(mostRecentVersion, version, verbose) + tryToUpgrade(fileExchangeUrl, verbose); + userInfo(verbose, ''); + end +end +% ============================================================================== +function shouldUpgrade = askToUpgrade(mostRecentVersion, version, verbose) + shouldUpgrade = false; + if ~isempty(mostRecentVersion) + userInfo(verbose, '**********************************************\n'); + userInfo(verbose, 'New version (%s) available!\n', mostRecentVersion); + userInfo(verbose, '**********************************************\n'); + + warnAboutUpgradeImplications(version, mostRecentVersion, verbose); + askToShowChangelog(version); + reply = input(' *** Would you like to upgrade? y/n [n]:','s'); + shouldUpgrade = ~isempty(reply) && strcmpi(reply(1),'y'); + if ~shouldUpgrade + userInfo(verbose, ['\nTo disable the self-updater in the future, add ' ... + '"''checkForUpdates'',false" to the parameters.\n'] ); + end + end +end +% ============================================================================== +function tryToUpgrade(fileExchangeUrl, verbose) + % Download the files and unzip its contents into two folders + % above the folder that contains the current script. + % This assumes that the file structure is something like + % + % src/matlab2tikz.m + % src/[...] + % src/private/m2tUpdater + % src/private/[...] + % AUTHORS + % ChangeLog + % [...] + % + % on the hard drive and the zip file. In particular, this assumes + % that the folder on the hard drive is writable by the user + % and that matlab2tikz.m is not symlinked from some other place. + pathstr = fileparts(mfilename('fullpath')); + targetPath = fullfile(pathstr, '..', '..'); + + % Let the user know where the .zip is downloaded to + userInfo(verbose, 'Downloading and unzipping to ''%s'' ...', targetPath); + + % Try upgrading + try + % List current folder structure. Will use last for cleanup + currentFolderFiles = rdirfiles(targetPath); + + % The FEX now forwards the download request to Github. + % Go through the forwarding to update the download count and + % unzip + html = urlread([fileExchangeUrl, '?download=true']); + expression = '(?<=\redirected)'; + url = regexp(html, expression,'match','once'); + unzippedFiles = unzip(url, targetPath); + + % The folder structure is additionally packed into the + % 'MATLAB Search Path' folder defined in FEX. Retrieve the + % top folder name + tmp = strrep(unzippedFiles,[targetPath, filesep],''); + tmp = regexp(tmp, filesep,'split','once'); + tmp = cat(1,tmp{:}); + topZipFolder = unique(tmp(:,1)); + + % If packed into the top folder, overwrite files into m2t + % main directory + if numel(topZipFolder) == 1 + unzippedFilesTarget = fullfile(targetPath, tmp(:,2)); + for ii = 1:numel(unzippedFiles) + movefile(unzippedFiles{ii}, unzippedFilesTarget{ii}) + end + % Add topZipFolder to current folder structure + currentFolderFiles = [currentFolderFiles; fullfile(targetPath, topZipFolder{1})]; + end + + cleanupOldFiles(currentFolderFiles, unzippedFilesTarget); + + userInfo(verbose, 'Upgrade has completed successfully.'); + catch + err = lasterror(); %#ok needed for Octave + + userInfo(verbose, ... + ['Upgrade has failed with error message "%s".\n', ... + 'Please install the latest version manually from %s !'], ... + err.message, fileExchangeUrl); + end +end +% ============================================================================== +function cleanupOldFiles(currentFolderFiles, unzippedFilesTarget) +% Delete files that were there in the old folder, but that are no longer +% present in the new release. + newFolderStructure = [getFolders(unzippedFilesTarget); unzippedFilesTarget]; + deleteFolderFiles = setdiff(currentFolderFiles, newFolderStructure); + for ii = 1:numel(deleteFolderFiles) + x = deleteFolderFiles{ii}; + if exist(x, 'dir') == 7 + % First check for directories since + % `exist(x, 'file')` also checks for directories! + rmdir(x,'s'); + elseif exist(x, 'file') == 2 + delete(x); + end + end +end +% ============================================================================== +function mostRecentVersion = determineLatestRelease(version, fileExchangeUrl) + % Read in the Github releases page + url = 'https://github.com/matlab2tikz/matlab2tikz/releases/'; + try + html = urlread(url); + catch %#ok + % Couldn't load the URL -- never mind. + html = ''; + warning('m2tUpdate:siteNotFound', ... + ['Cannot determine the latest version.\n', ... + 'Either your internet is down or something went wrong.\n', ... + 'You might want to check for updates by hand at %s.\n'], ... + fileExchangeUrl); + end + + % Parse tag names which are the version number in the format ##.##.## + % It assumes that releases will always be tagged with the version number + expression = '(?<=matlab2tikz\/matlab2tikz\/releases\/tag\/)\d+\.\d+\.\d+'; + tags = regexp(html, expression, 'match'); + ntags = numel(tags); + + % Keep only new releases + inew = false(ntags,1); + for ii = 1:ntags + inew(ii) = isVersionBelow(version, tags{ii}); + end + nnew = nnz(inew); + + % One new release + if nnew == 1 + mostRecentVersion = tags{inew}; + % Several new release, pick latest + elseif nnew > 1 + tags = tags(inew); + tagnum = zeros(nnew,1); + for ii = 1:nnew + tagnum(ii) = [10000,100,1] * versionArray(tags{ii}); + end + [~, imax] = max(tagnum); + mostRecentVersion = tags{imax}; + % No new + else + mostRecentVersion = ''; + end +end +% ============================================================================== +function askToShowChangelog(currentVersion) +% Asks whether the user wants to see the changelog and then shows it. + reply = input(' *** Would you like to see the changelog? y/n [y]:' ,'s'); + shouldShow = isempty(reply) || ~strcmpi(reply(1),'n') ; + if shouldShow + fprintf(1, '\n%s\n', changelogUntilVersion(currentVersion)); + end +end +% ============================================================================== +function changelog = changelogUntilVersion(currentVersion) +% This function retrieves the chunk of the changelog until the current version. + URL = 'https://github.com/matlab2tikz/matlab2tikz/raw/master/CHANGELOG.md'; + changelog = urlread(URL); + currentVersion = versionString(currentVersion); + + % Header is "# YYYY-MM-DD Version major.minor.patch [Manager](email)" + % Just match for the part until the version number. Here, we're actually + % matching a tiny bit too broad due to the periods in the version number + % but the outcome should be the same if we keep the changelog format + % identical. + pattern = ['\#\s*[\d-]+\s*Version\s*' currentVersion]; + idxVersion = regexpi(changelog, pattern); + if ~isempty(idxVersion) + changelog = changelog(1:idxVersion-1); + else + % Just show the whole changelog if we don't find the old version. + end +end +% ============================================================================== +function warnAboutUpgradeImplications(currentVersion, latestVersion, verbose) +% This warns the user about the implications of upgrading as dictated by +% Semantic Versioning. + switch upgradeSize(currentVersion, latestVersion); + case 'major' + % The API might have changed in a backwards incompatible way. + userInfo(verbose, 'This is a MAJOR upgrade!\n'); + userInfo(verbose, ' - New features may have been introduced.'); + userInfo(verbose, ' - Some old code/options may no longer work!\n'); + + case 'minor' + % The API may NOT have changed in a backwards incompatible way. + userInfo(verbose, 'This is a MINOR upgrade.\n'); + userInfo(verbose, ' - New features may have been introduced.'); + userInfo(verbose, ' - Some options may have been deprecated.'); + userInfo(verbose, ' - Old code should continue to work but might produce warnings.\n'); + + case 'patch' + % No new functionality is introduced + userInfo(verbose, 'This is a PATCH.\n'); + userInfo(verbose, ' - Only bug fixes are included in this upgrade.'); + userInfo(verbose, ' - Old code should continue to work as before.') + end + userInfo(verbose, 'Please check the changelog for detailed information.\n'); + userWarn(verbose, '\n!! By upgrading you will lose any custom changes !!\n'); +end +% ============================================================================== +function cls = upgradeSize(currentVersion, latestVersion) +% Determines whether the upgrade is major, minor or a patch. + currentVersion = versionArray(currentVersion); + latestVersion = versionArray(latestVersion); + description = {'major', 'minor', 'patch'}; + for ii = 1:numel(description) + if latestVersion(ii) > currentVersion(ii) + cls = description{ii}; + return + end + end + cls = 'unknown'; +end +% ============================================================================== +function userInfo(verbose, message, varargin) + % Display information (i.e. to stdout) + if verbose + userPrint(1, message, varargin{:}); + end +end +function userWarn(verbose, message, varargin) + % Display warnings (i.e. to stderr) + if verbose + userPrint(2, message, varargin{:}); + end +end +function userPrint(fid, message, varargin) + % Print messages (info/warnings) to a stream/file. + mess = sprintf(message, varargin{:}); + + % Replace '\n' by '\n *** ' and print. + mess = strrep( mess, sprintf('\n'), sprintf('\n *** ') ); + fprintf(fid, ' *** %s\n', mess ); +end +% ========================================================================= +function list = rdirfiles(rootdir) + % Recursive files listing + s = dir(rootdir); + list = {s.name}'; + + % Exclude .git, .svn, . and .. + [list, idx] = setdiff(list, {'.git','.svn','.','..'}); + + % Add root + list = fullfile(rootdir, list); + + % Loop for sub-directories + pdir = find([s(idx).isdir]); + for ii = pdir + list = [list; rdirfiles(list{ii})]; %#ok + end + + % Drop directories + list(pdir) = []; +end +% ========================================================================= +function list = getFolders(list) + % Extract the folder structure from a list of files and folders + + for ii = 1:numel(list) + if exist(list{ii},'file') == 2 + list{ii} = fileparts(list{ii}); + end + end + list = unique(list); +end +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/src/private/m2tstrjoin.m b/matlab/matlab2tikz-1.1.0/src/private/m2tstrjoin.m new file mode 100644 index 0000000..43efb54 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/m2tstrjoin.m @@ -0,0 +1,35 @@ +function newstr = m2tstrjoin(cellstr, delimiter, floatFormat) +% This function joins a cell of strings to a single string (with a +% given delimiter in between two strings, if desired). + if ~exist('delimiter','var') || isempty(delimiter) + delimiter = ''; + end + if ~exist('floatFormat','var') || isempty(floatFormat) + floatFormat = '%g'; + end + if isempty(cellstr) + newstr = ''; + return + end + + % convert all values to strings first + nElem = numel(cellstr); + for k = 1:nElem + if isnumeric(cellstr{k}) + cellstr{k} = sprintf(floatFormat, cellstr{k}); + elseif iscell(cellstr{k}) + cellstr{k} = m2tstrjoin(cellstr{k}, delimiter, floatFormat); + % this will fail for heavily nested cells + elseif ~ischar(cellstr{k}) + error('matlab2tikz:join:NotCellstrOrNumeric',... + 'Expected cellstr or numeric.'); + end + end + + % inspired by strjoin of recent versions of MATLAB + newstr = cell(2,nElem); + newstr(1,:) = reshape(cellstr, 1, nElem); + newstr(2,1:nElem-1) = {delimiter}; % put delimiters in-between the elements + newstr(2,end) = {''}; % for Octave 4 compatibility + newstr = [newstr{:}]; +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/versionArray.m b/matlab/matlab2tikz-1.1.0/src/private/versionArray.m new file mode 100644 index 0000000..96af769 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/versionArray.m @@ -0,0 +1,18 @@ +function arr = versionArray(str) +% Converts a version string to an array. + if ischar(str) + % Translate version string from '2.62.8.1' to [2; 62; 8; 1]. + switch getEnvironment + case 'MATLAB' + split = regexp(str, '\.', 'split'); % compatibility MATLAB < R2013a + case 'Octave' + split = strsplit(str, '.'); + otherwise + errorUnknownEnvironment(); + end + arr = str2num(char(split)); %#ok + else + arr = str; + end + arr = arr(:)'; +end diff --git a/matlab/matlab2tikz-1.1.0/src/private/versionString.m b/matlab/matlab2tikz-1.1.0/src/private/versionString.m new file mode 100644 index 0000000..5f82c29 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/src/private/versionString.m @@ -0,0 +1,9 @@ +function str = versionString(arr) +% Converts a version array to string + if ischar(arr) + str = arr; + elseif isnumeric(arr) + str = sprintf('%d.', arr); + str = str(1:end-1); % remove final period + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/README.md b/matlab/matlab2tikz-1.1.0/test/README.md new file mode 100644 index 0000000..162d01f --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/README.md @@ -0,0 +1,101 @@ +This test module is part of matlab2tikz. + +Its use is mainly of interest to the matlab2tikz developers to assert that the produced output is good. +Ideally, the tests should be run on every supported environment, i.e.: + + * MATLAB R2014a/8.3 (or an older version) + * MATLAB R2014b/8.4 (or a newer version) + * Octave 3.8 + +Preparing your environment +========================== + +Before you can run the tests, you need to make sure that you have all relevant +functions available on your path. From within the `/test` directory run the +following code in your MATLAB/Octave console: + +```matlab +addpath(pwd); % for the test harness +addpath(fullfile(pwd,'..','src')); % for matlab2tikz +addpath(fullfile(pwd,'suites')); % for the test suites +``` + +Running the tests +================= + +We have two kinds of tests runners available that each serve a slightly different +purpose. + + * "Graphical" tests produce an output report that graphically shows test + figures as generated by MATLAB/Octave and our TikZ output. + * "Headless" tests do not produce graphical output, but instead check the MD5 + hash of the generated TikZ files to make sure that the same output + as before is generated. + +It is recommended to run the headless tests first and check the problems in +the graphical tests afterwards. + +Headless tests +-------------- +These tests check that the TikZ output file produced by `matlab2tikz` matches +a reference output. The actual checking is done by hashing the file and the +corresponding hashes are stored in `.md5` files next to the test suites. +For each environment, different reference hashes can be stored. + +The headless tests can be invoked using +```matlab +testHeadless; +``` +, or, equivalently, +```matlab +makeTravisReport(testHeadless) +``` + +There are some caveats for this method of testing: + + * The MD5 hash is extremely brittle to small details in the output: e.g. + extra whitespace or some other characters will change the hash. + * This automated test does NOT test whether the output is desirable or not. + It only checks whether the previous output is not altered! + * Hence, when structural changes are made, the reference hash should be changed. + This SHOULD be motivated in the pull request (e.g. with a picture)! + +Graphical tests +--------------- +These tests allow easy comparison of a native PDF `print` output and the +output produced by `matlab2tikz`. For the large amount of cases, however, +this comparison has become somewhat unwieldy. + +You can execute the tests using +```matlab +testGraphical; +``` +or, equivalently, +```matlab +makeLatexReport(testGraphical) +``` +This generates a LaTeX report in `test/output/current/acid.tex` which can then be compiled. +Compilation of this file can be done using the Makefile `test/output/current/Makefile` if you are on a Unix-like system (OS X, Linux) or have [Cygwin](https://www.cygwin.com) installed on Windows. + +If all goes well, the result will be the file `test/output/current/acid.pdf` that contains +a list of the test figures, exported as PDF and right next to it the matlab2tikz generated plot. + +Advanced Use +------------ + +Both `testHeadless` and `testGraphical` can take multiple arguments, those are documented in the raw test runner `testMatlab2tikz` that is used behind the scenes. Note that this file sits in a private directory, so `help testMatlab2tikz` will not work! + +Also, both can be called with a single output argument, for programmatical +access to the test results as +```matlab +status = testHeadless() +``` +These test results in `status` can be passed to `saveHashTable` for updating the hash tables. +Obviously, this should be done with the due diligence! + +Automated Tests +=============== + +The automated tests run on [Travis-CI](https://travis-ci.org) for Octave and on a [personal Jenkins server](https://github.com/matlab2tikz/matlab2tikz/wiki/Jenkins) for MATLAB. +These are effectively the "headless" tests that get called by the `runMatlab2TikzTests` function. +Without verification of those automated tests, a pull request is unlikely to get merged. diff --git a/matlab/matlab2tikz-1.1.0/test/codeReport.m b/matlab/matlab2tikz-1.1.0/test/codeReport.m new file mode 100644 index 0000000..ccac19b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/codeReport.m @@ -0,0 +1,280 @@ +function [ report ] = codeReport( varargin ) +%CODEREPORT Builds a report of the code health +% +% This function generates a Markdown report on the code health. At the moment +% this is limited to the McCabe (cyclomatic) complexity of a function and its +% subfunctions. +% +% This makes use of |checkcode| in MATLAB. +% +% Usage: +% +% CODEREPORT('function', functionName) to determine which function is +% analyzed. (default: matlab2tikz) +% +% CODEREPORT('complexityThreshold', integer ) to set above which complexity, a +% function is added to the report (default: 10) +% +% CODEREPORT('stream', stream) to set to which stream/file to output the report +% (default: 1, i.e. stdout). The stream is used only when no output argument +% for `codeReport` is specified!. +% +% See also: checkcode, mlint + + SM = StreamMaker(); + %% input options + ipp = m2tInputParser(); + ipp = ipp.addParamValue(ipp, 'function', 'matlab2tikz', @ischar); + ipp = ipp.addParamValue(ipp, 'complexityThreshold', 10, @isnumeric); + ipp = ipp.addParamValue(ipp, 'stream', 1, SM.isStream); + ipp = ipp.parse(ipp, varargin{:}); + + stream = SM.make(ipp.Results.stream, 'w'); + + %% generate report data + data = checkcode(ipp.Results.function,'-cyc','-struct'); + [complexityAll, mlintMessages] = splitCycloComplexity(data); + + %% analyze cyclomatic complexity + categorizeComplexity = @(x) categoryOfComplexity(x, ... + ipp.Results.complexityThreshold, ... + ipp.Results.function); + + complexityAll = arrayfun(@parseCycloComplexity, complexityAll); + complexityAll = arrayfun(categorizeComplexity, complexityAll); + + complexity = filter(complexityAll, @(x) strcmpi(x.category, 'Bad')); + complexity = sortBy(complexity, 'line', 'ascend'); + complexity = sortBy(complexity, 'complexity', 'descend'); + + [complexityStats] = complexityStatistics(complexityAll); + + %% analyze other messages + %TODO: handle all mlint messages and/or other metrics of the code + + %% format report + dataStr = complexity; + dataStr = arrayfun(@(d) mapField(d, 'function', @markdownInlineCode), dataStr); + if ~isempty(dataStr) + dataStr = addFooterRow(dataStr, 'complexity', @sum, {'line',0, 'function',bold('Total')}); + end + dataStr = arrayfun(@(d) mapField(d, 'line', @integerToString), dataStr); + dataStr = arrayfun(@(d) mapField(d, 'complexity', @integerToString), dataStr); + + report = makeTable(dataStr, {'function', 'complexity'}, ... + {'Function', 'Complexity'}); + + %% command line usage + if nargout == 0 + if ismember(stream.name, {'stdout','stderr'}) + stream.print('%s\n', codelinks(report, ipp.Results.function)); + else + stream.print('%s\n', report); + end + + figure('name',sprintf('Complexity statistics of %s', ipp.Results.function)); + h = statisticsPlot(complexityStats, 'Complexity', 'Number of functions'); + for hh = h + plot(hh, [1 1]*ipp.Results.complexityThreshold, ylim(hh), ... + 'k--','DisplayName','Threshold'); + end + legend(h(1),'show','Location','NorthEast'); + + clear report + end + +end +%% CATEGORIZATION ============================================================== +function [complexity, others] = splitCycloComplexity(list) +% splits codereport into McCabe complexity and others + filter = @(l) ~isempty(strfind(l.message, 'McCabe complexity')); + idxComplexity = arrayfun(filter, list); + complexity = list( idxComplexity); + others = list(~idxComplexity); +end +function [data] = categoryOfComplexity(data, threshold, mainFunc) +% categorizes the complexity as "Good", "Bad" or "Accepted" + TOKEN = '#COMPLEX'; % token to signal allowed complexity + + try %#ok + helpStr = help(sprintf('%s>%s', mainFunc, data.function)); + if ~isempty(strfind(helpStr, TOKEN)) + data.category = 'Accepted'; + return; + end + end + if data.complexity > threshold + data.category = 'Bad'; + else + data.category = 'Good'; + end +end + +%% PARSING ===================================================================== +function [out] = parseCycloComplexity(in) +% converts McCabe complexity report strings into a better format + out = regexp(in.message, ... + 'The McCabe complexity of ''(?[A-Za-z0-9_]+)'' is (?[0-9]+).', ... + 'names'); + out.complexity = str2double(out.complexity); + out.line = in.line; +end + +%% DATA PROCESSING ============================================================= +function selected = filter(list, filterFunc) +% filters an array according to a binary function + idx = logical(arrayfun(filterFunc, list)); + selected = list(idx); +end +function [data] = mapField(data, field, mapping) + data.(field) = mapping(data.(field)); +end +function sorted = sortBy(list, fieldName, mode) +% sorts a struct array by a single field +% extra arguments are as for |sort| + values = arrayfun(@(m)m.(fieldName), list); + [dummy, idxSorted] = sort(values(:), 1, mode); %#ok + sorted = list(idxSorted); +end + +function [stat] = complexityStatistics(list) +% calculate some basic statistics of the complexities + + stat.values = arrayfun(@(c)(c.complexity), list); + stat.binCenter = sort(unique(stat.values)); + + categoryPerElem = {list.category}; + stat.categories = unique(categoryPerElem); + nCategories = numel(stat.categories); + + groupedHist = zeros(numel(stat.binCenter), nCategories); + for iCat = 1:nCategories + category = stat.categories{iCat}; + idxCat = ismember(categoryPerElem, category); + groupedHist(:,iCat) = hist(stat.values(idxCat), stat.binCenter); + end + + stat.histogram = groupedHist; + stat.median = median(stat.values); +end +function [data] = addFooterRow(data, column, func, otherFields) +% adds a footer row to data table based on calculations of a single column +footer = data(end); +for iField = 1:2:numel(otherFields) + field = otherFields{iField}; + value = otherFields{iField+1}; + footer.(field) = value; +end +footer.(column) = func([data(:).(column)]); +data(end+1) = footer; +end + +%% FORMATTING ================================================================== +function str = integerToString(value) +% convert integer to string + str = sprintf('%d',value); +end +function str = markdownInlineCode(str) +% format as inline code for markdown + str = sprintf('`%s`', str); +end +function str = makeTable(data, fields, header) +% make a markdown table from struct array + nData = numel(data); + str = ''; + if nData == 0 + return; % empty input + end + %TODO: use gfmTable from makeTravisReport instead to do the formatting + + % determine column sizes + nFields = numel(fields); + table = cell(nFields, nData); + columnWidth = zeros(1,nFields); + for iField = 1:nFields + field = fields{iField}; + table(iField, :) = {data(:).(field)}; + columnWidth(iField) = max(cellfun(@numel, table(iField, :))); + end + columnWidth = max(columnWidth, cellfun(@numel, header)); + columnWidth = columnWidth + 2; % empty space left and right + columnWidth([1,end]) = columnWidth([1,end]) - 1; % except at the edges + + % format table inside cell array + table = [header; table']; + for iField = 1:nFields + FORMAT = ['%' int2str(columnWidth(iField)) 's']; + + for jData = 1:size(table, 1) + table{jData, iField} = strjust(sprintf(FORMAT, ... + table{jData, iField}), 'center'); + end + end + + % insert separator + table = [table(1,:) + arrayfun(@(n) repmat('-',1,n), columnWidth, 'UniformOutput',false) + table(2:end,:)]'; + + % convert cell array to string + FORMAT = ['%s' repmat('|%s', 1,nFields-1) '\n']; + str = sprintf(FORMAT, table{:}); + +end + +function str = codelinks(str, functionName) +% replaces inline functions with clickable links in MATLAB +str = regexprep(str, '`([A-Za-z0-9_]+)`', ... + ['`$1`']); +%NOTE: editing function>subfunction will focus on that particular subfunction +% in the editor (this also works for the main function) +end +function str = bold(str) +str = ['**' str '**']; +end + +%% PLOTTING ==================================================================== +function h = statisticsPlot(stat, xLabel, yLabel) +% plot a histogram and box plot + nCategories = numel(stat.categories); + colors = colorscheme; + + h(1) = subplot(5,1,1:4); + hold all; + hb = bar(stat.binCenter, stat.histogram, 'stacked'); + + for iCat = 1:nCategories + category = stat.categories{iCat}; + + set(hb(iCat), 'DisplayName', category, 'FaceColor', colors.(category), ... + 'LineStyle','none'); + end + + %xlabel(xLabel); + ylabel(yLabel); + + h(2) = subplot(5,1,5); + hold all; + + boxplot(stat.values,'orientation','horizontal',... + 'boxstyle', 'outline', ... + 'symbol', 'o', ... + 'colors', colors.All); + xlabel(xLabel); + + xlims = [min(stat.binCenter)-1 max(stat.binCenter)+1]; + c = 1; + ylims = (ylim(h(2)) - c)/3 + c; + + set(h,'XTickMode','manual','XTick',stat.binCenter,'XLim',xlims); + set(h(1),'XTickLabel',''); + set(h(2),'YTickLabel','','YLim',ylims); + linkaxes(h, 'x'); +end +function colors = colorscheme() +% recognizable color scheme for the categories + colors.All = [ 0 113 188]/255; + colors.Good = [118 171 47]/255; + colors.Bad = [161 19 46]/255; + colors.Accepted = [236 176 31]/255; +end diff --git a/matlab/matlab2tikz-1.1.0/test/compareTimings.m b/matlab/matlab2tikz-1.1.0/test/compareTimings.m new file mode 100644 index 0000000..021167c --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/compareTimings.m @@ -0,0 +1,256 @@ +function compareTimings(statusBefore, statusAfter) +% COMPARETIMINGS compare timing of matlab2tikz test suite runs +% +% This function plots some analysis plots of the timings of different test +% cases. When the test suite is run repeatedly, the median statistics are +% reported as well as the individual runs. +% +% Usage: +% COMPARETIMINGS(statusBefore, statusAfter) +% +% Parameters: +% - statusBefore and statusAfter are expected to be +% N x R cell arrays, each cell contains a status of a test case +% where there are N test cases, repeated R times each. +% +% You can build such cells, e.g. with the following snippet. +% +% suite = @ACID +% N = numel(suite(0)); % number of test cases +% R = 10; % number of repetitions of each test case +% +% statusBefore = cell(N, R); +% for r = 1:R +% statusBefore(:, r) = testHeadless; +% end +% +% % now check out the after commit +% +% statusAfter = cell(N, R); +% for r = 1:R +% statusAfter(:, r) = testHeadless; +% end +% +% compareTimings(statusBefore, statusAfter) +% +% See also: testHeadless + +%% Extract timing information +time_cf = extract(statusBefore, statusAfter, @(s) s.tikzStage.cleanfigure_time); +time_m2t = extract(statusBefore, statusAfter, @(s) s.tikzStage.m2t_time); +%% Construct plots +hax(1) = subplot(3,2,1); +histograms(time_cf, 'cleanfigure'); +legend('show') + +hax(2) = subplot(3,2,3); +histograms(time_m2t, 'matlab2tikz'); +legend('show') +linkaxes(hax([1 2]),'x'); + +hax(3) = subplot(3,2,5); +histogramSpeedup('cleanfigure', time_cf, 'matlab2tikz', time_m2t); +legend('show'); + +hax(4) = subplot(3,2,2); +plotByTestCase(time_cf, 'cleanfigure'); +legend('show') + +hax(5) = subplot(3,2,4); +plotByTestCase(time_m2t, 'matlab2tikz'); +legend('show') + +hax(6) = subplot(3,2,6); +plotSpeedup('cleanfigure', time_cf, 'matlab2tikz', time_m2t); +legend('show'); + +linkaxes(hax([4 5 6]), 'x'); + +% ------------------------------------------------------------------------------ +end +%% Data processing +function timing = extract(statusBefore, statusAfter, func) + otherwiseNaN = {'ErrorHandler', @(varargin) NaN}; + + timing.before = cellfun(func, statusBefore, otherwiseNaN{:}); + timing.after = cellfun(func, statusAfter, otherwiseNaN{:}); +end +function [names,timings] = splitNameTiming(vararginAsCell) + names = vararginAsCell(1:2:end-1); + timings = vararginAsCell(2:2:end); +end + +%% Plot subfunctions +function [h] = histograms(timing, name) + % plot histogram of time measurements + colors = colorscheme; + histostyle = {'DisplayStyle', 'bar',... + 'Normalization','pdf',... + 'EdgeColor','none',... + 'BinWidth',0.025}; + + hold on; + h{1} = myHistogram(timing.before, histostyle{:}, ... + 'FaceColor', colors.before, ... + 'DisplayName', 'Before'); + h{2} = myHistogram(timing.after , histostyle{:}, ... + 'FaceColor', colors.after,... + 'DisplayName', 'After'); + + xlabel(sprintf('%s runtime [s]',name)) + ylabel('Empirical PDF'); +end +function [h] = histogramSpeedup(varargin) + % plot histogram of observed speedup + histostyle = {'DisplayStyle', 'bar',... + 'Normalization','pdf',... + 'EdgeColor','none'}; + + [names,timings] = splitNameTiming(varargin); + nData = numel(timings); + h = cell(nData, 1); + minTime = NaN; maxTime = NaN; + for iData = 1:nData + name = names{iData}; + timing = timings{iData}; + + hold on; + speedup = computeSpeedup(timing); + color = colorOptionsOfName(name, 'FaceColor'); + + h{iData} = myHistogram(speedup, histostyle{:}, color{:},... + 'DisplayName', name); + + [minTime, maxTime] = minAndMax(speedup, minTime, maxTime); + end + xlabel('Speedup') + ylabel('Empirical PDF'); + set(gca,'XScale','log', 'XLim', [minTime, maxTime].*[0.9 1.1]); +end +function [h] = plotByTestCase(timing, name) + % plot all time measurements per test case + colors = colorscheme; + hold on; + if size(timing.before, 2) > 1 + h{3} = plot(timing.before, '.',... + 'Color', colors.before, 'HandleVisibility', 'off'); + h{4} = plot(timing.after, '.',... + 'Color', colors.after, 'HandleVisibility', 'off'); + end + h{1} = plot(median(timing.before, 2), '-',... + 'LineWidth', 2, ... + 'Color', colors.before, ... + 'DisplayName', 'Before'); + h{2} = plot(median(timing.after, 2), '-',... + 'LineWidth', 2, ... + 'Color', colors.after,... + 'DisplayName', 'After'); + + ylabel(sprintf('%s runtime [s]', name)); + set(gca,'YScale','log') +end +function [h] = plotSpeedup(varargin) + % plot speed up per test case + [names, timings] = splitNameTiming(varargin); + + nDatasets = numel(names); + minTime = NaN; + maxTime = NaN; + h = cell(nDatasets, 1); + for iData = 1:nDatasets + name = names{iData}; + timing = timings{iData}; + color = colorOptionsOfName(name); + + hold on + [speedup, medSpeedup] = computeSpeedup(timing); + if size(speedup, 2) > 1 + plot(speedup, '.', color{:}, 'HandleVisibility','off'); + end + h{iData} = plot(medSpeedup, color{:}, 'DisplayName', name, ... + 'LineWidth', 2); + + [minTime, maxTime] = minAndMax(speedup, minTime, maxTime); + end + + nTests = size(speedup, 1); + plot([-nTests nTests*2], ones(2,1), 'k','HandleVisibility','off'); + + legend('show', 'Location','NorthWest') + set(gca,'YScale','log','YLim', [minTime, maxTime].*[0.9 1.1], ... + 'XLim', [0 nTests+1]) + xlabel('Test case'); + ylabel('Speed-up (t_{before}/t_{after})'); +end + +%% Histogram wrapper +function [h] = myHistogram(data, varargin) +% this is a very crude wrapper that mimics Histogram in R2014a and older + if ~isempty(which('histogram')) + h = histogram(data, varargin{:}); + else % no "histogram" available + options = struct(varargin{:}); + + minData = min(data(:)); + maxData = max(data(:)); + if isfield(options, 'BinWidth') + numBins = ceil((maxData-minData)/options.BinWidth); + elseif isfield(options, 'NumBins') + numBins = options.NumBins; + else + numBins = 10; + end + [counts, bins] = hist(data(:), numBins); + if isfield(options,'Normalization') && strcmp(options.Normalization,'pdf') + binWidth = mean(diff(bins)); + counts = counts./sum(counts)/binWidth; + end + h = bar(bins, counts, 1); + + % transfer properties as well + names = fieldnames(options); + for iName = 1:numel(names) + option = names{iName}; + if isprop(h, option) + set(h, option, options.(option)); + end + end + set(allchild(h),'FaceAlpha', 0.75); % only supported with OpenGL renderer + % but this should look a bit similar with matlab2tikz then... + end +end + +%% Calculations +function [speedup, medSpeedup] = computeSpeedup(timing) + % computes the timing speedup (and median speedup) + dRep = 2; % dimension containing the repeated tests + speedup = timing.before ./ timing.after; + medSpeedup = median(timing.before, dRep) ./ median(timing.after, dRep); +end +function [minTime, maxTime] = minAndMax(speedup, minTime, maxTime) + % calculates the minimum/maximum time in an array and peviously + % computed min/max times + minTime = min([minTime; speedup(:)]); + maxTime = min([maxTime; speedup(:)]); +end +%% Color scheme +function colors = colorscheme() +% defines the color scheme + colors.matlab2tikz = [161 19 46]/255; + colors.cleanfigure = [ 0 113 188]/255; + colors.before = [236 176 31]/255; + colors.after = [118 171 47]/255; +end +function color = colorOptionsOfName(name, keyword) +% returns a cell array with a keyword (default: 'Color') and a named color +% if it exists in the colorscheme + if ~exist('keyword','var') || isempty(keyword) + keyword = 'Color'; + end + colors = colorscheme; + if isfield(colors,name) + color = {keyword, colors.(name)}; + else + color = {}; + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/examples/example_bar_plot.m b/matlab/matlab2tikz-1.1.0/test/examples/example_bar_plot.m new file mode 100644 index 0000000..fa347c7 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/examples/example_bar_plot.m @@ -0,0 +1,53 @@ +function example_bar_plot() +test_data =[18 0; 20 0; 21 2; 30 14; 35 34; 40 57; 45 65; 50 46; 55 9; 60 2; 65 1; 70 0]; + +% Create figure +figure1 = figure('Color',[1 1 1]); + +subplot(1,2,1) + + +hb=barh(test_data(:,1),test_data(:,2),'DisplayName','Test Data'); + +ylabel('parameter [units]'); +xlabel('#'); +legend('show','Location','northwest'); +subplot(1,2,2) + + +hb=bar(test_data(:,1),test_data(:,2),'DisplayName','Test Data'); + +xlabel('parameter [units]'); +ylabel('#'); +legend('show','Location','northwest'); + + +xdata=test_data(:,1); +barWidth=test_getBarWidthInAbsolutUnits(hb); + +x_l=xdata-barWidth/2; +x_u=xdata+barWidth/2; +max_y=max(test_data(:,2))*1.2; +x=[]; +y=[]; +for i=1:length(x_l) + x = [x , x_l(i),x_l(i),nan,x_u(i),x_u(i),nan]; + y = [y, 0,max_y ,nan,0 ,max_y ,nan]; + + +end +hold on +plot(x,y,'r'); + +matlab2tikz('figurehandle',figure1,'filename','example_v_bar_plot.tex' ,'standalone', true); + + + function BarWidth=test_getBarWidthInAbsolutUnits(h) + % astimates the width of a bar plot + XData_bar=get(h,'XData'); + length_bar = length(XData_bar); + BarWidth= get(h, 'BarWidth'); + if length_bar > 1 + BarWidth = min(diff(XData_bar))*BarWidth; + end + diff --git a/matlab/matlab2tikz-1.1.0/test/examples/example_quivers.m b/matlab/matlab2tikz-1.1.0/test/examples/example_quivers.m new file mode 100644 index 0000000..a881f94 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/examples/example_quivers.m @@ -0,0 +1,80 @@ +%% Quiver calculations +% These are calculations for the quiver dimensions as implemented in MATLAB +% (HG1) as in the |quiver.m| function. +% +% For HG2 and Octave, the situation might be different. +% +% A single quiver is defined as: +% +% C +% \ +% \ +% A ----------------- B +% / +% / +% D +% +% To know the dimensions of the arrow head, MATLAB defines the quantities +% alpha = beta = 0.33 that determine the coordinates of C and D as given below. + +clc; +clear variables; +close all; + +%% Parameters +try + syms x y z u v w alpha beta epsilon real +catch + warning('Symbolic toolbox not found. Interpret the values with care!'); + x = randn(); y = randn(); z = randn(); + u = randn(); v = randn(); w = randn(); +end +alpha = 0.33; +beta = alpha; +epsilon = 0; +is2D = true; + +%% Coordinates as defined in MATLAB +% Note that in 3D, the arrow head is oriented in a weird way. Let' just ignore +% that and only focus on 2D and use the same in 3D. Due to the lack +% of [u,v,w]-symmetry in those equations, the angle is bound to depend on the +% length of |delta|, i.e. something we don't know beforehand. +A = [x y z].'; +delta = [u v w].'; +B = A + delta; +C = B - alpha*[u+beta*(v+epsilon); + v-beta*(u+epsilon) + w]; +D = B - alpha*[u-beta*(v+epsilon); + v+beta*(u+epsilon) + w]; + +if is2D + A = A(1:2); + B = B(1:2); + C = C(1:2); + D = D(1:2); + delta = delta(1:2); +end + +%% Calculating the angle of the arrowhead +% Calculate the cos(angle) using the inner product +unitVector = @(v) v/norm(v); +cosAngleBetween = @(a,b,c) unitVector(a-b).' * unitVector(c-b); + +cosTwiceTheta = cosAngleBetween(C,B,D); +if isa(cosTwiceTheta, 'sym') + cosTwiceTheta = simplify(cosTwiceTheta); +end + +theta = acos(cosTwiceTheta) / 2 + +radToDeg = @(rads) (rads * 180 / pi); + +thetaVal = radToDeg(theta) +try + thetaVal = double(thetaVal) +end + +% For the MATLAB parameters alpha=beta=0.33, we get theta = 18.263 degrees. + diff --git a/matlab/matlab2tikz-1.1.0/test/makeLatexReport.m b/matlab/matlab2tikz-1.1.0/test/makeLatexReport.m new file mode 100644 index 0000000..f91361b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/makeLatexReport.m @@ -0,0 +1,222 @@ +function makeLatexReport(status, output) +% generate a LaTeX report +% +% + if ~exist('output','var') + output = m2troot('test','output','current'); + end + % first, initialize the tex output + SM = StreamMaker(); + stream = SM.make(fullfile(output, 'acid.tex'), 'w'); + + texfile_init(stream); + + printFigures(stream, status); + printSummaryTable(stream, status); + printErrorMessages(stream, status); + printEnvironmentInfo(stream, status); + + texfile_finish(stream); +end +% ========================================================================= +function texfile_init(stream) + + stream.print(['\\documentclass[landscape]{scrartcl}\n' , ... + '\\pdfminorversion=6\n\n' , ... + '\\usepackage{amsmath} %% required for $\\text{xyz}$\n\n', ... + '\\usepackage{hyperref}\n' , ... + '\\usepackage{graphicx}\n' , ... + '\\usepackage{epstopdf}\n' , ... + '\\usepackage{tikz}\n' , ... + '\\usetikzlibrary{plotmarks}\n\n' , ... + '\\usepackage{pgfplots}\n' , ... + '\\pgfplotsset{compat=newest}\n\n' , ... + '\\usepackage[margin=0.5in]{geometry}\n' , ... + '\\newlength\\figurewidth\n' , ... + '\\setlength\\figurewidth{0.4\\textwidth}\n\n' , ... + '\\begin{document}\n\n']); + +end +% ========================================================================= +function texfile_finish(stream) + stream.print('\\end{document}'); +end +% ========================================================================= +function printFigures(stream, status) + for k = 1:length(status) + texfile_addtest(stream, status{k}); + end +end +% ========================================================================= +function printSummaryTable(stream, status) + texfile_tab_completion_init(stream) + for k = 1:length(status) + stat = status{k}; + testNumber = stat.index; + % Break table up into pieces if it gets too long for one page + %TODO: use booktabs instead + %TODO: maybe just write a function to construct the table at once + % from a cell array (see makeTravisReport for GFM counterpart) + if ~mod(k,35) + texfile_tab_completion_finish(stream); + texfile_tab_completion_init(stream); + end + + stream.print('%d & \\texttt{%s}', testNumber, name2tex(stat.function)); + if stat.skip + stream.print(' & --- & skipped & ---'); + else + for err = [stat.plotStage.error, ... + stat.saveStage.error, ... + stat.tikzStage.error] + if err + stream.print(' & \\textcolor{red}{failed}'); + else + stream.print(' & \\textcolor{green!50!black}{passed}'); + end + end + end + stream.print(' \\\\\n'); + end + texfile_tab_completion_finish(stream); +end +% ========================================================================= +function printErrorMessages(stream, status) + if errorHasOccurred(status) + stream.print('\\section*{Error messages}\n\\scriptsize\n'); + for k = 1:length(status) + stat = status{k}; + testNumber = stat.index; + if isempty(stat.plotStage.message) && ... + isempty(stat.saveStage.message) && ... + isempty(stat.tikzStage.message) + continue % No error messages for this test case + end + + stream.print('\n\\subsection*{Test case %d: \\texttt{%s}}\n', testNumber, name2tex(stat.function)); + print_verbatim_information(stream, 'Plot generation', stat.plotStage.message); + print_verbatim_information(stream, 'PDF generation' , stat.saveStage.message); + print_verbatim_information(stream, 'matlab2tikz' , stat.tikzStage.message); + end + stream.print('\n\\normalsize\n\n'); + end +end +% ========================================================================= +function printEnvironmentInfo(stream, status) + [env,versionString] = getEnvironment(); + + testsuites = unique(cellfun(@(s) func2str(s.testsuite) , status, ... + 'UniformOutput', false)); + testsuites = name2tex(m2tstrjoin(testsuites, ', ')); + + stream.print(['\\newpage\n',... + '\\begin{tabular}{ll}\n',... + ' Suite & ' testsuites ' \\\\ \n', ... + ' Created & ' datestr(now) ' \\\\ \n', ... + ' OS & ' OSVersion ' \\\\ \n',... + ' ' env ' & ' versionString ' \\\\ \n', ... + VersionControlIdentifier, ... + ' TikZ & \\expandafter\\csname ver@tikz.sty\\endcsname \\\\ \n',... + ' Pgfplots & \\expandafter\\csname ver@pgfplots.sty\\endcsname \\\\ \n',... + '\\end{tabular}\n']); + +end +% ========================================================================= +function print_verbatim_information(stream, title, contents) + if ~isempty(contents) + stream.print(['\\subsubsection*{%s}\n', ... + '\\begin{verbatim}\n%s\\end{verbatim}\n'], ... + title, contents); + end +end +% ========================================================================= +function texfile_addtest(stream, status) +% Actually add the piece of LaTeX code that'll later be used to display +% the given test. + if ~status.skip + + ref_error = status.plotStage.error; + gen_error = status.tikzStage.error; + + ref_file = status.saveStage.texReference; + gen_file = status.tikzStage.pdfFile; + + stream.print(... + ['\\begin{figure}\n' , ... + ' \\centering\n' , ... + ' \\begin{tabular}{cc}\n' , ... + ' %s & %s \\\\\n' , ... + ' reference rendering & generated\n' , ... + ' \\end{tabular}\n' , ... + ' \\caption{%s \\texttt{%s}, \\texttt{%s(%d)}.%s}\n', ... + '\\end{figure}\n' , ... + '\\clearpage\n\n'],... + include_figure(ref_error, 'includegraphics', ref_file), ... + include_figure(gen_error, 'includegraphics', gen_file), ... + status.description, ... + name2tex(status.function), name2tex(status.testsuite), status.index, ... + formatIssuesForTeX(status.issues)); + end +end +% ========================================================================= +function str = include_figure(errorOccured, command, filename) + if errorOccured + str = sprintf(['\\tikz{\\draw[red,thick] ', ... + '(0,0) -- (\\figurewidth,\\figurewidth) ', ... + '(0,\\figurewidth) -- (\\figurewidth,0);}']); + else + switch command + case 'includegraphics' + strFormat = '\\includegraphics[width=\\figurewidth]{%s}'; + case 'input' + strFormat = '\\input{%s}'; + otherwise + error('Matlab2tikz_acidtest:UnknownFigureCommand', ... + 'Unknown figure command "%s"', command); + end + str = sprintf(strFormat, filename); + end +end +% ========================================================================= +function texfile_tab_completion_init(stream) + + stream.print(['\\clearpage\n\n' , ... + '\\begin{table}\n' , ... + '\\centering\n' , ... + '\\caption{Test case completion summary}\n' , ... + '\\begin{tabular}{rlccc}\n' , ... + 'No. & Test case & Plot & PDF & TikZ \\\\\n' , ... + '\\hline\n']); + +end +% ========================================================================= +function texfile_tab_completion_finish(stream) + + stream.print( ['\\end{tabular}\n' , ... + '\\end{table}\n\n' ]); + +end +% ========================================================================= +function texName = name2tex(matlabIdentifier) +% convert a MATLAB identifier/function handle to a TeX string + if isa(matlabIdentifier, 'function_handle') + matlabIdentifier = func2str(matlabIdentifier); + end + texName = strrep(matlabIdentifier, '_', '\_'); +end +% ========================================================================= +function str = formatIssuesForTeX(issues) +% make links to GitHub issues for the LaTeX output + issues = issues(:)'; + if isempty(issues) + str = ''; + return + end + BASEURL = 'https://github.com/matlab2tikz/matlab2tikz/issues/'; + SEPARATOR = sprintf(' \n'); + strs = arrayfun(@(n) sprintf(['\\href{' BASEURL '%d}{\\#%d}'], n,n), issues, ... + 'UniformOutput', false); + strs = [strs; repmat({SEPARATOR}, 1, numel(strs))]; + str = sprintf('{\\color{blue} \\texttt{%s}}', [strs{:}]); +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/makeTapReport.m b/matlab/matlab2tikz-1.1.0/test/makeTapReport.m new file mode 100644 index 0000000..73b68a0 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/makeTapReport.m @@ -0,0 +1,74 @@ +function makeTapReport(status, varargin) +% Makes a Test Anything Protocol report +% +% This function produces a testing report of HEADLESS tests for +% display on Jenkins (or any other TAP-compatible system) +% +% MAKETAPREPORT(status) produces the report from the `status` output of +% `testHeadless`. +% +% MAKETAPREPORT(status, 'stream', FID, ...) changes the filestream to use +% to output the report to. (Default: 1 (stdout)). +% +% TAP Specification: https://testanything.org +% +% See also: testHeadless, makeTravisReport, makeLatexReport + + %% Parse input arguments + SM = StreamMaker(); + ipp = m2tInputParser(); + + ipp = ipp.addRequired(ipp, 'status', @iscell); + ipp = ipp.addParamValue(ipp, 'stream', 1, SM.isStream); + + ipp = ipp.parse(ipp, status, varargin{:}); + arg = ipp.Results; + + %% Construct stream + stream = SM.make(arg.stream, 'w'); + + %% build report + printTAPVersion(stream); + printTAPPlan(stream, status); + for iStatus = 1:numel(status) + printTAPReport(stream, status{iStatus}, iStatus); + end +end +% ============================================================================== +function printTAPVersion(stream) + % prints the TAP version + stream.print('TAP version 13\n'); +end +function printTAPPlan(stream, statuses) + % prints the TAP test plan + firstTest = 1; + lastTest = numel(statuses); + stream.print('%d..%d\n', firstTest, lastTest); +end +function printTAPReport(stream, status, testNum) + % prints a TAP test case report + message = status.function; + + if hasTestFailed(status) + result = 'not ok'; + else + result = 'ok'; + end + directives = getTAPDirectives(status); + + stream.print('%s %d %s %s\n', result, testNum, message, directives); + + %TODO: we can provide more information on the failure using YAML syntax +end +function directives = getTAPDirectives(status) + % add TAP directive (a todo or skip) to the test directives + directives = {}; + if status.skip + directives{end+1} = '# SKIP skipped'; + end + if status.unreliable + directives{end+1} = '# TODO unreliable'; + end + directives = strtrim(m2tstrjoin(directives, ' ')); +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/makeTravisReport.m b/matlab/matlab2tikz-1.1.0/test/makeTravisReport.m new file mode 100644 index 0000000..60446cf --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/makeTravisReport.m @@ -0,0 +1,360 @@ +function [nErrors] = makeTravisReport(status, varargin) +% Makes a readable report for Travis/Github of test results +% +% This function produces a testing report of HEADLESS tests for +% display on GitHub and Travis. +% +% MAKETRAVISREPORT(status) produces the report from the `status` output of +% `testHeadless`. +% +% MAKETRAVISREPORT(status, 'stream', FID, ...) changes the filestream to use +% to output the report to. (Default: 1 (stdout)). +% +% MAKETRAVISREPORT(status, 'length', CHAR, ...) changes the report length. +% A few values are possible that cover different aspects in less/more detail. +% - 'default': all unreliable tests, failed & skipped tests and summary +% - 'short' : only show the brief summary +% - 'long' : all tests + summary +% +% See also: testHeadless, makeLatexReport + + SM = StreamMaker(); + %% Parse input arguments + ipp = m2tInputParser(); + + ipp = ipp.addRequired(ipp, 'status', @iscell); + ipp = ipp.addParamValue(ipp, 'stream', 1, SM.isStream); + ipp = ipp.addParamValue(ipp, 'length', 'default', @isReportLength); + + ipp = ipp.parse(ipp, status, varargin{:}); + arg = ipp.Results; + arg.length = lower(arg.length); + stream = SM.make(arg.stream, 'w'); + + %% transform status data into groups + S = splitStatuses(status); + + %% build report + stream.print(gfmHeader(describeEnvironment)); + reportUnreliableTests(stream, arg, S); + reportReliableTests(stream, arg, S); + displayTestSummary(stream, S); + + %% set output arguments if needed + if nargout >= 1 + nErrors = countNumberOfErrors(S.reliable); + end +end +% == INPUT VALIDATOR FUNCTIONS ================================================= +function bool = isReportLength(val) + % validates the report length + bool = ismember(lower(val), {'default','short','long'}); +end +% == GITHUB-FLAVORED MARKDOWN FUNCTIONS ======================================== +function str = gfmTable(data, header, alignment) + % Construct a Github-flavored Markdown table + % + % Arguments: + % - data: nRows x nCols cell array that represents the data + % - header: cell array with the (nCol) column headers + % - alignment: alignment specification per column + % * 'l': left-aligned (default) + % * 'c': centered + % * 'r': right-aligned + % When not enough entries are specified, the specification is repeated + % cyclically. + % + % Output: table as a string + % + % See https://help.github.com/articles/github-flavored-markdown/#tables + + % input argument validation and normalization + nCols = size(data, 2); + if ~exist('alignment','var') || isempty(alignment) + alignment = 'l'; + end + if numel(alignment) < nCols + % repeat the alignment specifications along the columns + alignment = repmat(alignment, 1, nCols); + alignment = alignment(1:nCols); + end + + % calculate the required column width + cellWidth = cellfun(@length, [header(:)' ;data]); + columnWidth = max(max(cellWidth, [], 1),3); % use at least 3 places + + % prepare the table format + COLSEP = '|'; ROWSEP = sprintf('\n'); + rowformat = [COLSEP sprintf([' %%%ds ' COLSEP], columnWidth) ROWSEP]; + alignmentRow = formatAlignment(alignment, columnWidth); + + % actually print the table + fullTable = [header; alignmentRow; data]; + strs = cell(size(fullTable,1), 1); + for iRow = 1:numel(strs) + thisRow = fullTable(iRow,:); + %TODO: maybe preprocess thisRow with strjust first + strs{iRow} = sprintf(rowformat, thisRow{:}); + end + str = [strs{:}]; + + %--------------------------------------------------------------------------- + function alignRow = formatAlignment(alignment, columnWidth) + % Construct a row of dashes to specify the alignment of each column + % See https://help.github.com/articles/github-flavored-markdown/#tables + DASH = '-'; COLON = ':'; + N = numel(columnWidth); + alignRow = arrayfun(@(w) repmat(DASH, 1, w), columnWidth, ... + 'UniformOutput', false); + for iColumn = 1:N + thisAlign = alignment(iColumn); + thisSpec = alignRow{iColumn}; + switch lower(thisAlign) + case 'l' + thisSpec(1) = COLON; + case 'r' + thisSpec(end) = COLON; + case 'c' + thisSpec([1 end]) = COLON; + otherwise + error('gfmTable:BadAlignment','Unknown alignment "%s"',... + thisAlign); + end + alignRow{iColumn} = thisSpec; + end + end +end +function str = gfmCode(str, inline, language) + % Construct a GFM code fragment + % + % Arguments: + % - str: code to be displayed + % - inline: - true -> formats inline + % - false -> formats as code block + % - [] -> automatic mode (default): picks one of the above + % - language: which language the code is (enforces a code block) + % + % Output: GFM formatted string + % + % See https://help.github.com/articles/github-flavored-markdown + if ~exist('inline','var') + inline = []; + end + if ~exist('language','var') || isempty(language) + language = ''; + else + inline = false; % highlighting is not supported for inline code + end + if isempty(inline) + inline = isempty(strfind(str, sprintf('\n'))); + end + + if inline + prefix = '`'; + postfix = '`'; + else + prefix = sprintf('\n```%s\n', language); + postfix = sprintf('\n```\n'); + if str(end) == sprintf('\n') + postfix = postfix(2:end); % remove extra endline + end + end + + str = sprintf('%s%s%s', prefix, str, postfix); +end +function str = gfmHeader(str, level) + % Constructs a GFM/Markdown header + if ~exist('level','var') + level = 1; + end + str = sprintf('\n%s %s\n', repmat('#', 1, level), str); +end +function symbols = githubEmoji() + % defines the emojis to signal the test result + symbols = struct('pass', ':white_check_mark:', ... + 'fail', ':heavy_exclamation_mark:', ... + 'skip', ':grey_question:'); +end +% ============================================================================== +function S = splitStatuses(status) + % splits a cell array of statuses into a struct of cell arrays + % of statuses according to their value of "skip", "reliable" and whether + % an error has occured. + % See also: splitUnreliableTests, splitPassFailSkippedTests + S = struct('all', {status}); % beware of cell array assignment to structs! + + [S.reliable, S.unreliable] = splitUnreliableTests(status); + [S.passR, S.failR, S.skipR] = splitPassFailSkippedTests(S.reliable); + [S.passU, S.failU, S.skipU] = splitPassFailSkippedTests(S.unreliable); +end +% ============================================================================== +function [short, long] = describeEnvironment() + % describes the environment in a short and long format + [env, ver] = getEnvironment; + [dummy, VCID] = VersionControlIdentifier(); %#ok + if ~isempty(VCID) + VCID = [' commit ' VCID(1:10)]; + end + OS = OSVersion; + short = sprintf('%s %s (%s)', env, ver, OS, VCID); + long = sprintf('Test results for m2t%s running with %s %s on %s.', ... + VCID, env, ver, OS); +end +% ============================================================================== +function reportUnreliableTests(stream, arg, S) + % report on the unreliable tests + if ~isempty(S.unreliable) && ~strcmpi(arg.length, 'short') + stream.print(gfmHeader('Unreliable tests',2)); + stream.print('These do not cause the build to fail.\n\n'); + displayTestResults(stream, S.unreliable); + end +end +function reportReliableTests(stream, arg, S) + % report on the reliable tests + switch arg.length + case 'long' + tests = S.reliable; + message = ''; + case 'default' + tests = [S.failR; S.skipR]; + message = 'Passing tests are not shown (only failed and skipped tests).\n\n'; + case 'short' + return; % don't show this part + end + + stream.print(gfmHeader('Reliable tests',2)); + stream.print('Only the reliable tests determine the build outcome.\n'); + stream.print(message); + displayTestResults(stream, tests); +end +% ============================================================================== +function displayTestResults(stream, status) + % display a table of specific test outcomes + headers = {'Testcase', 'Name', 'OK', 'Status'}; + data = cell(numel(status), numel(headers)); + symbols = githubEmoji; + for iTest = 1:numel(status) + data(iTest,:) = fillTestResultRow(status{iTest}, symbols); + end + str = gfmTable(data, headers, 'llcl'); + stream.print('%s', str); +end +function row = fillTestResultRow(oneStatus, symbol) + % format the status of a single test for the summary table + testNumber = oneStatus.index; + testSuite = func2str(oneStatus.testsuite); + summary = ''; + if oneStatus.skip + summary = 'SKIPPED'; + passOrFail = symbol.skip; + else + stages = getStagesFromStatus(oneStatus); + for jStage = 1:numel(stages) + thisStage = oneStatus.(stages{jStage}); + if ~thisStage.error + continue; + end + stageName = strrep(stages{jStage},'Stage',''); + switch stageName + case 'plot' + summary = sprintf('%s plot failed', summary); + case 'tikz' + summary = sprintf('%s m2t failed', summary); + case 'hash' + summary = sprintf('new hash %32s != expected (%32s) %s', ... + thisStage.found, thisStage.expected, summary); + otherwise + summary = sprintf('%s %s FAILED', summary, thisStage); + end + end + if isempty(summary) + passOrFail = symbol.pass; + else + passOrFail = symbol.fail; + end + summary = strtrim(summary); + end + row = { gfmCode(sprintf('%s(%d)', testSuite, testNumber)), ... + gfmCode(oneStatus.function), ... + passOrFail, ... + summary}; +end +% ============================================================================== +function displayTestSummary(stream, S) + % display a table of # of failed/passed/skipped tests vs (un)reliable + + % compute number of cases per category + reliableSummary = cellfun(@numel, {S.passR, S.failR, S.skipR}); + unreliableSummary = cellfun(@numel, {S.passU, S.failU, S.skipU}); + + % make summary table + calculate totals + summary = [unreliableSummary numel(S.unreliable); + reliableSummary numel(S.reliable); + reliableSummary+unreliableSummary numel(S.all)]; + + % put results into cell array with proper layout + summary = arrayfun(@(v) sprintf('%d',v), summary, 'UniformOutput', false); + table = repmat({''}, 3, 5); + header = {'','Pass','Fail','Skip','Total'}; + table(:,1) = {'Unreliable','Reliable','Total'}; + table(:,2:end) = summary; + + % print table + [envShort, envDescription] = describeEnvironment(); %#ok + stream.print(gfmHeader('Test summary', 2)); + stream.print('%s\n', envDescription); + stream.print('%s\n', gfmCode(generateCode(S),false,'matlab')); + stream.print(gfmTable(table, header, 'lrrrr')); + + % print overall outcome + symbol = githubEmoji; + nErrors = numel(S.failR); + if nErrors == 0 + stream.print('\nBuild passes. %s\n', symbol.pass); + else + stream.print('\nBuild fails with %d errors. %s\n', nErrors, symbol.fail); + end +end +function code = generateCode(S) + % generates some MATLAB code to easily replicate the results + code = sprintf('%s = %s;\n', ... + 'suite', ['@' func2str(S.all{1}.testsuite)], ... + 'alltests', testNumbers(S.all), ... + 'reliable', testNumbers(S.reliable), ... + 'unreliable', testNumbers(S.unreliable), ... + 'failReliable', testNumbers(S.failR), ... + 'passUnreliable', testNumbers(S.passU), ... + 'skipped', testNumbers([S.skipR; S.skipU])); + % -------------------------------------------------------------------------- + function str = testNumbers(status) + str = intelligentVector( cellfun(@(s) s.index, status) ); + end +end +function str = intelligentVector(numbers) + % Produce a string that is an intelligent vector notation of its arguments + % e.g. when numbers = [ 1 2 3 4 6 7 8 9 ], it should return '[ 1:4 6:9 ]' + % The order in the vector is not retained! + + if isempty(numbers) + str = '[]'; + else + numbers = sort(numbers(:).'); + delta = diff([numbers(1)-1 numbers]); + % place virtual bounds at the first element and beyond the last one + bounds = [1 find(delta~=1) numel(numbers)+1]; + idx = 1:(numel(bounds)-1); % start index of each segment + start = numbers(bounds(idx ) ); + stop = numbers(bounds(idx+1)-1); + parts = arrayfun(@formatRange, start, stop, 'UniformOutput', false); + str = sprintf('[%s]', strtrim(sprintf('%s ', parts{:}))); + end +end +function str = formatRange(start, stop) + % format a range [start:stop] of integers in MATLAB syntax + if start==stop + str = sprintf('%d',start); + else + str = sprintf('%d:%d',start, stop); + end +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/output/.gitignore b/matlab/matlab2tikz-1.1.0/test/output/.gitignore new file mode 100644 index 0000000..7e0545b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/output/.gitignore @@ -0,0 +1,4 @@ +# This is a directory for testing output. Nothing in here should ever +# be committed, except the .gitignore to enforce all of this. +* +!.gitignore diff --git a/matlab/matlab2tikz-1.1.0/test/private/OSVersion.m b/matlab/matlab2tikz-1.1.0/test/private/OSVersion.m new file mode 100644 index 0000000..9efc47a --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/OSVersion.m @@ -0,0 +1,36 @@ +function [formatted, OSType, OSVersion] = OSVersion() + % determines the OS type and its (kernel) version number + if ismac + OSType = 'Mac OS'; + [dummy, OSVersion] = system('sw_vers -productVersion'); %#ok + % Output like "10.10.4" for OS X Yosemite + + elseif ispc + OSType = 'Windows'; + [dummy, rawVersion] = system('ver'); %#ok + % Output like "Microsoft Windows [Version 6.3.9600]" for Win8.1 + pattern = '(?<=Version )[0-9.]+'; + OSVersion = regexpi(rawVersion, pattern, 'match', 'once'); + + elseif isunix + [dummy, OSType] = system('uname -s'); %#ok + % This returns the kernal name + % e.g. "Linux" on Linux, "Darwin" on Mac, "SunOS" on Solaris + [dummy, OSVersion] = system('uname -r'); %#ok + % Returns the kernel version. Many Linux distributions + % include an identifier, e.g. "4.0.7-2-ARCH" on Arch Linux + + % TODO: also use `lsb_release` in Linux for distro info + else + warning('OSVersion:UnknownOS', 'Could not recognize OS.'); + OSType = 'Unknown OS'; + OSVersion = ''; + + end + + EOL = sprintf('\n'); + OSType = strrep(OSType, EOL, ''); + OSVersion = strrep(OSVersion, EOL, ''); + + formatted = strtrim([OSType ' ' OSVersion]); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/StreamMaker.m b/matlab/matlab2tikz-1.1.0/test/private/StreamMaker.m new file mode 100644 index 0000000..a5b1b66 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/StreamMaker.m @@ -0,0 +1,74 @@ +function SM = StreamMaker() +% StreamMaker (Factory for fie/input/output Streams) +% +% A StreamMaker can make Stream PseudoObjects based on either +% an "fid" or "filename" (and extra arguments for `fopen`). +% The StreamMaker also contains a method `isStream` to validate whether +% the value passed is a valid stream specifier. +% +% Usage +% +% SM = StreamMaker; +% +% Stream = SM.make(fid) +% Stream = SM.make(filename, ...) +% +% This returns a PseudoObject Stream with the following properties: +% - name: (file) name of the stream +% - fid: handle (fid) of the stream +% +% and methods: +% - print: prints to the stream, i.e. fprintf +% - close: closes the stream, i.e. fclose +% +% It may also contain a field to automatically close the Stream when it goes +% out of scope. +% + SM = PseudoObject('StreamMaker', ... + 'isStream', @isStream, ... + 'make', @constructStream); +end + +function PseudoObj = PseudoObject(T, varargin) +% construct a Pseudo-Object with type T (no other fields yet) + PseudoObj = struct('Type', T, varargin{:}); +end + +function bool = isStream(value) + bool = ischar(value) || ismember(value, [1,2,fopen('all')]); + %TODO: allow others kinds of streams + % Stream -> clipboard (write on close) + % Stream -> string variable + % e.g. a quick-and-dirty way would be to write the file to `tempname` + % putting a flag to read that file back upon completion. +end + +function Stream = constructStream(streamSpecifier, varargin) + % this is the actual constructor of a stream + if ~isStream(streamSpecifier) + error('StreamMaker:NotAStream', 'Invalid stream specifier "%s"', ... + streamSpecifier); + end + + Stream = PseudoObject('Stream'); + closeAfterUse = false; + if ischar(streamSpecifier) + Stream.name = streamSpecifier; + Stream.fid = fopen(Stream.name, varargin{:}); + closeAfterUse = true; + elseif isnumeric(streamSpecifier) + Stream.fid = streamSpecifier; + Stream.name = fopen(Stream.fid); + end + + if Stream.fid == -1 + error('Stream:InvalidStream', ... + 'Unable to create stream "%s"!', streamSpecifier); + end + + Stream.print = @(varargin) fprintf(Stream.fid, varargin{:}); + Stream.close = @() fclose(Stream.fid); + if closeAfterUse + Stream.closeAfterUse = onCleanup(Stream.close); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/VersionControlIdentifier.m b/matlab/matlab2tikz-1.1.0/test/private/VersionControlIdentifier.m new file mode 100644 index 0000000..b96955e --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/VersionControlIdentifier.m @@ -0,0 +1,47 @@ +function [formatted,treeish] = VersionControlIdentifier() +% This function gives the (git) commit ID of matlab2tikz +% +% This assumes the standard directory structure as used by Nico's master branch: +% SOMEPATH/src/matlab2tikz.m with a .git directory in SOMEPATH. +% +% The HEAD of that repository is determined from file system information only +% by following dynamic references (e.g. ref:refs/heds/master) in branch files +% until an absolute commit hash (e.g. 1a3c9d1...) is found. +% NOTE: Packed branch references are NOT supported by this approach + MAXITER = 10; % stop following dynamic references after a while + formatted = ''; + REFPREFIX = 'ref:'; + isReference = @(treeish)(any(strfind(treeish, REFPREFIX))); + treeish = [REFPREFIX 'HEAD']; + try + % get the matlab2tikz directory + privateDir = fileparts(mfilename('fullpath')); + gitDir = fullfile(privateDir,'..','..','.git'); + + nIter = 1; + while isReference(treeish) + refName = treeish(numel(REFPREFIX)+1:end); + branchFile = fullfile(gitDir, refName); + + if exist(branchFile, 'file') && nIter < MAXITER + % The FID is reused in every iteration, so `onCleanup` cannot + % be used to `fclose(fid)`. But since there is very little that + % can go wrong in a single `fscanf`, it's probably best to leave + % this part as it is for the time being. + fid = fopen(branchFile,'r'); + treeish = fscanf(fid,'%s'); + fclose(fid); + nIter = nIter + 1; + else % no branch file or iteration limit reached + treeish = ''; + return; + end + end + catch %#ok + treeish = ''; + end + if ~isempty(treeish) + formatted = [' Commit & ' treeish ' \\\\ \n']; + end + %TODO: do the formatting somewhere else! +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/calculateMD5Hash.m b/matlab/matlab2tikz-1.1.0/test/private/calculateMD5Hash.m new file mode 100644 index 0000000..88c6308 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/calculateMD5Hash.m @@ -0,0 +1,35 @@ +function hash = calculateMD5Hash(filename) +% CALCULATEMD5HASH calculate a MD5 hash of a file +% +% This functionality is built-in into Octave but uses Java in MATLAB. + + switch getEnvironment + case 'Octave' + hash = md5sum(filename); + + case 'MATLAB' + % There are some MD5 implementations in MATLAB, but those + % tend to be slow and licensing is unclear. + % Rolling our own implementation is unwanted, especially since this + % is a cryptographic hash, even though its security has been + % broken. Instead we make use of the Java libraries. + % Unless the "-nojvm" flag is specified, this should work well. + + MD5 = java.security.MessageDigest.getInstance('MD5'); + + % Open the file + fid = fopen(filename, 'r'); + + % Make sure fid is closed + finally_close = onCleanup(@()fclose(fid)); + + % Faster file digest based on code by Jan Simon as in + % http://www.mathworks.com/matlabcentral/fileexchange/31272-datahash + data = fread(fid, '*uint8'); + MD5.update(data); + + hash = reshape(dec2hex(typecast(MD5.digest(),'uint8')).', 1, 32); + end + + hash = lower(hash); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/cleanFiles.m b/matlab/matlab2tikz-1.1.0/test/private/cleanFiles.m new file mode 100644 index 0000000..6d4fcb8 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/cleanFiles.m @@ -0,0 +1,19 @@ +function cleanFiles(cleanBefore) +% clean output files in ./tex using make +%FIXME: this file appears to be unused (but it is useful) +%FIXME: adapt this file to take the output directory into account + if cleanBefore && exist(fullfile('tex','Makefile'),'file') + fprintf(1, 'Cleaning output files...\n'); + cwd = pwd; + try + cd('tex'); + [exitCode, output] = system('make distclean'); + fprintf(1,'%s\n', output); + assert(exitCode==0, 'Exit code 0 means correct execution'); + catch + % This might happen when make is not present + fprintf(2, '\tNot completed succesfully\n\n'); + end + cd(cwd); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/countNumberOfErrors.m b/matlab/matlab2tikz-1.1.0/test/private/countNumberOfErrors.m new file mode 100644 index 0000000..8089cf2 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/countNumberOfErrors.m @@ -0,0 +1,4 @@ +function nErrors = countNumberOfErrors(status) +% counts the number of errors in a status cell array + nErrors = sum(hasTestFailed(status)); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/emptyStage.m b/matlab/matlab2tikz-1.1.0/test/private/emptyStage.m new file mode 100644 index 0000000..34d892a --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/emptyStage.m @@ -0,0 +1,4 @@ +function stage = emptyStage() +% constructs an empty (workflow) stage struct + stage = struct('message', '', 'error' , false); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/emptyStatus.m b/matlab/matlab2tikz-1.1.0/test/private/emptyStatus.m new file mode 100644 index 0000000..0118d4a --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/emptyStatus.m @@ -0,0 +1,24 @@ +function defaultStatus = emptyStatus(testsuite, testNumber) +% constructs an empty status struct + defaultStatus = struct(... + 'function', '', ... + 'description', '',... + 'testsuite', testsuite ,... + 'index', testNumber, ... + 'issues', [],... + 'unreliable', false, ... + 'skip', false, ... % skipped this test? + 'closeall', false, ... % call close all after? + 'extraOptions', {cell(0)}, ... + 'extraCleanfigureOptions',{cell(0)}, ... + 'plotStage', emptyStage(), ... + 'saveStage', emptyStage(), ... + 'tikzStage', emptyStage(), ... + 'hashStage', emptyStage() ... + ); + + % for reliable tests explicitly define width and height, see #659 + % TODO: Remove explicitly setting this option. + % After #641 is merged, this might be not needed anyhow. + defaultStatus.extraCleanfigureOptions = {'targetResolution', [1000,500]}; +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/errorHandler.m b/matlab/matlab2tikz-1.1.0/test/private/errorHandler.m new file mode 100644 index 0000000..ab7a32b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/errorHandler.m @@ -0,0 +1,41 @@ +function [stage, errorHasOccurred] = errorHandler(e) +% common error handler code: save and print to console + errorHasOccurred = true; + stage = emptyStage(); + stage.message = format_error_message(e); + stage.error = errorHasOccurred; + + disp_error_message(stage.message); +end +% ============================================================================== +function msg = format_error_message(e) + msg = ''; + if ~isempty(e.message) + msg = sprintf('%serror: %s\n', msg, e.message); + end + if ~isempty(e.identifier) + if strfind(lower(e.identifier),'testmatlab2tikz:') + % When "errors" occur in the test framework, i.e. a hash mismatch + % or no hash provided, there is no need to be very verbose. + % So we don't return the msgid and the stack trace in those cases! + return % only return the message + end + msg = sprintf('%serror: %s\n', msg, e.identifier); + end + if ~isempty(e.stack) + msg = sprintf('%serror: called from:\n', msg); + for ee = e.stack(:)' + msg = sprintf('%serror: %s at line %d, in function %s\n', ... + msg, ee.file, ee.line, ee.name); + end + end +end +% ============================================================================== +function disp_error_message(msg) + stderr = 2; + % The error message should not contain any more escape sequences and + % hence can be output literally to stderr. + + fprintf(stderr, '%s', msg); +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/private/errorHasOccurred.m b/matlab/matlab2tikz-1.1.0/test/private/errorHasOccurred.m new file mode 100644 index 0000000..e73c0f1 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/errorHasOccurred.m @@ -0,0 +1,16 @@ +function errorOccurred = errorHasOccurred(status) +% determines whether an error has occurred from a status struct OR cell array +% of status structs + errorOccurred = false; + if iscell(status) + for iStatus = 1:numel(status) + errorOccurred = errorOccurred || errorHasOccurred(status{iStatus}); + end + else + stages = getStagesFromStatus(status); + for iStage = 1:numel(stages) + thisStage = status.(stages{iStage}); + errorOccurred = errorOccurred || thisStage.error; + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/execute_hash_stage.m b/matlab/matlab2tikz-1.1.0/test/private/execute_hash_stage.m new file mode 100644 index 0000000..1e268f5 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/execute_hash_stage.m @@ -0,0 +1,34 @@ +function [status] = execute_hash_stage(status, ipp) + % test stage: check recorded hash checksum + calculated = ''; + expected = ''; + try + expected = getReferenceHash(status, ipp); + calculated = calculateMD5Hash(status.tikzStage.texFile); + + % do the actual check + if ~strcmpi(expected, calculated) + % throw an error to signal the testing framework + error('testMatlab2tikz:HashMismatch', ... + 'The hash "%s" does not match the reference hash "%s"', ... + calculated, expected); + end + catch %#ok + e = lasterror('reset'); %#ok + [status.hashStage] = errorHandler(e); + end + status.hashStage.expected = expected; + status.hashStage.found = calculated; +end +% ============================================================================== +function hash = getReferenceHash(status, ipp) + % retrieves a reference hash from a hash table + % WARNING: do not make `hashTable` persistent, since this is slower + + hashTable = loadHashTable(ipp.Results.testsuite); + if isfield(hashTable.contents, status.function) + hash = hashTable.contents.(status.function); + else + hash = ''; + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/execute_plot_stage.m b/matlab/matlab2tikz-1.1.0/test/private/execute_plot_stage.m new file mode 100644 index 0000000..ff1519e --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/execute_plot_stage.m @@ -0,0 +1,45 @@ +function [status] = execute_plot_stage(defaultStatus, ipp) +% plot a test figure + testsuite = ipp.Results.testsuite; + testNumber = defaultStatus.index; + + % open a window + fig_handle = figure('visible',ipp.Results.figureVisible); + errorHasOccurred = false; + + % plot the figure + try + status = testsuite(testNumber); + + catch %#ok + e = lasterror('reset'); %#ok + + status.description = '\textcolor{red}{Error during plot generation.}'; + [status.plotStage, errorHasOccurred] = errorHandler(e); + + % Automaticall mark the test as unreliable + % + % Since metadata is not set in this case, also stat.unreliable is + % not returned. So ideally, we should + % FIXME: implement #484 to get access to the meta data + % but we can work around this issue by forcefully setting that value. + % The rationale for setting this to true: + % - the plot part is not the main task of M2T + % (so breaking a single test is less severe in this case), + % - if the plotting fails, the test is not really reliable anyway, + % - this allows to get full green on Travis. + status.unreliable = true; + + end + + status = fillStruct(status, defaultStatus); + if isempty(status.function) + allFuncs = testsuite(0); + status.function = func2str(allFuncs{testNumber}); + end + status.plotStage.fig_handle = fig_handle; + + if status.skip || errorHasOccurred + close(fig_handle); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/execute_save_stage.m b/matlab/matlab2tikz-1.1.0/test/private/execute_save_stage.m new file mode 100644 index 0000000..0835ac4 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/execute_save_stage.m @@ -0,0 +1,63 @@ +function [status] = execute_save_stage(status, ipp) +% save stage: saves the figure to EPS/PDF depending on env + testNumber = status.index; + + basepath = fullfile(ipp.Results.output,'data','reference'); + reference_eps = fullfile(basepath, sprintf('test%d-reference.eps', testNumber)); + reference_pdf = fullfile(basepath, sprintf('test%d-reference.pdf', testNumber)); + % the reference below is for inclusion in LaTeX! Use UNIX conventions! + reference_fig = sprintf('data/reference/test%d-reference', testNumber); + + % Save reference output as PDF + try + switch getEnvironment + case 'MATLAB' + % MATLAB does not generate properly cropped PDF files. + % So, we generate EPS files that are converted later on. + print(gcf, '-depsc2', reference_eps); + + fixLineEndingsInWindows(reference_eps); + + case 'Octave' + % In Octave, figures are properly cropped when using print(). + print(reference_pdf, '-dpdf', '-S415,311', '-r150'); + pause(1.0) + otherwise + error('matlab2tikz:UnknownEnvironment', ... + 'Unknown environment. Need MATLAB(R) or GNU Octave.') + end + catch %#ok + e = lasterror('reset'); %#ok + [status.saveStage] = errorHandler(e); + end + status.saveStage.epsFile = reference_eps; + status.saveStage.pdfFile = reference_pdf; + status.saveStage.texReference = reference_fig; +end +% ============================================================================== +function fixLineEndingsInWindows(filename) +% On R2014b Win, line endings in .eps are Unix style (LF) instead of Windows +% style (CR+LF). This causes problems in the MikTeX `epstopdf` for some files +% as dicussed in: +% * https://github.com/matlab2tikz/matlab2tikz/issues/370 +% * http://tex.stackexchange.com/questions/208179 + if ispc + fid = fopen(filename,'r+'); + finally_fclose_fid = onCleanup(@() fclose(fid)); + testline = fgets(fid); + CRLF = sprintf('\r\n'); + endOfLine = testline(end-1:end); + if ~strcmpi(endOfLine, CRLF) + endOfLine = testline(end); % probably an LF + + % Rewind, read the whole + fseek(fid,0,'bof'); + str = fread(fid,'*char')'; + + % Replace, overwrite and close + str = strrep(str, endOfLine, CRLF); + fseek(fid,0,'bof'); + fprintf(fid,'%s',str); + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/execute_tikz_stage.m b/matlab/matlab2tikz-1.1.0/test/private/execute_tikz_stage.m new file mode 100644 index 0000000..fa82463 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/execute_tikz_stage.m @@ -0,0 +1,43 @@ +function [status] = execute_tikz_stage(status, ipp) +% test stage: TikZ file generation + testNumber = status.index; + datapath = fullfile(ipp.Results.output,'data','converted'); + gen_tex = fullfile(datapath, sprintf('test%d-converted.tex', testNumber)); + % the value below is for inclusion into LaTeX report! Use UNIX convention. + gen_pdf = sprintf('data/converted/test%d-converted.pdf', testNumber); + cleanfigure_time = NaN; + m2t_time = NaN; + + % now, test matlab2tikz + try + %TODO: remove this once text removal has been removed + oldWarn = warning('off','cleanfigure:textRemoval'); + + cleanfigure_time = tic; + cleanfigure(status.extraCleanfigureOptions{:}); + cleanfigure_time = toc(cleanfigure_time); + + warning(oldWarn); + + m2t_time = tic; + matlab2tikz('filename', gen_tex, ... + 'showInfo', false, ... + 'checkForUpdates', false, ... + 'dataPath', datapath, ... + 'standalone', true, ... + ipp.Results.extraOptions{:}, ... + status.extraOptions{:} ... + ); + m2t_time = toc(m2t_time); + catch %#ok + e = lasterror('reset'); %#ok + % Remove (corrupted) output file. This is necessary to avoid that the + % Makefile tries to compile it and fails. + delete(gen_tex) + [status.tikzStage] = errorHandler(e); + end + status.tikzStage.texFile = gen_tex; + status.tikzStage.pdfFile = gen_pdf; + status.tikzStage.m2t_time = m2t_time; + status.tikzStage.cleanfigure_time = cleanfigure_time; +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/execute_type_stage.m b/matlab/matlab2tikz-1.1.0/test/private/execute_type_stage.m new file mode 100644 index 0000000..a9d4324 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/execute_type_stage.m @@ -0,0 +1,15 @@ +function [status] = execute_type_stage(status, ipp) + try + filename = status.tikzStage.texFile; + stream = 1; % stdout + if errorHasOccurred(status) && exist(filename, 'file') + shortname = strrep(filename, m2troot, '$(M2TROOT)'); + fprintf(stream, '\n%%%%%%%% BEGIN FILE "%s" %%%%%%%%\n', shortname); + type(filename); + fprintf(stream, '\n%%%%%%%% END FILE "%s" %%%%%%%%\n', shortname); + end + catch + e = lasterror('reset'); + [status.typeStage] = errorHandler(e); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/fillStruct.m b/matlab/matlab2tikz-1.1.0/test/private/fillStruct.m new file mode 100644 index 0000000..1ddc6d8 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/fillStruct.m @@ -0,0 +1,10 @@ +function [status] = fillStruct(status, defaultStatus) +% fills non-existant fields of |data| with those of |defaultData| + fields = fieldnames(defaultStatus); + for iField = 1:numel(fields) + field = fields{iField}; + if ~isfield(status,field) + status.(field) = defaultStatus.(field); + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/getEnvironment.m b/matlab/matlab2tikz-1.1.0/test/private/getEnvironment.m new file mode 100644 index 0000000..4717cb5 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/getEnvironment.m @@ -0,0 +1,25 @@ +function [env, versionString] = getEnvironment() +% Determine environment (Octave, MATLAB) and version string +% TODO: Unify private `getEnvironment` functions + persistent cache + + if isempty(cache) + isOctave = exist('OCTAVE_VERSION', 'builtin') ~= 0; + if isOctave + env = 'Octave'; + versionString = OCTAVE_VERSION; + else + env = 'MATLAB'; + vData = ver(env); + versionString = vData.Version; + end + + % store in cache + cache.env = env; + cache.versionString = versionString; + + else + env = cache.env; + versionString = cache.versionString; + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/getStagesFromStatus.m b/matlab/matlab2tikz-1.1.0/test/private/getStagesFromStatus.m new file mode 100644 index 0000000..7ca6669 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/getStagesFromStatus.m @@ -0,0 +1,5 @@ +function stages = getStagesFromStatus(status) +% retrieves the different (names of) stages of a status struct + fields = fieldnames(status); + stages = fields(cellfun(@(f) ~isempty(strfind(f,'Stage')), fields)); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/hasTestFailed.m b/matlab/matlab2tikz-1.1.0/test/private/hasTestFailed.m new file mode 100644 index 0000000..3981dfd --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/hasTestFailed.m @@ -0,0 +1,13 @@ +function bool = hasTestFailed(status) + % returns true when the test has failed + + if iscell(status) % allow for vectorization of the call + bool = cellfun(@hasTestFailed, status, 'UniformOutput', true); + else + stages = getStagesFromStatus(status); + bool = false; + for jStage = 1:numel(stages) + bool = bool || status.(stages{jStage}).error; + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/hashTableName.m b/matlab/matlab2tikz-1.1.0/test/private/hashTableName.m new file mode 100644 index 0000000..faa1c6d --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/hashTableName.m @@ -0,0 +1,55 @@ +function filename = hashTableName(suite) + % determines the file name of a hash table + % + % The MD5 file is assumed to be in the same directory as the test suite. + % It has a file name "$SUITE.$ENV.$VER.md5" + % where the following fields are filled: + % $ENV: the environment (either "MATLAB" or "Octave") + % $VER: the version (e.g. "3.8.0" for Octave, "8.3" for MATLAB 2014a) + % $SUITE: the name (and path) of the test suite + % + % For the $VER-part, a fall-back mechanism is present that prefers the exact + % version but will use the closest available file if such file does not + % exist. + [pathstr,name, ext] = fileparts(which(func2str(suite))); + [env, version] = getEnvironment(); + ext = sprintf('.%s.%s.md5', env, version); + relFilename = [name ext]; + filename = fullfile(pathstr, relFilename); + + if ~exist(filename,'file') + % To avoid having to create a file for each release of the environment, + % also other versions are tried. The file for different releases are checked + % in the following order: + % 1. the currently running version (handled above!) + % 2. the newest older version (e.g. use R2014b's file in R2015a) + % 3. the oldest newer version (e.g. use R2014a's file in R2013a) + pattern = sprintf('%s.%s.*.md5', name, env); + candidates = dir(fullfile(pathstr, pattern)); + + % We just need the file names. + filenames = arrayfun(@(c)c.name, candidates, 'UniformOutput', false); + + % Add the expected version to the results, and sort the names by + % version (this is the same as alphabetically). + filenames = sort([filenames; {relFilename}]); + nFiles = numel(filenames); + iCurrent = find(ismember(filenames, relFilename)); + % determine the fall-back candidates: + iNewestOlder = iCurrent - 1; + iOldestNewer = iCurrent + 1; + + inRange = @(idx)(idx <= nFiles && idx >= 1); + if inRange(iNewestOlder) + % use the newest older version + relFilename = filenames{iNewestOlder}; + elseif inRange(iOldestNewer) + % use the oldest newer version + relFilename = filenames{iOldestNewer}; + else + % use the exact version anyhow + end + + filename = fullfile(pathstr, relFilename); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/initializeGlobalState.m b/matlab/matlab2tikz-1.1.0/test/private/initializeGlobalState.m new file mode 100644 index 0000000..0ecac82 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/initializeGlobalState.m @@ -0,0 +1,99 @@ +function [orig] = initializeGlobalState() +% Initialize global state. Set working directory and various properties of +% the graphical root to ensure reliable output of the ACID testsuite. +% See #542 and #552 +% +% 1. Working directory +% 2. Bring get(0,'Default') in line with get(0,'Factory') +% 3. Set specific properties, required by matlab2tikz + fprintf('Initialize global state...\n'); + orig = struct(); + + %--- Extract user defined default properties and set factory state + default = get(0,'Default'); + factory = get(0,'Factory'); + + f = fieldnames(default); % fields of user's default state + for i = 1:length(f) + factory_property_name = strrep(f{i},'default','factory'); + factory_property_value = factory.(factory_property_name); + orig.(f{i}).val = ... + swapPropertyState(0, f{i}, factory_property_value); + end + + %--- Define desired global state properties + % defaultAxesColorOrder: on HG1 'default' and 'factory' differ and + % HG1 differs from HG2. Consequently use HG2 colors (the new standard). + new.defaultAxesColorOrder.val = [0.000 0.447 0.741; ... + 0.850 0.325 0.098; ... + 0.929 0.694 0.125; ... + 0.494 0.184 0.556; ... + 0.466 0.674 0.188; ... + 0.301 0.745 0.933; ... + 0.635 0.0780 0.184]; + new.defaultAxesColorOrder.ignore= false; + + % defaultFigurePosition: width and height influence cleanfigure() and + % the number/location of axis ticks + new.defaultFigurePosition.val = [300,200,560,420]; + new.defaultFigurePosition.ignore= false; + + % ScreenPixelsPerInch: TODO: determine, if necessary + % (probably needed for new line simplification algorithm) + % not possible in octave + new.ScreenPixelsPerInch.val = 96; + new.ScreenPixelsPerInch.ignore = strcmpi(getEnvironment,'octave'); + + % MATLAB's factory values differ from their default values of a clean + % MATLAB installation (observed on R2014a, Linux) + new.defaultAxesColor.val = [1 1 1]; + new.defaultAxesColor.ignore = false; + new.defaultLineColor.val = [0 0 0]; + new.defaultLineColor.ignore = false; + new.defaultTextColor.val = [0 0 0]; + new.defaultTextColor.ignore = false; + new.defaultAxesXColor.val = [0 0 0]; + new.defaultAxesXColor.ignore = false; + new.defaultAxesYColor.val = [0 0 0]; + new.defaultAxesYColor.ignore = false; + new.defaultAxesZColor.val = [0 0 0]; + new.defaultAxesZColor.ignore = false; + new.defaultFigureColor.val = [0.8 0.8 0.8]; + new.defaultFigureColor.ignore = false; + new.defaultPatchEdgeColor.val = [0 0 0]; + new.defaultPatchEdgeColor.ignore = false; + new.defaultPatchFaceColor.val = [0 0 0]; + new.defaultPatchFaceColor.ignore = false; + new.defaultFigurePaperType.val = 'A4'; + new.defaultFigurePaperType.ignore = false; + new.defaultFigurePaperSize.val = [20.9840 29.6774]; + new.defaultFigurePaperSize.ignore = false; + new.defaultFigurePaperUnits.val = 'centimeters'; + new.defaultFigurePaperUnits.ignore = false; + + %--- Extract relevant properties and set desired state + f = fieldnames(new); % fields of new state + for i = 1:length(f) + % ignore property on specified environments + if ~new.(f{i}).ignore + val = swapPropertyState(0, f{i}, new.(f{i}).val); + + % store original value only, if not set by user's defaults + if ~isfield(orig,f{i}) + orig.(f{i}).val = val; + end + end + end +end +% ========================================================================= +function old = swapPropertyState(h, property, new) + % read current property of graphical object + % set new value, if not empty + if nargin < 3, new = []; end + + old = get(h, property); + + if ~isempty(new) + set(h, property, new); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/loadHashTable.m b/matlab/matlab2tikz-1.1.0/test/private/loadHashTable.m new file mode 100644 index 0000000..3d88017 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/loadHashTable.m @@ -0,0 +1,19 @@ +function hashTable = loadHashTable(suite) + % loads a reference hash table from disk + hashTable.suite = suite; + hashTable.contents = struct(); + filename = hashTableName(suite); + if exist(filename, 'file') + fid = fopen(filename, 'r'); + finally_fclose_fid = onCleanup(@() fclose(fid)); + + data = textscan(fid, '%s : %s'); + if ~isempty(data) && ~all(cellfun(@isempty, data)) + functions = cellfun(@strtrim, data{1},'UniformOutput', false); + hashes = cellfun(@strtrim, data{2},'UniformOutput', false); + for iFunc = 1:numel(functions) + hashTable.contents.(functions{iFunc}) = hashes{iFunc}; + end + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/m2troot.m b/matlab/matlab2tikz-1.1.0/test/private/m2troot.m new file mode 100644 index 0000000..475789b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/m2troot.m @@ -0,0 +1,30 @@ +function rootpath = m2troot(varargin) + % M2TROOT produces paths inside the matlab2tikz repository + % + % Usage: + % There are two ways to call this function, the base syntax is: + % + % * rootpath = m2troot() + % + % where |rootpath| points towards the root of the repository. + % + % The other syntax: + % + % * path = m2troot(...) + % + % is equivalent to |fullfile(m2troot, ...)| and as such allows to + % easily produce a path to any file within the repository. + + m2t = which('matlab2tikz'); + if isempty(m2t) + error('M2TRoot:NotFound', 'Matlab2tikz was not found on the PATH!') + end + + [srcpath] = fileparts(m2t); % this should be $(m2troot)/src + [rootpath, srcdir] = fileparts(srcpath); % this should be $(m2troot) + assert(strcmpi(srcdir,'src')); + + if nargin >= 1 + rootpath = fullfile(rootpath, varargin{:}); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/m2tstrjoin.m b/matlab/matlab2tikz-1.1.0/test/private/m2tstrjoin.m new file mode 100644 index 0000000..70c7267 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/m2tstrjoin.m @@ -0,0 +1,24 @@ +function [ newstr ] = m2tstrjoin( cellstr, delimiter ) +%M2TSTRJOIN This function joins a cellstr with a separator +% +% This is an alternative implementation for MATLAB's `strjoin`, since that +% one is not available before R2013a. +% +% See also: strjoin + + %TODO: Unify the private `m2tstrjoin` functions + %FIXME: differs from src/private/m2tstrjoin in functionality !!! + + nElem = numel(cellstr); + if nElem == 0 + newstr = ''; + return % m2tstrjoin({}, ...) -> '' + end + + newstr = cell(2,nElem); + newstr(1,:) = reshape(cellstr, 1, nElem); + newstr(2,1:nElem-1) = {delimiter}; % put delimiters in-between the elements + newstr(2, end) = {''}; % for Octave 4 compatibility + newstr = [newstr{:}]; + +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/restoreGlobalState.m b/matlab/matlab2tikz-1.1.0/test/private/restoreGlobalState.m new file mode 100644 index 0000000..404b9c4 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/restoreGlobalState.m @@ -0,0 +1,11 @@ +function restoreGlobalState(orig) +% Restore original properties of global state. +% See #542 and #552 + fprintf('Restore global state...\n'); + + % Restore relevant properties + state_fields = fieldnames(orig); + for i = 1:length(state_fields) + set(0, state_fields{i}, orig.(state_fields{i}).val); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/splitPassFailSkippedTests.m b/matlab/matlab2tikz-1.1.0/test/private/splitPassFailSkippedTests.m new file mode 100644 index 0000000..92aed64 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/splitPassFailSkippedTests.m @@ -0,0 +1,10 @@ +function [passedTests, failedTests, skippedTests] = splitPassFailSkippedTests(status) + % splits tests between passed, failed and skippedtests + skipped = cellfun(@(s) s.skip, status); + status_notSkipped = status(~skipped); + failed = hasTestFailed(status_notSkipped); + + passedTests = status_notSkipped(~failed); + failedTests = status_notSkipped(failed); + skippedTests = status(skipped); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/splitUnreliableTests.m b/matlab/matlab2tikz-1.1.0/test/private/splitUnreliableTests.m new file mode 100644 index 0000000..950b553 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/splitUnreliableTests.m @@ -0,0 +1,7 @@ +function [reliableTests, unreliableTests] = splitUnreliableTests(status) + % splits tests between reliable and unreliable tests + knownToFail = cellfun(@(s)s.unreliable, status); + + unreliableTests = status( knownToFail); + reliableTests = status(~knownToFail); +end diff --git a/matlab/matlab2tikz-1.1.0/test/private/testMatlab2tikz.m b/matlab/matlab2tikz-1.1.0/test/private/testMatlab2tikz.m new file mode 100644 index 0000000..f1612ac --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/private/testMatlab2tikz.m @@ -0,0 +1,146 @@ +function [status, parameters] = testMatlab2tikz(varargin) +%TESTMATLAB2TIKZ unit test driver for matlab2tikz +% +% This function should NOT be called directly by the user (or even developer). +% If you are a developer, please use some of the following functions instead: +% * `testHeadless` +% * `testGraphical` +% +% The following arguments are supported, also for the functions above. +% +% TESTMATLAB2TIKZ('testFunctionIndices', INDICES, ...) or +% TESTMATLAB2TIKZ(INDICES, ...) runs the test only for the specified +% indices. When empty, all tests are run. (Default: []). +% +% TESTMATLAB2TIKZ('extraOptions', {'name',value, ...}, ...) +% passes the cell array of options to MATLAB2TIKZ. Default: {} +% +% TESTMATLAB2TIKZ('figureVisible', LOGICAL, ...) +% plots the figure visibly during the test process. Default: false +% +% TESTMATLAB2TIKZ('testsuite', FUNCTION_HANDLE, ...) +% Determines which test suite is to be run. Default: @ACID +% A test suite is a function that takes a single integer argument, which: +% when 0: returns a cell array containing the N function handles to the tests +% when >=1 and <=N: runs the appropriate test function +% when >N: throws an error +% +% TESTMATLAB2TIKZ('output', DIRECTORY, ...) +% Sets the output directory where the output files are places. +% The default directory is $M2TROOT/test/output/current +% +% See also matlab2tikz, ACID + + % In which environment are we? + env = getEnvironment(); + + % ----------------------------------------------------------------------- + ipp = m2tInputParser; + + ipp = ipp.addOptional(ipp, 'testFunctionIndices', [], @isfloat); + ipp = ipp.addParamValue(ipp, 'extraOptions', {}, @iscell); + ipp = ipp.addParamValue(ipp, 'figureVisible', false, @islogical); + ipp = ipp.addParamValue(ipp, 'actionsToExecute', @(varargin) varargin{1}, @isFunction); + ipp = ipp.addParamValue(ipp, 'testsuite', @ACID, @isFunction ); + ipp = ipp.addParamValue(ipp, 'output', m2troot('test','output','current'), @ischar); + + ipp = ipp.parse(ipp, varargin{:}); + + ipp = sanitizeInputs(ipp); + parameters = ipp.Results; + + % ----------------------------------------------------------------------- + if strcmpi(env, 'Octave') + if ~ipp.Results.figureVisible + % Use the gnuplot backend to work around an fltk bug, see + % . + graphics_toolkit gnuplot + end + + if ispc + % Prevent three digit exponent on Windows Octave + % See https://github.com/matlab2tikz/matlab2tikz/pull/602 + setenv ('PRINTF_EXPONENT_DIGITS', '2') + end + end + + % copy output template into output directory + if ~exist(ipp.Results.output,'dir') + mkdir(ipp.Results.output); + end + template = m2troot('test','template'); + copyfile(fullfile(template,'*'), ipp.Results.output); + + % start overall timing + elapsedTimeOverall = tic; + status = runIndicatedTests(ipp); + + % print out overall timing + elapsedTimeOverall = toc(elapsedTimeOverall); + stdout = 1; + fprintf(stdout, 'overall time: %4.2fs\n\n', elapsedTimeOverall); +end +% INPUT VALIDATION ============================================================= +function bool = isFunction(f) + bool = isa(f,'function_handle'); +end +function ipp = sanitizeInputs(ipp) + % sanitize all input arguments + ipp = sanitizeFunctionIndices(ipp); + ipp = sanitizeFigureVisible(ipp); +end +function ipp = sanitizeFunctionIndices(ipp) +% sanitize the passed function indices to the range of the test suite + % query the number of test functions + testsuite = ipp.Results.testsuite; + n = length(testsuite(0)); + + if ~isempty(ipp.Results.testFunctionIndices) + indices = ipp.Results.testFunctionIndices; + % kick out the illegal stuff + I = find(indices>=1 & indices<=n); + indices = indices(I); %#ok + else + indices = 1:n; + end + ipp.Results.testFunctionIndices = indices; +end +function ipp = sanitizeFigureVisible(ipp) + % sanitizes the figure visible option from boolean to ON/OFF + if ipp.Results.figureVisible + ipp.Results.figureVisible = 'on'; + else + ipp.Results.figureVisible = 'off'; + end +end +% TEST RUNNER ================================================================== +function status = runIndicatedTests(ipp) +% run all indicated tests in the test suite + % cell array to accomodate different structure + indices = ipp.Results.testFunctionIndices; + testsuite = ipp.Results.testsuite; + testsuiteName = func2str(testsuite); + stdout = 1; + status = cell(length(indices), 1); + + for k = 1:length(indices) + testNumber = indices(k); + + fprintf(stdout, 'Executing %s test no. %d...\n', testsuiteName, indices(k)); + + status{k} = emptyStatus(testsuite, testNumber); + + elapsedTime = tic; + + status{k} = feval(ipp.Results.actionsToExecute, status{k}, ipp); + + elapsedTime = toc(elapsedTime); + status{k}.elapsedTime = elapsedTime; + fprintf(stdout, '%s ', status{k}.function); + if status{k}.skip + fprintf(stdout, 'skipped (%4.2fs).\n\n', elapsedTime); + else + fprintf(stdout, 'done (%4.2fs).\n\n', elapsedTime); + end + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/runMatlab2TikzTests.m b/matlab/matlab2tikz-1.1.0/test/runMatlab2TikzTests.m new file mode 100644 index 0000000..9c5c47b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/runMatlab2TikzTests.m @@ -0,0 +1,38 @@ +function statusAll = runMatlab2TikzTests(varargin) +%% This file runs the complete MATLAB2TIKZ test suite. +% It is mainly used for testing on a continuous integration server, but it can +% also be used on a development machine. + +CI_MODE = strcmpi(getenv('CONTINUOUS_INTEGRATION'),'true') || strcmp(getenv('CI'),'true'); +isJenkins = ~isempty(getenv('JENKINS_URL')); + +%% Set path +addpath(fullfile(pwd,'..','src')); +addpath(fullfile(pwd,'suites')); + +%% Select functions to run +suite = @ACID; +allTests = 1:numel(suite(0)); + +%% Prepare environment +if strcmpi(getEnvironment(), 'Octave') + % Ensure that paging is disabled + % https://www.gnu.org/software/octave/doc/interpreter/Paging-Screen-Output.html + more off +end + +%% Run tests +status = testHeadless('testFunctionIndices', allTests,... + 'testsuite', suite, varargin{:}); + +if isJenkins + makeTapReport(status, 'stream', 'results.test.tap'); + makeTravisReport(status, 'stream', 'results.test.md'); +end + +nErrors = makeTravisReport(status); + +%% Calculate exit code +if CI_MODE + exit(nErrors); +end diff --git a/matlab/matlab2tikz-1.1.0/test/saveHashTable.m b/matlab/matlab2tikz-1.1.0/test/saveHashTable.m new file mode 100644 index 0000000..2d56ef1 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/saveHashTable.m @@ -0,0 +1,164 @@ +function saveHashTable(status, varargin) +% SAVEHASHTABLE saves the references hashes for the Matlab2Tikz tests +% +% Usage: +% SAVEHASHTABLE(status) +% +% SAVEHASHTABLE(status, 'dryrun', BOOL, ...) determines whether or not to +% write the constructed hash table to file (false) or to stdout (true). +% Default: false +% +% SAVEHASHTABLE(status, 'removedTests', CHAR, ...) specifies which action to +% execute on "removed tests" (i.e. test that have a hash recorded in the file, +% but which are not present in `status`). Three values are possible: +% - 'ask' (default): Ask what to do for each such test. +% - 'remove': Remove the test from the file. +% This is appropriate if the test has been removed from the suite. +% - 'keep': Keep the test hash in the file. +% This is appropriate when the test has not executed all tests. +% +% Inputs: +% - status: output cell array of the testing functions +% +% See also: runMatlab2TikzTests, testMatlab2tikz + ipp = m2tInputParser(); + ipp = ipp.addRequired(ipp, 'status', @iscell); + ipp = ipp.addParamValue(ipp, 'dryrun', false, @islogical); + ipp = ipp.addParamValue(ipp, 'removedTests', 'ask', @isValidAction); + ipp = ipp.parse(ipp, status, varargin{:}); + + %% settings + suite = status{1}.testsuite; %TODO: handle multiple test suites in a single array + filename = hashTableName(suite); + READFORMAT = '%s : %s'; + WRITEFORMAT = [READFORMAT '\n']; + + %% process the hash table + oldHashes = readHashesFromFile(filename); + newHashes = updateHashesFromStatus(oldHashes, status); + writeHashesToFile(filename, newHashes); + + % -------------------------------------------------------------------------- + function hashes = updateHashesFromStatus(hashes, status) + % update hashes from the test results in status + oldFunctions = fieldnames(hashes); + newFunctions = cellfun(@(s) s.function, status, 'UniformOutput', false); + + % add hashes from all executed tests + for iFunc = 1:numel(status) + S = status{iFunc}; + thisFunc = S.function; + thisHash = ''; + if isfield(S.hashStage,'found') + thisHash = S.hashStage.found; + elseif S.skip + if isfield(hashes, thisFunc) + % Test skipped, but reference hash present in file + % Probably this means that the developer doesn't have access + % to a certain toolbox. + warning('SaveHashTable:CannotUpdateSkippedTest', ... + 'Test "%s" was skipped. Cannot update hash!',... + thisFunc); + else + % Test skipped and reference hash absent. + % Probably the test is skipped because something is tested + % that relies on HG1/HG2/Octace-specific features and we are + % in the wrong environment for the test. + end + else + warning('SaveHashTable:NoHashFound',... + 'No hash found for "%s"!', thisFunc); + end + if ~isempty(thisHash) + hashes.(thisFunc) = thisHash; + end + end + + % ask what to do with tests for which we have a hash, but no test results + removedTests = setdiff(oldFunctions, newFunctions); + if ~isempty(removedTests) + fprintf(1, 'Some tests in the file were not in the build status.\n'); + end + for iTest = 1:numel(removedTests) + thisTest = removedTests{iTest}; + + action = askActionToPerformOnRemovedTest(thisTest); + switch action + case 'remove' + % useful for test that no longer exist + fprintf(1, 'Removed hash for "%s"\n', thisTest); + hashes = rmfield(hashes, thisTest); + + case 'keep' + % useful when not all tests were executed by the tester + fprintf(1, 'Kept hash for "%s"\n', thisTest); + + end + end + end + function action = askActionToPerformOnRemovedTest(testName) + % ask which action to carry out on a removed test + action = lower(ipp.Results.removedTests); + while ~isActualAction(action) + query = sprintf('Keep or remove "%s"? [Kr]:', testName); + answer = strtrim(input(query,'s')); + + if isempty(answer) || strcmpi(answer(1), 'K') + action = 'keep'; + elseif strcmpi(answer(1), 'R') + action = 'remove'; + else + action = 'ask again'; + % just keep asking until we get a reasonable answer + end + end + end + function writeHashesToFile(filename, hashes) + % write hashes to a file (or stdout when dry-running) + if ~ipp.Results.dryrun + fid = fopen(filename, 'w+'); + finally_fclose_fid = onCleanup(@() fclose(fid)); + else + fid = 1; % Use stdout to print everything + fprintf(fid, '\n\n Output: \n\n'); + end + + funcNames = sort(fieldnames(hashes)); + for iFunc = 1:numel(funcNames) + func = funcNames{iFunc}; + fprintf(fid, WRITEFORMAT, func, hashes.(func)); + end + end + function hashes = readHashesFromFile(filename) + % read hashes from a file + if exist(filename,'file') + fid = fopen(filename, 'r'); + finally_fclose_fid = onCleanup(@() fclose(fid)); + + data = textscan(fid, READFORMAT); + % data is now a cell array with 2 elements, each a (row) cell array + % - the first is all the function names + % - the second is all the hashes + + % Transform `data` into {function1, hash1, function2, hash2, ...}' + % First step is to transpose the data concatenate both fields under + % each other. Since MATLAB indexing uses "column major order", + % traversing the concatenated array is in the order we want. + data = [data{:}]'; + allValues = data(:)'; + else + allValues = {}; + end + hashes = struct(allValues{:}); + end +end +% ============================================================================== +function bool = isValidAction(str) + % returns true for valid actions (keep/remove/ask) on "removedTests": + bool = ismember(lower(str), {'keep','remove','ask'}); +end +function bool = isActualAction(str) + % returns true for actual actions (keep/remove) on "removedTests" + bool = ismember(lower(str), {'keep','remove'}); +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/suites/ACID.m b/matlab/matlab2tikz-1.1.0/test/suites/ACID.m new file mode 100644 index 0000000..42be495 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/ACID.m @@ -0,0 +1,2818 @@ +% ========================================================================= +% *** FUNCTION ACID +% *** +% *** MATLAB2TikZ ACID test functions +% *** +% ========================================================================= +function [status] = ACID(k) + + % assign the functions to test + testfunction_handles = { ... + @multiline_labels , ... + @plain_cos , ... + @sine_with_markers , ... + @markerSizes , ... + @markerSizes2 , ... + @sine_with_annotation, ... + @linesWithOutliers , ... + @peaks_contour , ... + @contourPenny , ... + @peaks_contourf , ... + @many_random_points , ... + @double_colorbar , ... + @randomWithLines , ... + @double_axes , ... + @double_axes2 , ... + @logplot , ... + @colorbarLogplot , ... + @legendplot , ... + @legendplotBoxoff , ... + @plotyyLegends , ... + @zoom , ... + @quiveroverlap , ... + @quiverplot , ... + @quiver3plot , ... + @logicalImage , ... + @imagescplot , ... + @imagescplot2 , ... + @stairsplot , ... + @polarplot , ... + @roseplot , ... + @compassplot , ... + @stemplot , ... + @stemplot2 , ... + @bars , ... + @xAxisReversed , ... + @errorBars , ... + @errorBars2 , ... + @subplot2x2b , ... + @manualAlignment , ... + @subplotCustom , ... + @legendsubplots , ... + @bodeplots , ... + @rlocusPlot , ... + @mandrillImage , ... + @besselImage , ... + @clownImage , ... + @zplanePlot1 , ... + @zplanePlot2 , ... + @freqResponsePlot , ... + @axesLocation , ... + @axesColors , ... + @multipleAxes , ... + @scatterPlotRandom , ... + @scatterPlot , ... + @scatter3Plot , ... + @spherePlot , ... + @surfPlot , ... + @surfPlot2 , ... + @superkohle , ... + @meshPlot , ... + @ylabels , ... + @spectro , ... % takes pretty long to LuaLaTeX-compile + @mixedBarLine , ... + @decayingharmonic , ... + @texcolor , ... + @textext , ... + @texrandom , ... + @latexInterpreter , ... + @latexmath2 , ... + @parameterCurve3d , ... + @parameterSurf , ... + @fill3plot , ... + @rectanglePlot , ... + @herrorbarPlot , ... + @hist3d , ... + @myBoxplot , ... + @areaPlot , ... + @customLegend , ... + @pixelLegend , ... + @croppedImage , ... + @pColorPlot , ... + @hgTransformPlot , ... + @scatterPlotMarkers , ... + @multiplePatches , ... + @logbaseline , ... + @alphaImage , ... + @annotationAll , ... + @annotationSubplots , ... + @annotationText , ... + @annotationTextUnits , ... + @imageOrientation_PNG, ... + @imageOrientation_inline, ... + @texInterpreter , ... + @stackedBarsWithOther, ... + @colorbarLabelTitle , ... + @textAlignment , ... + @overlappingPlots , ... + @histogramPlot , ... + @alphaTest , ... + @removeOutsideMarker , ... + @colorbars , ... + @colorbarManualLocationRightOut , ... + @colorbarManualLocationRightIn , ... + @colorbarManualLocationLeftOut , ... + @colorbarManualLocationLeftIn + }; + + + numFunctions = length( testfunction_handles ); + + if (k<=0) + status = testfunction_handles; + return; % This is used for querying numFunctions. + + elseif (k<=numFunctions) + status = testfunction_handles{k}(); + status.function = func2str(testfunction_handles{k}); + + else + error('testfunctions:outOfBounds', ... + 'Out of bounds (number of testfunctions=%d)', numFunctions); + end + +end +% ========================================================================= +function data = ACID_data() + % Data to be used for various ACID tests + % This ensures the tests don't rely on functions that yield + % non-deterministic output, e.g. `rand` and `svd`. + data = [ 11 11 9 + 7 13 11 + 14 17 20 + 11 13 9 + 43 51 69 + 38 46 76 + 61 132 186 + 75 135 180 + 38 88 115 + 28 36 55 + 12 12 14 + 18 27 30 + 18 19 29 + 17 15 18 + 19 36 48 + 32 47 10 + 42 65 92 + 57 66 151 + 44 55 90 + 114 145 257 + 35 58 68 + 11 12 15 + 13 9 15 + 10 9 7]; +end +% ========================================================================= +function [stat] = multiline_labels() + stat.description = 'Test multiline labels and plot some points.'; + stat.unreliable = isOctave || isMATLAB(); %FIXME: `width` is inconsistent, see #552 + + m = [0 1 1.5 1 -1]; + plot(m,'*-'); hold on; + plot(m(end:-1:1)-0.5,'x--'); + + title({'multline','title'}); + legend({sprintf('multi-line legends\ndo work 2^2=4'), ... + sprintf('second\nplot')}); + xlabel(sprintf('one\ntwo\nthree')); + ylabel({'one','° ∞', 'three'}); + + set(gca,'YTick', []); + set(gca,'XTickLabel',{}); +end +% ========================================================================= +function [stat] = plain_cos() + stat.description = 'Plain cosine function.'; + + t = linspace(0, 2*pi, 1e5); + x = cos(t); + + % Explicitely cut the line into segments + x([2e4, 5e4, 8e4]) = NaN; + + % Plot the cosine + plot(t, x); + xlim([0, 2*pi]); + + % also add some patches to test their border color reproduction + hold on; + h(1) = fill(pi*[1/4 1/4 1/2 1/2] , [-2 1 1 -2], 'y'); + h(2) = fill(pi*[1/4 1/4 1/2 1/2]+pi, -[-2 1 1 -2], 'y'); + + set(h(1), 'EdgeColor', 'none', 'FaceColor', 0.8*[1 1 1]); + set(h(2), 'EdgeColor', 'k', 'FaceColor', 0.5*[1 1 1]); + + if isMATLAB + uistack(h, 'bottom'); % patches below the line plot + % this is not supported in Octave + end + + % add some minor ticks + set(gca, 'XMinorTick', 'on'); + set(gca, 'YTick', []); + + % Adjust the aspect ratio when in MATLAB(R) or Octave >= 3.4. + if isOctave('<=', [3,4]) + % Octave < 3.4 doesn't have daspect unfortunately. + else + daspect([ 1 2 1 ]) + end +end +% ========================================================================= +function [stat] = sine_with_markers () + % Standard example plot from MATLAB's help pages. + stat.description = [ 'Twisted plot of the sine function. ' ,... + 'Pay particular attention to how markers and Infs/NaNs are treated.' ]; + + x = -pi:pi/10:pi; + y = sin(x); + y(3) = NaN; + y(7) = Inf; + y(11) = -Inf; + plot(x,y,'--o', 'Color', [0.6,0.2,0.0], ... + 'LineWidth', 1*360/127,... + 'MarkerEdgeColor','k',... + 'MarkerFaceColor',[0.3,0.1,0.0],... + 'MarkerSize', 5*360/127 ); + + set( gca, 'Color', [0.9 0.9 1], ... + 'XTickLabel', [], ... + 'YTickLabel', [] ... + ); + + set(gca,'XTick',[0]); + set(gca,'XTickLabel',{'null'}); +end +% ========================================================================= +function [stat] = markerSizes() + stat.description = 'Marker sizes.'; + + hold on; + + h = fill([1 1 2 2],[1 2 2 1],'r'); + set(h,'LineWidth',10); + + plot([0],[0],'go','Markersize',14,'LineWidth',10) + plot([0],[0],'bo','Markersize',14,'LineWidth',1) +end +% ========================================================================= +function [stat] = markerSizes2() + stat.description = 'Line plot with with different marker sizes.'; + + hold on; + grid on; + + n = 1:10; + d = 10; + s = round(linspace(6,25,10)); + e = d * ones(size(n)); + style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'}; + nStyles = numel(style); + + for ii = 1:nStyles + for jj = 1:10 + plot(n(jj), ii * e(jj),style{ii},'MarkerSize',s(jj)); + end + end + xlim([min(n)-1 max(n)+1]); + ylim([0 d*(nStyles+1)]); + set(gca,'XTick',n,'XTickLabel',s,'XTickLabelMode','manual'); +end +% ========================================================================= +function [stat] = sine_with_annotation () + stat.description = [ 'Plot of the sine function. ',... + 'Pay particular attention to how titles and annotations are treated.' ]; + stat.unreliable = isOctave || isMATLAB('>=',[8,4]) ... %FIXME: investigate + || isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + + x = -pi:.1:pi; %TODO: the 0.1 step is probably a bad idea (not representable in float) + y = sin(x); + h = plot(x,y); + set(gca,'XTick',-pi:pi/2:pi); + + set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'}); + + xlabel('-\pi \leq \Theta \leq \pi'); + ylabel('sin(\Theta)'); + title({'Plot of sin(\Theta)','subtitle','and here''s one really long subtitle' }); + text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)',... + 'HorizontalAlignment','left'); + + % Doesn't work in Octave + %set(findobj(gca,'Type','line','Color',[0 0 1]),... + % 'Color','red',... + % 'LineWidth',10); + +end +% ========================================================================= +function [stat] = linesWithOutliers() + stat.description = 'Lines with outliers.'; + stat.issues = [392,400]; + + far = 200; + x = [ -far, -1, -1, -far, -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far ]; + y = [ -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far, -1, -1, -far, -0.5 ]; + plot( x, y,'o-'); + axis( [-2,2,-2,2] ); +end +% ========================================================================= +function [stat] = peaks_contour() + stat.description = 'Test contour plots.'; + stat.unreliable = isMATLAB('<', [8,4]) || isOctave; %R2014a and older + % FIXME: see #604; contour() produces inconsistent output + + subplot(121) + [C, h] = contour(peaks(20),10); + clabel(C, h); + + % remove y-ticks + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + + colormap winter; + + % Contour layers with predefined color + subplot(122) + contour(peaks(20), 10,'r', 'LineWidth', 5) + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); +end +% ========================================================================= +function [stat] = contourPenny() + stat.description = 'Contour plot of a US\$ Penny.'; + stat.unreliable = isMATLAB('<', [8,4]); + % FIXME: see #604; contour() produces inconsistent output (mac/windows of PeterPablo) + stat.issues = [49 404]; + + if ~exist('penny.mat','file') + fprintf( 'penny data set not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + load penny; + contour(flipud(P)); + axis square; + +end +% ========================================================================= +function [stat] = peaks_contourf () + stat.description = 'Test the contourfill plots.'; + stat.unreliable = isMATLAB('>=', [8,4]); % FIXME: inspect this + stat.issues = 582; + + [trash, h] = contourf(peaks(20), 10); + hold on + plot(1:20) + colorbar(); + legend(h, 'Contour'); + colormap hsv; +end +% ========================================================================= +function [stat] = double_colorbar() + stat.description = 'Double colorbar.'; + + if isOctave() + fprintf( 'Octave can''t handle tight axes.\n\n' ); + stat.skip = true; + return + end + + vspace = linspace(-40,40,20); + speed_map = magic(20).'; + Q1_map = magic(20); + + subplot(1, 2, 1); + contour(vspace(9:17),vspace(9:17),speed_map(9:17,9:17),20) + colorbar + axis tight + axis square + xlabel('$v_{2d}$') + ylabel('$v_{2q}$') + + subplot(1, 2, 2) + contour(vspace(9:17),vspace(9:17),Q1_map(9:17,9:17),20) + colorbar + axis tight + axis square + xlabel('$v_{2d}$') + ylabel('$v_{2q}$') +end +% ========================================================================= +function [stat] = randomWithLines() + stat.description = 'Lissajous points with lines.'; + + beta = 42.42; + t = 1:150; + X = [sin(t); cos(beta * t)].'; + + X(:,1) = (X(:,1) * 90) + 75; + plot(X(:,1),X(:,2),'o'); + hold on; + M(1)=min(X(:,1)); + M(2)=max(X(:,1)); + mn = mean(X(:,2)); + s = std(X(:,2)); + plot(M,[mean(X(:,2)) mean(X(:,2))],'k-'); + plot(M,mn + 1*[s s],'--'); + plot(M,mn - 2*[s s],'--'); + axis('tight'); +end +% ========================================================================= +function [stat] = many_random_points () + stat.description = 'Test the performance when drawing many points.'; + + n = 1e3; + alpha = 1024; + beta = 1; + gamma = 5.47; + + x = cos( (1:n) * alpha ); + y = sin( (1:n) * beta + gamma); + + plot ( x, y, '.r' ); + axis([ 0, 1, 0, 1 ]) +end +% ========================================================================= +function [stat] = double_axes() + stat.description = 'Double axes'; + + dyb = 0.1; % normalized units, bottom offset + dyt = 0.1; % separation between subsequent axes bottoms + + x = [0; 24; 48; 72; 96;]; + y = [7.653 7.473 7.637 7.652 7.651]; + + grid on + h1 = plot(x,y,'Color','k'); + + % following code is taken from `floatAxisX.m' + + % get position of axes + allAxes = findobj(gcf,'type','axes'); + naxes = length(allAxes); + ax1Pos = get(allAxes(naxes),'position'); + + % rescale and reposition all axes to handle additional axes + for an=1:naxes-1 + if isequal(rem(an,2),0) + % even ones in array of axes handles represent axes on which lines are plotted + set(allAxes(an),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt]) + else + % odd ones in array of axes handles represent axes on which floating x-axss exist + axPos = get(allAxes(an),'Position'); + set(allAxes(an),'Position',[axPos(1,1) axPos(1,2)+dyb axPos(1,3) axPos(1,4)]) + end + end + % first axis a special case (doesn't fall into even/odd scenario of figure children) + set(allAxes(naxes),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt]) + ylimit1 = get(allAxes(naxes),'Ylim'); + + % get new position for plotting area of figure + ax1Pos = get(allAxes(naxes),'position'); + + % axis to which the floating axes will be referenced + ref_axis = allAxes(1); + refPosition = get(ref_axis,'position'); + + % overlay new axes on the existing one + ax2 = axes('Position',ax1Pos); + % plot data and return handle for the line + hl1 = plot(x,y,'k'); + % make the new axes invisible, leaving only the line visible + set(ax2,'visible','off','ylim',ylimit1) + + % set the axis limit mode so that it does not change if the + % user resizes the figure window + set(ax2,'xLimMode','manual') + + % set up another set of axes to act as floater + ax3 = axes('Position',[refPosition(1) refPosition(2)-dyb refPosition(3) 0.01]); + + set(ax3,'box','off','ycolor','w','yticklabel',[],'ytick',[]) + set(ax3,'XMinorTick','on','color','none','xcolor',get(hl1,'color')) + + xlabel('secondary axis') +end +% ========================================================================= +function [stat] = double_axes2() + stat.description = 'Double overlayed axes with a flip.' ; + + ah1=axes; + ph=plot([0 1],[0 1]); + + title('Title') + ylabel('y') + xlabel('x') + + % add a new set of axes + % to make a gray grid + ah2=axes; + % make the background transparent + set(ah1,'color','none') + % move these axes to the back + set(gcf,'Children',flipud(get(gcf,'Children'))) +end +% ========================================================================= +function [stat] = logplot() + stat.description = 'Test logscaled axes.'; + % This was once unreliable (and linked to #590). Mac and Linux seem fine. + + x = logspace(-1,2); + y = exp(x); + loglog(x, y, '-s') + + ylim([1 1e45]); + grid on; + if isprop(gca,'GridColor') + set(gca, 'GridColor', 'red'); + set(gca, 'MinorGridColor', 'blue'); + else + %TODO equivalent HG1 settings (if those exist) + end +end +% ========================================================================= +function [stat] = colorbarLogplot() + stat.description = 'Logscaled colorbar.'; + stat.unreliable = isOctave; % FIXME: investigate (Travis differs from Linux/Mac octave) + % https://github.com/matlab2tikz/matlab2tikz/pull/641#issuecomment-120481564 + + imagesc([1 10 100]); + try + set(colorbar(), 'YScale', 'log'); + catch + warning('M2TAcid:LogColorBar',... + 'Logarithmic Colorbars are not documented in MATLAB R2014b and Octave'); + stat.skip = true; + end +end +% ========================================================================= +function [stat] = legendplot() + stat.description = 'Test inserting of legends.'; + stat.unreliable = isMATLAB || isOctave; % FIXME: investigate + +% x = -pi:pi/20:pi; +% plot(x,cos(x),'-ro',x,sin(x),'-.b'); +% h = legend('one pretty long legend cos_x','sin_x',2); +% set(h,'Interpreter','none'); + + x = linspace(0, 2*pi, 1e5); + plot( x, sin(x), 'b', ... + x, cos(x), 'r' ); + xlim( [0 2*pi] ) + ylim( [-0.9 0.9] ) + title( '{tikz test}' ) + xlabel( '{x-Values}' ) + ylabel( '{y-Values}' ) + legend( 'sin(x)', 'cos(x)', 'Location','NorthOutside', ... + 'Orientation', 'Horizontal' ); + grid on; +end +% ========================================================================= +function [stat] = legendplotBoxoff () + stat.description = 'Test inserting of legends.'; + stat.issues = [607,609]; + + x = -pi:pi/20:pi; + l = plot(x, cos(x),'-ro',... + x, sin(x),'-.b'); + h = legend(l(2), 'one pretty long legend sin_x (dash-dot)', 'Location', 'northeast'); + set(h, 'Interpreter', 'none'); + legend boxoff +end +% ========================================================================= +function [stat] = plotyyLegends() + stat.description = 'More legends.'; + + x = 0:.1:7; + y1 = sin(x); + y2 = cos(x); + [ax,h1,h2] = plotyy(x,y1,x,y2); + legend([h1;h2],'Sine','Cosine'); +end +% ========================================================================= +function [stat] = zoom() + stat.description = ['Test function \texttt{pruneOutsideBox()} ', ... + 'and \texttt{movePointsCloser()} ', ... + 'of \texttt{cleanfigure()}.']; + stat.unreliable = isOctave; %FIXME: investigate + stat.issues = [226,392,400]; + + % Setup + subplot(311) + plot(1:10,10:-1:1,'-r*',1:15,repmat(9,1,15),'-g*',[5.5,5.5],[1,9],'-b*') + hold on; + stairs(1:10,'-m*'); + plot([2,8.5,8.5,2,2],[2,2,7.5,7.5,2],'--k'); + title('setup'); + legend('cross with points','no cross','cross no points','stairs','zoom area'); + + % Last comes before simple zoomin due to cleanfigure + subplot(313) + plot(1:10,10:-1:1,'-r*',1:10,repmat(9,1,10),'-g*',[5.5,5.5],[1,9],'-b*'); + hold on; + stairs(1:10,'-m*'); + xlim([2, 8.5]), ylim([2,7.5]); + cleanfigure(); % FIXME: this generates many "division by zero" in Octave + plot([2,8.5,8.5,2,2],[2,2,7.5,7.5,2],'--k'); + xlim([0, 15]), ylim([0,10]); + title('zoom in, cleanfigure, zoom out'); + + % Simple zoom in + subplot(312) + plot(1:10,10:-1:1,'-r*',1:10,repmat(9,1,10),'-g*',[5.5,5.5],[1,9],'-b*'); + hold on; + stairs(1:10,'-m*'); + xlim([2, 8.5]), ylim([2,7.5]); + title('zoom in'); +end +% ========================================================================= +function [stat] = bars() + stat.description = '2x2 Subplot with different bars'; + stat.unreliable = isOctave || isMATLAB('>=', [8,4]) || ... % FIXME: investigate + isMATLAB('<=', [8,3]); %FIXME: #749 (Jenkins) + + % dataset grouped + bins = 10 * (-0.5:0.1:0.5); + numEntries = length(bins); + + alpha = [13 11 7]; + numBars = numel(alpha); + plotData = zeros(numEntries, numBars); + for iBar = 1:numBars + plotData(:,iBar) = abs(round(100*sin(alpha(iBar)*(1:numEntries)))); + end + + % dataset stacked + data = ACID_data; + Y = round(abs(data(2:6,1:3))/10); + + subplot(2,2,1); + b1 = bar(bins,plotData,'grouped','BarWidth',1.5); + set(gca,'XLim',[1.25*min(bins) 1.25*max(bins)]); + + subplot(2,2,2); + barh(bins, plotData, 'grouped', 'BarWidth', 1.3); + + subplot(2,2,3); + bar(Y, 'stacked'); + + subplot(2,2,4); + b2= barh(Y,'stacked','BarWidth', 0.75); + + set(b1(1),'FaceColor','m','EdgeColor','none') + set(b2(1),'FaceColor','c','EdgeColor','none') + +end +% ========================================================================= +function [stat] = stemplot() + stat.description = 'A simple stem plot.' ; + + x = 0:25; + y = [exp(-.07*x).*cos(x); + exp(.05*x).*cos(x)]'; + h = stem(x, y); + legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest'); + set(h(1),'MarkerFaceColor','blue'); + set(h(2),'MarkerFaceColor','red','Marker','square'); + + % Octave 4 has some smart behavior: it only prints a single baseline. + % Let's mimick this behavior everywhere else. + baselines = findall(gca, 'Type', 'line', 'Color', [0 0 0]); + if numel(baselines) > 1 + % We only need the last line in Octave 3.8, as that is where + % Octave 4.0 places the baseline + delete(baselines(1:end-1)); + end +end +% ========================================================================= +function [stat] = stemplot2() + stat.description = 'Another simple stem plot.'; + stat.unreliable = isOctave('>=', 4); %FIXME: see #759, #757/#759 and #687 + + x = 0:25; + y = [exp(-.07*x).*cos(x); + exp(.05*x).*cos(x)]'; + h = stem(x, y, 'filled'); + legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest'); +end +% ========================================================================= +function [stat] = stairsplot() + stat.description = 'A simple stairs plot.' ; + + X = linspace(-2*pi,2*pi,40)'; + Yconst = [zeros(10,1); 0.5*ones(20,1);-0.5*ones(10,1)]; + Y = [sin(X), 0.2*cos(X), Yconst]; + h = stairs(Y); + legend(h(2),'second entry') +end +% ========================================================================= +function [stat] = quiverplot() + stat.description = 'A combined quiver/contour plot of $x\exp(-x^2-y^2)$.' ; + stat.extraOptions = {'arrowHeadSize', 2}; + + [X,Y] = meshgrid(-2:.2:2); + Z = X.*exp(-X.^2 - Y.^2); + [DX,DY] = gradient(Z,.2,.2); + contour(X,Y,Z); + hold on + quiver(X,Y,DX,DY); + %TODO: also show a `quiver(X,Y,DX,DY,0);` to test without scaling + colormap hsv; + hold off +end +% ========================================================================= +function [stat] = quiver3plot() + stat.description = 'Three-dimensional quiver plot.' ; + stat.unreliable = isMATLAB(); %FIXME: #590 + + vz = 10; % Velocity + a = -32; % Acceleration + + t = 0:.1:1; + z = vz*t + 1/2*a*t.^2; + + vx = 2; + x = vx*t; + vy = 3; + y = vy*t; + + u = gradient(x); + v = gradient(y); + w = gradient(z); + scale = 0; + quiver3(x,y,z,u,v,w,scale) + view([70 18]) +end +% ========================================================================= +function [stat] = quiveroverlap () + stat.description = 'Quiver plot with avoided overlap.'; + stat.issues = [679]; + % TODO: As indicated in #679, the native quiver scaling algorithm still isn't + % perfect. As such, in MATLAB the arrow heads may appear extremely tiny. + % In Octave, they look fine though. Once the scaling has been done decently, + % this reminder can be removed. + if isOctave + stat.extraOptions = {'arrowHeadSize', 20}; + end + + x = [0 1]; + y = [0 0]; + u = [1 -1]; + v = [1 1]; + + hold all; + qvr1 = quiver(x,y,u,v); + qvr2 = quiver(x,y,2*u,2*v); + set(qvr2, 'MaxHeadSize', get(qvr1, 'MaxHeadSize')/2); +end +% ========================================================================= +function [stat] = polarplot () + stat.description = 'A simple polar plot.' ; + stat.extraOptions = {'showHiddenStrings',true}; + stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687 + isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + t = 0:.01:2*pi; + polar(t,sin(2*t).*cos(2*t),'--r') +end +% ========================================================================= +function [stat] = roseplot () + stat.description = 'A simple rose plot.' ; + stat.extraOptions = {'showHiddenStrings',true}; + stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687 + isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + + theta = 2*pi*sin(linspace(0,8,100)); + rose(theta); +end +% ========================================================================= +function [stat] = compassplot () + stat.description = 'A simple compass plot.' ; + stat.extraOptions = {'showHiddenStrings',true}; + stat.unreliable = isOctave('>=', 4) || ... %FIXME: see #759, #757/#759 and #687 + isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + + Z = (1:20).*exp(1i*2*pi*cos(1:20)); + compass(Z); +end +% ========================================================================= +function [stat] = logicalImage() + stat.description = 'An image plot of logical matrix values.' ; + stat.unreliable = isOctave; %FIXME: investigate + % different `width`, see issue #552# (comment 76918634); (Travis differs from Linux/Mac octave) + + plotData = magic(10); + imagesc(plotData > mean(plotData(:))); + colormap('hot'); +end +% ========================================================================= +function [stat] = imagescplot() + stat.description = 'An imagesc plot of $\sin(x)\cos(y)$.'; + stat.unreliable = isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave) + + pointsX = 10; + pointsY = 20; + x = 0:1/pointsX:1; + y = 0:1/pointsY:1; + z = sin(x)'*cos(y); + imagesc(x,y,z); +end +% ========================================================================= +function [stat] = imagescplot2() + stat.description = 'A trimmed imagesc plot.'; + stat.unreliable = isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave) + + a=magic(10); + x=-5:1:4; + y=10:19; + imagesc(x,y,a) + + xlim([-3,2]) + ylim([12,15]) + + grid on; +end +% ========================================================================= +function [stat] = xAxisReversed () + stat.description = 'Reversed axes with legend.' ; + + n = 100; + x = (0:1/n:1); + y = exp(x); + plot(x,y); + set(gca,'XDir','reverse'); + set(gca,'YDir','reverse'); + if isOctave('<=', [3,8]) + % TODO: see whether we can unify this syntax for all environments + % at the moment, the generic syntax doesn't seem to work for Octave + % 3.8 (it doesn't even show a legend in gnuplut). + legend( 'data1', 'Location', 'SouthWest' ); + else + legend( 'Location', 'SouthWest' ); + end +end +% ========================================================================= +function [stat] = subplot2x2b () + stat.description = 'Three aligned subplots on a $2\times 2$ subplot grid.' ; + stat.unreliable = isOctave || isMATLAB(); + % FIXME: this test is unreliable because the automatic axis limits + % differ on different test platforms. Reckon this by creating the figure + % using `ACID(97)` and then manually slightly modify the window size. + % We should not set the axis limits explicitly rather find a better way. + % #591 + + x = (1:5); + + subplot(2,2,1); + y = sin(x.^3); + plot(x,y); + + subplot(2,2,2); + y = cos(x.^3); + plot(x,y); + + subplot(2,2,3:4); + y = tan(x); + plot(x,y); +end +% ========================================================================= +function [stat] = manualAlignment() + stat.description = 'Manually aligned figures.'; + + xrange = linspace(-3,4,2*1024); + + axes('Position', [0.1 0.1 0.85 0.15]); + plot(xrange); + ylabel('$n$'); + xlabel('$x$'); + + axes('Position', [0.1 0.25 0.85 0.6]); + plot(xrange); + set(gca,'XTick',[]); +end +% ========================================================================= +function [stat] = subplotCustom () + stat.description = 'Three customized aligned subplots.'; + stat.unreliable = isMATLAB(); % FIXME: #590 + + x = (1:5); + + y = cos(sqrt(x)); + subplot( 'Position', [0.05 0.1 0.3 0.3] ) + plot(x,y); + + y = sin(sqrt(x)); + subplot( 'Position', [0.35 0.5 0.3 0.3] ) + plot(x,y); + + y = tan(sqrt(x)); + subplot( 'Position', [0.65 0.1 0.3 0.3] ) + plot(x,y); +end +% ========================================================================= +function [stat] = errorBars() + stat.description = 'Generic error bar plot.'; + + data = ACID_data; + plotData = 1:10; + + eH = abs(data(1:10,1))/10; + eL = abs(data(1:10,3))/50; + + x = 1:10; + hold all; + errorbar(x, plotData, eL, eH, '.') + h = errorbar(x+0.5, plotData, eL, eH); + set(h, 'LineStyle', 'none'); + % Octave 3.8 doesn't support passing extra options to |errorbar|, but + % it does allow for changing it after the fact +end +% ========================================================================= +function [stat] = errorBars2() + stat.description = 'Another error bar example.'; + data = ACID_data; + y = mean( data, 2 ); + e = std( data, 1, 2 ); + errorbar( y, e, 'xr' ); +end +% ========================================================================= +function [stat] = legendsubplots() + stat.description = [ 'Subplots with legends. ' , ... + 'Increase value of "length" in the code to stress-test your TeX installation.' ]; + stat.unreliable = isOctave; %FIXME: investigate + stat.issues = 609; + + % size of upper subplot + rows = 4; + % number of points. A large number here (eg 1000) will stress-test + % matlab2tikz and your TeX installation. Be prepared for it to run out of + % memory + length = 100; + + % generate some spurious data + t = 0:(4*pi)/length:4*pi; + x = t; + a = t; + y = sin(t) + 0.1*sin(134*t.^2); + b = sin(t) + 0.1*cos(134*t.^2) + 0.05*cos(2*t); + + % plot the top figure + subplot(rows+2,1,1:rows); + + % first line + sigma1 = std(y); + tracey = mean(y,1); + plot123 = plot(x,tracey,'b-'); + + hold on + + % second line + sigma2 = std(b); + traceb = mean(b,1); + plot456 = plot(a,traceb,'r-'); + + spec0 = ['Mean V(t)_A (\sigma \approx ' num2str(sigma1,'%0.4f') ')']; + spec1 = ['Mean V(t)_B (\sigma \approx ' num2str(sigma2,'%0.4f') ')']; + + hold off + %plot123(1:2) + legend([plot123; plot456],spec0,spec1) + legend boxoff + xlabel('Time/s') + ylabel('Voltage/V') + title('Time traces'); + + % now plot a differential trace + subplot(rows+2,1,rows+1:rows+2) + plot7 = plot(a,traceb-tracey,'k'); + + legend(plot7,'\Delta V(t)') + legend boxoff + xlabel('Time/s') + ylabel('\Delta V') + title('Differential time traces'); +end +% ========================================================================= +function [stat] = bodeplots() + stat.description = 'Bode plots with legends.'; + stat.unreliable = isMATLAB(); % FIXME: inconsistent axis limits and + % tick positions; see #641 (issuecomment-106241711) + + if isempty(which('tf')) + fprintf( 'function "tf" not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + Rc=1; + C=1.5e-6; %F + + % Set inductors + L1=4e-3; + L2=0.8e-3; + + % Resistances of inductors + R1=4; + R2=2; + + % Transfer functions + % Building transfer functions + s=tf('s'); + Zc=1/(s*C)+Rc; + Z1=s*L1+R1; + Z2=s*L2+R2; + LCLd=(Z2+Zc)/(Z1+Zc); + LCL=(s^2*C*L2+1)/(s^2*C*L1+1); + + t=logspace(3,5,1000); + bode(LCL,t) + hold on + bode(LCLd,t) + title('Voltage transfer function of a LCL filter') + set(findall(gcf,'type','line'),'linewidth',1.5) + grid on + + legend('Perfect LCL',' Real LCL','Location','SW') + + % Work around a peculiarity in MATLAB: when the figure is invisible, + % the XData/YData of all plots is NaN. It gets set to the proper values when + % the figure is actually displayed. To do so, we temporarily toggle this + % option. This triggers the call-back (and might flicker the figure). + isVisible = get(gcf,'visible'); + set(gcf,'visible','on') + set(gcf,'visible',isVisible); +end +% ========================================================================= +function [stat] = rlocusPlot() + stat.description = 'rlocus plot.'; + stat.unreliable = isMATLAB(); % FIXME: radial grid is not present on all + % environments (see #641) + + if isempty(which('tf')) + fprintf( 'function "tf" not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + if isMATLAB('<', [8,4]) + % in MATLAB R2014a and below, `rlocus` plots with no background color + % are not supported. So, force that color to white to work around + % that bug. Newer versions don't suffer from this. + set(gca, 'Color', 'w'); + end + + rlocus(tf([1 1],[4 3 1])) + + % Work around a peculiarity in MATLAB: when the figure is invisible, + % the XData/YData of all plots is NaN. It gets set to the proper values when + % the figure is actually displayed. To do so, we temporarily toggle this + % option. This triggers the call-back (and might flicker the figure). + isVisible = get(gcf,'visible'); + set(gcf,'visible','on') + set(gcf,'visible',isVisible); +end +% ========================================================================= +function [stat] = mandrillImage() + stat.description = 'Picture of a mandrill.'; + + if ~exist('mandrill.mat','file') + fprintf( 'mandrill data set not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + data = load( 'mandrill' ); + image( data.X ) % show image + colormap( data.map ) % adapt colormap + axis image % pixels should be square + axis off % disable axis +end +% ========================================================================= +function [stat] = besselImage() + stat.description = 'Bessel function.'; + stat.unreliable = isOctave(); % FIXME (Travis differs from Linux/Mac octave) + + nu = -5:0.25:5; + beta = 0:0.05:2.5; + + m = length(beta); + n = length(nu); + trace = zeros(m,n); + for i=1:length(beta); + for j=1:length(nu) + if (floor(nu(j))==nu(j)) + trace(i,j)=abs(besselj(nu(j),beta(i))); + end + end + end + + imagesc(nu,beta,trace); + colorbar() + xlabel('Order') + ylabel('\beta') + set(gca,'YDir','normal') +end +% ========================================================================= +function [stat] = clownImage() + stat.description = 'Picture of a clown.'; + + if ~exist('clown.mat','file') + fprintf( 'clown data set not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + data = load( 'clown' ); + imagesc( data.X ) + colormap( gray ) +end +% ========================================================================= +function [stat] = zplanePlot1() + stat.description = 'Representation of the complex plane with zplane.'; + stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate + + % check of the signal processing toolbox is installed + verInfo = ver('signal'); + if isempty(verInfo) || isempty(verInfo.Name) + fprintf( 'Signal toolbox not found. Skip.\n\n' ); + stat.skip = true; + + return + end + + [z,p] = ellip(4,3,30,200/500); + zplane(z,p); + title('4th-Order Elliptic Lowpass Digital Filter'); +end +% ========================================================================= +function [stat] = zplanePlot2() + stat.description = 'Representation of the complex plane with zplane.'; + stat.unreliable = isMATLAB; % FIXME: #604; only difference is `width` + stat.closeall = true; + + % check of the signal processing toolbox is installed + verInfo = ver('signal'); + if isempty(verInfo) || isempty(verInfo.Name) + fprintf( 'Signal toolbox not found. Skip.\n\n' ); + stat.skip = true; + return + end + + [b,a] = ellip(4,3,30,200/500); + Hd = dfilt.df1(b,a); + zplane(Hd) % FIXME: This opens a new figure that doesn't get closed automatically +end +% ========================================================================= +function [stat] = freqResponsePlot() + stat.description = 'Frequency response plot.'; + stat.closeall = true; + stat.issues = [409]; + stat.unreliable = isMATLAB(); % FIXME: investigate + % See also: https://github.com/matlab2tikz/matlab2tikz/pull/759#issuecomment-138477207 + % and https://gist.github.com/PeterPablo/b01cbe8572a9e5989037 (R2014b) + + % check of the signal processing toolbox is installed + verInfo = ver('signal'); + if isempty(verInfo) || isempty(verInfo.Name) + fprintf( 'Signal toolbox not found. Skip.\n\n' ); + stat.skip = true; + return + end + + b = fir1(80,0.5,kaiser(81,8)); + hd = dfilt.dffir(b); + freqz(hd); % FIXME: This opens a new figure that doesn't get closed automatically +end +% ========================================================================= +function [stat] = axesLocation() + stat.description = 'Swapped axis locations.'; + stat.issues = 259; + + plot(cos(1:10)); + set(gca,'XAxisLocation','top'); + set(gca,'YAxisLocation','right'); +end +% ========================================================================= +function [stat] = axesColors() + stat.description = 'Custom axes colors.'; + + plot(sin(1:15)); + set(gca,'XColor','g','YColor','b'); +% set(gca,'XColor','b','YColor','k'); + box off; +end +% ========================================================================= +function [stat] = multipleAxes() + stat.description = 'Multiple axes.'; + + x1 = 0:.1:40; + y1 = 4.*cos(x1)./(x1+2); + x2 = 1:.2:20; + y2 = x2.^2./x2.^3; + + line(x1,y1,'Color','r'); + ax1 = gca; + set(ax1,'XColor','r','YColor','r') + + ax2 = axes('Position',get(ax1,'Position'),... + 'XAxisLocation','top',... + 'YAxisLocation','right',... + 'Color','none',... + 'XColor','k','YColor','k'); + + line(x2,y2,'Color','k','Parent',ax2); + + xlimits = get(ax1,'XLim'); + ylimits = get(ax1,'YLim'); + xinc = (xlimits(2)-xlimits(1))/5; + yinc = (ylimits(2)-ylimits(1))/5; + + % Now set the tick mark locations. + set(ax1,'XTick',xlimits(1):xinc:xlimits(2) ,... + 'YTick',ylimits(1):yinc:ylimits(2) ) +end +% ========================================================================= +function [stat] = scatterPlotRandom() + stat.description = 'Generic scatter plot.'; + + n = 1:100; + + % MATLAB: Use the default area of 36 points squared. The units for the + % marker area is points squared. + % octave: If s is not given, [...] a default value of 8 points is used. + % Try obtain similar behavior and thus apply square root: sqrt(36) vs. 8 + sArea = 1000*(1+cos(n.^1.5)); % scatter size in unit points squared + sRadius = sqrt(sArea*pi); + if isMATLAB() + s = sArea; % unit: points squared + elseif isOctave() + s = sRadius; % unit: points + end + + scatter(n, n, s, n.^8); + colormap autumn; +end +% ========================================================================= +function [stat] = scatterPlot() + stat.description = 'Scatter plot with MATLAB(R) stat.'; + if ~exist('seamount.mat','file') + fprintf( 'seamount data set not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + data = load( 'seamount' ); + scatter( data.x, data.y, 5, data.z, '^' ); +end +% ========================================================================= +function [stat] = scatterPlotMarkers() + stat.description = 'Scatter plot with with different marker sizes and legend.'; + % FIXME: octave: Output is empty?! Potentially fixed by #669 + + n = 1:10; + d = 10; + e = d * ones(size(n)); + + % MATLAB: Use the default area of 36 points squared. The units for the + % marker area is points squared. + % octave: If s is not given, [...] a default value of 8 points is used. + % Try obtain similar behavior and thus apply square root: sqrt(36) vs. 8 + sArea = d^2 * n; % scatter size in unit points squared + sRadius = sqrt(sArea); + if isMATLAB() + s = sArea; % unit: points squared + elseif isOctave() + s = sRadius; % unit: points + end + + grid on; + hold on; + + style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'}; + names = {'bx','rd','go','c.','m plus','y star','bs','mv',... + 'k up triangle','r left triangle','g right triangle','cp','bh'}; + + nStyles = numel(style); + for ii = 1:nStyles + curr = style{ii}; + scatter(n, ii * e, s, curr(1), curr(2)); + end + xlim([min(n)-1 max(n)+1]); + ylim([0 d*(nStyles+1)]); + set(gca,'XTick',n,'XTickLabel',sArea,'XTickLabelMode','manual'); +end +% ========================================================================= +function [stat] = scatter3Plot() + stat.description = 'Scatter3 plot with MATLAB(R) stat.'; + + [x,y,z] = sphere(16); + X = [x(:)*.5 x(:)*.75 x(:)]; + Y = [y(:)*.5 y(:)*.75 y(:)]; + Z = [z(:)*.5 z(:)*.75 z(:)]; + S = repmat([1 .75 .5]*10,numel(x),1); + C = repmat([1 2 3],numel(x),1); + scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'), view(-60,60) + view(40,35) +end +% ========================================================================= +function [stat] = spherePlot() + stat.description = 'Stretched sphere with unequal axis limits.'; + stat.issues = 560; + + sphere(30); + title('a sphere: x^2+y^2+z^2'); + xlabel('x'); + ylabel('y'); + zlabel('z'); + set(gca,'DataAspectRatio',[1,1,.5],'xlim',[-1 2], 'zlim',[-1 0.8]) +end +% ========================================================================= +function [stat] = surfPlot() + stat.description = 'Surface plot.'; + + [X,Y,Z] = peaks(30); + surf(X,Y,Z) + colormap hsv + axis([-3 3 -3 3 -10 5]) + set(gca,'View',[-37.5,36]); + + hc = colorbar('YTickLabel', ... + {'Freezing','Cold','Cool','Neutral',... + 'Warm','Hot','Burning','Nuclear'}); + set(get(hc,'Xlabel'),'String','Multitude'); + set(get(hc,'Ylabel'),'String','Magnitude'); + set(hc,'YTick',0:0.7:7); + set(hc,'YTickLabel',... + {'-0.8' '-0.6' '-0.4' '-0.2' '0.0' ... + '0.2' '0.4' '0.6' '0.8' '0.10' '0.12'}); + + set(get(hc,'Title'),... + 'String', 'k(u,v)', ... + 'FontSize', 12, ... + 'interpreter', 'tex'); + + xlabel( 'x' ) + ylabel( 'y' ) + zlabel( 'z' ) +end +% ========================================================================= +function [stat] = surfPlot2() + stat.description = 'Another surface plot.'; + stat.unreliable = isMATLAB || isOctave; % FIXME: investigate + + z = [ ones(15, 5) zeros(15,5); + zeros(5, 5) zeros( 5,5)]; + + surf(abs(fftshift(fft2(z))) + 1); + set(gca,'ZScale','log'); + + legend( 'legendary', 'Location', 'NorthEastOutside' ); +end +% ========================================================================= +function [stat] = superkohle() + stat.description = 'Superkohle plot.'; + stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + + if ~exist('initmesh') + fprintf( 'initmesh() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + x1=0; + x2=pi; + y1=0; + y2=pi; + omegashape = [2 2 2 2 % 2 = line segment; 1 = circle segment; 4 = elipse segment + x1 x2 x2 x1 % start point x + x2 x2 x1 x1 % end point x + y1 y1 y2 y2 % start point y + y1 y2 y2 y1 % end point y + 1 1 1 1 + 0 0 0 0]; + [xy,edges,tri] = initmesh(omegashape,'Hgrad',1.05); + mmin = 1; + while size(xy,2) < mmin + [xy,edges,tri] = refinemesh(omegashape,xy,edges,tri); + end + m = size(xy,2); + x = xy(1,:)'; + y = xy(2,:)'; + y0 = cos(x).*cos(y); + + pdesurf(xy,tri,y0(:,1)); + title('y_0'); + xlabel('x1 axis'); + ylabel('x2 axis'); + axis([0 pi 0 pi -1 1]); + grid on; +end +% ========================================================================= +function [stat] = meshPlot() + stat.description = 'Mesh plot.'; + + [X,Y,Z] = peaks(30); + mesh(X,Y,Z) + colormap hsv + axis([-3 3 -3 3 -10 5]) + + xlabel( 'x' ) + ylabel( 'y' ) + zlabel( 'z' ) +end +% ========================================================================= +function [stat] = ylabels() + stat.description = 'Separate y-labels.'; + + x = 0:.01:2*pi; + H = plotyy(x,sin(x),x,3*cos(x)); + + ylabel(H(1),'sin(x)'); + ylabel(H(2),'3cos(x)'); + + xlabel(H(1),'time'); +end +% ========================================================================= +function [stat] = spectro() + stat.description = 'Spectrogram plot'; + stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate + + % In the original test case, this is 0:0.001:2, but that takes forever + % for LaTeX to process. + if isempty(which('chirp')) + fprintf( 'chirp() not found. Skipping.\n\n' ); + stat.description = []; + stat.skip = true; + return + end + + T = 0:0.005:2; + X = chirp(T,100,1,200,'q'); + spectrogram(X,128,120,128,1E3); + title('Quadratic Chirp'); +end +% ========================================================================= +function [stat] = mixedBarLine() + stat.description = 'Mixed bar/line plot.'; + stat.unreliable = isOctave; %FIXME: investigate (octave of egon) + % unreliable, see issue #614 (comment 92263263) + + data = ACID_data; + x = data(:); + hist(x,10) + y = ylim; + hold on; + plot([mean(x) mean(x)], y, '-r'); + hold off; +end +% ========================================================================= +function [stat] = decayingharmonic() + stat.description = 'Decaying harmonic oscillation with \TeX{} title.'; + stat.issues = 587; + + % Based on an example from + % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 + A = 0.25; + alpha = 0.007; + beta = 0.17; + t = 0:901; + y = A * exp(-alpha*t) .* sin(beta*t); + plot(t, y) + title('{\itAe}^{-\alpha\itt}sin\beta{\itt}, \alpha<<\beta, \beta>>\alpha, \alpha<\beta, \beta>\alpha, b>a') + xlabel('Time \musec.') + ylabel('Amplitude |X|') +end +% ========================================================================= +function [stat] = texcolor() + stat.description = 'Multi-colored text using \TeX{} commands.'; + + % Taken from an example at + % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 + text(.1, .5, ['\fontsize{16}black {\color{magenta}magenta '... + '\color[rgb]{0 .5 .5}teal \color{red}red} black again']) +end +% ========================================================================= +function [stat] = textext() + stat.description = 'Formatted text and special characters using \TeX{}.'; + + % Taken from an example at + % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28303 + txstr(1) = { 'Each cell is a quoted string' }; + txstr(2) = { 'You can specify how the string is aligned' }; + txstr(3) = { 'You can use LaTeX symbols like \pi \chi \Xi' }; + txstr(4) = { '\bfOr use bold \rm\itor italic font\rm' }; + txstr(5) = { '\fontname{courier}Or even change fonts' }; + txstr(5) = { 'and use umlauts like äöüßÄÖÜ and accents éèêŐőŰűç' }; + plot( 0:6, sin(0:6) ) + text( 5.75, sin(2.5), txstr, 'HorizontalAlignment', 'right' ) +end +% ========================================================================= +function [stat] = texrandom() + stat.description = 'Random TeX symbols'; + + try + rng(42); %fix seed + %TODO: fully test tex conversion instead of a random subsample! + catch + rand('seed', 42); %#ok (this is deprecated in MATLAB) + end + + num = 20; % number of symbols per line + symbols = {'\it', '\bf', '\rm', '\sl', ... + '\alpha', '\angle', '\ast', '\beta', '\gamma', '\delta', ... + '\epsilon', '\zeta', '\eta', '\theta', '\vartheta', ... + '\iota', '\kappa', '\lambda', '\mu', '\nu', '\xi', '\pi', ... + '\rho', '\sigma', '\varsigma', '\tau', '\equiv', '\Im', ... + '\otimes', '\cap', '{\int}', '\rfloor', '\lfloor', '\perp',... + '\wedge', '\rceil', '\vee', '\langle', '\upsilon', '\phi', ... + '\chi', '\psi', '\omega', '\Gamma', '\Delta', '\Theta', ... + '\Lambda', '\Xi', '\Pi', '\Sigma', '\Upsilon', '\Phi', ... + '\Psi', '\Omega', '\forall', '\exists', '\ni', '{\cong}', ... + '\approx', '\Re', '\oplus', '\cup', '\subseteq', '\lceil', ... + '\cdot', '\neg', '\times', '\surd', '\varpi', '\rangle', ... + '\sim', '\leq', '\infty', '\clubsuit', '\diamondsuit', ... + '\heartsuit', '\spadesuit', '\leftrightarrow', ... + '\leftarrow', '\Leftarrow', '\uparrow', '\rightarrow', ... + '\Rightarrow', '\downarrow', '\circ', '\pm', '\geq', ... + '\propto', '\partial', '\bullet', '\div', '\neq', ... + '\aleph', '\wp', '\oslash', '\supseteq', '\nabla', ... + '{\ldots}', '\prime', '\0', '\mid', '\copyright', ... + '\o', '\in', '\subset', '\supset', ... + '\_', '\^', '\{', '\}', '$', '%', '#', ... + '(', ')', '+', '-', '=', '/', ',', '.', '<', '>', ... + '!', '?', ':', ';', '*', '[', ']', '§', '"', '''', ... + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ... + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', ... + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', ... + 'w', 'x', 'y', 'z', ... + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', ... + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', ... + 'W', 'X', 'Y', 'Z' ... + }; + % Note: Instead of '\ldots' the list of symbols contains the entry + % '{\ldots}'. This is because TeX gives an error if it + % encounters the sequence '$a_\ldots$' or '$a^\ldots$'. It + % looks like that is a TeX bug. Nevertheless this sequence + % could appear in the random output, therefore \ldots is + % wrapped in braces since '$a_{\ldots}$' and '$a^{\ldots}$' + % don't crash TeX. + % Same thing with '\cong' and '\int'. + % \color{red} etc. isn't included + % \fontname{Times} etc. isn't included + % \fontsize{12} etc. isn't included + + switch getEnvironment + case 'MATLAB' + % MATLAB expects tilde and ampersand to be un-escaped and backslashes + % to be escaped + symbols = [ symbols, {'~', '&', '\\'} ]; + case 'Octave' + % Octave expects tilde and ampersand to be escaped for regular + % output. If either are used un-escaped, that creates odd output in + % Octave itself, but since matlab2tikz should be able to handle + % those cases, let's include the un-escaped symbols in the list. + symbols = [ symbols, {'\~', '\&', '~', '&'} ]; + % Octave's backslash handling is weird to say the least. However, + % matlab2tikz treats backslashes the same in Octave as it does in + % MATLAB. Therefore, let's add an escaped backslash to the list + symbols = [ symbols, {'\\'} ]; + otherwise + error( 'Unknown environment. Need MATLAB(R) or Octave.' ) + end + + for ypos = [0.9:-.2:.1] + % Generate `num' random indices to the list of symbols + index = max(ceil(rand(1, num)*length(symbols)), 1); + % Assemble symbols into one cell string array + string = symbols(index); + + % Add random amount of balanced braces in random positions to `string'. + % By potentially generating more than one set of braces randomly, it's + % possible to create more complex patterns of nested braces. Increase + % `braceprob' to get more braces, but don't use values greater than or + % equal 1 which would result in an infinite loop. + braceprob = 0.6; + while rand(1,1) < braceprob + % Generate two random numbers ranging from 1 to n with n = number + % of symbols in `string' + bracepos = max(ceil(rand(1, 2)*length(string)), 1); + % Modify `string' so that an opening brace is inserted before + % min(bracepos) symbols and a closing brace after max(bracepos) + % symbols. That way any number of symbols from one to all in + % `string' are wrapped in braces for min(bracepos) == max(bracepos) + % and min(bracepos) == 1 && max(bracepos) == length(string), + % respectively. + string = [string(1:min(bracepos)-1), {'{'}, ... + string(min(bracepos):max(bracepos)), ... + {'}'}, string(max(bracepos)+1:end) ]; + end + % Clean up: remove '{}', '{{}}', etc. + clean = false; + while clean == false + clean = true; + for i = 1:length(string)-1 + if strcmp( string(i), '{' ) && strcmp( string(i+1), '}' ) + string = [string(1:i-1), string(i+2:end)]; + clean = false; + break + end + end + end + + % Subscripts '_' and superscripts '^' in TeX are tricky in that certain + % combinations are not allowed and there are some subtleties in regard + % to more complicated combinations of sub/superscripts: + % - ^a or _a at the beginning of a TeX math expression is permitted. + % - a^ or a_ at the end of a TeX math expression is not. + % - a__b, a_^b, a^_b, or a^^b is not allowed, as is any number of + % consecutive sub/superscript operators. Actually a^^b does not + % crash TeX, but it produces seemingly random output instead of `b', + % therefore it should be avoided, too. + % - a^b^c or a_b_c is not allowed as it results in a "double subscript/ + % superscript" error. + % - a^b_c or a_b^c, however, does work. + % - a^bc^d or a_bc_d also works. + % - a^b_c^d or a_b^c_d is not allowed and results in a "double + % subscript/superscript" error. + % - a{_}b, a{^}b, {a_}b or {a^}b is not permitted. + % - a{_b} or a{^b} is valid TeX code. + % - {a_b}_c produces the same output as a_{bc}. Likewise for '^'. + % - a_{b_c} results in "a index b sub-index c". Likewise for '^'. + % - a^{b}^c or a_{b}_c is not allowed as it results in a "double + % subscript/superscript" error. + % + % From this we can derive a number of rules: + % 1) The last symbol in a TeX string must not be '^' or '_'. + % 2a) There must be at least one non-brace symbol between any '^' and '_'. + % 2b) There must be at least one non-brace symbol between any '_' and '^'. + % 3a) There must either be at least two non-brace, non-'_' symbols or at + % least one non-brace, non-'_' symbol and one brace (opening or + % closing) between any two '^'. + % 3b) There must either be at least two non-brace, non-'^' symbols or at + % least one brace (opening or closing) between any two '_'. + % 4) '^' or '_' must not appear directly before '}'. + % 5) '^' or '_' must not appear directly after '}'. + % 6) Whenever braces were mentioned, that refers to non-empty braces, + % i.e. '{}' counts as nothing. Printable/escaped braces '\{' and '\}' + % also don't count as braces but as regular symbols. + % 7) '^' or '_' must not appear directly before '\it', '\bf', '\rm', or + % '\sl'. + % 8) '^' or '_' must not appear directly after '\it', '\bf', '\rm', or + % '\sl'. + % + % A few test cases: + % Permitted: ^a... _a... a^b_c a_b^c a^bc^d a_bc_d a{_b} a{^b} + % {a_b}_c a_{bc} {a^b}^c a^{bc} a_{b_c} a^{b^c} + % Forbidden: ...z^ ...z_ a__b a_^b a^_b [a^^b] a^b^c a_b_c + % a^b_c^d a_b^c_d a{_}b a{^}b {a_}b {a^}b + % a^{_b} a_{^b} a^{b}^c a_{b}_c + % + % Now add sub/superscripts according to these rules + subsupprob = 0.1; % Probability for insertion of a sub/superscript + caretdist = Inf; % Distance to the last caret + underscdist = Inf; % Distance to the last underscore + bracedist = Inf; % Distance to the last brace (opening or closing) + pos = 0; + % Making sure the post-update `pos' in the while loop is less than the + % number of symbols in `string' enforces rule 1: The last symbol in + % a TeX string must not be '^' or '_'. + while pos+1 < length(string) + % Move one symbol further + pos = pos + 1; + % Enforce rule 7: No sub/superscript directly before '\it', '\bf', + % '\rm', or '\sl'. + if strcmp( string(pos), '\it' ) || strcmp( string(pos), '\bf' ) ... + || strcmp( string(pos), '\rm' ) || strcmp( string(pos), '\sl' ) + continue + end + % Enforce rule 8: No sub/superscript directly after '\it', '\bf', + % '\rm', or '\sl'. + if (pos > 1) ... + && ( strcmp( string(pos-1), '\it' ) ... + || strcmp( string(pos-1), '\bf' ) ... + || strcmp( string(pos-1), '\rm' ) ... + || strcmp( string(pos-1), '\sl' ) ... + ) + continue + end + bracedist = bracedist + 1; + % Enforce rule 4: No sub/superscript directly before '}' + if strcmp( string(pos), '}' ) + bracedist = 0; % Also update braces distance + continue + end + % Enforce rule 5: No sub/superscript directly after '}' + if (pos > 1) && strcmp( string(pos-1), '}' ) + continue + end + % Update distances for either braces or caret/underscore depending + % on whether the symbol currently under scrutiny is a brace or not. + if strcmp( string(pos), '{' ) + bracedist = 0; + else + caretdist = caretdist + 1; + underscdist = underscdist + 1; + end + % Generate two random numbers, then check if any of them is low + % enough, so that with probability `subsupprob' a sub/superscript + % operator is inserted into `string' at the current position. In + % case both random numbers are below the threshold, whether a + % subscript or superscript operator is to be inserted depends on + % which of the two numbers is smaller. + randomnums = rand(1, 2); + if min(randomnums) < subsupprob + if randomnums(1) < randomnums(2) + % Enforce rule 2b: There must be at least one non-brace + % symbol between previous '_' and to-be-inserted '^'. + if underscdist < 1 + continue + end + % Enforce rule 3a: There must either be at least two + % non-brace, non-'_' symbols or at least one brace (opening + % or closing) between any two '^'. + if ~( ((caretdist >= 2) && (underscdist >= 2)) ... + || ((bracedist < 2) && (caretdist >= 2)) ) + continue + end + % Insert '^' before `pos'th symbol in `string' now that + % we've made sure all rules are honored. + string = [ string(1:pos-1), {'^'}, string(pos:end) ]; + caretdist = 0; + pos = pos + 1; + else + % Enforce rule 2a: There must be at least one non-brace + % symbol between previous '^' and to-be-inserted '_'. + if caretdist < 1 + continue + end + % Enforce rule 3b: There must either be at least two + % non-brace, non-'^' symbols or at least one brace (opening + % or closing) between any two '_'. + if ~( ((caretdist >= 2) && (underscdist >= 2)) ... + || ((bracedist < 2) && (underscdist >= 2)) ) + continue + end + % Insert '_' before `pos'th symbol in `string' now that + % we've made sure all rules are honored. + string = [ string(1:pos-1), {'_'}, string(pos:end) ]; + underscdist = 0; + pos = pos + 1; + end + end + end % while pos+1 < length(string) + + % Now convert the cell string array of symbols into one regular string + string = [string{:}]; + % Print the string in the figure to be converted by matlab2tikz + text( .05, ypos, string, 'interpreter', 'tex' ) + % And print it to the console, too, in order to enable analysis of + % failed tests + fprintf( 'Original string: %s\n', string ) + end + + title('Random TeX symbols \\\{\}\_\^$%#&') +end +% ========================================================================= +function [stat] = latexInterpreter() + stat.description = '\LaTeX{} interpreter test (display math not working)'; + stat.issues = 448; + stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: broken since decd496 (mac vs linux) + + plot(magic(3),'-x'); + + % Adapted from an example at + % http://www.mathworks.com/help/techdoc/ref/text_props.html#Interpreter + text(1.5, 2.0, ... + '$$\int_0^x\!\int_{\Omega} \mathrm{d}F(u,v) \mathrm{d}\omega$$', ... + 'Interpreter', 'latex', ... + 'FontSize', 26); + + title(['display math old: $$\alpha$$ and $$\sum_\alpha^\Omega$$; ', ... + 'inline math: $\alpha$ and $\sum_\alpha^\Omega$'],'Interpreter','latex'); +end +% ========================================================================= +function [stat] = latexmath2() + stat.description = 'Some nice-looking formulas typeset using the \LaTeX{} interpreter.'; + stat.issues = 637; + + % Adapted from an example at + % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#bq558_t + set(gcf, 'color', 'white') + set(gcf, 'units', 'inches') + set(gcf, 'position', [2 2 4 6.5]) + set(gca, 'visible', 'off') + + % Note: The matrices in h(1) and h(2) cannot be compiled inside pgfplots. + % They are therefore disabled. +% h(1) = text( 'units', 'inch', 'position', [.2 5], ... +% 'fontsize', 14, 'interpreter', 'latex', 'string', ... +% [ '$$\hbox {magic(3) is } \left( {\matrix{ 8 & 1 & 6 \cr' ... +% '3 & 5 & 7 \cr 4 & 9 & 2 } } \right)$$' ]); +% h(2) = text( 'units', 'inch', 'position', [.2 4], ... +% 'fontsize', 14, 'interpreter', 'latex', 'string', ... +% [ '$$\left[ {\matrix{\cos(\phi) & -\sin(\phi) \cr' ... +% '\sin(\phi) & \cos(\phi) \cr}} \right]' ... +% '\left[ \matrix{x \cr y} \right]$$' ]); + h(3) = text( 'units', 'inches', 'position', [.2 3], ... + 'fontsize', 14, 'interpreter', 'latex', 'string', ... + [ '$$L\{f(t)\} \equiv F(s) = \int_0^\infty\!\!{e^{-st}' ... + 'f(t)dt}$$' ]); + h(4) = text( 'units', 'inches', 'position', [.2 2], ... + 'fontsize', 14, 'interpreter', 'latex', 'string', ... + '$$e = \sum_{k=0}^\infty {\frac{1}{k!}} $$' ); + h(5) = text( 'units', 'inches', 'position', [.2 1], ... + 'fontsize', 14, 'interpreter', 'latex', 'string', ... + [ '$$m \ddot y = -m g + C_D \cdot {\frac{1}{2}}' ... + '\rho {\dot y}^2 \cdot A$$' ]); + h(6) = text( 'units', 'inches', 'position', [.2 0], ... + 'fontsize', 14, 'interpreter', 'latex', 'string', ... + '$$\int_{0}^{\infty} x^2 e^{-x^2} dx = \frac{\sqrt{\pi}}{4}$$' ); +end +% ========================================================================= +function [stat] = parameterCurve3d() + stat.description = 'Parameter curve in 3D with text boxes in-/outside axis.'; + stat.issues = [378, 790] ; + t = linspace(0, 20*pi, 1e5); + plot3(t, sin(t), 50 * cos(t)); + text(0.5, 0.5, 10, 'text inside axis limits'); + text(5.0, 1.5, 50, 'text outside axis (will be removed by cleanfigure())'); +end +% ========================================================================= +function [stat] = parameterSurf() + stat.description = 'Parameter and surface plot.'; + stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate + + if ~exist('TriScatteredInterp') + fprintf( 'TriScatteredInterp() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + t = (1:100).'; + t1 = cos(5.75352*t).^2; + t2 = abs(sin(t)); + + x = t1*4 - 2; + y = t2*4 - 2; + z = x.*exp(-x.^2 - y.^2); + + %TODO: do we really need this TriScatteredInterp? + % It will be removed from MATLAB + + % Construct the interpolant + F = TriScatteredInterp(x,y,z,'linear'); + + % Evaluate the interpolant at the locations (qx, qy), qz + % is the corresponding value at these locations. + ti = -2:.25:2; + [qx,qy] = meshgrid(ti,ti); + qz = F(qx,qy); + + hold on + surf(qx,qy,qz) + plot3(x,y,z,'o') + view(gca,[-69 14]); + hold off +end +% ========================================================================= +function [stat] = fill3plot() + stat.description = 'fill3 plot.'; + + if ~exist('fill3','builtin') + fprintf( 'fill3() not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + x1 = -10:0.1:10; + x2 = -10:0.1:10; + p = sin(x1); + d = zeros(1,numel(p)); + d(2:2:end) = 1; + h = p.*d; + grid on; + fill3(x1,x2,h,'k'); + view(45,22.5); + box on; +end +% ========================================================================= +function [stat] = rectanglePlot() + stat.unreliable = isMATLAB('<=', [8,3]); %FIXME: #749 (Jenkins) + stat.description = 'Rectangle handle.'; + + rectangle('Position', [0.59,0.35,3.75,1.37],... + 'Curvature', [0.8,0.4],... + 'LineWidth', 2, ... + 'LineStyle', '--' ... + ); + daspect([1,1,1]); +end +% ========================================================================= +function [stat] = herrorbarPlot() + stat.description = 'herrorbar plot.'; + % FIXME: octave is missing the legend + + hold on; + X = 1:10; + Y = 1:10; + err = repmat(0.2, 1, 10); + h1 = errorbar(X, Y, err+X/30, 'r'); + h_vec = herrorbar(X, Y, err); + for h=h_vec + set(h, 'color', [1 0 0]); + end + h2 = errorbar(X, Y+1, err, 'g'); + h_vec = herrorbar(X, Y+1, err+Y/40); + for h=h_vec + set(h, 'color', [0 1 0]); + end + legend([h1 h2], {'test1', 'test2'}) +end +% ========================================================================= +function [stat] = hist3d() + stat.description = '3D histogram plot.'; + + if ~exist('hist3','builtin') && isempty(which('hist3')) + fprintf( 'Statistics toolbox not found. Skipping.\n\n' ); + stat.skip = true; + return + end + +% load carbig +% X = [MPG,Weight]; +% hist3(X,[7 7]); +% xlabel('MPG'); ylabel('Weight'); +% set(get(gca,'child'),'FaceColor','interp','CDataMode','auto'); + + load carbig + X = [MPG,Weight]; + hist3(X,[7 7]); + xlabel('MPG'); ylabel('Weight'); + hist3(X,[7 7],'FaceAlpha',.65); + xlabel('MPG'); ylabel('Weight'); + % Linux crashed with OpenGL. + %%set(gcf,'renderer','opengl'); + +% load seamount +% dat = [-y,x]; % Grid corrected for negative y-values +% n = hist3(dat); % Extract histogram data; +% % default to 10x10 bins +% view([-37.5, 30]); +end +% ========================================================================= +function [stat] = myBoxplot() + stat.description = 'Boxplot.'; + stat.unreliable = isMATLAB('<', [8,4]); % R2014a; #552 #414 + + if ~exist('boxplot','builtin') && isempty(which('boxplot')) + fprintf( 'Statistics toolbox not found. Skipping.\n\n' ); + stat.skip = true; + return + end + + errors =[ + 0.810000 3.200000 0.059500 + 0.762500 -3.200000 0.455500 + 0.762500 4.000000 0.901000 + 0.762500 3.600000 0.406000 + 0.192500 3.600000 0.307000 + 0.810000 -3.600000 0.604000 + 1.000000 -2.400000 0.505000 + 0.430000 -2.400000 0.455500 + 1.000000 3.200000 0.158500 + ]; + + boxplot(errors); +end +% ========================================================================= +function [stat] = areaPlot() + stat.description = 'Area plot.'; + + M = magic(5); + M = M(1:3,2:4); + h = area(1:3, M); + legend(h([1,3]),'foo', 'foobar'); +end +% ========================================================================= +function [stat] = customLegend() + stat.description = 'Custom legend.'; + stat.unreliable = isMATLAB('<', [8,4]) || isOctave; %FIXME: investigate (Travis differs from Linux/Mac octave) + + x = -pi:pi/10:pi; + y = tan(sin(x)) - sin(tan(x)); + plot(x,y,'--rs'); + + lh=legend('y',4); + set(lh,'color','g') + set(lh,'edgecolor','r') + set(lh, 'position',[.5 .6 .1 .05]) +end +% ========================================================================= +function [stat] = pixelLegend() + stat.description = 'Legend with pixel position.'; + + x = linspace(0,1); + plot(x, [x;x.^2]); + set(gca, 'units', 'pixels') + lh=legend('1', '2'); + set(lh, 'units','pixels','position', [100 200 65 42]) +end +% ========================================================================= +function [stat] = croppedImage() + stat.description = 'Custom legend.'; + + if ~exist('flujet.mat','file') + fprintf( 'flujet data set not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + load('flujet','X','map'); + image(X) + colormap(map) + %axis off + axis image + xlim([50 200]) + ylim([50 200]) + % colorbar at top + colorbar('north'); + set(gca,'Units','normalized'); +end +% ========================================================================= +function [stat] = pColorPlot() + stat.description = 'pcolor() plot.'; + + ylim([-1 1]); xlim([-1 1]); hold on; % prevent error on octave + n = 6; + r = (0:n)'/n; + theta = pi*(-n:n)/n; + X = r*cos(theta); + Y = r*sin(theta); + C = r*cos(2*theta); + pcolor(X,Y,C) + axis equal tight +end +% ========================================================================= +function [stat] = multiplePatches() + stat.description = 'Multiple patches.'; + + xdata = [2 2 0 2 5; + 2 8 2 4 5; + 8 8 2 4 8]; + ydata = [4 4 4 2 0; + 8 4 6 2 2; + 4 0 4 0 0]; + cdata = [15 0 4 6 10; + 1 2 5 7 9; + 2 3 0 8 3]; + p = patch(xdata,ydata,cdata,'Marker','o',... + 'MarkerFaceColor','flat',... + 'FaceColor','none'); +end +% ========================================================================= +function [stat] = hgTransformPlot() + stat.description = 'hgtransform() plot.'; + + if isOctave + % Octave (3.8.0) has no implementation of `hgtransform` + stat.skip = true; + return; + end + % Check out + % http://www.mathworks.de/de/help/matlab/ref/hgtransform.html. + + ax = axes('XLim',[-2 1],'YLim',[-2 1],'ZLim',[-1 1]); + view(3); + grid on; + axis equal; + + [x,y,z] = cylinder([.2 0]); + h(1) = surface(x,y,z,'FaceColor','red'); + h(2) = surface(x,y,-z,'FaceColor','green'); + h(3) = surface(z,x,y,'FaceColor','blue'); + h(4) = surface(-z,x,y,'FaceColor','cyan'); + h(5) = surface(y,z,x,'FaceColor','magenta'); + h(6) = surface(y,-z,x,'FaceColor','yellow'); + + t1 = hgtransform('Parent',ax); + t2 = hgtransform('Parent',ax); + + set(h,'Parent',t1); + h2 = copyobj(h,t2); + + Txy = makehgtform('translate',[-1.5 -1.5 0]); + set(t2,'Matrix',Txy) + drawnow +end +% ========================================================================= +function [stat] = logbaseline() + stat.description = 'Logplot with modified baseline.'; + + bar([0 1 2], [1 1e-2 1e-5],'basevalue', 1e-6); + set(gca,'YScale','log'); +end +% ========================================================================= +function [stat] = alphaImage() + stat.description = 'Images with alpha channel.'; + stat.unreliable = isOctave; %FIXME: investigate + + subplot(2,1,1); + title('Scaled Alpha Data'); + N = 20; + h_imsc = imagesc(repmat(1:N, N, 1)); + mask = zeros(N); + mask(N/4:3*N/4, N/4:3*N/4) = 1; + set(h_imsc, 'AlphaData', double(~mask)); + set(h_imsc, 'AlphaDataMapping', 'scaled'); + set(gca, 'ALim', [-1,1]); + title(''); + + subplot(2,1,2); + title('Integer Alpha Data'); + N = 2; + line([0 N]+0.5, [0 N]+0.5, 'LineWidth', 2, 'Color','k'); + line([0 N]+0.5, [N 0]+0.5, 'LineWidth', 2, 'Color','k'); + hold on + imagesc([0,1;2,3],'AlphaData',uint8([64,128;192,256])) +end +% ========================================================================= +function stat = annotationAll() + stat.description = 'All possible annotations with edited properties'; + stat.unreliable = isMATLAB('<', [8,4]); % TODO: R2014a and older: #604 + + if isempty(which('annotation')) + fprintf( 'annotation() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + % Create plot + X1 = -5:0.1:5; + plot(X1,log(X1.^2+1)); + + % Create line + annotation('line',[0.21 0.26], [0.63 0.76], 'Color',[0.47 0.3 0.44],... + 'LineWidth',4, 'LineStyle',':'); + + % Create arrow + if isOctave('>=', 4) + headStyle = 'vback3'; %Octave does not support cback2 yet (2015-09) + else + headStyle = 'cback2'; + end + + annotation('arrow',[0.25 0.22], [0.96 0.05], 'LineStyle','-.',... + 'HeadStyle', headStyle); + + % Create textarrow + annotation('textarrow',[0.46 0.35], [0.41 0.50],... + 'Color',[0.92 0.69 0.12], 'TextBackgroundColor',[0.92 0.83 0.83],... + 'String',{'something'}, 'LineWidth',2, 'FontWeight','bold',... + 'FontSize',20, 'FontName','Helvetica'); + + % Create doublearrow + annotation('doublearrow',[0.33 0.7], [0.56 0.55]); + + % Create textbox + annotation('textbox', [0.41 0.69 0.17 0.10], 'String',{'something'},... + 'FitBoxToText','off'); + + % Create ellipse + if isOctave(4) + colorSpec = 'EdgeColor'; + else + colorSpec = 'Color'; + end + annotation('ellipse', [0.70 0.44 0.15 0.51], ... + colorSpec, [0.63 0.07 0.18],... + 'LineWidth', 3, 'FaceColor',[0.80 0.87 0.96]); + + % Create rectangle + annotation('rectangle', [0.3 0.26 0.53 0.58], 'LineWidth',8,... + 'LineStyle',':'); +end +% ========================================================================= +function [stat] = annotationSubplots() + stat.description = 'Annotated and unaligned subplots'; + + if isempty(which('annotation')) + fprintf( 'annotation() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + X1 = 0:0.01:1; + Y1 = X1.^2; + Y2 = Y1.^2; + Y3 = X1.^(1/4); + + set(gcf, 'Position', [100 100 1500 600]); + + axes1 = axes('Parent',gcf, 'Position',[0.07 0.4015 0.2488 0.5146]); + box(axes1,'on'); + hold(axes1,'all'); + + title('f(x)=x^2'); + + plot(X1,Y1,'Parent',axes1, 'DisplayName','(0:0.05:1).^2 vs 0:0.05:1'); + + axes2 = axes('Parent',gcf, 'OuterPosition',[0.4062 0 0.2765 0.6314]); + box(axes2,'on'); + hold(axes2,'all'); + + plot(X1,Y2,'Parent',axes2,'DisplayName','(0:0.05:1).^4 vs 0:0.05:1'); + + axes3 = axes('Parent',gcf, 'Position',[0.7421 0.3185 0.21 0.5480]); + box(axes3,'on'); + hold(axes3,'all'); + + plot(X1,Y3,'Parent',axes3,'DisplayName','(0:0.05:1).^(1/4) vs 0:0.05:1'); + + annotation(gcf,'textbox',[0.3667 0.5521 0.0124 0.0393], ... + 'String',{'f^2'}, 'FitBoxToText','off'); + + annotation(gcf,'arrow',[0.3263 0.4281], [0.6606 0.3519]); + + annotation(gcf,'textarrow',[0.6766 0.7229], [0.3108 0.6333],... + 'TextEdgeColor','none', 'HorizontalAlignment','center', ... + 'String',{'invert'}); +end +% ========================================================================= +function [stat] = annotationText() + stat.description = 'Variations of textual annotations'; + stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate + + if ~exist('annotation') + fprintf( 'annotation() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + X1 = -5:0.1:5; + Y1 = log(X1.^2+1); + + % Resize figure to fit all text inside + set(gcf,'Position', [100 100 1000 700]); + + % Otherwise the axes is plotted wrongly + drawnow(); + + % Create axes + axes1 = axes('Parent',gcf); + hold(axes1,'all'); + + % Create plot + plot(X1,Y1); + + % Create text + text('Parent',axes1,'String',' \leftarrow some point on the curve',... + 'Position',[-2.01811125485123 1.5988219895288 7.105427357601e-15]); + + % Create text + text('Parent',axes1,'String','another point \rightarrow',... + 'Position',[1 0.693147180559945 0],... + 'HorizontalAlignment','right'); + + % Create textbox + annotation(gcf,'textbox',... + [0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],... + 'String',{'This boxes size','should adjust to','the text size'}); + + % Create textbox + annotation(gcf,'textbox',... + [0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],... + 'String',{'Multiple Lines due to fixed width'},... + 'FitBoxToText','off'); + + % Create textbox + annotation(gcf,'textbox',... + [0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],... + 'String',{'Overlapping','and italic'},... + 'FontAngle','italic',... + 'FitBoxToText','off',... + 'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); + + % Create textbox + annotation(gcf,'textbox',... + [0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],... + 'VerticalAlignment','middle',... + 'String',{'Text with a','thick and','dotted','border'},... + 'HorizontalAlignment','center',... + 'FitBoxToText','off',... + 'LineStyle',':',... + 'LineWidth',4); + + % Create textarrow + annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],... + [0.371002132196162 0.235640648011782],'TextEdgeColor','none',... + 'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],... + 'TextRotation',30,... + 'VerticalAlignment','bottom',... + 'HorizontalAlignment','center',... + 'String',{'Rotated Text'}); + + % Create textarrow + annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],... + [0.604315828808828 0.524300441826215],'TextEdgeColor','none',... + 'TextColor',[1 1 1],... + 'TextBackgroundColor',[0 0 1],... + 'TextRotation',30,... + 'VerticalAlignment','bottom',... + 'HorizontalAlignment','center',... + 'String',{'Rotated Text 2'},... + 'HeadStyle','diamond',... + 'Color',[1 0 0]); +end +% ========================================================================= +function [stat] = annotationTextUnits() + stat.description = 'Text with changed Units'; + stat.unreliable = isMATLAB('<', [8,4]); % FIXME: investigate + + if ~exist('annotation') + fprintf( 'annotation() not found. Skipping.\n\n' ); + stat.skip = true; + return; + end + + X1 = -5:0.1:5; + Y1 = log(X1.^2+1); + + % Resize figure to fit all text inside + set(gcf,'Units', 'inches'); + set(gcf,'Position', [1.03125, 1.03125, 10.416666666666666, 7.291666666666666 ]); + + % Otherwise the axes is plotted wrongly + drawnow(); + + % Create axes + axes1 = axes('Parent',gcf,'Units','centimeters',... + 'Position',[3.4369697916666664, 2.035743645833333 20.489627604166664 15.083009739583332]); + hold(axes1,'all'); + + % Create plot + plot(X1,Y1); + + % Create text + text('Parent',axes1,'Units','normalized',... + 'String',' \leftarrow some point on the curve',... + 'Position',[0.295865633074935 0.457364341085271 0]); + + % Create text + text('Parent',axes1,'Units','centimeters',... + 'String','another point \rightarrow',... + 'Position',[12.2673383333333 2.98751989583333 0],... + 'HorizontalAlignment','right'); + + % Create textbox + annotation(gcf,'textbox',... + [0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],... + 'String',{'This boxes size','should adjust to','the text size'},... + 'FitBoxToText','off',... + 'Units','pixels'); + + + % Create textarrow + annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],... + [0.371002132196162 0.235640648011782],'TextEdgeColor','none',... + 'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],... + 'TextRotation',30,... + 'HorizontalAlignment','center',... + 'String',{'Rotated Text'},... + 'Units','points'); + + % Create textarrow + annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],... + [0.604315828808828 0.524300441826215],'TextEdgeColor','none',... + 'TextColor',[1 1 1],... + 'TextBackgroundColor',[0 0 1],... + 'TextRotation',30,... + 'HorizontalAlignment','center',... + 'String',{'Rotated Text 2'},... + 'HeadStyle','diamond',... + 'Color',[1 0 0]); + + % Create textbox + if ~isOctave(4) + annotation(gcf,'textbox',... + [0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],... + 'String',{'Multiple Lines due to fixed width'},... + 'FitBoxToText','off',... + 'Units','characters'); + else + % Octave 4 doesn't seem to like the "'Units','Characters'" in there + % so just remove the object altogether. + % This is strange, since it is documented: https://www.gnu.org/software/octave/doc/interpreter/Plot-Annotations.html#Plot-Annotations + end + + % Create textbox + annotation(gcf,'textbox',... + [0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],... + 'VerticalAlignment','middle',... + 'String',{'Text with a','thick and','dotted','border'},... + 'HorizontalAlignment','center',... + 'FitBoxToText','off',... + 'LineStyle',':',... + 'LineWidth',4); + + % Create textbox + annotation(gcf,'textbox',... + [0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],... + 'String',{'Overlapping','and italic'},... + 'FontAngle','italic',... + 'FitBoxToText','off',... + 'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); +end +% ========================================================================= +function [stat] = imageOrientation_inline() +% Run test and save pictures as inline TikZ code + [stat] = imageOrientation(false); + stat.unreliable = isOctave; % FIXME +end +function [stat] = imageOrientation_PNG() +% Run test and save pictures as external PNGs + [stat] = imageOrientation(true); + stat.unreliable = isOctave; % FIXME +end +function [stat] = imageOrientation(imagesAsPng) +% Parameter 'imagesAsPng' is boolean + stat.description = ['Systematic test of different axis', ... + ' orientations and visibility (imagesAsPng = ', ... + num2str(imagesAsPng), ').']; + stat.extraOptions = {'imagesAsPng', imagesAsPng}; + + data = magic(3); + data = [[0,0,9]; data]; % ensure non-quadratic matrix + + subplot(3,2,1); + imagesc(data); colormap(hot); + set(gca,'XDir','normal'); + xlabel('XDir normal'); + set(gca,'YDir','normal'); + ylabel('YDir normal'); + + subplot(3,2,2); + imagesc(data); colormap(hot); + set(gca,'XDir','reverse'); + xlabel('XDir reverse'); + set(gca,'YDir','normal'); + ylabel('YDir normal'); + + subplot(3,2,3); + imagesc(data); colormap(hot); + set(gca,'XDir','normal'); + xlabel('XDir normal'); + set(gca,'YDir','reverse'); + ylabel('YDir reverse'); + + subplot(3,2,4); + imagesc(data); colormap(hot); + set(gca,'XDir','reverse'); + xlabel('XDir reverse'); + set(gca,'YDir','reverse'); + ylabel('YDir reverse'); + + subplot(3,2,5); + imagesc(data); colormap(hot); + set(gca,'XDir','normal'); + xlabel('XDir normal'); + set(gca,'YDir','reverse'); + ylabel('YDir reverse'); + axis off; + title('like above, but axis off'); + + subplot(3,2,6); + imagesc(data); colormap(hot); + set(gca,'XDir','reverse'); + xlabel('XDir reverse'); + set(gca,'YDir','reverse'); + ylabel('YDir reverse'); + axis off; + title('like above, but axis off'); +end +% ========================================================================= +function [stat] = texInterpreter() + stat.description = 'Combinations of tex commands'; + axes + text(0.1,0.9, {'\bfBold text before \alpha and also afterwards.', 'Even the next line is bold \itand a bit italic.'}); + text(0.1,0.75, {'Changing \bfthe\fontname{Courier} font or \color[rgb]{0,0.75,0}color doesn''t', 'change the style. Resetting \rmthe style', 'doesn''t change the font or color.'}); + text(0.1,0.6, 'Styles can be {\bflimited} using \{ and \}.'); + text(0.1,0.45, {'But what happens to the output if there is', '{\bfuse an \alpha inside} the limitted style.'}); + text(0.1,0.3, 'Or if the\fontsize{14} size\color{red} and color are \fontsize{10}changed at different\color{blue} points.'); + text(0.1,0.15, {'Also_{some \bf subscripts} and^{superscripts} are possible.', 'Without brackets, it l^o_oks like t_his.' }); +end +% ========================================================================= +function [stat] = stackedBarsWithOther() + stat.description = 'stacked bar plots and other plots'; + stat.issues = [442,648]; + stat.unreliable = isOctave || isMATLAB(); % FIXME: #614 + % details: https://github.com/matlab2tikz/matlab2tikz/pull/614#issuecomment-91844506 + + % dataset stacked + data = ACID_data; + Y = round(abs(data(7:-1:3,1:3))/10); + n = size(Y,1); + xVals = (1:n).'; + yVals = min((xVals).^2, sum(Y,2)); + + subplot(2,1,1); hold on; + bar(Y,'stacked'); + plot(xVals, yVals, 'Color', 'r', 'LineWidth', 2); + legend('show'); + + subplot(2,1,2); hold on; + b2 = barh(Y,'stacked','BarWidth', 0.75); + plot(yVals, xVals, 'Color', 'b', 'LineWidth', 2); + + set(b2(1),'FaceColor','c','EdgeColor','none') +end +% ========================================================================= +function [stat] = colorbarLabelTitle() + stat.description = 'colorbar with label and title'; + stat.unreliable = isOctave; %FIXME: investigate + stat.issues = 429; + + % R2014b handles colorbars smart: `XLabel` and `YLabel` merged into `Label` + % Use colormap 'jet' to create comparable output with MATLAB R2014b + % * Check horizontal/vertical colorbar (subplots) + % * Check if 'direction' is respected + % * Check if multiline label and title works + % * Check if latex interpreter works in label and title + + subplot(1,2,1) + imagesc(magic(3)); + hc = colorbar; + colormap('jet'); + title(hc,'title $\beta$','Interpreter','latex'); + ylabel(hc,'label $a^2$','Interpreter','latex'); + set(hc,'YDir','reverse'); + + subplot(1,2,2) + label_multiline = {'first','second','third'}; + title_multiline = {'title 1','title 2'}; + imagesc(magic(3)); + hc = colorbar('southoutside'); + colormap('jet'); + title(hc,title_multiline); + xlabel(hc,label_multiline); +end +% ========================================================================= +function [stat] = textAlignment() + stat.description = 'alignment of text boxes and position relative to axis'; + stat.issues = 378; + stat.unreliable = isOctave; %FIXME: investigate + + plot([0.0 2.0], [1.0 1.0],'k'); hold on; + plot([0.0 2.0], [0.5 0.5],'k'); + plot([0.0 2.0], [1.5 1.5],'k'); + plot([1.0 1.0], [0.0 2.0],'k'); + plot([1.5 1.5], [0.0 2.0],'k'); + plot([0.5 0.5], [0.0 2.0],'k'); + + text(1.0,1.0,'h=c, v=m', ... + 'HorizontalAlignment','center','VerticalAlignment','middle'); + text(1.5,1.0,'h=l, v=m', ... + 'HorizontalAlignment','left','VerticalAlignment','middle'); + text(0.5,1.0,'h=r, v=m', ... + 'HorizontalAlignment','right','VerticalAlignment','middle'); + + text(0.5,1.5,'h=r, v=b', ... + 'HorizontalAlignment','right','VerticalAlignment','bottom'); + text(1.0,1.5,'h=c, v=b', ... + 'HorizontalAlignment','center','VerticalAlignment','bottom'); + text(1.5,1.5,'h=l, v=b', ... + 'HorizontalAlignment','left','VerticalAlignment','bottom'); + + text(0.5,0.5,'h=r, v=t', ... + 'HorizontalAlignment','right','VerticalAlignment','top'); + text(1.0,0.5,'h=c, v=t', ... + 'HorizontalAlignment','center','VerticalAlignment','top'); + h_t = text(1.5,0.5,{'h=l, v=t','multiline'}, ... + 'HorizontalAlignment','left','VerticalAlignment','top'); + set(h_t,'BackgroundColor','g'); + + text(0.5,2.1, 'text outside axis (will be removed by cleanfigure())'); + text(1.8,0.7, {'text overlapping', 'axis limits'}); + text(-0.2,0.7, {'text overlapping', 'axis limits'}); + text(0.9,0.0, {'text overlapping', 'axis limits'}); + h_t = text(0.9,2.0, {'text overlapping', 'axis limits'}); + + % Set different units to test if they are properly handled + set(h_t, 'Units', 'centimeters'); +end +% ========================================================================= +function [stat] = overlappingPlots() + stat.description = 'Overlapping plots with zoomed data and varying background.'; + stat.unreliable = isMATLAB(); + % FIXME: this test is unreliable because the automatic axis limits of `ax2` + % differ on different test platforms. Reckon this by creating the figure + % using `ACID(97)` and then manually slightly modify the window size. + % We should not set the axis limits explicitly rather find a better way. + % Workaround: Slightly adapt width and height of `ax2`. + % #591, #641 (issuecomment-106241711) + stat.issues = 6; + + % create pseudo random data and convert it from matrix to vector + l = 256; + l_zoom = 64; + wave = sin(linspace(1,10*2*pi,l)); + + % plot data + ax1 = axes(); + plot(ax1, wave); + + % overlapping plots with zoomed data + ax3 = axes('Position', [0.2, 0.6, 0.3, 0.4]); + ax4 = axes('Position', [0.7, 0.2, 0.2, 0.4]); + ax2 = axes('Position', [0.25, 0.3, 0.3, 0.4]); + + plot(ax2, 1:l_zoom, wave(1:l_zoom), 'r'); + plot(ax3, 1:l_zoom, wave(1:l_zoom), 'k'); + plot(ax4, 1:l_zoom, wave(1:l_zoom), 'k'); + + % set x-axis limits of main plot and first subplot + xlim(ax1, [1,l]); + xlim(ax3, [1,l_zoom]); + + % axis background color: ax2 = default, ax3 = green, ax4 = transparent + set(ax3, 'Color', 'green'); + set(ax4, 'Color', 'none'); +end +% ========================================================================= +function [stat] = histogramPlot() + if isOctave || isMATLAB('<', [8,4]) + % histogram() was introduced in Matlab R2014b. + % TODO: later replace by 'isHG2()' + fprintf('histogram() not found. Skipping.\n' ); + stat.skip = true; + return; + end + stat.description = 'overlapping histogram() plots and custom size bins'; + stat.issues = 525; + + x = [-0.2, -0.484, 0.74, 0.632, -1.344, 0.921, -0.598, -0.727,... + -0.708, 1.045, 0.37, -1.155, -0.807, 1.027, 0.053, 0.863,... + 1.131, 0.134, -0.017, -0.316]; + y = x.^2; + edges = [-2 -1:0.25:3]; + histogram(x,edges); + hold on + h = histogram(y); + set(h, 'orientation', 'horizontal'); +end +% ========================================================================= +function [stat] = alphaTest() + stat.description = 'overlapping objects with transparency and other properties'; + stat.issues = 593; + + contourf(peaks(5)); hold on; % background + + % rectangular patch with different properties + h = fill([2 2 4 4], [2 3 3 2], 'r'); + set(h, 'FaceColor', 'r'); + set(h, 'FaceAlpha', 0.2); + set(h, 'EdgeColor', 'g'); + set(h, 'EdgeAlpha', 0.4); + set(h, 'LineStyle', ':'); + set(h, 'LineWidth', 4); + set(h, 'Marker', 'x'); + set(h, 'MarkerSize', 16); + set(h, 'MarkerEdgeColor', [1 0.5 0]); + set(h, 'MarkerFaceColor', [1 0 0]); % has no visual effect + + % line with different properties + h = line([3 3.5], [1.5 3.5]); + set(h, 'Color', [1 1 1]); + if isMATLAB('>=', [8,4]) + % TODO: later replace by 'isHG2()' + fprintf('Note: RGBA (with alpha channel) only in HG2.\n' ); + set(h, 'Color', [1 1 1 0.3]); + end + set(h, 'LineStyle', ':'); + set(h, 'LineWidth', 6); + set(h, 'Marker', 'o'); + set(h, 'MarkerSize', 14); + set(h, 'MarkerEdgeColor', [1 1 0]); + set(h, 'MarkerFaceColor', [1 0 0]); +end +% ========================================================================= +function [stat] = removeOutsideMarker() + stat.description = 'remove markers outside of the box'; + stat.issues = 788; + + % Create the data and plot it + xdata = -1 : 0.5 : 1.5; + ydata_marker = 1.5 * ones(size(xdata)); + ydata_line = 1 * ones(size(xdata)); + ydata_combined = 0.5 * ones(size(xdata)); + plot(xdata, ydata_marker, '*', ... + xdata, ydata_line, '-', ... + xdata, ydata_combined, '*-'); + title('Markers at -1 and 0.5 should be removed, the line shortened'); + + % Change the limits, so one marker is outside the box + ylim([0, 2]); + xlim([0, 2]); + + % Remove it + cleanfigure; + + % Change the limits back to check result + xlim([-1, 2]); +end +% ========================================================================= +function [stat] = colorbars() + stat.description = 'Manual positioning of colorbars'; + stat.issues = [933 937]; + stat.unreliable = isOctave(); %FIXME: positions differ between Octave 3.2 and 4.0. + + shift = [0.2 0.8 0.2 0.8]; + axLoc = {'in','out','out','in'}; + + for iAx = 1:4 + hAx(iAx) = subplot(2,2,iAx); + axPos = get(hAx(iAx), 'Position'); + cbPos = [axPos(1)+shift(iAx)*axPos(3), axPos(2), 0.02, 0.2]; + + hCb(iAx) = colorbar('Position', cbPos); + try + % only in HG2 + set(hCb(iAx), 'AxisLocation', axLoc{iAx}); + end + title(['AxisLocation = ' axLoc{iAx}]); + grid('on'); + end +end +% ========================================================================= +function [stat] = colorbarManualLocationRightOut() + stat.description = 'Manual positioning of colorbars - Right Out'; + stat.issues = [933 937]; + + axLoc = 'out'; + figPos = [1 , 1, 11 ,10]; + axPos(1,:) = [1 , 1, 8 , 3]; + axPos(2,:) = [1 , 5, 8 , 3]; + cbPos = [9.5, 1, 0.5, 7]; + + colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc); +end +function [stat] = colorbarManualLocationRightIn() + stat.description = 'Manual positioning of colorbars - Right In'; + stat.issues = [933 937]; + + axLoc = 'in'; + figPos = [ 1 , 1, 11 ,10]; + axPos(1,:) = [ 1 , 1, 8 , 3]; + axPos(2,:) = [ 1 , 5, 8 , 3]; + cbPos = [10.5, 1, 0.5, 7]; + + colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc); +end +function [stat] = colorbarManualLocationLeftOut() + stat.description = 'Manual positioning of colorbars - Left Out'; + stat.issues = [933 937]; + + axLoc = 'out'; + figPos = [1 , 1, 11 , 10]; + axPos(1,:) = [2.5, 1, 8 , 3]; + axPos(2,:) = [2.5, 5, 8 , 3]; + cbPos = [1.5, 1, 0.5, 7]; + + colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc); +end +function [stat] = colorbarManualLocationLeftIn() + stat.description = 'Manual positioning of colorbars - Left In'; + stat.issues = [933 937]; + + axLoc = 'in'; + figPos = [1 , 1, 11 , 10]; + axPos(1,:) = [2.5, 1, 8 , 3]; + axPos(2,:) = [2.5, 5, 8 , 3]; + cbPos = [0.5, 1, 0.5, 7]; + + colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc); +end +function colorbarManualLocationHelper_(figPos, axPos, cbPos, axLoc) + % this is a helper function, not a test case + set(gcf, 'Units','centimeters','Position', figPos); + + hAx(1) = axes('Units', 'centimeters', 'Position', axPos(1,:)); + imagesc([1,2,3], [4,5,6], magic(3)/9, [0,1]); + + hAx(2) = axes('Units', 'centimeters', 'Position', axPos(2,:)); + imagesc([1,2,3], [4,5,6], magic(3)/9, [0,1]); + + hCb = colorbar('Units', 'centimeters', 'Position', cbPos); + try + % only in HG2 + %TODO: check if there are HG1 / Octave counterparts for this property + set(hCb, 'AxisLocation', axLoc); + end + + labelProperty = {'Label', 'YLabel'}; %YLabel as fallback for + idxLabel = find(cellfun(@(p) isprop(hCb, p), labelProperty), 1); + if ~isempty(idxLabel) + hLabel = get(hCb, labelProperty{idxLabel}); + set(hLabel, 'String', ['AxisLocation = ' axLoc]); + end +end +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/test/suites/issues.m b/matlab/matlab2tikz-1.1.0/test/suites/issues.m new file mode 100644 index 0000000..79dc69f --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/issues.m @@ -0,0 +1,43 @@ +function [ status ] = issues( k ) +%ISSUES M2T Test cases related to issues +% +% Issue-related test cases for matlab2tikz +% +% See also: ACID, matlab2tikz_acidtest + testfunction_handles = { + @scatter3Plot3 + }; + + numFunctions = length( testfunction_handles ); + + if (k<=0) + status = testfunction_handles; + return; % This is used for querying numFunctions. + + elseif (k<=numFunctions) + status = testfunction_handles{k}(); + status.function = func2str(testfunction_handles{k}); + + else + error('issues:outOfBounds', ... + 'Out of bounds (number of testfunctions=%d)', numFunctions); + end + +end + +% ========================================================================= +function [stat] = scatter3Plot3() + stat.description = 'Scatter3 plot with 2 colors'; + stat.issues = 292; + + hold on; + x = sin(1:5); + y = cos(3.4 *(1:5)); + z = x.*y; + scatter3(x,y,z,150,... + 'MarkerEdgeColor','none','MarkerFaceColor','k'); + scatter3(-x,y,z,150,... + 'MarkerEdgeColor','none','MarkerFaceColor','b'); +end + +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/getEnvironment.m b/matlab/matlab2tikz-1.1.0/test/suites/private/getEnvironment.m new file mode 100644 index 0000000..4717cb5 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/getEnvironment.m @@ -0,0 +1,25 @@ +function [env, versionString] = getEnvironment() +% Determine environment (Octave, MATLAB) and version string +% TODO: Unify private `getEnvironment` functions + persistent cache + + if isempty(cache) + isOctave = exist('OCTAVE_VERSION', 'builtin') ~= 0; + if isOctave + env = 'Octave'; + versionString = OCTAVE_VERSION; + else + env = 'MATLAB'; + vData = ver(env); + versionString = vData.Version; + end + + % store in cache + cache.env = env; + cache.versionString = versionString; + + else + env = cache.env; + versionString = cache.versionString; + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/herrorbar.m b/matlab/matlab2tikz-1.1.0/test/suites/private/herrorbar.m new file mode 100644 index 0000000..9f4ad19 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/herrorbar.m @@ -0,0 +1,167 @@ +function hh = herrorbar(x, y, l, u, symbol) +%HERRORBAR Horizontal Error bar plot. +% HERRORBAR(X,Y,L,R) plots the graph of vector X vs. vector Y with +% horizontal error bars specified by the vectors L and R. L and R contain the +% left and right error ranges for each point in X. Each error bar +% is L(i) + R(i) long and is drawn a distance of L(i) to the right and R(i) +% to the right the points in (X,Y). The vectors X,Y,L and R must all be +% the same length. If X,Y,L and R are matrices then each column +% produces a separate line. +% +% HERRORBAR(X,Y,E) or HERRORBAR(Y,E) plots X with error bars [X-E X+E]. +% HERRORBAR(...,'LineSpec') uses the color and linestyle specified by +% the string 'LineSpec'. See PLOT for possibilities. +% +% H = HERRORBAR(...) returns a vector of line handles. +% +% Example: +% x = 1:10; +% y = sin(x); +% e = std(y)*ones(size(x)); +% herrorbar(x,y,e) +% draws symmetric horizontal error bars of unit standard deviation. +% +% This code is based on ERRORBAR provided in MATLAB. +% +% See also ERRORBAR + +% Jos van der Geest +% email: jos@jasen.nl +% +% File history: +% August 2006 (Jos): I have taken back ownership. I like to thank Greg Aloe from +% The MathWorks who originally introduced this piece of code to the +% Matlab File Exchange. +% September 2003 (Greg Aloe): This code was originally provided by Jos +% from the newsgroup comp.soft-sys.matlab: +% http://newsreader.mathworks.com/WebX?50@118.fdnxaJz9btF^1@.eea3ff9 +% After unsuccessfully attempting to contact the orignal author, I +% decided to take ownership so that others could benefit from finding it +% on the MATLAB Central File Exchange. + +if min(size(x))==1, + npt = length(x); + x = x(:); + y = y(:); + if nargin > 2, + if ~ischar(l), + l = l(:); + end + if nargin > 3 + if ~ischar(u) + u = u(:); + end + end + end +else + [npt,n] = size(x); +end + +if nargin == 3 + if ~ischar(l) + u = l; + symbol = '-'; + else + symbol = l; + l = y; + u = y; + y = x; + [m,n] = size(y); + x(:) = (1:npt)'*ones(1,n);; + end +end + +if nargin == 4 + if ischar(u), + symbol = u; + u = l; + else + symbol = '-'; + end +end + +if nargin == 2 + l = y; + u = y; + y = x; + [m,n] = size(y); + x(:) = (1:npt)'*ones(1,n);; + symbol = '-'; +end + +u = abs(u); +l = abs(l); + +if ischar(x) || ischar(y) || ischar(u) || ischar(l) + error('Arguments must be numeric.') +end + +if ~isequal(size(x),size(y)) || ~isequal(size(x),size(l)) || ~isequal(size(x),size(u)), + error('The sizes of X, Y, L and U must be the same.'); +end + +tee = (max(y(:))-min(y(:)))/100; % make tee .02 x-distance for error bars +% changed from errorbar.m +xl = x - l; +xr = x + u; +ytop = y + tee; +ybot = y - tee; +n = size(y,2); +% end change + +% Plot graph and bars +hold_state = ishold; +cax = newplot; +next = lower(get(cax,'NextPlot')); + +% build up nan-separated vector for bars +% changed from errorbar.m +xb = zeros(npt*9,n); +xb(1:9:end,:) = xl; +xb(2:9:end,:) = xl; +xb(3:9:end,:) = NaN; +xb(4:9:end,:) = xl; +xb(5:9:end,:) = xr; +xb(6:9:end,:) = NaN; +xb(7:9:end,:) = xr; +xb(8:9:end,:) = xr; +xb(9:9:end,:) = NaN; + +yb = zeros(npt*9,n); +yb(1:9:end,:) = ytop; +yb(2:9:end,:) = ybot; +yb(3:9:end,:) = NaN; +yb(4:9:end,:) = y; +yb(5:9:end,:) = y; +yb(6:9:end,:) = NaN; +yb(7:9:end,:) = ytop; +yb(8:9:end,:) = ybot; +yb(9:9:end,:) = NaN; +% end change + + +[ls,col,mark,msg] = colstyle(symbol); +if ~isempty(msg) + error(msg); +end +if isempty(col) + col = ''; +end +symbol = [ls mark col]; % Use marker only on data part +esymbol = ['-' col]; % Make sure bars are solid +if ~isempty(strfind(symbol,'none')) + symbol = 'none'; +end +if ~isempty(strfind(esymbol,'none')) + esymbol = 'none'; +end +h = plot(xb,yb,'LineStyle',esymbol); hold on +h = [h;plot(x,y,'LineStyle',symbol)]; + +if ~hold_state + hold off; +end + +if nargout>0 + hh = h; +end diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/isEnvironment.m b/matlab/matlab2tikz-1.1.0/test/suites/private/isEnvironment.m new file mode 100644 index 0000000..b5f315a --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/isEnvironment.m @@ -0,0 +1,46 @@ +function bool = isEnvironment(wantedEnvironment, varargin) +% ISENVIRONMENT check for a particular environment (MATLAB/Octave) +% +% This function returns TRUE when it is run within the "wantedEnvironment" +% (e.g. MATLAB or Octave). This environment can be tested to be a particular +% version or be older/newer than a specified version. +% +% Usage: +% +% ISENVIRONMENT(ENV) +% ISENVIRONMENT(ENV, VERSION) +% ISENVIRONMENT(ENV, OP, VERSION) +% +% Parameters: +% - `ENV`: the expected environment (e.g. 'MATLAB' or 'Octave') +% - `VERSION`: a version number or string to compare against +% e.g. "3.4" or equivalently [3,4] +% - `OP`: comparison operator (e.g. '==', '<=', '<', ...) to define a range +% of version numbers that return a TRUE value +% +% When `OP` is not specified, "==" is used. +% When no `VERSION` is specified, all versions pass the check. +% +% See also: isMATLAB, isOctave, versionCompare + [env, thisVersion] = getEnvironment(); + bool = strcmpi(env, wantedEnvironment); + + switch numel(varargin) + case 0 % nothing to be done + return + + case 1 % check equality + version = varargin{1}; + operator = '=='; + bool = bool && versionCompare(thisVersion, operator, version); + + case 2 + operator = varargin{1}; + version = varargin{2}; + bool = bool && versionCompare(thisVersion, operator, version); + + otherwise + error('isEnvironment:BadNumberOfArguments', ... + '"isEnvironment" was called with an incorrect number of arguments.'); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/isMATLAB.m b/matlab/matlab2tikz-1.1.0/test/suites/private/isMATLAB.m new file mode 100644 index 0000000..962ff77 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/isMATLAB.m @@ -0,0 +1,4 @@ +function bool = isMATLAB(varargin) +%ISMATLAB Determines whether (a certain) version of MATLAB is being used +% See also: isEnvironment, isOctave +bool = isEnvironment('MATLAB', varargin{:}); diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/isOctave.m b/matlab/matlab2tikz-1.1.0/test/suites/private/isOctave.m new file mode 100644 index 0000000..28936e3 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/isOctave.m @@ -0,0 +1,5 @@ +function bool = isOctave(varargin) +%ISOCTAVE Determines whether (a certain) version of Octave is being used +% +% See also: isEnvironment, isMATLAB +bool = isEnvironment('Octave', varargin{:}); diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/isVersionBelow.m b/matlab/matlab2tikz-1.1.0/test/suites/private/isVersionBelow.m new file mode 100644 index 0000000..c078b26 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/isVersionBelow.m @@ -0,0 +1,38 @@ +function isBelow = isVersionBelow(versionA, versionB) +% Checks if versionA is smaller than versionB + vA = versionArray(versionA); + vB = versionArray(versionB); + n = min(length(vA), length(vB)); + deltaAB = vA(1:n) - vB(1:n); + difference = find(deltaAB, 1, 'first'); + if isempty(difference) + isBelow = false; % equal versions + else + isBelow = (deltaAB(difference) < 0); + end +end +% ============================================================================== +function arr = versionArray(str) +% Converts a version string to an array. + if ischar(str) + % Translate version string from '2.62.8.1' to [2; 62; 8; 1]. + switch getEnvironment + case 'MATLAB' + split = regexp(str, '\.', 'split'); % compatibility MATLAB < R2013a + case 'Octave' + split = strsplit(str, '.'); + otherwise + errorUnknownEnvironment(); + end + arr = str2num(char(split)); %#ok + else + arr = str; + end + arr = arr(:)'; +end +% ============================================================================== +function errorUnknownEnvironment() +error('matlab2tikz:unknownEnvironment',... + 'Unknown environment "%s". Need MATLAB(R) or Octave.', getEnvironment); +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/suites/private/versionCompare.m b/matlab/matlab2tikz-1.1.0/test/suites/private/versionCompare.m new file mode 100644 index 0000000..6ef6096 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/private/versionCompare.m @@ -0,0 +1,20 @@ +function bool = versionCompare( vA, operator, vB ) +%VERSIONCOMPARE Performs a version comparison operation + switch operator + case '<' + bool = isVersionBelow(vA, vB); + case '>' + bool = isVersionBelow(vB, vA); + case {'<=', '=<'} + bool = ~isVersionBelow(vB, vA); + case {'>=', '=>'} + bool = ~isVersionBelow(vA, vB); + case {'=', '=='} + bool = ~isVersionBelow(vA, vB) && ~isVersionBelow(vB, vA); + case {'~=', '!='} + bool = isVersionBelow(vA, vB) || isVersionBelow(vB, vA); + otherwise + error('versionCompare:UnknownOperator',... + '"%s" is not a known comparison operator', operator); + end +end diff --git a/matlab/matlab2tikz-1.1.0/test/suites/testPatches.m b/matlab/matlab2tikz-1.1.0/test/suites/testPatches.m new file mode 100644 index 0000000..6cd9454 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/testPatches.m @@ -0,0 +1,121 @@ +function status = testPatches(k) +% TESTPATCHES Test suite for patches +% +% See also: ACID, matlab2tikz_acidtest + +testfunction_handles = { + @patch01; + @patch02; + @patch03; + @patch04; + @patch05; + @patch06; + @patch07; + @patch08; + }; + +numFunctions = length( testfunction_handles ); + +if nargin < 1 || isempty(k) || k <= 0 + status = testfunction_handles; + return; % This is used for querying numFunctions. + +elseif (k<=numFunctions) + status = testfunction_handles{k}(); + status.function = func2str(testfunction_handles{k}); + +else + error('patchTests:outOfBounds', ... + 'Out of bounds (number of testfunctions=%d)', numFunctions); +end + +end + +% ========================================================================= +function p = patch00() +% DO NOT INCLUDE IN ACID LIST +% Base patch plot for following tests +xdata = [2 2 0 2 5; 2 8 2 4 5; 8 8 2 4 8]; +ydata = [4 4 4 2 0; 8 4 6 2 2; 4 0 4 0 0]; +zdata = ones(3,5)*2; +p = patch(xdata,ydata,zdata); +end +% ========================================================================= +function stat = patch01() +stat.description = 'Set face color red'; + +p = patch00(); +set(p,'FaceColor','r') +end +% ========================================================================= +function stat = patch02() +stat.description = 'Flat face colors scaled in clim [0,40]'; + +p = patch00(); +set(gca,'CLim',[0 40]) +cdata = [15 30 25 2 60]; +set(p,'FaceColor','flat','CData',cdata,'CDataMapping','scaled') +end +% ========================================================================= +function stat = patch03() +stat.description = 'Flat face colors direct in clim [0,40]'; + +p = patch00(); +set(gca,'CLim',[0 40]) +cdata = [15 30 25 2 60]; +set(p,'FaceColor','flat','CData',cdata,'CDataMapping','direct') +end +% ========================================================================= +function stat = patch04() +stat.description = 'Flat face colors with 3D (truecolor) CData'; + +p = patch00(); +cdata(:,:,1) = [0 0 1 0 0.8]; +cdata(:,:,2) = [0 0 0 0 0.8]; +cdata(:,:,3) = [1 1 1 0 0.8]; +set(p,'FaceColor','flat','CData',cdata) +end +% ========================================================================= +function stat = patch05() +stat.description = 'Flat face color, scaled edge colors in clim [0,40]'; + +p = patch00(); +set(gca,'CLim',[0 40]) +cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; +set(p,'FaceColor','flat','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','scaled') +end +% ========================================================================= +function stat = patch06() +stat.description = 'Flat face color, direct edge colors in clim [0,40]'; + +p = patch00(); +set(gca,'CLim',[0 40]) +cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; +set(p,'FaceColor','flat','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','direct') +end +% ========================================================================= +function stat = patch07() +stat.description = 'Flat face color with 3D CData and interp edge colors'; + +p = patch00(); +cdata(:,:,1) = [0 0 1 0 0.8; + 0 0 1 0.2 0.6; + 0 1 0 0.4 1]; +cdata(:,:,2) = [0 0 0 0 0.8; + 1 1 1 0.2 0.6; + 1 0 0 0.4 0]; +cdata(:,:,3) = [1 1 1 0 0.8; + 0 1 0 0.2 0.6; + 1 0 1 0.4 0]; +set(p,'FaceColor','flat','CData',cdata,'EdgeColor','interp','LineWidth',5) +end +% ========================================================================= +function stat = patch08() +stat.description = 'Interp face colors, flat edges, scaled CData in clims [0,40]'; + +p = patch00(); +set(gca,'CLim',[0 40]) +cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; +set(p,'FaceColor','interp','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','scaled') +end +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/test/suites/testSurfshader.m b/matlab/matlab2tikz-1.1.0/test/suites/testSurfshader.m new file mode 100644 index 0000000..15ac25d --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/suites/testSurfshader.m @@ -0,0 +1,102 @@ +function status = testSurfshader(k) +% TESTSURFSHADER Test suite for Surf/mesh shaders (coloring) +% +% See also: ACID, matlab2tikz_acidtest + + testfunction_handles = { + @surfShader1; + @surfShader2; + @surfShader3; + @surfShader4; + @surfShader5; + @surfNoShader; + @surfNoPlot; + @surfMeshInterp; + @surfMeshRGB; + }; + + numFunctions = length( testfunction_handles ); + + if nargin < 1 || isempty(k) || k <= 0 + status = testfunction_handles; + return; % This is used for querying numFunctions. + + elseif (k<=numFunctions) + status = testfunction_handles{k}(); + status.function = func2str(testfunction_handles{k}); + + else + error('patchTests:outOfBounds', ... + 'Out of bounds (number of testfunctions=%d)', numFunctions); + end + +end + +% ========================================================================= +function [stat] = surfShader1() + stat.description = 'shader=flat/(flat mean) | Fc: flat | Ec: none'; + + [X,Y,Z] = peaks(5); + surf(X,Y,Z,'FaceColor','flat','EdgeColor','none') +end +% ========================================================================= +function [stat] = surfShader2() + stat.description = 'shader=interp | Fc: interp | Ec: none'; + + [X,Y,Z] = peaks(5); + surf(X,Y,Z,'FaceColor','interp','EdgeColor','none') +end +% ========================================================================= +function [stat] = surfShader3() + stat.description = 'shader=faceted | Fc: flat | Ec: RGB'; + + [X,Y,Z] = peaks(5); + surf(X,Y,Z,'FaceColor','flat','EdgeColor','green') +end +% ========================================================================= +function [stat] = surfShader4() +stat.description = 'shader=faceted | Fc: RGB | Ec: interp'; +if isMATLAB('<', [8,4]); %R2014a and older + warning('m2t:ACID:surfShader4',... + 'The MATLAB EPS export may behave strangely for this case'); +end + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','blue','EdgeColor','interp') +end +% ========================================================================= +function [stat] = surfShader5() +stat.description = 'shader=faceted interp | Fc: interp | Ec: flat'; + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','interp','EdgeColor','flat') +end +% ========================================================================= +function [stat] = surfNoShader() +stat.description = 'no shader | Fc: RGB | Ec: RGB'; + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','blue','EdgeColor','yellow') +end +% ========================================================================= +function [stat] = surfNoPlot() +stat.description = 'no plot | Fc: none | Ec: none'; + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','none','EdgeColor','none') +end +% ========================================================================= +function [stat] = surfMeshInterp() +stat.description = 'mesh | Fc: none | Ec: interp'; + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','none','EdgeColor','interp') +end +% ========================================================================= +function [stat] = surfMeshRGB() +stat.description = 'mesh | Fc: none | Ec: RGB'; + +[X,Y,Z] = peaks(5); +surf(X,Y,Z,'FaceColor','none','EdgeColor','green') +end +% ========================================================================= diff --git a/matlab/matlab2tikz-1.1.0/test/template/.gitignore b/matlab/matlab2tikz-1.1.0/test/template/.gitignore new file mode 100644 index 0000000..8878867 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/template/.gitignore @@ -0,0 +1,6 @@ +# just ignore all generate files +acid.* +*.log +*.aux +*.pdf +*.tex diff --git a/matlab/matlab2tikz-1.1.0/test/template/Makefile b/matlab/matlab2tikz-1.1.0/test/template/Makefile new file mode 100644 index 0000000..72f9d4f --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/template/Makefile @@ -0,0 +1,33 @@ +# ./Makefile + +ECHOCMD:=/bin/echo -e +LATEX:=pdflatex --shell-escape +TARGET:=acid + +main: + cd data/reference/ && $(MAKE) + cd data/converted/ && $(MAKE) + @$(LATEX) $(TARGET) + +.PHONY: clean + +clean: + @rm -f $(TARGET).aux \ + $(TARGET).log \ + $(TARGET).nav \ + $(TARGET).out \ + $(TARGET).snm \ + $(TARGET).toc \ + $(TARGET).vrb \ + $(TARGET).pdf \ + $(TARGET).dvi \ + $(TARGET).ps \ + missfont.log + @rm -f *~ + cd data/reference/ && $(MAKE) clean + cd data/converted/ && $(MAKE) clean + +distclean: clean + @rm -f $(TARGET).tex + cd data/reference/ && $(MAKE) distclean + cd data/converted/ && $(MAKE) distclean diff --git a/matlab/matlab2tikz-1.1.0/test/template/data/.gitignore b/matlab/matlab2tikz-1.1.0/test/template/data/.gitignore new file mode 100644 index 0000000..e511b9b --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/template/data/.gitignore @@ -0,0 +1,8 @@ +# just ignore all generated files +*.log +*.aux +*.pdf +*.eps +*.png +*.tex +*.tsv diff --git a/matlab/matlab2tikz-1.1.0/test/template/data/converted/Makefile b/matlab/matlab2tikz-1.1.0/test/template/data/converted/Makefile new file mode 100644 index 0000000..3197373 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/template/data/converted/Makefile @@ -0,0 +1,23 @@ +# ./Makefile + +ECHOCMD:=/bin/echo -e +LATEX:=pdflatex --shell-escape -interaction=batchmode + +TEST_SRCS:=$(wildcard test*-converted.tex) +TEST_PDFS:=$(TEST_SRCS:.tex=.pdf) + +default: $(TEST_PDFS) + +%.pdf: %.tex + @$(LATEX) $< + +.PHONY: clean + +clean: + rm -f test*-converted.aux \ + test*-converted.log \ + test*-converted.pdf + +distclean: clean + rm -f test*-converted.tex \ + test*-converted*.png diff --git a/matlab/matlab2tikz-1.1.0/test/template/data/reference/Makefile b/matlab/matlab2tikz-1.1.0/test/template/data/reference/Makefile new file mode 100644 index 0000000..1c39fac --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/template/data/reference/Makefile @@ -0,0 +1,19 @@ +# ./Makefile + +EPSTOPDF:=epstopdf + +REFERENCE_EPSS:=$(wildcard test*-reference.eps) +REFERENCE_PDFS:=$(REFERENCE_EPSS:.eps=.pdf) + +default: $(REFERENCE_PDFS) + +%.pdf: %.eps + $(EPSTOPDF) $< + +.PHONY: clean + +clean: + rm -f test*-reference.pdf + +distclean: clean + rm -f test*-reference.eps diff --git a/matlab/matlab2tikz-1.1.0/test/testGraphical.m b/matlab/matlab2tikz-1.1.0/test/testGraphical.m new file mode 100644 index 0000000..27e943d --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/testGraphical.m @@ -0,0 +1,47 @@ +function [ status ] = testGraphical( varargin ) +%TESTGRAPHICAL Runs the M2T test suite to produce graphical output +% +% This is quite a thin wrapper around testMatlab2tikz to run the test suite to +% produce a PDF side-by-side report. +% +% Its allowed arguments are the same as those of testMatlab2tikz. +% +% Usage: +% +% status = testGraphical(...) % gives programmatical access to the data +% +% testGraphical(...); % automatically invokes makeLatexReport afterwards +% +% See also: testMatlab2tikz, testHeadless, makeLatexReport + + [state] = initializeGlobalState(); + finally_restore_state = onCleanup(@() restoreGlobalState(state)); + + [status, args] = testMatlab2tikz('actionsToExecute', @actionsToExecute, ... + varargin{:}); + + if nargout == 0 + makeLatexReport(status, args.output); + end +end +% ============================================================================== +function status = actionsToExecute(status, ipp) + status = execute_plot_stage(status, ipp); + + if status.skip + return + end + + status = execute_save_stage(status, ipp); + status = execute_tikz_stage(status, ipp); + %status = execute_hash_stage(status, ipp); %cannot work with files in + %standalone mode! + status = execute_type_stage(status, ipp); + + if ~status.closeall && ~isempty(status.plotStage.fig_handle) + close(status.plotStage.fig_handle); + else + close all; + end +end +% ============================================================================== diff --git a/matlab/matlab2tikz-1.1.0/test/testHeadless.m b/matlab/matlab2tikz-1.1.0/test/testHeadless.m new file mode 100644 index 0000000..b88b5a8 --- /dev/null +++ b/matlab/matlab2tikz-1.1.0/test/testHeadless.m @@ -0,0 +1,62 @@ +function [ status ] = testHeadless( varargin ) +%TESTGRAPHICAL Runs the M2T test suite without graphical output +% +% This is quite a thin wrapper around testMatlab2tikz to run the test suite to +% produce a textual report and checks for regressions by checking the MD5 hash +% of the output +% +% Its allowed arguments are the same as those of testMatlab2tikz. +% +% Usage: +% +% status = TESTHEADLESS(...) % gives programmatical access to the data +% +% TESTHEADLESS(...); % automatically invokes makeTravisReport afterwards +% +% See also: testMatlab2tikz, testGraphical, makeTravisReport + +% The width and height are specified to circumvent different DPIs in developer +% machines. The float format reduces the probability that numerical differences +% in the order of numerical precision disrupt the output. + extraOptions = {'width' ,'\figureWidth', ... + 'height','\figureHeight',... + 'floatFormat', '%4g', ... % see #604 + 'extraCode',{ ... + '\newlength\figureHeight \setlength{\figureHeight}{6cm}', ... + '\newlength\figureWidth \setlength{\figureWidth}{10cm}'} + }; + + [state] = initializeGlobalState(); + finally_restore_state = onCleanup(@() restoreGlobalState(state)); + + status = testMatlab2tikz('extraOptions', extraOptions, ... + 'actionsToExecute', @actionsToExecute, ... + varargin{:}); + + if nargout == 0 + makeTravisReport(status); + end +end +% ============================================================================== +function status = actionsToExecute(status, ipp) + status = execute_plot_stage(status, ipp); + + if status.skip + return + end + + status = execute_tikz_stage(status, ipp); + status = execute_hash_stage(status, ipp); + status = execute_type_stage(status, ipp); + + if ~status.closeall && ~isempty(status.plotStage.fig_handle) + try + close(status.plotStage.fig_handle); + catch + close('all'); + end + else + close all; + end +end +% ==============================================================================

+$>op6jChze>xRzh%X)wFDCjydUM5o_ow_l|@+@``@D<&4MW z;i|0Ki|v?Mc!%HC$pqb?UfOh5#_M)nHH=Pw3K2|xWyo=|<*`D!@U_f!;jk{>h4Flq zCVxo>?NK(Ub=!ISv3hwMxw!Y=>`hHfQ-$JD4L{y$`I(HT;#+|ksqwS+!rZMGD5Gb9 zE^H;(}9dTp=^ZU08=tn3iI(sM^)VnXQd9a}^bvfQpeu|gF=>A-{ zH$wXAR2PT6@-SbMLMh75<3$E;sjq#+TH=RMG`)YxuxA5nQfow?_N|1uUnkHzVs}-s zV*N(nAn>edqxI0CM*BL2G6zY{NP6@F1_zzV1&wa^a#jnKkRz)hbT`BGA`R84iO=z3 zZr-_U#Y~#7#~EC*uI8*b*u32O+OW*Pc}xt)C8ub4{d?aee~bVNqB_kixo@EE?)z_}ek@u~>sCiAvPbp*9|xmTs1UoE zNgesed-B~S#Hy;~(b9BSzYV|XYBFB6W?hWX`VFuO?2m|5al3lrnBC3I+YRgecmrDS z^Fj#ZIp5CRgl6H+#nq#`Yvk#&$#`!1I}T2AdbUCpUchW;m5yp$Q=?dTqHL!0YK})r zHO*@9eni>9_vJ&xe3R!cs=;bKqS{Q3%C$S6Bkj?YMZ?Pm$e=;%Y$-dvxLHltck^W3 zs#W;MuuPg<`_suVz=su!G!WU1g;UfzI_lXg^}t>{SQwMVVc^4LNJ;@~7}IbEpDtdn zu){Z7alGnj_HlnUl3dAf02eL|$L{nUwJOM*i*n?fdi*a)e|5GVS-b-4d>53#mqYTT z@u?nKQFBrLX42EE#Gub24K9;q#QJaI5dk@|!ar-?u;iD!cpYR=3z{}LZ1IrtqC_pOsbe#$#2(pq z@*H3E%{aVZdpzwY3$SH@w8KgquPb_Z{0iO!)!;~;#mbiQJKe<*z9dVuziJ;Axr!9f{d`^ z^{X{dF0=UB97Qcqpto+y7wJEgF>oM=Fs?|^;hk0v&l6&Yhnv3w8Z_1ptl`6`FQ|H z@&@9jM00#5X68#B)7N^hRBoJqnPuxxe_8h{zMmEAYE=mH+j!}Yr=J!xZLcYF8(N#w z0i%ww2Jvn4gC!+@)2K9(IAmlX`QTlS_FPrTLcYQvdx7~S<|?HnLzTPOP?!$~%FTDQ z)*c7~TK|`{gS>n@+)KtqljMU%H;?o?btWPtRxQAv$PA79r#~(vOl9}Sei)zF)#>k6;AH;<5fXl z@29)o6`r5Lq``Wpl|nGY>x{hV2j)o0pI%_t6$yS{4;W#l2S%A;Ja8IK6Tu9bBXfik zEpxeZ>x_9MuSRdjSAP9Z1>*`G$Tt0q2ha#%y7pO5b~CphQlrz`t5L zl&K*JDPK=_BxK0&@#f|p*1Pjb==a-s6J)WYM0g6e_V%d1SHO9~{1gXlUYl>~&6UN% zQ%uZ|vJcrt6KA-|fG90XEm`!YFH0$ntL_r?Me+`Qv5chp!QgKl5g zO`6o6>}1Q>>q7sf`oa*F;XH3!O+Q~a9*dn=sRna>-K{dl_(dN`8M}-i+F-tjAu^;r zz3kxo$yJRDakVFvQhENfnQa0#pIuTNguR>9$ZE8|q(RgzBk8-EdpqwyivOfm+ z(hbjIyZ!bpnX0Ux6M9kgGkNe>XW>t#TD{|@X!qIy1Tn9ct-1$R!T0xhC{Hl=0ea;9 z?s^r!-AOlS9=BFsT5RutgRu{todrZ`)f~YxxfW5%6D*N%uN&elZNNWwyPHar9Dj12 zu`SsB_*~6Aa~Evez~?jca(hMD+i~)pLJXU`&L!-zu;+vKnXR6^(s=giCi{b@`jhF8pJ&irugU_P1It!s8@ShGL;u=;cZ3<~qT$6m zHfs|}QLyuIS2gYc&=~J>d(qreVBVhNtCvIB4JgJ{*|AeLJ4_nHAkkVf^soDx=LVhnpKq zF+$7+oi4UZ%s3(2`wps|TZ_o-dG@^TKj`*J`n%jl<3>0=COS^f;}<(W zOwOkPT2hRQ^e5`8dc19R-8zLSkTWtji@F}Je~+dHUgL{BsZwKyF;b8S*`{BJQ-g7X0Ftc^7J?_S4LMO{ZpwnSP8A9^U^XI zd0*K+kh{UN-#4XPhmN>(nn}sn&`B3Th>&haUh4$?Y$_0q$)+Z}mK}tDHs)T5t(8Kf zUqU<0Y~6!Usqv~KW=025=lLT22RzrG8@rz~y@mMy{{b+!`q=TCWU^YY%}DLK0*cw7 z=ija>4DA*|*XxRD=86Fc;8=1`8&%EXk92xu)&0hK*IuNsuMYIlai_x6`0oM*IX$(( z5~@}u$- zuQL;X(Qgi~6QY!F)7{}hPB){2Z0BFI5~9BEHkiT7LGsSC-EHAAOteX>*XSX6=yKr0 z-t}dge zdmW~>wvH3)-B@1iiqB}@2az-I;KZo`;R4rr5dTJV|B25^e^RTo@r9nmaNIX33mwy; z?4zG4RfN`X?uhVgus?xXdo+EN(HE$Q_VqOrVVT3QSZGj8vD=f_)VT7PwY@*{*~Izs zk5%K6H##IbLaONiX^>U_Z%kAe4)0~WzriN&OgUE%%S*gJXBL$OIs&9|YFp8}L-h=F`)w=Le zK+9%FXp7*VNtV0NAKpc7?eXQZdA$ESV8sP3z%rxmo_LP3%&_}1&gSTKSq_HvO7R;n z>0t01&QsTGQWewJYSQ&_?Y|)Dvo-TO`^}}Rox6G8uXHbkBWO~wf8WjaG=U@; z5)RRiJodW6-_R>PTo6Q@h_t93sVbecEnA(0yDX*4>!lHs2yt9kX^R-alump4-XC z=QX<-+lvHO+!+ct*tqt4JkE6cuRD0^eygq7coYllU@a1{ciloRciqkVy?w_pMcmDJ zk%WZ=Qz!|$woix8;ygb3%pvok&WkbL4W@R5eaQgedSD-f5>5#gg$i@8w+`73WvvEl2 z>8W^-qA?Wz$d{jFADs5Q*8Rot`OQ9Vobgp=^?|Y@Udq=-R$6|a8R%Jwncq`+wC#<{ zJ+|oy#%ss)g--8pPpk1D0L4GXz<$Mg+ameB;d79;_-z`QOx$PhW0`^sEC~Sh*3VsV zsQIKx>@uCK>~fzS8E+GN+ffxcqJ!7|gLcMJO_zo*O75-jxH8^(=b{43OmgiMQ63eh zk;rG|G|A-IKpLwjO24YYGbPn{mwgV3y=HTgej;2S#XY^V(6+_1TGI$EC!MbERAYq^ zTM^&Ys9vD0eFk_e!l3?}`nwP`mC!@p2dHFuprvY9nOwZjS}uxz(En5teS0 z@i$&|+l;HN;@7iroT05|O&<++`bZ=08RdMbTQp{_Co-HQ0Z6OOLH-+i$3ByJ3yV+9 z^7vZQt>`6yB3kLR!@n~N`!VvpGV$o$ z5^{YOA;<3xuF_+F3zB_uJtad9X?Ld51gsv*vhX(8KGqg18vU4eRWWT=Cp%1g%4l3- z25il5w&r{a*!sujuV*u?+y>ie#UM*1e`y78=x5K1#TjO!{q{nA-2$9R8#A%R$90gG ziB)yWLzd(*={)9KZgJW3op3?6uKQTwO$4iFuf##0^~G}f*1q*1ljXLhA}nJJz^R|k z8yksY)<2;Ew-V;@D})%hN7CJ9Q@8=_3LgzJ`?o1jczEiMoKjmS_bxMkGW4#+8z1n^ z(K{ucM((RUlu=C&UzM~wTM*<=o!5}RnY4{%a}(!K`~(0BF+TZH&WqaJ_P}eOo97yp z0ZD{i$wiMzCY@9yAIJ@`H+e^+cRUt==iVN-bi*f0w+A$XzT#a?G69}i=O=aZ*J0{_ z9c%PAEY?1?AP_>cd%l>|+&mdy_pE8KhVJPX*%0|i0q#iK#%I@ z-n3<%V=bqQL9&Wth9?!x` zeNFSYnhYfe6gR!v15zKk&B+QgO-8Ps@Q2dcsQ5Wc3x_pZI|rt{m>w(2l#t5TX~c^q zrd|ZL%5p@*3&7yZG=g7q`K5y@SdfrOezVq*Q-cLHb#%euPWy?zbxk3E#n_kDpNdtv z-Ae3*KlGp-og;^57vx46&Xt+MnWu{mw*+04JxB+f%>myn>jf8}X@=GH-y!`NXtOw* z#f*GafZN)YJ{R1bP|z2H`!s`Z`tvidrPXV3PIp%)F?S?v7S z=G(93x!Y6gX3xmY0qxe%&OUFOd%?{8N44TUm*;$5zb@=`Md3+|d$iV#9SH!&Z+YjM z?YK>ClzvsaP*^j;ZgVn60!ZiL{K9y%skCbp2ro~1M(r%B#o>IAm-R8}H&vDZL2Ndk42)s(|37UU_$#ZDGpuWrgcMd)3oTPuYbt zbX9$$&UsF3=AbRKgh!$moKrM{OUkfYNhj0Xo*;vj^D6x{@5L+Hta~%UTZS!MuRV@M zu5#W0uxVbaL1y8zy9*3f*#~e)lsL@k0fMScj8aKe*Eb8T_H>4t%_L=ktL{|aNz(I( z_PWG=lB%xU8CTz&TGp<(nK3e-?Mgj@_Skn%n?>|3t&&Ax-pdul3e zR1MuvpEGwo(i;q}x(}_c+|8FD8i~~9l@f%(T{r~P*4Z7Rw1P`Aog z&&izbZ{4R+?zi#f`^{g_(y=p~)7&gQ z9J}Qwb31!L-bRx3ItFv=O0#lmRNr$;Ha2g+nrCH+>*1P%AEB71Ta#V zeLX{bvDjwWG^#JOn*i{a?iOc;Sc}+oTY#({3$_hpej2~s z;a~jUx zV~|%}YH~*|Uz6;N_U(R~=3SmDg;F78AnC;E_^hi~+gYxfJ@+~3)~_~&Rwe>N*l}a* z=M)1ooO|9fp=slg&X5-BTN~!3wJkk{Ud~ipD8{00^pE+L_M#jr{}wz zms+B%zloFrXi$M^>gC9vV1J0&VfyRh5QouYFwrNI#l~3VU+{_T{vO&0 zH4S2#m_{cR>Q}fVHj15UKQqlrW}8pu>Iq^}H%K5izug)jpfoGqP}BTFk*chG-bWv% zb?A>2h-@dpIbvDwom*492nECLOqe+xCfZtmZyM=7Mn@3{dQG%yAEOt6HEO*P@IlLq z11I}Jy*Za3cSZ6Hp^NFbDG0@O9IfVRn0uJVPb0^O?^^S0=H!vP5@+A1>wQaWf!KAf zGv6)0goOB8=G|B%mGH>~1Ju;f$_xIY-jr&aY?;k&Gq2%mf-#CVGsFhN+%zF9P>=DJ zZO*;dyKT73m)mbsLB3?=H}iaa?m04F$5XR!>2y36bHoRQtqzv)9!Vn$f(aH2ow1+Y zI8{C=udBQIZkL&!dX*Wpa-xMEZs6c^l}oC1L~gq`mY!SGbm*E7)SSfPi|;KiUfxIi zt=i9!sjMzKd3uobyiCBi12P6C-4cMA|OUfZ1-MzMb}zc`oOFA6T}T;qe?eOPc~uofEOQ#b-OUBWEX|nyZOs)__yzcdW*O`)LV-TkH5?qpb>yg zPkz;vI}rP8aMP-CwRY<|2j4HEweansDu2+I5;^GJAA9RC$x!T|0?SC*{wIUZpIRT_ zffpqDeceuVg#k;Knhn^U4A=h@YZ$?^^X;EXi}DqqvCQ_jYF@T88A%$Y#{Dz5O1a`{ zB(b8~d00{QcYLKD&TS88Dr<|2KNnu}y?-C~juT`py;aMvn#;Pg;LMgs^p44PR4-L; zJGqj-um>8X(DT)W>NJK)`H*^*`K(gg7GKh*mR{^9y2wsaZ1{FK|wyOJ+} z*#2+gQK{VGjoohBv-AB@=!6yzHGS*%TeNNUnUg(UMR=IFuiQAxaFWQt=rhRwoLEng z;iO7p7@0h#PpAmBPSs<&k@0DbcB|W9@HOgIWp0~9;SXk#!Z*TRv*-hbDgrG}4{Hk( zKGkv^?`QPo0xEw2(sV8+;N>Y#Rreoupk8hJ(b-aNj-5f+_-FBe?dP(|uU^d?M)wdd zG&@mde*KIA$(+>Qf0M#Ds%U%x`E5U6EozWb|^gFLvW8JMyWfqAue>$56K`KYa zi)=2Lw(jT>o;KveRE8DWqOK67+Hf;F9?Qga+o&=R#h%s<1~C%%xsDQ-gWBX9Emrwa zh4yH@e`uRc2`y}L%&~mLD5qF=2XDODhh_SYES^-V2eKkxsQhi43(Gc{96u(g1)SqB zO9V3?vU(yC-%Q*7M0;lH0aCS_Dq*(?!LHOKal<}^bGBsED75cCC6A)~@y6uV>-j}r z&6n7puCvV&^S!WqJpJc6=uEr02qQQ>Nl|mdLktOMxn3jEvkvlWh356Jz2P~(x9D_Q z@1lZsmS2S1lDW04jhmD2bmwer~D2dts+1s^yK4{2KD7ujAN|(yKeA zGkdZQ*Qi-dZ_JL~c}V_EqgJKkR=!G6N23Qd5O>a*UtzpF6C-acx6u2qpKa}Kt!W!j z4AJR=3_9C%8{?nq5n{2rzC@MmWP1hnJfvkk>#qx;rn6|@IVjaO{fENd3?$-@3_GdO zTm4xBbpY8vebMf$IFsLHDg&{_Ipjs6R-ms^aeYkVCUi{*NY;3I5yXlR6ZgURz3A)d z(h*mhd1O6trE)b}PO>f0Em1e@+^64Wsr~$W(^9gvPFz0RcTR6pePjv=^d*hN?zdks z=XN5C?3&EDKAzjduV7C`?y1~Yi`zPGn&*n+uZ$4D)$os{&W~Ib=kC5=^C#q`_PH5d zH)=Pordoq#3K4R<3i6|hK9dK1SBM?+#p7KMhtZ=G7J+jH6%)&^W{KzIQcvOKu=~NU z+i*OdLy5n<4;~7%Yy2H~RtG2Gj>S+UcEPlJQfj~Nx4bHwf4a`bs5k45?fS3ZnB~{o z)^4cyg;AO`0Reew9X9%)a?|5|A#h5)`kfZ)h2i;LRS#&G!K)?by5*~#*9X-Xj3k4+ zzEA+le2a$oxZLzs!XDK^=>N4;-97>aQp0T0*OQd6-kPPA$u7+3)iNVL={O9avAgf= z;{AG(iTr$hlqnVtSO3_S;7x&qnsOg?JD^Fw3*1zMUOBOUNs0NcNfDK=&>6 z{W3ag_YZe^0W1dU_gNiud#6vufjr82+jGTqYkwoW#&(zbWuZ|FNPd;WgRIc!M$==0 zkIZf_7ArMb%)yIJcMaCr0_e~vQsEPOjtA6Y`aZS|prEc12mdPmx_sG55d8kd+h*<3 z9P?A@cvEmIhY?(n zFxrq$KW{c0+4eEr<88Vxbbys~|LUK*di!p(5U-^#R?o8M(Rb`3;G_{BY- zm$1xyLkPSOL>sXee9qYNVMokhY@^oeV?y+Z>hvpBGbDLvo%ydgdx!b zvupWn_5p8I`;@Wpd75wy(tIqwOZf@$LRY%6R(34+H;tN!Yd5#G#BsU5>1UbQFeJXW zQDZGFA5yM+DSg%PY|!OnP;XbQF8a3Fft5KG>_Mq%-MYILjk)FDxV4Ta%1WU%=FAV1 z85%)tiXP@=p-0q@e=fXkPhAgB4tBotZP0v>%}smkWZS8D_g7UxJ!@Wts&&ieaB8t= zoJ9*AnLvUl+M327>HCP5)^;WNA zZJC$4Ep}j5XOsIEpxe1#uhjQ0+#6wsQT4$?Hm63Yj>0T4e%6$&1u0NY0{Vk@F6b7Ws7F%y9>Te zZ&SJi7ZI{CdwY)G?D(K~z%3YYD5GC$g}K=UU7edpu(6R!JuQq6xTod`(plG^TivZ) zhb8Qie93Q>ja*+rwp^4VTIn$hism1#8Cplxg0 z&zuDhl5B79W99p+${BcPZbzZpoJTkg!2Cs#y4@f~xv+Z8?p_}z32X|;+HuE;0BG(tP|qG`WgQ z8(6ST9$tzOTV)s5DcApdX#KSJp4a5oGJA_kImk{sO*7=w(blCi z#GBEJRlMevr5E1{t)>9!!2|?0QoGCAD^$*T^t6A2SgY3QCGU5J{7{7B?LJj<(7;4> zF>M9&2BBkrGlDQsc6B;mCh_cbcZ)Vl@mQIu!Pk)H+4j3( z1fu7rLXy7TyZ0Z(w7eB0+cT0~>qWOe_xr7iSXTwT5%2yjbN0^MLf^M103AbTLKFFgyK{l5Wegf!IL|u7`B^j$F6kSSgAu;iHPGUI)xxdxT3*!DX5)rO44YhlT~@Ez zWj>xYUMt}=d3GjN*$0NElRpPj37IBAbBgta;&Tkk^ty$2L9Ejq7lOVhqP|~4tcmQK zL1xwEjx~c1S)}l|aGmdBIGvAvm9AZl_CWxzqo_cx{%BSby+p!b z-SgP~=EY?GD|fU_g>p|c zfJK)=bw8_rHks*;IXvR!u!QWUOI2}Cw-4HkHiK?Q_}!fPNy!qs>!GMFipPXkwX1Z4 zGXDq57&WG6aL2(CIr+?Rk(023Z#gDFH&^2Cx+GRao*m>3GYQ)we|mNL#adu6+gfFP zRM#8qS9EnvtnFQzmv#L_a-ou{#}~HN4+dpQ7L)gA@Bj<;U0{KSabA8>h0w=EHl)84>Qv~ zwv5gWIZb?Ol8ERKd;rTz&LlZI^GN!niEYnV?Vg9Ym$!?7^s8!VI2IAQyoN{J7$9HpVaOjafTX0_A ziKm>hSB_CPY!|#wn=&lphZ-Vcom#a~oF{hO$zY4#Q0Chux-4&%J4R)t#bmXbw(=|; zXRtIm&Cv`5?c})8eP?DWKV%d@lYk$j!R@BA!KyLPmW9jb+_qGswTcU1&4Fc}yo5)f zZ0jQ|5uS>e>WwDZC}_YB82vtq+L=zu`Rt*fQG}GG8yYfYN&`jYW{?;&9_`N8H=Z|6 z%l%0@l%5gAfuW*LCBQ`NEbQNfn9ivD-{+}Pggea;#K~-Sy;NRzp3md4es)`j$D_KM zS_WT*YItjV?$asV)9sd2w&v2hWATN0C5=s9u6FH+gd#l-8#`;(x zJAKt%>vlQM+%JsNfk@|@5M`INvGZ<#fR5sr{8bpbs>o@3ROa_Ez0*zv9(+s4&SKU^_M|#vV;!R%2FJ3ZWH}CdVJV% zvBOZ6w8KE;#}w57OQdo1Um3+W)N1vR*=^kCcNdNK1;ZI}!@M-k^=1EIvM@g&r{v&7 z)sc`WWg1W(e&sIbO)eyak2l|(^7ON*|8mnZbAWPtdO2+Fx$OOq+hgGwjJEoJJ9Hy) zG`54B04A5}YBjeXG}X}|dv6*+WIU<;bU2@yt-^iP<=5|r|9T5A)`zWlt~qu1^1L}X zx6e}U33XNN{>BG+?X`l8jC+8;Hwcrmbn*T7re*LO#uV<{vA)^9CTzZSpqwKEeotUy z)D@rNBxyjf&z4=aM!Ox`L^jE(Hn5M~d)VA5#L@-*7>{=jne}r+Yy=0Uyzm5Fao3`R zP2Cr_Z|1LHFXU<+(s3PWe#=CIqla+kMzi<9IN$Zui8%3b zrx#?p#QxCGBdfHFK&+Kn4C=zbS@1NF4zWJYcKpQI7y{;97cwjZk+bn{(Fvr%V9Yco znhnJH?$Lhr=kRi9k+S{{LTxny)%TX$t34Pwcto@1(taM5Z@FKsIlh&bad_>RgKJ*; zlH{~+T$7WzS;q$bi>1*PX}~h;HD@+2;D%VejYIY@!z&;6srg}sv~#`Rx}(3Q%c(0Y zyckHBLk7^#Sx&v+L5dqW<6K*_&ZN=3@S}qz}xj(Q^22*`qBVR0LwgO zvYpGIgMlDvv_=@D>Vl-{W(jBFFl@Kb^{fwgSI!b{%Xj{v&9$$1aE?Kxd^ufd=|ES{ z9p!_X(RwLTgLGTGaJn-_;-5kkM~K8d>@6?loDvVt!#;Xn7{_$}jBYssj$@-3 z;lr<#-CzTAT|Dcz)U3_Ghz844%8-n#F*7u{u6sRNxDcXlr{`O=7!!+SbF;j{D}-5) z-g7#`6K`hB>lHX^lv@Wyer3ok>L1lR6|IRg!l0)JZF7JCB8SzrAtB-5qc-#XztK0a zE2l{QLEJxOs)DyL#Wm5%qhKsI^h~Vi1y^j(ov+_>d@Ns?3YXy^#eVH0ZhvsDbmNG` zmMm#`!v?4~>^}|~nHAR`p~N-nW+|+c3;f~mC$*A+PHY`__xDP%9$2FkByzo@b+P@p zJVRxgA3q5AV%~pesmPbo>kZrbdp?~VhkJJ{8RcEBu|iIlM^!EHA&lpcb-W!{%gQV~ zcIxqO?#7qDUqhknmB6u=TY5*gImP;|<@p-#_|0S_HjH-lmHQ}Oc5>ghcO!KRF(~O3 zTvFM*&Zyt6yOrqdZ2Yt@a52HKGlYW(6tHGrBN|{0z5KcLex5Ub4#``9z$MBGH*h>| zbT%a>@hhxi6_+v51iTk-CH)ezW?|l{4`2)4-a@ z)ni#D8irl!T7$O7~}EZceCn=%4e&u`>60oZ)4CUGOUWr1xhy0mKzsv!rrXp z+|>iEHqbkS$}e}nJz2S=(qRL?cS?7;cJRtQEz7Mw$Lo^%;kG#COnG4ex{O=~ztUez zb%0eKT4kBgQSp%hCb&~H$92Z+I$f890J!YM(sMF+V(3D(>5%a;n%_j!j_Pc$|bK_lxZhsVTkzj4cU0zxd-P5$=`QFoPHO1ko|xhU-^oSs5S!}4>#<0 z_a;J1VY?)upny4yUSNup2?614ttBU+#JiDfJZ169823Y^xJ;m6-wjTiF>N+pF+L!` zHpjf|EKDr_t{nHPk*n8VKG~xVWtcKvdqS9APjVp+@X6`D{;kFUHWHbVG#|zJ4dVxT z)cKSrHGlo?3$Mzhx&uWhxn1VT@N&+u)e5cYq<;k?TZ20f##wLjcNe&|(B}KP%A(SK z7#@&kVfdV_Kz03~nI$ta0H~~7k>6b##0GSIqxk*6E1fR7%GQDS_6{y_Q75Onh3jBT z;>Dk#+0%L>VtL+_&n(<|HfLxW!ZKo;G6}I~H~r3(hMa@_dloL?2zhtsc4j`IVHOwTT&+41jX;HnoM{#uh6Dm3Cnfn&*F8 zr#&gx^6q2!d>qjnhm=<7eGG{%S0CUUqp$*{=sBGMI)70|w(K-M{Um3pck?4>Pmb5) zdIh2S{z8zx$JkNMjG@~-Z46+ja@i?Z@9u=6Ab}p1d8bK^)?b}L?K$Uj9eFz`V(3Hm zn!{rGM4JjU2b2Vp^pObpC-W-KcGc;#s(SlQD4qE@*!Y9_dH=%W747Yua7JvLMd!53 zoi2;swm|dX(EB?*&tF@yde`{Dm!n(W;{Q%h$XuACTifxq zdjo|_R=d}~4E;krJrwB7Dvpp`X{%Rsyf+N;lLaRfYY15CX54aZ<<=*!6}Mq`XrX~! z0mY64zi51k8o=rN5*Od5A|?H9{st@K+V`VaVB}RT(=M*+R5+^CGPx!L#X1u_7N>7h z=+c%jv4*!)xvPrQWjJTTVI8I0tLCD{3Rg~t)2a4_p(V8=L@Fy33yXED>7*4BS;~vx zPpFKZuVZwU@A9K@j;{MlZ=^Zp$-NfkD>1Q^v*T=T=k_12x}o3B>UYjwE4GIuJ&3SX z1tak84cBR`G6>-b+Tle4x}X%Za7KZK+G*d4`amE4!Awedm{i7m3*BZ4+2q7+%$CS@ z4upZsce}QAjV8aSo;VNGc#vOI&d;41Bf!f~#gehV;jZ_v+ntVnxMLzO11GlGoa z@IKCD9{0e`5yEEQ&$tnPbHDYW!Qthq=L;H2=DgK#_k0?;;eFA*1Ay`VH~I$N!r}H* zW(y@FT`l+ZQZH+cJ$04-bNP<(^0JLc0zSOwR~AIeD#LCX`OSJ#EXPKG%Oy$FS&*l^ z9zdqwHO}uIIiGZITNZJonJR9^71^Tx+TCFT=Avkuw0DKyy?TuAjBQWOeS%1sc5lC) zeOc&dHp%%RYAH2hegY6`sKE|#GC?@mH_Ee~?7Zk^F7igB-I`r`6b!*?cJ$`B)z<U`-S!1WMPx7gUE%g@VCjelp#ImOzq|PLHU2v0U%nCD!M&eWM;gi7 zEl|YKa&*JGZvn5qA7$}~ln$FrgGUU0@Z;*x>q)#qYxQ@tX|FD|-mb>+vd|hzT<&mc zfg(y&JCk;`2(q#2axakOWBIOKimu-TI!WMk$IHrc(HjFGt^CbyfrHo_pMK7{IOkdx zFro*Lr95sA!yO(i%~1U73v_=twFNAMHtR^(OnB1c3u<%E3x(#9Uah1VLCP0J=BD z&*Pty3`LkwsGt{`Z=;o4Fbec~wM6&%O=HD}+c|I?b27N5E%bWKTqWqj_czbk4--VW z*gIgK?)$tiQ9EuKZEMc(F}zC`J0HE)#RQg-(*@DK*^O#iL>_Hw$OLcmQ#8Y-lKUx+ zpl55@+b`-M8wM#4&W^ob2S8SOJbxmyeQsM9HL<_L>uKI;BWYaR&vQDh!M`S&xjvem z{SLJg|95&mSStcYes0g-=W|O+OWE`B9Vhh}P*cr~gbyP!=e`s+Yx1EntFNay@r<-35K&JEksHJT52HSSt#|6Yo&-t987^>les)*Q?FsjQaNkNSXBc>Nr5}jTdkW%VD5XLc(p?Ts*b^_w#9BQ;|a@< zyhnhgo#IN8E~PnQL*?%97?wjOqn#H(YgBiOw5&>vr6y!X3nZ8Kv;O_i9IL~n91QI2 zaX>&W=C$#QE2AD>>j>k$OqY=YefwE#ukjfd1m2jPje>t&}P92h8wR5-8}3@i07s zC8b(;6Nd5rt=VC#IW*`8M69CKCLC*g%3!w@^DZ1@^>Lf&oeYW><9)7#v8#f+YP~>} z%@qz$ddKAu$Od29B*w}aC;9IeSRe<~F(i{mPlkU=*taa3c>4Ufp5 z&W2tjt!h;J*yVg0ZMM={o@0m>up4p=!6hrS7u zkHY9V7%>a3aZetA;f&6^mvwBf*^?@i?ni2P(RRfiEaMiIm-$l-CfC!$iR4c4 zT-Er-H!nOze6n2U*5lx=n9)L9t}Q?7#dCm6 z8uUczgPSpN4ny|uW>a@P(0I99+SX{#1b9e(3AB*IZp%K-o0sWxOwJmFn{MS84Q@>7 z$`I|tZ;eOk+gxY&=M@nH+D_Qd_Q_xWBXFVOc)+8oB&Np?RnRe*HTy zU1hdpy=3)X?4N+#bU%n!eW}v&Ank#Tx!}Q|`HdAXOk+8A1HpV)$y!_*fa@92I>>Aw zx=Z-?LN|Mu+2nMA6W1s58TV@8T&g|0QC&k^=0M+j;DL=l-T@ka{Y@jAZ;j31vb*HV zPvGWozwABwg`3qNn{^7?+kQ_L7{6Sy7r7Z;-h@`J%ne)cYq-O&G1bbq*j8UZ@TMC6 zeu_52E?QmX+)kK57R#81=*Sh-3+&DuKKG76&d6I1MLcg{`&s1f$T&VfU7Y#@TD)Zk zDne=T3slhoNg`x&KfZs<#7L=l+WE9uhYW~xs@fX>tPOejY?Yv(3(4^%*CbiM-{K`#;4|+?*r+zqq-k?}_dCBdJ8j~b z?2!~IwLg<=83#~0Z28acBx(f|nY09w0X{S}1^H{&?KaJJD5C+$|& z_N8&{ZgEl*yF2og<<6gh2Y8TlEzEOOHjk5tByQIV$7UX*$hn2To20R-AC0bSz1F`5 zo6)B$6xQ1k0KF>x7iog(_wS*JWNj5g0>hHFri+U~8^*Y0EqGbOZ&Bou)s2-W>ZbB{o-n4|f zc~6ToisCk~gLd-W{r0b>CK8VgMAa~t??#K{VzX?XtA3d+4(=k^U)K?_K^t>-r)zN@$xDLT60Z-i@A+ZQTSEKG%`oltb$yQ@ zS&Pq;^~>L8ldBC-7a8Oc0I5t)WpBFKPuGRk!Zv?^j00Ggvwb|GE*=0SXN;lHRZR=c zv}~4ieo|TNN7CdyQ*Av|$x3gfZ|A~g0Drs5F2&?B&JT%~Ec^*BvF_ErtkcuuHAIfR zPG>NiJ~I>0K<9ima}*O3$#-ux1|9_!Cl zZEiG4!g80(O^T}OXwbWqwZH2i%@U)l^-aCO(SjJzy++~PtjEu{ac8=>*J}0Xy?9IN z?lO1fF+ztQI;Y5&*;HW{9eXnPOo7wH_}AgF1UI1l=&KIv%y=2MUy$t}hFljp*?(7c zzF7Ft%VW+VXKUrt6AtpkI`Tht)DHHUrS{vjaifO4zj$->4bpOT<(%%XUO1kdFFBzf zpiOe&O(BTXDh=6mQNf1a_MSyvd3qE_R#Q69+PS~_#(vvioM|g-?HRJSU}ddOE#o~v zE312(ImEFliu`qO!N)2^^)7) zQ60G8=0cm+*+XMHB#;7F63%M6eZ9sk@yz|3MH6eslGHHvoT0}JCdqgl}s3|3V8#ValMJfPJX@$Cm)!*44xiQ*32z8 zJU!l}Ic#0)7NK~`K28wix8<6W=*I_8idUS1e1QCCF^C5+SF|jb5dLli5|F1MOS{$n zuE_Sg0$@3Th>k{MSf85dPH(4U;f)tscOvzyYd>RlmbFTM_gIQc%&Jvv1kIMe?rbw} zWS8ET$c5hhQ>F3PLnh;_M;>gRxDZf=o1%m>ywbH>e&)ntXD-ddyxUi8!CiC#U||Tu zgwEZeJ6fr4lk(tM>-DA4C+TZ{8+v;q-iXDDZcH|XccCBVa)(4=I8~<9xLm4FTIKKI zKed-nmXqv0<=`lGY|7X6Tg4e(H;jZ|6}V^jb%0^)D4kkDE*YLW_=qYzSCv8k0dJ=H z5D`ldH^1joxzemPZx-u==-dU2P~DpKI!aS5Is2q)!_$z5dl@}!V9Hr%rVq?>8=<%D z>v_CWQ1A6;4n9O?J}wQ$_5D;t`1JXyH-pxA-QPUkYWLQlireuhIc?mHx4C@Z3nkjn z^V*to_+5N0#I?+~|F=RXpXsRg(2ZD0-XISjdn*Wg>MoY5CT6=;TddI!bp8u1Gfp^c z<+wd}w68XHAoGZ%_^nVapqh*T`H4vTXs14Ufk-$ffA-ydj!J*FvPSjQ-w3bS1$Ajl zP2M$;=y(5KVCLLf$E$vh`c=P1dq6!ey(?HnlP-HTGm# zvZ6X^Zt~B!ehm9`W>f6PtARaoT{uXWpiBz^fd9FEY1O3FU_9?j*O^qE<;K0}*Pmog z8gMXACb9Y0LB5?~iqjlY-6AD~_cRFe%PrgjP?Xte@&hW$vhrcDXb)S!t+vX|qI*O{Ps1 zf<^EfP53H>t$fK_skLxBFp;!)FVfF1fntlGfG=A&ZobU_?KfdPLy<7!9N!|4{7A=_ z3SsF{Wr^073uPL zF+_dwvT&{;*)NP~&dA^AIh-dAeFYd_fPKvEYWFT2K8CyNnbR2I6Jl6uk=dHUfO_0} zmq#YYT|vH{Z=$FbkBSFg>|jG-##FM5h;F~%RhXFjDaBN_zhizhiEX;%RsNRFC#@kz zvT+Iyy@t2sk3;QRKqw$p%qm+xa2u0{s%{0^q{eB9V3EO2UDSg)7arg;p1_g%qlWK; zmq)$!8eqD3yYo1TpDK0ET@Z+}9BON%{)RFx(Zai#M}My>Zsz$cO(7md_tGkRoRbIc z5(i&cP+BF?FKEV?hTcRiRUN$d7*emy-ofI`?v?RoxEqt1>0Ld2Nml@}N0qHgg;Mjr zxf`q9-`(?c6W-^GRMVNlukfo~p?5p$W|qe&nt;1H%Fki8=Y&MXaxT3{bvOv1*PnHz z%Wfx$KWMb~l@()7NIBa=&*`=qGH$t0kY8uyH?2~HNvhKKZ(AcCSL(~vZw-%8IY;4c zxGmXRvzgCT!{)qBR(4ehGJ1FWL_G=@pQN9HpKzT}gT&Lup-!UI^mAA|wB!^Hl8l_5 zR?7HVJf0@i_e4+6kUD<+Qw=!+cfW1QN@p~IDc-ggumeCXa6DJLIF?kc@+}SQvBIOW z+)x*zHf^@D#pL0QFofOQv_tfx>~p^aly|@5bf-I&Fgnj?e44Fu1VovwR(~@ zS*1us&*wP+M|-9h8>Oj6(wRmMHjvGGgz2pVlvyL(S6B6FSE5TZwo7aWcCTLv;Umnw zVUyX2hh50bjZ_@8l2v~d?=el9C$nsuZXR*w^w{3Mcl*OKi5PF>u8?GZhg;Z&~bjiNnI- z^w#+_gq3}!R11seBzOEj52J~8(VANvzr`f%*t_-(VjS`IOM zoX5rE7~Y^mIlKc3HEfiBj|UOI-7qp60Y*qDMfX0;MiatAu(X057}j0>%f zBe&0GX_-aPQ;{h>Izf(n0T04Xh1iyU#&FG0PyX)Hj8nMoN9poWaF>nfQ1nfZ4?&q? zcpBsRzE)6|*$8JxkNCl;VST=7veeCgv;#8d~Ca2XU3 z8v^F|I)@8iV|f{TlCgZ))O*0~rK>)2{Nu1{5remV^ou@hyH88rRQMUBw@sMVh5(23iKGOsB zEF9MTtLzEH0vz66HM8um!3{xo=W?b%?fpJbIaR|rJQpW^yCD1L$+O2dW{)~ns5IeE*D&|Wo+wm^woB2O~g=~FQiFJFFk2;b(T|T&Lr<{KfC}9Ox(e=6R1| z?%J$~Pw!aBFPXyMY;EVLVJ;j(8Zrftc1*|a*{e2|H%$3;KV2bsm=dn3=Adfv)w2(nyA zA=h4;tC%YY$r9&Xt?o8TN0V{B^|SS?CSBGMy&-~z*&~GE-1WB<2_>K>9&7l)sZ5D+ z4B<#6yz_qRU22k9iYKtbZg`YyPW(STbg>Z|tNeE??TtY)lq z3sETJ0%zeQz0zkf zE1}X}X`{vBXPg8KS%xUi6p1Zi#D#Nah>$6d*+V@G4 zNRf)SQhWkcfpG?9V70gRTE>~@v}itI20HkbDjtik#yXpbXzj0zQKv4&vJ}#t zHDH2Z1$8-~@3%6fiJAXy(DrWw#2Xs!qvrTM)R?{y z{2e)%%I4v+M-bc3CR6&lFI)gM*n&1%fQMLNb+hCD8)m&0Sa?iBHtsR&` z+&1g$Vba@ivUzJ{BB5Pa^*=Uay)%?|eJ((r6ZqBPpO0XD@68tDCew_UQ)~_&7}8+@ zoqx~j0hM^HA|W0-%($5x`)m^UoAt8;r|{wOn@XX59fkQ)vYd{C^Jc{p)t3fQwG~H^ zv)w7dJ1f8DUytkb@5mvd-DZjt`$R}wj9WUJ>yGZBH)#wJ>F9b&W2FO@T-Z<-G4wTHWNc@lFeW2PphrjbeWR zF8zj?_suM<8sn1qNfQsmz|e_y5tn?G1#L(StGC>9P=CKJNnYW?k${pL*!^p{Wqx@U zE;oT$w;|!)+6xR-K0>;&3B*`S8zl^sv5ENe&RMS&YRjG0G}@&Xx8;=+*(UZNv3d;d zC+P;DJ*msy(EfgRKOh%QT(yW}J1NcUGr2!P;DcDN&x$6>(xU_@f}zmyd*>wW^-6X2 z%m4K{CwxC2wDI&~Hx~OF%tek>)1@wj2VUhKg#mkAw5x-Xw$28l(T7D>k1S4fufZO= zPX;UPy8q{|kcT#V=kM)1vf4d0Fwkt;q}42C{CP@mg1-jwQD@tS+}YoEHRQ5s-M_EA zsrC*eKOXXptr+rZtAchZE#FYs?3se3j3qj(r6(cdaoH5uzm6_-`hyNW&1Hn|U|%Tq zCo;cXQ!SMmjW2TlHm^e&d4iq;bfS8n(w@IG`S@$mg$c`%$dy+<#EgMQ1qGCTEG?Z` zg+e+;r`rvA{8Gq0uY(eI%lD1tr*+WN8HDXQJE?H}-MhV0I059?GQz6R`Gqp2`fd(w z64stx+PBuy?@BGyhLHGDwI$b)ZTHfl2c%=UCAE7L5Nqe*~s}!h9pPma17RsMEQ~0MrM^@*J=B_AeVyrHwVEP%ZykTTmGLp zO=lLb9Kn7jNreAkAD#YfYew{A^S2j2fbc&spM>Dy>`AldE)TJ7)S)&l(QULzZ1oOb z#1U^kT5XR<=cv50_rU6G9)sfLQ^4wkPLdan)4(R2K#!Vc+|6zbftO0BGLHXVfqCZD z_(~tQ*~oA$A`Y@%eOg;eJ_+2_QFgsS+|C*z6XnTPqmJRTeK^OJmmv<%bv7(w;E<_L zX{|O@_}jazzj*77wQ`n?hl{+v@0)VgU&?xsAGRHm*=#fV!#Y z`9LDq>(bvV&?(~2UiO{LD}w5cc>XaS7atdCHY7t31Jzw|6E-QE>}wK4#AJs}8ORex znOTzKC#&^Z?h|bfDA>nx8HM4oZ4Lo0-1bpbSKIhQGJ4iM%$rc=R*x*@%54$eB`Lll z<4pT7rKZ6V$g8$06|G)%C9gYmMBZ+YM-P=9(r7>s`;M`a++Z}V<Zo@MtX60Te{0%Czm(r3%<$_-Mg;Z;-kQ`~Wgbo~@6q*`rCaR%oNQ1d2aDJ;5M&F3**oR3Cxi|VVNMF4FC-rR= zy(6z`zZoPy%o)X(eeGDysgqA2Xa`(s@)|kVm9$qAig|~> z5-&E0TiYnPHusNp540z>lAZrH9+0>G)5P}mPjkC&=uy{Da7pR;W-@v2$=#v8j7C{C`Rbh>EKg$RH>z5nRu$oi zqze8(zu$4qS@&EG00t%>_V2&Gz<79DT}bOR?aglIHfoQ?bQz8u@%-c=kR5ZlB=y{! zl}Qg$XV4Yy5qWMbT8-Hf>%KOP=|Wl21Ar^Z)&12lDL5BDUe(6tSgJGQ`?iOvgIVy` z>tu9d8xyU>`b;=b!h*HZZ=jc*#&_o3N|m`=*J0x}{%wR001WZ-5U|HTyWk?Y%u2e| zwU*W6uzk%IYyH+ChmcGL*f`aB?)Ekp4}N46kJl*&Wzy+;L~(b%s%OsU4siC*V&HEU znz0GaAwIC3#kT@h*(7iuz1QRt3;BjsHu6t4AI`WM%lW(-K5`2o>oe=ex=?2AB1W$Q z=J@MrkNtD5wEm0wW-agmyAj%Kl}Blw%imvL*0b%Lx;m}xhm+4arks0qi^KCBgQkk) z;tm&8V3F`m-!2|K<(@OUwZ-x^CJLYoU1Dm9J9OHY8&46mVQi0=d+_%PbontYB^Egy z&7X3!^|`FIba_m!UG}j)?0VWDd4o>?6m0VQd&C|R9_O;f%LLK$+Nt!^EN658&xOLo z75RJ9xN7)#w)|STWp8_>MkRa5Cx7aP6q){7A_f$XXU5r_=pS#iP2hhD@Y9jV1g~YY z(Av!(w9`%eklT6WYwtMf^Mj=BhgSUe53s+5Uk~?othnn!-NdQ|_qsNwb zr{bJ>PDzmI#FT3RZB^6Hthu|on<{mjq4T-shJ$a){0U%0p&;{JMA!_lNuOMEKoZM& zp|Qha^7#_*w%%ZIu~2?8^jYtcnw8C1_;)iOFz-TJXjG&XFO(|pJF_}K9z|$er0iz> z;3qMK(Yu~a&wIt`9Lh-DCR>t^yEn)KK8>2!GXPF@8I-$Kxxv=hpVydxg=eoO{6qDt zo_!)y1H*8vo{OhwmGIssfFqV(nq51qdcIDf-4EWXRHMAKJ5j)0&sKha&6Lt2U(HUU zXCgK3?d@o>=%bu8T6Dj~{xq1sYR!zFB@ihKYP&_zRhi@Ja6CT28u+nJ>?WVvg#oUV z>OWyHeGx>j?c&U!QttYzG6al2-nRcS|L!;KYLnpBQ*EEP%g+W(I^dODY(~g)SV;%1 z3dRmAprf(q%36Arx9|0IqO@cRYlr;#RO&MOuN8?9h=YnBue(;{T%dE0O3qp}Q@2Ql z(b|~!e?6PldCXYYV^Kw@qxR5rbU;XY_Y8lXq&Yd9F4n`={eXO5&dJ!kOPi=!(3wwC z{nfk+G2&_SJs%6*!!GE4n*3C&MixX9&(@dSmD8uxb&9u{|I*$9`B>-DC`_3+ZC1VS z{OeX)z~;Hp017BMm7PA3wH-b=T02@&qbyf~R`MbuqO5LRwwbt^|4zJJNf@_D7y=mS z3m~tMkNh;P!0CwoyGYCMH0HJy(gQu|++JL-8uUJmFHFtxLevc!6Js&H_u6&q>XL>6 zPf(Pl%a>s4^Gm7MK94$Zk_?X2w0vKNpWaOwCKG2@Teo(7kEdqX+gWtA>$&*XN+dT&pFR&9f-zwLO2IA4U|2AQI{J6Ngg-dXu zShGQv{S06{BmaP>rrgtaK}H)C^k!#-g> zRs8AzJYlPGH_OkavAi?)e*vI1|PN zZ#K^2E1aF~UHfeA&eCD>aK-6&mz@gn2@VgP<9DYps6ehK!rx6gyo3jJT_p5t@M9aiYTrh~|rYb!HO`*&KiK9Z4@?6I^v zjGLP+Mc9N$O8fbAsV$a6dZl*m#Xbo#ZXWbNHKAbbGa^iEsK1Mc`xPx~G$`5~o`OVaKN~hLm>4l3<b;LM!d|Syd&3XCePL7?cj!d`TJnKslLD$3+7F9D?kKAzIOCM^4FNWzWb#8_&Y$2 zM#=&pI_iW}X7`%VvS{Ng z=W6n<*tja`YLzP}%g)|02k@&A{V0d2T(<)am75$6-zWF(;+Hlgr=)3mO=sU9(K8|o zUG?uM5@$?N{+qB%6Ky#KqInlD<$zu{jjsl3>5W@hZe#7%U~|h=BKP@OPY6OEleK} zxUD|gy`XWzom#(ccJ-bva{D3b=f)jxtX)6)#58n_xC?0X5^|BOn-@T%!(D1m=)=}~ zg~2}w)hjIoGuzRw*6r9YVbH<*YpF&~ZS{aA&arnqp(8J@TrSZu1KRiPqf^UTw>5U@ zT-fqx{A}@__6nToctBh((xvjw<<@fgJH<3}eGE>)Jf6hy*t=bKDwd63U19&|WQKf! z`#an|`*?ub4$XdRxKRCJU)o=-Lt{mE;`&3193x|?k2RA^=>da zEWDv`W1pQKVFeIYauR-ujR|NC>nql15*?#TLqAg!Eled1b5Xp%HbpvFeA@n;G+eoG z*sX77|6Z9~Ap~Lf_d<_jycx}s>?p_Vx7cu>%(?O81kuegEi?xzdkgw8a=R1 zk+-SzDHfM`uHO%xp9iYZNZS;LuP3V(Q(cUG>1{3}&#dy;tpXa^pFiF1C)KD*8HJL| zhamCGZ*VwGo7145?EnN30_#0Hj5y1UA5mppnK>y_oAm)jxRpse z|9brXWY<}+ffw1+oEvRB*;Uy3-q%UF8f6pSSPFfu{;q!fAa&Oc;UunCNAXuF5Kie1 zImQ%)o|c@4RzVL^Lg|>`a``o z=*aDg@cWj?O;uWSnydyp703DXmCf1Cocl&)j5Eq>_r4iJB|*L-376(?!@)UA~c4mLtLADTtiT|$ru_Yj@pgt?9TGL#@Em%D%v}6_J71gaSXp` z(5)3S*Wvq;9=(T1AB|f0$aeNgzXJZygbHrg30^TKWd1uZ@Bt0fh+}}X=coJEJ!zEW z-U;jrj%j_lC8;>X_ag=&_fGLnoC@NP{@VyNh`Q=Gwe;jR%eY(}$N@jj6>cRRZX);i zx*0Z%VdH9tm}5vC)ytQ zBgn-H1AD83Hu(iG{(&p0^=r*m^<=%f!$fKd90H@#D*ui{{*!*LXwOc$#o%08RnMa; zw^8Ra!)Mw{9AB@UwD!_&f8*6ksc=9i8SKg}>+hU) zS-pIoSGIw=(|-#3pkGt7yM9TzF+*3cMzhu2F3OosnLo_tY41{f6W9}5BFEw_Sy@HC zn-}KzsFq_0EP{TaO02+ZG*nt&a)OCYRaGOp`L}yYw?b5m3Q_}K)ww%i*Pb{yn9sTV zXoh658^q7%E4rp?0Klf8D|MyEZNGtxZ3V z@5AqH{b?3>2YcmG?=u7}wJzs{tF5r7VyKL+OMl4ksBUwd@-QISuwnX0cF!f&Ut#0R zLUgvOYr3tU)Q4${HJxtbn1#89Sj=d$_hyhkNO!fYVIXp684{F-;kR_5upU&e%ubHV|c`s^+%aK_#kWQ(sU_+05zZnTM+ajG#?G~Ec; z-o0EPqWm!|BItrD7G=|{KgRSS z1@#G4dtNJD>AO4KZ1w(ZiXh6mv);il*kM!-kNjzdkhmqm;Mw zI#VQTFWo__(1+0TI1xk0V=v8)_g{YF(oJ;7l!8VHZAufF>f%(1liPW?a&ey!3f|M%UT>Fg2$QNQM)u+W#io^%~hPJWfS-=^=Y zBLkhSxwLLd;R&g+U?vl@ky|Nrw)@>B4_nd-Fs3uhqyfKXO^gjhLi^`+_wY2AIYl-G z{n*xa%AbOG|ILIY2+$xAX=Av-Qw;k11;au_MP~1xG^?A1&#reQ&vye~R>N&Jxz*Mu zN>GrN91Xq%m#OaO;Txw+(GQncM$1R&Wz5X8#R#8nuehPxf7hr+Er4jeT}z4gv^$@j zqi9|7on2QroeCEi|CndPvhq(sBzyd5vrb-R$#v)C5eon$bK_59X*YvA+m&L2N=R9a z*5nJ+OZ*3On>rZ=r>!vf;||K^Y3nh?V>cI0^I{`YZ-h^7`)Tf>e}B;}{d^g=7p^tA z4cQr6yLDe%r?$M3Lavt0X9o3r@p3=l_-l)??W zept-{7^1`!TU83AqcP0?aLD_8dR#sjs1WuF|yB+){e*>Ah0?ElJE(%;4|>* z<}C3Mk;*;nPYcfybplfP4j+CF=Sh}7=)KvuI8mX@n5<@v%~pN=YFb%NV}K7Vqt8Vh zyRgV9&DZrNgZM{4cO5jrLnX)9*ePPN-P%l)x{F;lh}qNONnf9rRDLAv>8qBSSDpRkwb~-rlfg5PE66f*e$| zmYp0jQ@LbAk~rC3ca^>ooyVp-ibr|6#e8!++$QePcv2>m!FAa|{x0nHVS%BIU8kDM ze)~}Y-`I1G`7n4#=`@b!Vt$M0{A$g@RO{gkN4CE-S9O6(J#)R;1bZiz>{^quq{S`i(H$(` zyH01WhxdMabpwZou47b=<1kfUE?vZG15Hp(dNL8YRJ&k^QV z;At|mxf2~vjqQ^T+5PX-NQi7}CB{FbuT#KeynliESIMlJBfdF2SOrQM7V%AT9#LuUQ;X*|^R8HM%gjDfW(n7)^I!4|$WL2Ym^! z0M7ka%$(GQP4l&uZ{HHI^QblCWvhQ1=f|#>`$uVU>A0f`F0ba6KG)+p)eWkHP5sUJ z&wOdzZ&~U%ZobZcm%>a(mHn5oCiwWtTNSbs6^~TGXj;@of-7ed(rnCoXHb=%`&a>d zrJtTuJeJ7t-pq%q&KEA~^Fz0ZjJmxpWq-zMy^0#UQ5_4X<<%F(as&Kt73kL&b7W;z z4pW=l-|Lt1tdA7d^RS@v?X_nkGb@sFUwzx8yA`q9Z^pzhxy`Jax8EG2(Y)S1)WquO z{>(JT+5FC{moCf^)b^VrJ$@#W+Dw0=|IY%dNew2*G(el|R}Fnp{}c^4u-}1YzsGuQ>$9yvTM#)9*QIEpTZMR2#zTkpXql{o3`oR?N@j?tB1900lx2{Jeov8Kg zcRJ*sy8Cf(*$)~hTKe>B5)ntZ>kOi0@y-t9Prm%Y_THm0KC6@Zr2MJPip2UYR56`X zKL=;Cu2eI_1w;e3&hyG6Q(`(xu}HayJb4n&TKyWY<|Vt#K$-ZqUh6B-<*;c{Zh%tl zUF8~KmDg)`dHZ_T_t>|!Y62W!UfwstiWtA1&xmW+p1*M3Fq`8i@NjF{PNhsQ%NW6J zY_Vb-nx)m zDXhibJ@A(#Hxmw4H+3xDJ+v~p=E2NK^iNGUdTC#~7sRks`TV6T(Pr~BDxZb~O-cE8 zRp<@jHkqi~)@LP?-}%8V#DA~R>^4CJs%igq)lXYKKcr5}CS==0(WvmcjmK4H<7%?D zcm3;mz_yDINgI{r2gTHE5F^~e?Q(+#_eo<^?gc$O(?}O9f1HS7P-C7!UGq19Ey;YQ zMYI@m&-C-xAWnwGl0aExXKfc>^3l1MbH!X;(=U5NJz{x!NnNO3u>WSi_)JoUGj;oJ z2>H1-=RHLq_l~lG0**41ob>70eYPLIQF!PjUdeZA`$l4f_0j)}2k?u@8;rr0^~<37 z>RWsLzPl}@Q+jBfzqlivh|}ct85;N0Aguy>dIpWO<(ks^BaKMxeqCOj{Qa1yi+2<6 zH$zR6O)-xSUOr1mlqY|xkK^BL4H%rz&DzY1-){A=U0&QFnVk0Y?aY4?D&p12qys4i zn%$y{z*(&iY!$_tQ($+TraFIo9F4Bp{59A38zg+k*-ZeUEDE{m4bz;h=n=KKgMTYZbuy?gM4;Zb?&6ASX-oSVt-!T5V+kl^4i7BOg^5@WT0JFv|QEC zs4On3F1oS{*; z$~0Bq9I7sw7)U5)d=cpeJrZHr7-*;Wi$<8vbYh^k#E(fn*&zhzoF zA{0P;@0XY>EA?l%&}RG4aAESb{_Qpc@?fW6aiD@rhK{7(MMIU#bgWKRB1-W)*=YS~ zZpoWfd9>TqtB>^NfKHq)7vYd^y?!b4^GV>fSpi?zucr6W(=T8 z7rpheIn8qBtGp+zJB_p!zg$`$vG?4=M;lHcHC96?vn&mc^#XPN2HC4vJxOm0&f)va zrz|QRAyaI3C%GP*)&t{)Ub>G{v$`%?OL~}Y*2KC8VM;Z&E2}O9!N~F(Eh;qm%;%eC zE39m>N$a^7$KU(k8M<;qqj7oUu4zLd<;1?{I*66AhK<>`vzesmY9w`PSJlmK0ARZs zipy-yTC}oQrHi`UJ{HT9CdHJ7M6T?YMFP1A`)@p14)30A_3K@kl@0oDziIpH$!gaw ze36UW)g|LP+*SM!C6|k!(O-GO_O!=cqL2@d{OvmTcEY*|t>(iupe5<8TfKXwfN7qB zZ}RpPF8!sR^p z)z2uWp6lVQEoVwj`syx>8&xLMGqro_t-Z8hwzVH8{wzlCfOT_`HGOxvP2A|Pp0v}> z`eK-W&6Ed|pJW_nKf#g*re`zuwn7%OuiQ=U>`BQh*x-vgubPAh}1 z=y7Li-B0JEwe2b~Rk*>rxn4X!+28I=FvqiJMkh=@Jd{qasl81uvFoaGB&8lD1C%4v zl_Tva%SGq>x@OexB-8)=oowa{`H=;zz1_O-B`;!ME!zHoTgoFYe{vpW!D%N3X$jKXKemx_^u3w(Dtr4* ztZ)X`7fN9XWeDSkT%i=0*fLW}el_%(X;zh9dx9)KZ4%(Ikiqac6xb`C<9`q`*P#gw zhUX}jDR_ggmNDX@0uX&Zct`7T4|Sf=B1MWJhNk&#T*j9mK*#Fz-dnCk+28ik z89k$~6>%T=L2~}>mC>;!ml^gRB~SQ2RjfI?4k4G|@0_-~ex^Lm?X~23UkoiRZqch` zvfOm0{fd2C#tAt@rC{!m{^k5jipKdn+jqZBXoL@_RjFOR@UZa1p|X|9sT-zXxP!7may0zPyXv}X?MKm zxWVdn@woF3OG%Vou4~txX78eb)pv@x&!(nG+uR2;MkzpnvH5UM4`Ua zbyk>~pki8EYVMn@ygm%DxQ5H(5*e1QKas^N>+E0VH7i2oV7GoeR;{ps_~+L7Lx`Y> zuTPN|whtHASlTJLLf>Duw7tAVA2I~akM_$S&g-7m$^FW&Yy#~GVcLCCu;`ByKh3A_ zUd}=HG?eKjRQLj?iq{N)+72I^9MxLSPlR0Pe2Kari($Rpe-@Y9XAZeeL-j=nn_l|6 zP6n#}?y58SB_*8?#KWRS$}#?U4GzsG$gP*z`=xpBa8ZxBLK$qdd{&CtXqaq_^oe0o zA=t#x+45`Y_Sp(*myId)?P@rG#lp8Pr+q~@8TUQ*B0gWza$lcp5vC8*d_QGo1UM?3 z&8Q-g+s<+4AWd$8m!$WfO0`%iy|&|aZB)oJMYfvBz1xm4Y;TzP4`xxJd*V0IM=IXu z1U5iIXGJBT(pILBl-KF=Eu+P{z_g zOq&5n=CZc1q~^`(%s)7&_P;paD~7#_ht_6Q+donX8iPF}OGyc{?Uo^dvAuWOtN0Sj zpwXP>M`x1l-WJzANP=;kd+J@zZ2p8U-u3=A0+y!r+=P7e`lZFL`UF#kxaG#{eLip8 zhP7^%25g2RSA*TP`5s^+%FYz3iUUW`^2Tm-?(?BLA_0^iZ5Hu6d#_gW!K&&k9xOnG z6-#*f4|KEqs z6n_#h28zFVj$;&fieLJ$Iym_r$Dd*F+9RhU*13EZkO4Jxia(r3rY&XHT!H*@c}n=e zp1a!hdY_dBC6PGL>IQw&f>_qU!n7{0UQtC6|Ewec-pW6*l`f0rHqpc@t!D?D6p%=i zE4h9b!B{fkrfjRy`a0=(9J#gcAcn^5J?$xOjX<4=Pi>TZ@O``7QM{%T{KqwcPjqj9 z$J~BXdZfO)e`O$~?})nWs>qWcxN|k5W7-!;Ub(=CC`R&{*Y8w7I@nI!0A z6|5Wck2x%vV4`@p<>q*+4$6Pb6s%h5{Q5ta;gjBaQ%J|l^t#=h3c=Ys+{FGdH4kwC zy%Xr1K3lAGS1u@|MUK3FZV=}&XLW=OPF12lr!GB{;^zd($St&+e*kmD?L*G$vxENa zp3V1!Q?>n5#AhqKb7|~m#Cy;;W(BD_`b3(&Z9Zw?nft&t*o9tmQ{O}H;E6u;Sh z1|=GJ3g2d=-^TZ=|0Rdr%7PhYdeUKE3sxLVs8R3lwzk?hR&(}ggB2ErBRyj`FEM+I z>5{1QWH{E_agXPUK7UDYc#3I&?ViXbBCk1p7jKt`?r$Cq3qV__(TcRlbztDO9xuOa zTantk(QBW!CXV&@3T)q$`@M;a0yS%$#<>`ArD^R}@Ue>Ib0t^4W~xmHp>W|#U~L7W z(DHb<=e;El7&Zj1-wD`^_Ij`1^1}=?ECcPmHXGN06({PMQ{r|QH2$8Z`d(ui%J52v zPJ~`#FnHnPo|RuS&-rLJ9;c(By=3JAy_nCZZDU-&oML(0OP`teXymb}TC++3i>%O% z9u>5g$Cj&rdjn)61)r%EFS|R1-TrO_B^o=_QB@nxX5M{*Y)mi9i^J<~Q75-kP9k9KYWwkt=L&McrJoMg97=tmE7yygkqv>eZ7sH&hT3 zAr`noC!0RS>(h2~oH>Xg%KpZ=LvL;$<>X|!z{5cQ)DK)Ca|H1pWAq^ISq;wh$_LSN z$wOUA^`PVkW&3E#Z9#>Jfd_f;k9;!1?_sy; z3qnR75jJqFGdKKu8o?>76j>kdG4q?<(t~jF&LXG7iUyU5xrFf7TDmh-;)_Ga+Estm zk~U@6csN<5Wtjb5mcvv0j7M?5bSD#W+-G(3^gQQ^vx?OH%+>(go>&hkbK_CR^-nD| zS9BVyZd?(n#RhBce~0+=$n(c-*k`z%5ams;L{|#A4p*esM2(VyOEPt}Bq$5qW^_r6 zADuf8jgNKd>^G$hq;;H!NM&y?aOv;vDUa3kxE7uWl?krODaCWwB{w){TNEh(BC6so zBVFF-+sNw6zLqYN6-KJZW7x35y)M9p)bGV9i{nxp`TcIMh z>^xgwO938l^}Ublk9vb~$w{q@9J_x%wOyeet<4!y-Bl=NxEt`Y+MW)`jMJt|eH2&Q z<0m!`0&720zy1g;*l1aQO)f82K=WLFMd5nY!;v%%I>C_447%VMoaMuX*`D@+<@XNJ>ZIPj&m*tbP zif>~0>GzxZ+J4Zur+vlR=on8FJZxS{H(VWy7Kaq9`{(x+IL=$`{2=TfD%(+VZi+vn zMX){O*;xdN$Gma5tXb^wt{Ki?Un1V}JC;VsKt*a-H_C5%*gB^fW3G^SW=$g7Z`Jt2 z62g;rI%p@ipVLgzw_Xp*_$u{RgVUL*$`0CWG}!G@oj|^r-rTKcf06!2-DtvkWC-_K z0SclV+Y@2Z=NAj|WCr>lay6$A@1pd)*Ll)gFcOa@CfPJtj6>y8x0qq(j00sBPPv|% znfaHN5W<_C`+gQjh_~nfX72Uefb zeLOC!Ox0CeZ+l*wxrVYos1Ku53i``*`qQUfzeDGKoVC(BiK}_e(ASM??AP%_{R6hc zhJQthv)sORG9iLQuR=!G_qu69>Y2wv6yWWO(pLNjL@>PSz-0scU}{iy3qET zV=$<#tH0YCt?;;zePre?bYUy0*9iyDe0_djQB&jAztFKbndZS)qqpZ$Lv{P+_N0Ov z0B{Q}g-zSws4h2z)~s1Kw{>DMB^G}*=kF4*e%^4$4Q_PURz6UM_y#+_9_bKkQe9WJ zUH@>SpC#llZq;tGpZQ>l!zLtEvHcO`#jGhBwC%QQsFkkHg?n*QzVk zTo>>iv}a{IKx8r?3{tC1crla0_cyq_hmF6U2lKP0M)<<BF^nde3OgcAq|`C^sauW*UM;4GtuQ+W(eVLqSB^72ykUCzDzaoIM)zZc8tWeJc-?l53X zO&DzOQE%`YcdLrJ$+O;yJPEjL?y%N#Av>)())r;;%=oV`s&$XeUVLc*Wj0CAkXDPT z-s`yq{5vWaKGq3Z^o0Ir2UY=NOGm9c-K zFHGI(_Nj(hKC$dHW@|!7@f)Z(NC0a6b$x*on+5&+dm46WiFc) z3}lqAHMO?#jvw-9((os_crY96HMWOMTM)SUriMcYcQkwkiy0dGTU*B&W<|$l_5Hg> z-A4N%hMcntg~7!>vB+q}FCjy&$%CnPqjs7f`3wv(HDRjb@nn36SGiO2P=^qDv+m{> zFegMUC8FINtOm}FFb0#}y7b|F*5&!uYCuH||dXR+qhb$2imJEevjqpl5meKaN z-`+FDKx=%RNqG=ATf-$wHW&MBP%2ub3``$|?h!LeG!W602h(VjUk3{Z)Ql%3N#FJi zCc8Qg3&WYZ67%i}#H!)0Po|kG@pn9rr@lAmv?L6FPv{bt&br(4NL*>Gviv*IsfB?k->yJFWOPt>g<6Q7yk6K7xSpsv*~R{g}xWag}aqf zH|E*gCAft|%Sz1O{YK!f-id#y8t?k(+7NYW+|BN@z4hhMvVBs$?EdtIfoDv&6dQSvdCdZtY~P82aX1y|W8A%+^ntGVKL5YFaaC zBtHzh;b;_rn;i85^He%WEqSn{<`h-{lfP=8a?4*Y(49$(ytfeQ%f|5jo$sUs2;&XK%qYxKi^}2R zL|r-i-ATK{){yIs`Rz1Wm8NJ^d}k_gcG`Vg(eQTtAn};@Ri{*koXYKn{9eD;c{OKD z6Xz{MnPG3^e@p;7_K3ovo-sh9tS$TYcF~x!a<$2y#Dpc6H}r`@_|DWj^Je}!OvN)c z7q@P*{lmzU-jUZDTHB|0*BCL(Ah#doO0(-^N;0Jt4+$?&#)5F~hVvJ4qeuRMdr#I0 zRI$HqDNT2-6WH`|Zc_5Plr?dwQ>`12FB7%q$9B&1{BhWFtmrP?^Zb*?i);lkx%P#U zUfWp1I>`Ges3UY5Sie54ymSlod0n3@YXJcUn2pGkW}9$T6LUG~I2w)wVuEP^p5q5e`&VZ6cnv(P zid)2;$if9pq9+w;5FOWgmCrp+R5PPC9g)S!#hxk+huba_bRrR?4+r;LOJ0|AU%51z zOYj!f_wh<85g-Pu&#_sx=pxx4GA$J-D5JBN$xHPU+G%(1{$QQ!A4O1~%8x0pOJnyh z?$V{rq&`xNw|_NyeziGMk?eC>#bW1ZopFfD034Iof{X<+4n&Zh-~vs0H1-BK@@*4O zTdm(5+L&{hd$=f25L2(?Rw?1x#jeXhtbEF0DoU>k5Q=%y%fy5e(Pk~l0JuLm>XUcb zSpxp#0O9Ooa28(S&b#Pn%w9ZKfEq$-tHxMyynrfKP9-R#RXdFXBTf&e&R+Rmjt>>< z#!Zrc6p&6i+MinjC)OK6R@IEflo9&IpfpGD)4Dj{C~CC_61HGxap>^FyAOfJF3?|SZr)3m zs zcFf!2e%3-Re(-}MM4@uzJ^;#|Ef-e3mx(P|r!QXT*5KIPtC{k!K(9Y-fFIxKiQWdj zTcrD!&Uoem=ewUj%|?4>PN8S%Ni6E^pW1He)~zoK5Xt3ZCy;|$VT^3H-YX?g#o`K^ ztne7*-^fl-#MhwJ$)=YlL2mxetyF0&OP^hS9UeNXnVq03ETvMnmBDTJA-PF6&16mqV-7!Pd(#%k94gHKxEYsTH<;JYevm4*96t2ZxwbwCTd!Vc! zBB+1m;ow!KihNu;@5WUA{?+x#0|39R7`1Y%Jed~ zS#6%SbG|eP$6IATFQcX?@BWecoVtg?)w&Ido-p^}5{#U~3uze0v}X^IP~Q~G_uJt+ zZ%dQ?g^8Hoc@v&6Q8{;X*@nAnY1lTw>q#r5l*_a_$>0J_-^(MD2QyKo-h0rh7uTJ? z{Ipn;FfesU7X%FLJu_Qw)0Ie9v;-O4G<>8Y&9cmzy-W89xc4uVfl1o+Sy%>E`Pu^) z*DQ78TkBFjJ4_k*8|53?idj2t|JK4Db0sAz_z931_hT!VdZiLtH9zQ!wVDt*Tfgt< z(7isQAY1E~pbswF1Z>|4YxC0!WXg>wf}A5l$rb?K&%cjVmtlh5tm>A}txkK0iA<;G zc01gg@Yq%QZRpU=SszQU;{U_-$qmes@Iq`4eqMlo@PXm+;ddJ70h)aw|j*}9-J}-+Cr~Vs4ju*n8tY15PhFOjEM$k+P=G6jQ z<0cm1`s->ep zW_LQh9d#1!@{kF$P86#2qfU;_C%b9Y8f9^N5712ct|!}9jVfg}JH;s4+4cYx;rf!x z?SIX!p+RtMYaT4>F6bkHYq7k_CS7Q;Yq++`jcoEI0j?&B$Na(0E{qbBA1v&iz*O5S zm{@$W$Z;q1R%wtwrf8jpg(8=Ki_so)#d!$q&MTmQehW#C7K(g^1ho0utPb6Kw+;|j ze;#$V?1gNyvtHxP5D*8qnE7bQ1tYr5QfVtYG~W%xDx1{@UwiDaa~;V~2unO{m}gZj zl_1aKk0P1F+s?+d-=6m$VUbe~YaOYiuXp7Qn;DlF%ls*VPlW z-+ioEF1^NGW7N3s6uZL7IUe(GIRJ)4Ixh;CBLI!ZaF>Gk&nF(1;aEbsc6C}IIX z^qQ6*wSe@y;6lqL3iB$^#XhCR&I!j{@D|v*FWl|4pU+gaIoFbKKo!n z@HDs)5U~W& z*Y_VB_=r1kO*&S$xs_5~t)7jO-I|T6?aUNJ4(iw#Stlg93n#&C!{X^|&M)j3rwT@A zjg`iqroYy{s)%K%!A|JLjuErX{)i*?>zP1=;v?I9D!rfVx=XB%3S>!4Vmx;)a6^sv zSiUq8P<90z=%UOz@?P?)4{Ia}@>R?|_n$%*~yB`O~{+i+_JzWP1WQb1EOkO(}epvUqxD-uHIuSF54eT44`J84}$n?|H%Ab~K^ z8tbpLU*lV15nl_7+fAVAjr`-3eJ$nsd?Cm6b+%F$UNvcfMA6~=L}5`ey5c{_N?SP~ z?{F{^AQQ&}9a4egv25QddD|BrCs|0JUazPfLf(*vE|5u&YgeCoQLo${BXJsel)6Gm zdNxM}6ok2ey(`D68D)Ozjw(#4ScZJCTH|+OkSW^KW%{t3feynf-}1`!*c)5B zb+6ZFbM+UMgezJ=5x2h6%UX>!np@Z%@Qt1TNdko5_{*P%>+`<84ka?l?$rL%#vhZQ z?%Ee4-T&7PHg7HP{NGyAc8gzIJ&*Md(I+icavkqG?~?kl77!Ka>T>6ube#+GejS#| zFhF0}ocMUN`vwwKHs>wT)V7(&r7!bHC$96lXk41zG;W?XybrI2T;}^!G1n=lIj);2 z4#CTAnD3}RBsZPQl~InT@oZhEj95vOxPrGDes;*q!gzjpy@hj~D`9%4kniNcTYp5f z%7yt(n7KEs3#OW00_RgNY=7Fpk)WFS+)4Y|xl*Vc-tw89DnZH~UCT~>#%;z?W3lm!2av_u{ zJZ7&FO31}iJ{}_G0Q@W}+0A6Bh=>2Marowo&Aky8nI#(C;XTuHG5Sn)3r~FzkoS5q*7WvY2~$eaYOiWRTWPNnzpFtd*nuK_K)bI zuTZM2c8_`L7qbT12V2+Z8k~MIxB;G*+a`VujSW@vs$o(%ajQn-soMlSShj-a-(;4r ztd5#l>g2$fEpK2oc$`-ptWl4SR)Qb$cI$bb_k;=^oSVqzY8385cfU!I8z&bZZoK{} zh?ysSB}l(rt?x6OpI6j!wgEG|s=c9KyR-GZF^rtOHuK>bLca5-#4R-SkyE9FO6Bbo zor`d&{N0=At5_HUh{4QtVTY&&Y-YP5katuQDOF9Nj7-GFaoD}*`$eifsYO=&KQ)Kp`D9w-9B*9WB3z&&+D~R z{CiD}#yIIQV+u0Ud#c|S&iQ>!9ixXs4IdKo;|SWj+l6meU3mkDj%)3A_iXkT{z2Hb z(R+BFpe%>K4)SbH=rizc|*(6=1Ti^Mnf8c&`&EntOx}M)MfhYTBkoXsqgvq{qqhGoR(Mny50A?OqU{kghw?TU z1F)ts>^?oERKo=kZ-DgfrX$;)>(1kjvE=o-EIfeJz^F>`)VnG6ludHI#uMq&Em;+* zkFUN8Ll(i^&vG#noZl)U`b3Q$&qdTLLy7p^A+b-MP*qe)^||!euh8D&R_&FJ_Ifca zN%%a+Ss>d_D7Nb^Nqh1o%_CB)4lDZ$b)aBjARX>B)|=Ij*;+zWdJJCM{e~&nyuW8} z9|v1JUKhF5Fq=W5DecU=>2*w1HzD6J%`{vF;8+29Tr4{F`T*&!m$%b)2;=TbzicfT zbY;1D?K6=e%xp0gEa_ZxH|-_$nH)0sud|_cZ%Q9FZppJ*kJW+fMe1;p*0 zMj%Z5y_&OMA=<<}=6EXkTr=nJ2T2Gy|F(zP%g*HJEdo=rgvy?H-GqY-nPQSSr0j5LJsI$8c{v>XY&elDy-?(wMA zyOINa54*tbmL(8(a9di)`Kh*oyZ8+m?rG@q}3&?-q+ZhM4b zqq@B9Outv2XL!HnqK~wOVxyZxjJ)pW68vri=cPXHwczSmKq7D%TH*)PL6FUW)LV%jiF{ag=a zyBYK?NT+3|IOM+asIW}niUnm5?N5pKS0pnN#OvM5<>S|PG8k&w^Ty+`+OR$qV{I?C(ncG!uTw zth@v7f0;1$qXRi}XGLu4Tzc=n@ur_N;>#l_w}0nNEG&IC?~U5`*~P#ylvBi!DZUuNm}iD0(O&mY9cZ9RRVImE4IGW}u%94GX%DCF`=4$ACX5#V>!y}87% z`-;`l863rWQc2EioeUh_wL!1G#1`#ld5e#H$6Hi0*>JjA>he{Y@SFKV80cD%tvr`v zUE3<_H;@rSZjx>GS90|v*R<>T|L>+OPV+i%yQ6h)rk%*EsojSB&m*77 z!mC-o{=^5iIg{47@nWFu|{>WHWAkvu4BHDyRpw!O$AXyns z7ZCoVWi~DS9uvP_0N*9oV{RV>`vwEk#S$ptgu<6zz4S|TbF-#Z=^d$TyuyyBzvl*# zm)pf{^|kxx23+UL4*nHTlw1}=5UaP3qlNfVWC=f#-JIKJf3#)~KmQJbz45Uzr?}wU zerX?P^>T-5ZIhY|r0DnOHeA%)RTQL`q8=1y2Xr$zYPkGbolB`xaP>f$U{Sv|UN^&+ zLG+PBaewM7qe`XX#it03^&+uq?SCGRRafWs!x09n9lnBeR7L!g*frl-*3OyGC7$Qw zt)XVjlB4&E>TpT2NpQ!PMgOlR4t)vssf7pWG#Z<;SED+go*ruSX+Lzk?C8y{`!u%x zK7LODg$l+lq5E{~A~`0Hb`!roSmFL<+!UdBxL(T^mZL6I{~F%3;NbPN1hX)^r5uXNEmu5 z9hO(Scl0wpjA~75e?-B=lWnuaa&ueuZ_R=J^7Gq%1k29Mb@XQEZoB@ca@T&|-y66k zw-4hvL)4@2m?uy6?#Mo5!_=1LzV^7|W4~;=L zVP8%qOU!`;5`246q7qWCQ8a;ezTV@}6h;$ZFSs>eXu|lMe6K9`Nn1#>zuVd*KVR}& z{aZ7|v@>ZxAa5o;+BlaB8fQEjPMp&_S;pLxV095<L_*Gq<3^Ba zHLD_!hJD$Mz3IyB1;O&kl!1krHmuzJ`zvD%hTEfX7}NZ_cUF|n(HSqi)_5!T-fDI^ ztU8YpEdN{8xEJ;kcbG};f1T~>23Z7_Ze8gwfznMHQH8C8zJe@8~U?MLpHA!+kgd4edA zaRHgpJ)Lg(v-KH5cH=qMr=LmjCKL;u>S_-cIJz5N`aI6BU>i1? zf5*@15Q981d#a8aYy_i{3pC~C(dN?ElB)yt?3IO6ss8+Ix83w8^GhQJ3z;<=4$LUX zT`U;$h0cy`4O+uk+u?5OCnAS6;ow>67=_UL%S^lIU@zq3%Snv$P5z8pb^*=t(c{*N z9^E7DlFG47*w^R-(>BF@ImR;HDiuZ5xi&Ok^>SNQbSxtNrDp_fyW)92MRx_=%Lf>TCR+AXdv z*a!^hbeU9^+4ie8gI&lpyjQwcHaxgJ=??}WP-e3rk&+L&WEv%HyersSXS3*a#=Aze zj;op)?Ttrvf39>on7ZFgUXR@Du{U~-SOQKd1Mxlil^E%mOFKdxNI+=-~0cPOm5)i8x2 zC=cGX59uv^WW*Z( z!LR;SE}ii?TmE}H<<)0WHFrODcT-K?t;hY(XdXQhp(HY?j=QIhQh~}T0pUZs5qTm1Hhg0v|d!Mb`q*`$FWX3+hZk}`G z!SoQ~pBhj(>=rP1+TQV9MXpiW57;ol%wrCJk=FLnnFjSWMsJR_ssa&l(Vx-EU6)3; zQhhbm=-UA@^6hutT#niyc%k>~_D$8Y_pNx=4RA!ANm5eh!a^LJ>d3~*K>oFmy!~Cj ze>*>4Fpk_yKp}WsXT9OtMLwp{o(&tuv7nD3aH#(nTeh|645`2lJp4BuL@HZhVjvyT z9mlQutiBk=i1fE*J+DfZ^L1EeS&_!!v!vSZ4c^(w_zZvLloS(kGDOZdnLGz%<9KtU z@x$_2Fh}hy{odyCdcNPf^xQ|MY5W?f?79jOwuMeklo1}>T^p=yrO~+a8H>Ge)XMbM z{^3~2KO_3}7>6sP)}dd;Tp=djcs$PG$h;ZMr1<1b@qTMrc=isZe62!uS5w41)UMjJ z5lK%dBS!D+{W7&q_4=55^jZnZVsm%(@S9{|H8yT*UrE?m9&io~zW2}@=8W{WSp;lU z@7t|9deaqO-RA^=ePdbfkq^hC#$mL}w+D-P7L_6~nI3<*DQ{>l%1NcQo(F%R$0p{B zn^T*0n%lDWOmX^s`M&HTQf*3C=Fls`v2LI*&{8_zIZ)@uIKy0-30l>3>1U!00J(AaXf zb44aZ#`4&N(JWsyi>FVyA|Bf{W=>$l`q$Zr-FJ2slKDkYwXw0)s9~}qXRaWd>Fm2l zqjlmU(@+5cuD0X(yI4JcD$#a)vz5gkQ)kudXT4~$;Y&M6-@`KU=EtDqhW;#a=PXxi zH~hwl|J?{qdwFTg2t3Tj$Ff)p3ogVVlEf2U# z5z}|y)wj3lN7K?@QG6%gZoPQ9ZInz7^;zt1G|WMmdNoj;zn=zbrD@32Q=(#_s->T@ zOS|Xwifyv3++HnAwGXKOo{?C!?r9Yp)}q2S&N%(&_!gxcUq|d&~Uf7UN3A zTF#E3HBtOwsWse^>UJ^3f2Ze?T}JF~*~tTZbq-kMw=fGN>NVP`QOm}b>JrU|fsZmA zTE(43b^Chux~NM=3-(liot%Bi_wv~$8%^~NxBJU-TP)g~9Rwh?=f9f%Flg=lyAj;8 zdAo69HpT1p`b3u0q#Ce~Kcf1ltcm!&P(SZVKVqnDVOUf#f%G34GUoqa=9ry5`H{MO zzyIFX)^x!buZzeU7Y=W-bt>($DfUx zy+`{%IZQO-ebC+xB$(HFx%+jYWIW?lquXb8LjoUlQY6OzA7<|?;&5G+FP&vIt(zk{>Pay zK8e>xozQ|Ywj6H8cc<>g-nLLIloK8qGrPgMyR=k%v{mSBJNumF46+oBCcgV8<@d+; zFAmYnN*_bo9^bPvm*fy^@IWJ`TdkGNs}J7c3HqWe@s@jRMwc-~_l=j*CSo;HZ9z=z zxQ!jA+GV%8my!creqJ$BIqBpou2xU`W<0u{W^dSq{+`g?^$wZ$zx?|>8B@Dy^&xDo zm7r1JW9*5XLRcf+)3!6HENP9o^|3|vRenRn!jp*JdTihK^`i4C!J2+tb8b|oU|ggM zpq0)ed)~+cI4ti%x)qcOtVe0uN`cL4G-5{NU(%KwP+p964qrPo&F$#j7VqG+AKRI1 zXQNG?!nHLy9p>3W$`(IeW#V@a8ExD#%MlDIyO!Ckdxvt_`Ys_3eWEe#QW?s$&35xI zsutRScI;Jbr<<~?VMD6T^&u*bFPnaO(2AmT9y;sH&S!nf8W6d0VR+oz@1$0i=bIOG zx1(K9pm4|%>t}-o{x04t$-EJIYGrB}^$C#D)QdmxyhEbdHfGS7 z@P@4_y`njW(G}j=jh{!qV1!BuLK6mY+i>& zf2&^~Kg2|%+tRh%_eIXoR$IuGR-0XiCt%y1s6)Eh?pvcSTui}xPg{tuKaPj%{_kLi z%Dl`ef<1eeC-DE|^U0%7&2Vgo+_Fb4ew;g7`SqTLUBxM9e{UKd#$mELW|q}eLFtZ{ zPam_aHjouECB9y>&g=U7_I*|vd7xW{B6Qa3yOkG?$t%j&Hh=OdOjlwHmd}&+l#d}^ zd%Pb=?fYVMKB|B7wS1}zYZuCl&`dDSw`BT$I+q^z+C3m9)BPVZ_t^KDl+)H`BRtAe zLp-B{&Gk;HN=mi{N*N2j8RdyVBY?1M#(67eTdLMD0<8k(q+Z5w>)jJ23 z%o~#CO7B?%%btOYg!u)$Q%9H zwQq%1&#L>kBPJvvmjZAiHowIg_wBU!;$UQ}Yshn2ZS^p=X?XwO9DJk8_vSz2F7`Wt8z1-;;PxT6)2zG+XSx)Y~UGdKl4503+?PjTCa> z*Xue{5^}()(lhfzaw4=>X7d*m(+dTnsqL=S`d|s1i=qwSLv$^z(jtf_-6>U{uev{v zN6Fo^$)d}WNSBs0iKQ(C5j#Recn%|-FR z$Lai#&9uoqxzDO)hWu7Ar;LzChsOxv!%nUP+)6Xn8mnU7R%VF&B*4h7znAKfdKCdC*E|Hhqi*0W~&MHuAg=s7E^I^BL zL%hF1Dn%MhSuFQyZ@I(ldwjPAyatzOvRm%s^R9Sz_>t7x#p-ghl&u6Y8IADfm6iXXtCP8bPSZAe z>w(jJ0r_s;U)&e6f>;q9c{cG6?^2uGBb1Wo zWQ%KQZb6OkdRB|R(a$QcG;IBTs{$SEef*QlZD5AuA&q7Hx;446+xcWQG*6kksAu6< z2+Fm`@E%o+MaI4=JjTxCT^5m!nsjaS8q%VicMe(fd&NJG@2Pab`{k^#X#Unju&+AY z15jK3t|VfZ53%j+p!v2;@IRT66| z4+a^jH93+_vPKcR{0g36-2_1kA4!tFjjpdbq&;^t4~=_X#=oB@WD&2&t=oLs5|??q z_JX~CN``>G?pE4tjcDJ*+u_Dlq@%F1V-uO$5I^`VRmvYp`w70+~H zQTmxh(_*iRs-+oJIko8noakeDRQd~A!8QU<36OKoqbc-D z5ZPn0Dapm+FfnGCP8)(qEsvCbv(D4jJLNa;eO;YT4b`Y@j1o8+YM;MnaaC?}AQ-Id zToHkB{#slJjbAzBTYn|hx zC)+zL(=~|>9ce|^KHhF^Y-%2;<$G)5*nHTzWZKsLN9SpAwfb6nz4*tz@szdcyjvM~ z=W@QYrBo!Qm0GlP&C|01k@1UBhY7XCbHE;S=x&p#e5r>Uxj8EUT=3kNXn-0MmsyhR2KB!eyyqfT3I$O z5Rf@IUQ+Pd-uD4sL{ofFKND*Aa?(8QcSr}mSh!cMt|&#^=w3w^EXR%q`|c~FwvgGj zcPCEtCIch8Rj@Pd);ve!y4K-pVQIQ(CS>xQn7JX}bebaC<1u1k6sDK%9z95QyL2w~ zU_I3Q4O4b&5I^LM%5b+=kkR(8I(|_+eER}}M507Kn;r4CvHb1=cZlWWFR<4tGrGdG z%)s80)u5eS)o;z+q3n^UbL;klXKaZ{n|n3IWK`{arFd5vLzyXKAxzBEGGwS+uwB0p zL;AS8l7h5lM7_PuCf#P#eb=345xiPTy694;_ct22VMUVJ4YS3Cl0M@y-Q7K#%}IbJ zF()8P7uNZTp-wHKyx9JR_Y$+d08wbKYF_psTuH(yg!`&osxhE;VRxh8*$t$l-p8VD z_*a^Xl4~|wuN_eBYP|WHNk!u3`$WIh%!1!A>o&ty?~q=1<1_S3yreJQS^M{e-ktyt zwUM~7u%EBgUVnRCB9#wYynwV|J**#t&foF!N50~3rKz1|&e}4iJ@%@WcKV-^t7gWA zZB}g~a2|4@OF_hAIxI7b+pe%at?Cczie`tu+nP`3#~^BLI-HjNsTnI*?O$fl%o2x=NjrZPMGcx}AWyn`=mzrF+c0dwMP1OyE(s?C8=>ON|1{L*G@1 z|2qx1g`L^yR8%e2=?!{B)75hD``vWa&V8zMK&i+Cn3%8G&r-A_>3-pqk|5KB93R2l z*ShNFG~bd|Xm#9ax0Ss{)tsq1onS`vsZMx-4qQ3Cd>9NK%B$61980BZo3B%{rO~C| zT)^dWqAx1|{Z#sFcf-YWOV=H*UuMr)=a%SLcYeCPx@!t)rp)tVvS#3-D-efviKkZT6_4W_-a}UJ7r6C zf(2VY;hk*ryFY5JXZ?eF_%QQVoIULB8=Akr7k9VFO(S2!&qcSM2SUC1m!$0O*sA8d zgXUqgNBwxVIQ_pD_kn%Bk$8D#(#uXuhMP8i63s6EvFlDutL60ck`y-Kk3y(7^F3~p z&)vO8-YV64sZ?+F`FLoX_tL&QE?|Ef89rf$!~-YK%f;`Cn<9TSDfX#n zGxsR~wKG3o8(lMlEOT#&GWJf-jCNEkx!4(eI$zk0-+bD9ezQfD^+1F?+l>#C3R8KS zSS<>Yjp;8V>B)&x%BrG81=?(OMdmT5B6&)-8J-2nR2h&dC}O`(XHUS zuT0*@0bCZI^{P}mWG72H%E+*F;k(j?pW>W^T1y3#TM`U@ef{;!cNeZ#E$6EK@L=uU zhsw|F7Zs-v3`790Wpvt-?cun00T1?MH>z+kHM!p=cNER|C|ITP@q?&tYd!r>yW8Ef ze&U}V?UtFhzM8_sb@MT53){5_vvlqS-B6n50AMcrbus>hoHq_WpIA zcE5WZ<%J7~mDk)>t@BVOMy$A9`;=j`@-6mz8!$b8#~Q!{PiL%=)E=GOmM`HCv^xaO z_{fUpnZ{rBm`?K2YsfzDIj@Oi2ea0^bgei68`o_M+kRDsX2Bn=jRyn)j&3LuP9mW+ zyKg^V{ZX72lQ>)E4Tkm0kjyh}1q-Z@yyI5-dUd;8@`h1b7wyl4MvVLw#B;^zXh1^M$|8 zCYp1Y(bb|-PJ5c23WUVIp3yx!+598vJl7S)f++ed=7155hzXFO7(qn=MUV^%=zaew zdw%tF&wRI9M-Qi}_FjAKPB+OnTeyZNO>z>zxO|CfSQ@{p!zQa}5-I_zMblCw9sWkD zuDyK?fA4u^=ah75Q^Xh;S}OOq0vyO%6Cx(wKdqh+w>qdWqP8O!97^wYs}~+S!~6Hp zJ>+a#X};U96hj2ji4}u9x$rA8mXVl*r+n+z;?7~y1BW2i{a#|sYG5GbHj=_$8^LE* zmji9_Wh*#p_K2_VXYnMLv2(_|NZC$R&mT+`f+ys52r`pL58raApj{#RYZcBW?J}m!3U})A8t3(a zT^GM+XaSbn`aRq!O8=xE=a;@68)0?sGisaw^!WCm(P=(@-mEmEyJ{h3qfN`6suXKPs8-`9%hj;#n z^={ij{k)+5hK&-GLA-iizI?{}$w&iM=dA@&B{G|yFXPS;nH_6QRsfI;7Pn0qWU{ao$xD;g30=JM1WO2uu`vd~!W> zC(4u^XCM7BRXl)#?G-M*$YuV#dXe6=I8n#W)OFWR_-=DtcxWH=yjyocRj?~w*U%dl zf3wcEF2u`+4r_)2K4EW%b^*{>{93QsF+G`}tJT3-=*u0m&H%Ejx2c?L$no3UuM1`A z(1!I8g^St}=oM=nG3k|K3ku$M0C=hcF?&-u-}|^T$uc{6@Sp_=oLf!1!BiK0YuGAbAlk`8GcGC@ho z<;zaaU$9i9~Ud!i?eM#gQa?JIx1qk$>1W1F>_ zDV|nw_A$gahvs0nT9lcmTIo-WI-!DY@UQx4+Icxeh)QuF`$oQ?WcQ<J31_z}c_y zo;km{z^gB_kmbnPG?PsenwR%5tTYpS;4?Y|-jB$+Duow(6V<(k)$0i7dtjhLcDMsF z3Pi$sfAn*z>AMdT%+*{9_pe$It%Y6AEaSR3ViQ|WejS0BYQqKHq?U_f^Ljk`swb%4 zXy#t?wLbTvubU>MupRs~sO#v?Z4UFRvapa>w|NO)+h&Dz$}Gj#xZxR+h@EY2CikUX z3Z7#~#5!3-H`M=MBa22xtmjt?jEpJ)5P{HPRvmC#@m;Mne_Y@2u=L zvLA5M+f7Fq4fdqm*FB%?t+i#xeoBHS#Jpv9`hCKWspI`hE_Q{zwHojBgEZSpiPg>C zht-J@$#VtVe$DMSoz)>pYtGLL{yH{)cW85aH3+ZQ={eKYB&v{UWlin>3QZ7evM{vJ zhCxMqc=?|87N3(-Ss*)dpv{gayWLW&M5#XJm_yK+6YQ#*y?nhxN^=u^AnN4NJ*dia zhV2Lh%3$fX>aC*{nD-hhHDbHMVluC_=xf93@>kcoOd|Tz;CoZ#N&jvh_l?IX#Zv=< zPrFw+J9Jp9lx#KuO9N<$)E6M`JQ*VVsIac_cX8E9;)C*VCUqA^oriONpM9uVm7rUTqa zz06ZoNWVocQR$v?CrJLAPoCT50>^=Ueg7#_thAWy*Kwca2jf55 zUY8puH|A|MiI;~L8B{H}~JzDlHGb$ zS0&;UqZ~nPF;JfE)b;eIuJLRRt zj^3QINcv5lGx@3LlOj8;^emr0e%UsnEtD~vF!h3&XD~6#8h*#GYVy$I`sUAEKF9l0 zw>a*PS{uf>G+3j&9AmZa+-wzyCy+deDtW34S)-M+lXfF~ZmqjE&CP>=upj;&{hUwXsn;u)J1gy>9&5exZIV}3!?!yML$eQnSFDRX76(XQwTbdy1gwqz zGM{hsEcJtZa>>rCh{EyqihxfO?RML&c5hg-zgf#JId*pVZ=~8jP~xls_!%s{;G++- zmZy81SuF1_voX2LSkX_V&hd?Ma{~p8Tu`c55TOg>@xJZq#>2V=h0mPL50BGXUrPHAiPnG*EL8@0TZ9OMktm2_4C4q1|dSTcp=K zy4iHb)t&Ty5g#}8_iy61#J*8E9QDr`*6Eo{w*E_oQ9}L@y{$~K5OA~~jcx0k3mPl- z-iWH5CXx2;bHsrVs{J@u|6QQ&-FoZHGrOVJe!>vtw)1T1pb*19Z8a;w5Myv)2{1l$ zE@DSV`Nfr&&0|vdHn+eP?T*T};NR;>#&&ru88X)oMaYi0TJg~ zAsBKQOD8V!j9ofKvFgmXc^6uv{MlqM^ds5$<4q>bwPHxBE{CI!_$f@RXtgY75 zz4{gK+jO=1?bckm+kVtXl%O^&-9J_hkxwIxJpuvg>Sz3FiB-aOAQOrP(mM`6 zv@RfKhjy63FgNTL46v>HbXIjC&hGz!CRTJM5a54DUO=T2Ly7 z)fZ#}j00g?iX5D=FfQugzuxoQ`0`eFx+;(prSWNY__ez_=u8XHbh%ccb=xl?swM60 z$$4krAm~wTc$C>O1cvOr-RL8*>P4sb3DZ7TA;fljy;FV3H}Gs}flBkdIm=OU|2MOd zCWY_Vzx$+_zhL&UIg=n|xmC-Mx#=p6WOes?w!W?z1e8%x$F)q!nwh^;rn!9fn0~Zr z>``IdPnzd_F)7^Y*LyTO_RQ18xIK%#-jg3g93Yf=x1-`1j@Ly(fK0ijv|9V*4l%~| zYzJTIsgF(f`Dv!2P6!AjJZX1ds($O{2bpC+`O%!;R~&i0tz5C9GE7<#)}*5Mrx1Ex z2xdaBdvCPf-IJ)G&m%FrGsdIp|_xRq)f){i6b6?$;NdNX$ zw^OMxwY`gl?l>zl$ZjvpMhB<9Ab{yI$G3;!Qsd|9XAD-X-R55J{6rQB0ne8Hv)V2n zl=*Pc6kV4h@#Cb>$`(^~-VZ8MLirly7tGZHay;kH;?C5i^`vNn!hJpVF-dmi{0s;iV70X~4{E)Y<|FO34VKg7;(~{v zE@HWEpdCg<$JGgKo`pCzkv#MTX?*G-*UZc-5VaLx>&ssd<>OJcsqV8Fkrw(VFd)tFt3)<(rMonH%nnV-7mJT?F>y3wrKc1+eUsjf>7rd#6>( z#Z7M;Lkt=rW5`(@8=-?yDRZTBR)!b2G&LoP5Ne65*=v(qC{?poE|DOT8lWyMu0Mr{CTLJ7q&(@zq=?7^^xP=FJI^_DsulYa-)n2y2&}j#5{^| za@|zt&#h`T`ij3*TbbP%spSWsiW_i!Af@o79XZ3`fH%Nx*2<*BUt(~M24x84o(BX@ z7Zr4LBTqcWDG}fjmx|#YZRykPEO2WWC!3b@37u1OQ-cL?E-6NdWrKWnRcJXyaa1K6 z8#1Elzd!Ob$N(+wgoFy}Iv>#!=FD$q(=I#~_;f{Qu`RlX+_(w$mu;HT{2A#2_t7cM zji+s5OT)d`1VI#KZj^bU#JJT*Ro3^lK3O%|%;&Y0M+GTd@WsI(Q7%1idK6na2oSXS zBKfUXU39i2OZ;KN%Y%8Yz-oYs?SGj$JT#wg43Zhe0%Ec@J8j(n5&hi6wLM`^9V%y-fsxmt@zdrNdwm^QHV6Mf&?O=TEBU`Z_zr9>i|Q=zM!1QN!E zkI}7mG2e3|PU+sdR8$9*=6Wbjb`?hoA^0YyUd28HxrHkgaD|7L?-wBaV!rsyy0KK8 z#IVnRGTV3aNDs?>7j1142aCmO^yS0JrL!9J8%^plr_ST%GH>4CcC9In#Q?OfykCK83b;$Ddlb44tZDsuMPc>p);d~T9g7MzcuYteR1R+W zCcwT&V60>qiT6{>bGsw5Bwi+Yyh#>Ukf2%}cQH(LsOnRB2z!tkEC)23peIom$7h}Q zNM_ybwv5IAVWR8P)P54htpyXKNuKJS-@F~N+N%5gUJA=c`;shLbiG){Mv%7mpzZIW zP4o@dxnI`opI?c_+#;TUgYIff(bvA(*>(eFc&qJCbtTUO^GzEPQbkPw6%s%hvsHKI zhc-*5eT2pt9vS=MFl*ZVAs4-(;hSuFnP_al^%{F7ONti)28I{vK-{Jjm=&{_`Aysyq-8 zX`j5DR?26{e%nV)w+Yv%?2g?Z2~|or+#iyUI<0a&V!G%FD*0d@cb93A1H%edy5bCSNA~4Tdi^e;KM9SW||B>Ke4Ph-b4`I()Aw~ zL7ap}XBeUlqnpe}Ss|cMwRV3~txG0k|K2#SmMbH_Gf-UnUE%XkG$DC zmVi`bcTbi28N5wy{L-hV3$obDrQWA{e9ZnOmqRLEar7CiM)L1HKl0n{h%B6*VW!%< zKXXnJ{LEbR#z;fy9~J4f*(BtYua8$~TKOZjFw;Ym zx4A3bhDc@)uf}3BTY;N?E90TuXO#ueW{DK~0TTEp>y~bZaT~Hfw$G^i?H>)E~)OC;HAd(xTrC z8SVZ$?%&;{S)?xWOsCs^qBfNAzf*Gfp0&)st7QDmk$(P)kx^PM5EtN)K3j3zbpNnr z*zK)WRkxP~@N;4gCh#S=`pFHAMCPmt+Le9iJeS5Z8kW z%n!l!l{L2VeWHxB>(;@nm8!3j-r&(QMHlnS=J8m?fKc<&`cQsqQ?E?ONU51}krzJ2n?m4`I#WV<=8Vn&k&(xqQWoDTu32X5gi z>>CDI^f5*uIqj#j@uZ9tkl)Lo<;=u1_4)<*;vgWywKA^(=&73P8|1RQ0IGPuQQ2}H zRZfxp0NzRZ+8g4*5Z%fIIN_IwK2F7Q!a03J1jO-Y^#c2vrWH#7*@rT&u?A!1BNTYV ztyQzb&8v_|BgR2mRTvUFrp>#BFVcxF1wuwoujMf27lY%xI?8*9g%n4}*MhIu^17?F zNNf(YC3dwERIx$^L;U5nd;Ho=vie(34c9^8LW z=5)Hs^ru#*EAqP;4#_=iRl@TJGSqJRH#?X##LTs%oMO+W4h!$BwK9uOd~JGDg{$0Q z@j#L#=Pyy!d}rpFgee@&IIlQwEyFH_)7+{cpsIy3G}2AXDCA1qt!G~ucRwqHIN~}w zeLj^x+#+mxT*9icCLgp?`+hQKXTUmtWVLW7U$v6hgkI8+2*FslEg0Wsu*c+p=Ncr% zT+U4i8y!gQr|Sgra(y!6PS2$M&DZwaG@0DNnRM9_JEC2b%ua3Lc2(*ls>Q(qO}vh^ zYadFXY(Do#Y106o_R>GEZJwN#E8j{#BtmZT+H^;!JF2x&o?Jx6&ymlsn!_eOSe$pN zUj$R?q|m4mcA-m7#7D5%NZ%IGR;GE#F=dv=-_59IE8~R+frm)r{)bURdStX4R+<+Y;&~@I0`?vQ80pW=0&2Tr)IaA49}TQR zy)jGwI(?53FOamkV9FC!u#g;68}5~yVAM1Etv{CBUq|5D#y3s3C)moJ39;Y|n89t+ zwyRoybZ_rU8Lb#pfU?}ZS1beIM)|W1lj&jR`aJ0LY6<-5{$FQz&1E0>ej@wm4i~1~ zKcTl`t^t+%I;b(qeW45xHdl6_GQ(vm-x(|+OwINW!)0dntlEwlcJF;1m^m)mPMFLKQt zO)i>;3f%RT+_(ewn&~zu=EPnx`WgW{`jC$}p3{E_j$LN;I5XIIc4Lv$1YwuVcg<`5 z8tnEpbQi8Gjc;s!%7s>|XSxti)02u~8_Ecy14yXOe`2LlHlHt_pH)CXfEMhmm@F!E zb^vMiIaA#^e@rLTuGVD0CqBOifwBOsk3qILnT27&E%I1P_@Dy<1k$7Yxrm24&`W7$ zmW5Frl$mCa-*-n?i_vg>;$toDOo_Ggcy?ce5r~f zF4*SguX#CB)v#L=Z!EG-I|gO_b#jqqs@DWBPMJ~uBL56CS9^Vajm|xMzLI}$nq#_Q zxseVuc}$-?Fgns*wgb);6jGu;xsbc$w$KYV|!H}8;Nssfhj5co zKqXu_le1B;aPY2cW^L+?w{1>O=S}J4-obJ!z;qM6uKR>*{rVGmCo_crm4D9;T#n1Er==fvqz`K8?asRU{hPyE=9gp*s zaJMtgyUHcAKK94?9RtKJp`119*lE=(8tbPY*8yy^mmBp%^exnz;MZ4`5ueMMhu>Xb zs26f?=F-8;E9)kWdS?1=2^u3)w8kw_jn^V3Y&U@$nAcCInZ_n`~ zdo(r!NDVu_XvXfD&0OaY(NQ;^F^rH$-)N)WBs?gy#IBSqRP8>VyUc1|vK-c4~Jf^sMxqyya7nr+MXEX#iiZzNE-O z8BoBCQT+BY-xexwV7Jh$*^kBM3_(oPf?A<*_;fz1foeHxr_*=#U%2CRjoznCwmZ#T zrdhhxMxhIK27zxcN*F8+v$Y{H^38O0t&NwxAl+O2PN}&v8M`t+Z=<^EqnbL31G=Ym z)?{JNV8t~IP_p;%eyfg3+>+;}zq`P3xDQ;atxgUqS?5fua`xvk%k>8w-RsxoZx)gc z2=s#@D4%znb1bIg5p(mf$Ki_U1?7RZvm{s5vitaY>Y`z8lKlBW4>_JXBR{>A-VO2n zlO-r0%?FJpf}i-=i@mgp_(_yF|H0a;+6+%tQsdDP@$cqZ9+va8OqIUEK-(I7GM}mR zYxpX@eH8E6bVlZ|e!6xJXC?m2j3#+)Tmqoq2U+`(j#`Z>*5WdnpDF4RY$u&P0Pem2T z;!+avgJK=H$)q(l5)!)CMZB-Y2=I*2E|{641vgRx>)cnvEl9IAtxhKDL1z8^F^X44 zJ=d9(AQJFQ)fzkAcx(>jOm}+u#&78*&fdWO)X_h%r0dlp>=EteoT#){q1*F2>jtlU zci4%;k4+1{rFXxCu@Hx7JTvsBFx76^YrD5mC8j0#ruNrkH2YN@_V;DjR-Be&I0u%S z&hL9en~=lNNF17Z>E}F^QQbM)1fxb2pl_L&C%Tj*IKgAnIi3ekbQ=se$07Yih3xe< z|AQGwNqFKDQYdU1C$t zbzjwY%=|fm4=ix)6B-F1Pe4?;nk^s3&HyJN91?s}WDMRi*kWIO_e|LFs{>DKBp)0qO}1$~#7PY%w;Xs7h|Ri)1Bd3i2ihHp&st5O*< zQRyavLR#wQeJog7(g%8c<=D}u66HO2k- z7?HJ%#4|$d|H;&D`N}>;Pd2_)WpEHWwM${$#xM3@a`LGQo$4G<*lU-%Rdl~Lsq(&r zxY4fg_>`5;t%9kKjJagpLF|M z>5jKwI^+s&WjaO^YmLum#F4=WzqTCY^pcv^nqmjJk6Nh zjzKWCutbcQ0>I9jyH2j|4eE!h41BudESU#Q01B2CDY1XV(2fxGT=f#w zQ@9*KnaiD$V;xGlP{(D>1_$=IldO7k6?{+Q?D`^A6|X6oxGJ0hg9`!bLOCXmcp2mHhP&lxYeW7%&_~q=v5UA?srGn&K245?*qPMA`#MQ2K#t$g{4n2Y^3x0R zSuNjOD0`QSTT#x{4tZkmE>#;NhY}0xx9+}P^7=#Cx?eWZX7JFFC=yAW5;{Mmk>F&l zgMYaG6{zY#9iGH_?Ow-dB#%DI6Q-9r0?Vd38yK*ZtDh#+vR>NEtMBPRo|x@yoAa z5AtH>ak2{CrzM5udbH68Tl*S(56S>;)VBh3w{@f^|FLa-h}uc(tx~X>t5%2d^_8n{V6vX1MP1arMC5w0vjh ziIwsA9$imjW!Mb!J*-zg_Vf&SMWuZQtxf1*v^-dPnwuiE$pSF_%RcirdTuaHwzwk1 znCJG8{+fUTjV*)-lu5RNi%d4V0hjx9`(cYRwwRS_-#b8)P_eg6b<=lwCYaX8qMct| z8LQN^P@9j(T9?4zgjQd6FB~#Tif$-j_e;!!TL3YgEzO#b)Ps4 z5F>WXy~>4=4QkRp8fp+Vz-q*$JeMku3Wub2Cj7%W05kqjic6Q@tQZF)ogRj zix*-9pRx;03%k#8!)G@%ejPmJv;v|9@ei2)tPkXDD8uLX+N_-PR@{7R+xu!se(WV; z_FV*A71EuOd#92lgG})Wps=jD&9?FUU`JFgE82Ta(NP8o`MdkaARq2y<-aLpR-Qla z;p$kowP1y0@SErSdk}cr8v-mI?A1={z;}1r+39r|E+sFa6Bm@{cW6e0bb21k-;o;8 z;^E>x7a3p8Jd_~2Gn>X}TbUa3U8u>ad~}IfN%DOAI4a&&{NecQpOW8Iod_yyvpvl- zi}5V(48imIVI3gageat07yT!~|7mg8VL=ELJ-nNX{W9(!{ zXQV%94d&50EH<@D9?VC)Vb|mK;PcyiE3tMzYjv2<6@-4@b*-h66xfyZxH z3XfmyzB5+j!iyNoHE+W#gtm_w(~cf2x98iyXy@n(m45qNe5paVUSMP*&y+m}78-MT zcUeQ3eKzPElc?&ns9L&Oy|RZAge}cllkBmdmN)!3oi|+d`}+OUX`dcmTbOQ?6yl^* zmsK*e-%XIsln%f5uH{w`XN$jUX|Hqlr@{t#7Ol8^fBp`ece(?X(}((U@Pm@UEboHP zvEAK@5OM>=3y8awO3Xwwpl|WSH73<2aZ}>{w16{@NGyS>)`DXj=$SL`{}(rPbBr=m zn!+e~+^v3dd;Hzg+(qMpM8Q*yJps8WAjs}_cT%@dOkXz*|mDjq{**sgCEmg$P zs#ORZ-*^7X%lvsRw7g}oGQ6guET69=*RG9*8|7_MeV@i#nQYd`M9A;!X{@#m+kQN@ z*5Q3NY$8Wk4XsH3{7ya z`y+Qfi}*(eB3=IK13hh1ax*L;KNp_->>mb%2XLp+5i&(P&izxm@cskuJU+XgdPwxw zxuRG1Hw7r=&tkp4`!xJcg>OC&)xF0`YFPk02Jf>Y<>cNn*agrz9hFBZfn_bK=Rhd zXWIEtUtu8vsqg5fgiE|W&^PDF3;D*?xPO=^Y5&n4o*G0oT0#_87t5blfXs@*655TyES_KakRb9anLuV`V> zpy!PteEd+~2Sd(kbQhE%XTRJPiBf!O?6P1k>~YIfa=uGx1n$H4-AxO7Xe_c}2rqidP=`v*!} z3=pGU(|-?w@{mi1{CN3Y_?a{Jl>?oyE{}X8G%7s!Jm*_yFr$Q)RJ=o)f>X*})d@qs zU;TZf43 z*4wccnaE-5QpY`0)Dqalo%zomcbg8T-_0V!*9Q_F&`TqulxO?fl{c3T_eRw2?OhqK z|AttMOn0XYpj}MmFux^WkpHvFMDw;!x_qhAZ|w?nQipLMUBAa}(RjRw&9ut|ov!@* z2pBkouoMSZe#VYdhHX3_tv-3BA8)P06?J$0jRF>Yx|xgU?>;|=-=!y<9}m!uJjZT* zY<8*zS36QqqN0)ED6PAa%rE*CG~+}^tSTBUYxff>Q|ku0eY)NIx_n<&1d@`GdTw7o zhr_nu=iW2mn`Ay_&}hd;H8Zq@(8mtFs9T9=io`ef`H!+L4g1gbv9=3FW5&+ba$?Rt z1N!j>>)FnIi4Jin(^)s0yfTPDX9wvc-gVYZ0}~+^x1qF|9SithM(ChOX^Xaz#jLLv z#oImDoO`N0x+pTT}sbX1;&@%|Jg{cM-fN zcDOp3M-l5mg}LBivS1IE_f4SeJQqP7$LR(%*CUh zPT4tr8}^)6Jnv2PC0CwcOcLjJ=IYn24TU^LQ|Atq@_cbv8DWmlmdt2Y1KrvN!Xoy? zhdHJT-Xkj)cTG7x&{-?rKEey!2UMKv{+-SfOgiO#1AhM)^t+t6y{BGxw>?8FF7TT< z?x#{+^np=FNK=>BmxXQ3VL(JQi~G;Tnf4@UbXDj+GUqJ_LOYrrrO3%IcgK| zFXy(WKXm;qe%cb!*2V`!nbl`x4zSy3r$Xg3RKYpSgWs8Et|drMPYWuHx|+=AQ~y?+ z_H`=6;5q*mNJ~BUO1?AgmvK|j_E}9MZX+8doaRDcz75o)r}>3Pzp7c47rBNM_LYoRn694^6#sL9EeGMt|bNbItv_ zVTAIlegVGh+^9X?wYAsz&+eR+*Mq1we1QP3-lLIjulxLWQi{z38a9( zzayY$p1rub+*iOjRUbVGQsLj6?fh;#RTR zimRa3$IRJr0;UC`g7(X1$Hn%UE94Nhf=G22PZI4i5|rshYltNsUhfbO6rS1hV}3n? zcv9M+)Ao9p=bs<i6+e0l z?R&d`VQC*bXbzU!6J~A(R4BCGQt9|^~s2IZ(wx#$5|3wp$9;hCy%&pM*l@YI+>!Krh zyNSvu=n7{nYbqW`hUSFrec)eoo~^Kn z9jXS9%gdwLI>pTT)PEK2@M70;%ikyMcH|<#mR~R-yFB8Rx>v`8)hm)?pPU#o^RVaM z7YLl9TG`vabr*F=nU10c5^!lt6VBE7{yq~{E_>Bpjm4+ce!iyT;C(zjkIU)Qmg>g! zdHXem4_(i=vq^XMq!-L}Q(<%dvelyFzd>n!=xj%ZxMDW_^$M8u$;NpVjAYCJEPyQG zey%h2YEqpWf+b^d^0U`IpfT?lBY&FVVpS`T#py!{lm74PdGV@`vD@zqAfj|9gIwW= zvP6ft7(@{4@$*Mx_IvK^JIohS8Gz9B4c6Z-u|ItBEZ;<cFT_8l?S(02~A4oUDVv3Qe}5Seuw&9qMLbm@HuF_ zZtdbQ%=A~c@hasOyJ+hiFEuPDoeDC&QE~&7)p+f;$^cpw8$w>T9{H_n@7LdS#;73y>ANkZpQ*L!eiR+ZE~)aci8D`DvsLL%-t9$-|JOtxZ#AuORvnNe*g z=W{r_R)BF*B;D)o5)=haZ|HwH>PgGiAE+A?9H)H;2Bw1m}&90GG00;i0Vc z&uG>kkd(vI;!`J#O7?(1xQxh}n?>v0V~v^%#vKU`7A0OBUxN%)35$A~cl1T_?iGIcel8N2X0Z zyP9@EJIxymm5;9V9>2wc@_F2;9p|HV*IGNXim<&EhTV)tYa=9zGiU2nV6oq;0rzZU zZX#Cn1T;)>?i%6|J$$g~ajFToB*-{y)?`_@0n^x$f&1#5QO~P(ftkoL77I%)7u62l zaXqPDd-JGa)x≺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