diff --git a/sphinx/build/doctrees/Ohmpi.doctree b/sphinx/build/doctrees/Ohmpi.doctree
index 9f269b16f0a76df9885e96152ce3dc478613274a..9368db394adee318243487046f8bc77bc17af45b 100644
Binary files a/sphinx/build/doctrees/Ohmpi.doctree and b/sphinx/build/doctrees/Ohmpi.doctree differ
diff --git a/sphinx/build/doctrees/V1_01.doctree b/sphinx/build/doctrees/V1_01.doctree
index ce6250bc6d5d0221a24916c8f4e2db0885e43006..52e5213ee38b57a5e73d660e145ac98c6ef902ee 100644
Binary files a/sphinx/build/doctrees/V1_01.doctree and b/sphinx/build/doctrees/V1_01.doctree differ
diff --git a/sphinx/build/doctrees/V1_02.doctree b/sphinx/build/doctrees/V1_02.doctree
index 690471fb6864a2560d3ec25654363f8232dc87d8..6644816c21a8a597e7f2f27769c9687e8601829b 100644
Binary files a/sphinx/build/doctrees/V1_02.doctree and b/sphinx/build/doctrees/V1_02.doctree differ
diff --git a/sphinx/build/doctrees/V2_00.doctree b/sphinx/build/doctrees/V2_00.doctree
index a02d898a179287ed671e3bdafead36409f541cbe..e5087e2d92e4bc64a915accb335e417180c177cc 100644
Binary files a/sphinx/build/doctrees/V2_00.doctree and b/sphinx/build/doctrees/V2_00.doctree differ
diff --git a/sphinx/build/doctrees/environment.pickle b/sphinx/build/doctrees/environment.pickle
index 65268571e863d9342ee0fa784eac3fd30692c878..0212f60d93f96755bf45fa56a9b25e66d4e7b4d2 100644
Binary files a/sphinx/build/doctrees/environment.pickle and b/sphinx/build/doctrees/environment.pickle differ
diff --git a/sphinx/build/doctrees/index.doctree b/sphinx/build/doctrees/index.doctree
index 1dbf9eed5986dabb16eb28ade9fa696f93d88e65..539e604232dfc3325feb2b71cde4ee45c3fa13ef 100644
Binary files a/sphinx/build/doctrees/index.doctree and b/sphinx/build/doctrees/index.doctree differ
diff --git a/sphinx/build/html/.buildinfo b/sphinx/build/html/.buildinfo
index a2c9a413b6ce7b07490e5151f9e3d29246b0e4a5..8ad5672749daad6fe54c5ad9791f1ad735ec2171 100644
--- a/sphinx/build/html/.buildinfo
+++ b/sphinx/build/html/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: c73cd0e1ac8a8c304acd5706bcab5918
+config: a121d25e499fa04be7ffb415e1360810
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/sphinx/build/html/Ohmpi.html b/sphinx/build/html/Ohmpi.html
index 2d545ab64d3484573bc1e5b68a4794fe0858ff8a..348923bdba86240f2535dfcbd8f5a6c13d9bee50 100644
--- a/sphinx/build/html/Ohmpi.html
+++ b/sphinx/build/html/Ohmpi.html
@@ -4,7 +4,7 @@
 <html class="writer-html5" lang="en" >
 <head>
   <meta charset="utf-8">
-  <meta name="generator" content="Docutils 0.17: http://docutils.sourceforge.net/" />
+  <meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
@@ -14,6 +14,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,10 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
diff --git a/sphinx/build/html/V1_01.html b/sphinx/build/html/V1_01.html
index d44794b355438212a0732791cae6db93f5afdb76..4953570bfad29de2931abd55123d779a27c54be6 100644
--- a/sphinx/build/html/V1_01.html
+++ b/sphinx/build/html/V1_01.html
@@ -4,7 +4,7 @@
 <html class="writer-html5" lang="en" >
 <head>
   <meta charset="utf-8">
-  <meta name="generator" content="Docutils 0.17: http://docutils.sourceforge.net/" />
+  <meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
@@ -14,6 +14,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,11 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
+        <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
@@ -426,23 +428,16 @@ it by following the steps described below and illustrated in the following figur
 \[coeff p2 = (R7 + R6) / R7\]</div>
 <div class="math notranslate nohighlight">
 \[coeff p3 = (R9 + R8) / R9\]</div>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">36</span>
-<span class="normal">37</span>
-<span class="normal">38</span>
-<span class="normal">39</span>
-<span class="normal">40</span>
-<span class="normal">41</span>
-<span class="normal">42</span>
-<span class="normal">43</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd"> hardware parameters</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
- <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
- <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
- <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
- <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">36</span> <span class="sd">&quot;&quot;&quot;</span>
+<span class="linenos">37</span><span class="sd"> hardware parameters</span>
+<span class="linenos">38</span><span class="sd"> &quot;&quot;&quot;</span>
+<span class="linenos">39</span> <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
+<span class="linenos">40</span> <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
+<span class="linenos">41</span> <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
+<span class="linenos">42</span> <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
+<span class="linenos">43</span> <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 <p>The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.</p>
 </div></blockquote>
 </dd>
@@ -655,23 +650,16 @@ are displayed on the screen. A measurement file is automatically created and nam
 </section>
 <section id="electrical-resistivity-measurement-parameters-description">
 <h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Permalink to this headline">¶</a></h3>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">27</span>
-<span class="normal">28</span>
-<span class="normal">29</span>
-<span class="normal">30</span>
-<span class="normal">31</span>
-<span class="normal">32</span>
-<span class="normal">33</span>
-<span class="normal">34</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd"> measurement parameters</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
- <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
- <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
- <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
- <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">27</span> <span class="sd">&quot;&quot;&quot;</span>
+<span class="linenos">28</span><span class="sd"> measurement parameters</span>
+<span class="linenos">29</span><span class="sd"> &quot;&quot;&quot;</span>
+<span class="linenos">30</span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
+<span class="linenos">31</span> <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
+<span class="linenos">32</span> <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
+<span class="linenos">33</span> <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
+<span class="linenos">34</span> <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 <p>The measurement parameters can be adjusted in lines 27 to 30 of the ohmpi.py code.</p>
 </section>
 </section>
@@ -681,6 +669,168 @@ are displayed on the screen. A measurement file is automatically created and nam
 <p class="admonition-title">Warning</p>
 <p>The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date</p>
 </div>
+<table class="colwidths-given docutils align-default" id="id10">
+<caption><span class="caption-text">Table Title</span><a class="headerlink" href="#id10" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col style="width: 8%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Component</p></th>
+<th class="head"><p>Number</p></th>
+<th class="head"><p>Cost per unit</p></th>
+<th class="head"><p>Total cost</p></th>
+<th class="head"><p>Manufacturer</p></th>
+<th class="head"><p>Manufacturer s reference</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>Raspberry Pi 3 Model B+</p></td>
+<td><p>1</p></td>
+<td><p>37</p></td>
+<td><p>37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 3 Model B</p></td>
+</tr>
+<tr class="row-odd"><td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+<td><p>1</p></td>
+<td><p>8.37</p></td>
+<td><p>8.37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+</tr>
+<tr class="row-even"><td><p>SainSmart 16-Channel Canal 12V Relay Relais Module pour Arduino DSP AVR PIC ARM</p></td>
+<td><p>8</p></td>
+<td><p>24.99</p></td>
+<td><p>199.92</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>101-70-103</p></td>
+</tr>
+<tr class="row-odd"><td><p>4-Channel 5V Relay Module</p></td>
+<td><p>1</p></td>
+<td><p>7.99</p></td>
+<td><p>7.99</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>20-018-101-CMS</p></td>
+</tr>
+<tr class="row-even"><td><p>cable 1X1 mm2 (50 m)</p></td>
+<td><p>1</p></td>
+<td><p>19.66</p></td>
+<td><p>19.66</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1568649</p></td>
+</tr>
+<tr class="row-odd"><td><p>cable 1X0.5 mm2 (100 m)</p></td>
+<td><p>1</p></td>
+<td><p>29.71</p></td>
+<td><p>29.71</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1565235</p></td>
+</tr>
+<tr class="row-even"><td><p>Printed circuit board (packaging quantity x 3)</p></td>
+<td><p>1</p></td>
+<td><p>12</p></td>
+<td><p>12</p></td>
+<td><p>Asler</p></td>
+<td><p>0</p></td>
+</tr>
+<tr class="row-odd"><td><p>Header sets 1x10</p></td>
+<td><p>1</p></td>
+<td><p>2.68</p></td>
+<td><p>2.68</p></td>
+<td><p>Samtec</p></td>
+<td><p>SSW-110-02-G-S</p></td>
+</tr>
+<tr class="row-even"><td><p>Dual screw terminal (3.5-mm pitch)</p></td>
+<td><p>7</p></td>
+<td><p>0.648</p></td>
+<td><p>4.55</p></td>
+<td><p>RS PRO</p></td>
+<td><p>897-1332</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 1 Kohm 0.5W +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.858</p></td>
+<td><p>3.44</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K0BYA</p></td>
+</tr>
+<tr class="row-even"><td><p>Resistor 1.5 Kohms +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.627</p></td>
+<td><p>2.52</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K5BYA</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 50 +- 0.1%</p></td>
+<td><p>1</p></td>
+<td><p>8.7</p></td>
+<td><p>8.7</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>UPW50B50RV</p></td>
+</tr>
+<tr class="row-even"><td><p>LM358N AMP-o</p></td>
+<td><p>4</p></td>
+<td><p>0.8</p></td>
+<td><p>2.4</p></td>
+<td><p>Texas Instruments</p></td>
+<td><p>LM358AN/NOPB</p></td>
+</tr>
+<tr class="row-odd"><td><p>ADS1115</p></td>
+<td><p>1</p></td>
+<td><p>11.9</p></td>
+<td><p>11.9</p></td>
+<td><p>Adafruit</p></td>
+<td><p>1083</p></td>
+</tr>
+<tr class="row-even"><td><p>12V battery 7ah</p></td>
+<td><p>1</p></td>
+<td><p>19.58</p></td>
+<td><p>19.58</p></td>
+<td><p>RS PRO</p></td>
+<td><p>537-5488</p></td>
+</tr>
+<tr class="row-odd"><td><p>Battery Holder Type D LR20 (9V)</p></td>
+<td><p>1</p></td>
+<td><p>3.43</p></td>
+<td><p>3.43</p></td>
+<td><p>RS PRO</p></td>
+<td><p>185-4686</p></td>
+</tr>
+<tr class="row-even"><td><p>Ferrule Crimp Terminal (1 mm2) (500 pieces)</p></td>
+<td><p>1</p></td>
+<td><p>30.48</p></td>
+<td><p>30.48</p></td>
+<td><p>WEIDMULLER</p></td>
+<td><p>9004330000</p></td>
+</tr>
+<tr class="row-odd"><td><p>Electrical Crimp Terminal (0.5 mm2) (100 piece)</p></td>
+<td><p>1</p></td>
+<td><p>6.38</p></td>
+<td><p>6.38</p></td>
+<td><p>AMP - TE CONNECTIVITY</p></td>
+<td><p>966067-1</p></td>
+</tr>
+<tr class="row-even"><td><p>Car Fuse 1.0 A</p></td>
+<td><p>1</p></td>
+<td><p>0.2</p></td>
+<td></td>
+<td><p>LITTELFUSE</p></td>
+<td><p>LITTELFUSE</p></td>
+</tr>
+<tr class="row-odd"><td><p>Fuse holder (576-FHAC0002ZXJ)</p></td>
+<td><p>1</p></td>
+<td><p>4.96</p></td>
+<td><p>4.96</p></td>
+<td><p>LITTELFUSE</p></td>
+<td><p>FHAC0002ZXJ</p></td>
+</tr>
+</tbody>
+</table>
 </section>
 </section>
 
diff --git a/sphinx/build/html/V1_02.html b/sphinx/build/html/V1_02.html
index 23946db46cf4193f5074eb06853849a4f724c930..1d1ce83c11b2a24d5433cb2563d22e0d4cb95c0c 100644
--- a/sphinx/build/html/V1_02.html
+++ b/sphinx/build/html/V1_02.html
@@ -4,7 +4,7 @@
 <html class="writer-html5" lang="en" >
 <head>
   <meta charset="utf-8">
-  <meta name="generator" content="Docutils 0.17: http://docutils.sourceforge.net/" />
+  <meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
@@ -14,6 +14,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,11 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
+        <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
@@ -433,23 +435,16 @@ it by following the steps described below and illustrated in the following figur
 \[coeff p2 = (R7 + R6) / R7\]</div>
 <div class="math notranslate nohighlight">
 \[coeff p3 = (R9 + R8) / R9\]</div>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">36</span>
-<span class="normal">37</span>
-<span class="normal">38</span>
-<span class="normal">39</span>
-<span class="normal">40</span>
-<span class="normal">41</span>
-<span class="normal">42</span>
-<span class="normal">43</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd"> hardware parameters</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
- <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
- <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
- <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
- <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">36</span> <span class="sd">&quot;&quot;&quot;</span>
+<span class="linenos">37</span><span class="sd"> hardware parameters</span>
+<span class="linenos">38</span><span class="sd"> &quot;&quot;&quot;</span>
+<span class="linenos">39</span> <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
+<span class="linenos">40</span> <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
+<span class="linenos">41</span> <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
+<span class="linenos">42</span> <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
+<span class="linenos">43</span> <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 <p>The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.</p>
 </div></blockquote>
 </dd>
@@ -665,19 +660,14 @@ are displayed on the screen. A measurement file is automatically created and nam
 <section id="electrical-resistivity-measurement-parameters-description">
 <h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Permalink to this headline">¶</a></h3>
 <p>In the version 1.02, the measurement parameters are in the Jason file (ohmpi_param.json).</p>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
-<span class="normal">2</span>
-<span class="normal">3</span>
-<span class="normal">4</span>
-<span class="normal">5</span>
-<span class="normal">6</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
- <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
- <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
- <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
- <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
- <span class="n">export_path</span><span class="o">=</span> <span class="s2">&quot;home/pi/Desktop/measurement.csv&quot;</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
+<span class="linenos">2</span> <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
+<span class="linenos">3</span> <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
+<span class="linenos">4</span> <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
+<span class="linenos">5</span> <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
+<span class="linenos">6</span> <span class="n">export_path</span><span class="o">=</span> <span class="s2">&quot;home/pi/Desktop/measurement.csv&quot;</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 </section>
 </section>
 <section id="complete-list-of-components">
@@ -686,6 +676,175 @@ are displayed on the screen. A measurement file is automatically created and nam
 <p class="admonition-title">Warning</p>
 <p>The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date</p>
 </div>
+<table class="colwidths-given docutils align-default" id="id10">
+<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id10" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col style="width: 8%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Component</p></th>
+<th class="head"><p>Number</p></th>
+<th class="head"><p>Cost per unit</p></th>
+<th class="head"><p>Total cost</p></th>
+<th class="head"><p>Manufacturer</p></th>
+<th class="head"><p>Manufacturer s reference</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>Raspberry Pi 3 Model B+</p></td>
+<td><p>1</p></td>
+<td><p>37</p></td>
+<td><p>37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 3 Model B</p></td>
+</tr>
+<tr class="row-odd"><td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+<td><p>1</p></td>
+<td><p>8.37</p></td>
+<td><p>8.37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+</tr>
+<tr class="row-even"><td><p>SainSmart 16-Channel 12V Relay</p></td>
+<td><p>8</p></td>
+<td><p>24.99</p></td>
+<td><p>199.92</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>101-70-103</p></td>
+</tr>
+<tr class="row-odd"><td><p>4-Channel 5V Relay Module</p></td>
+<td><p>1</p></td>
+<td><p>7.99</p></td>
+<td><p>7.99</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>20-018-101-CMS</p></td>
+</tr>
+<tr class="row-even"><td><p>cable 1X1 mm2 (50 m)</p></td>
+<td><p>1</p></td>
+<td><p>19.66</p></td>
+<td><p>19.66</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1568649</p></td>
+</tr>
+<tr class="row-odd"><td><p>cable 1X0.5 mm2 (100 m)</p></td>
+<td><p>1</p></td>
+<td><p>29.71</p></td>
+<td><p>29.71</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1565235</p></td>
+</tr>
+<tr class="row-even"><td><p>Printed circuit board (packaging quantity x 3)</p></td>
+<td><p>1</p></td>
+<td><p>12</p></td>
+<td><p>12</p></td>
+<td><p>Asler</p></td>
+<td><p>0</p></td>
+</tr>
+<tr class="row-odd"><td><p>Header sets 1x10</p></td>
+<td><p>1</p></td>
+<td><p>2.68</p></td>
+<td><p>2.68</p></td>
+<td><p>Samtec</p></td>
+<td><p>SSW-110-02-G-S</p></td>
+</tr>
+<tr class="row-even"><td><p>Dual screw terminal (3.5-mm pitch)</p></td>
+<td><p>7</p></td>
+<td><p>0.648</p></td>
+<td><p>4.55</p></td>
+<td><p>RS PRO</p></td>
+<td><p>897-1332</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 1 Kohm 0.5W +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.858</p></td>
+<td><p>3.44</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K0BYA</p></td>
+</tr>
+<tr class="row-even"><td><p>Resistor 1.5 Kohms +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.627</p></td>
+<td><p>2.52</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K5BYA</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 50 +- 0.1%</p></td>
+<td><p>1</p></td>
+<td><p>8.7</p></td>
+<td><p>8.7</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>UPW50B50RV</p></td>
+</tr>
+<tr class="row-even"><td><p>LM358N AMP-o</p></td>
+<td><p>4</p></td>
+<td><p>0.8</p></td>
+<td><p>2.4</p></td>
+<td><p>Texas Instruments</p></td>
+<td><p>LM358AN/NOPB</p></td>
+</tr>
+<tr class="row-odd"><td><p>ADS1115</p></td>
+<td><p>1</p></td>
+<td><p>11.9</p></td>
+<td><p>11.9</p></td>
+<td><p>Adafruit</p></td>
+<td><p>1083</p></td>
+</tr>
+<tr class="row-even"><td><p>12V battery 7ah</p></td>
+<td><p>1</p></td>
+<td><p>19.58</p></td>
+<td><p>19.58</p></td>
+<td><p>RS PRO</p></td>
+<td><p>537-5488</p></td>
+</tr>
+<tr class="row-odd"><td><p>Battery Holder Type D LR20 (9V)</p></td>
+<td><p>1</p></td>
+<td><p>3.43</p></td>
+<td><p>3.43</p></td>
+<td><p>RS PRO</p></td>
+<td><p>185-4686</p></td>
+</tr>
+<tr class="row-even"><td><p>Ferrule Crimp Terminal (1 mm2) (500 pieces)</p></td>
+<td><p>1</p></td>
+<td><p>30.48</p></td>
+<td><p>30.48</p></td>
+<td><p>WEIDMULLER</p></td>
+<td><p>9004330000</p></td>
+</tr>
+<tr class="row-odd"><td><p>Electrical Crimp Terminal (0.5 mm2) (100 piece)</p></td>
+<td><p>1</p></td>
+<td><p>6.38</p></td>
+<td><p>6.38</p></td>
+<td><p>AMP - TE CONNECTIVITY</p></td>
+<td><p>966067-1</p></td>
+</tr>
+<tr class="row-even"><td><p>Fuse 1.0 A</p></td>
+<td><p>1</p></td>
+<td><p>0.2</p></td>
+<td></td>
+<td><p>LITTELFUSE</p></td>
+<td><p>0251001.PAT1L</p></td>
+</tr>
+<tr class="row-odd"><td><p>Capacitor 100nF 50Vdc 10% Ceramic</p></td>
+<td><p>4</p></td>
+<td><p>0.2</p></td>
+<td><p>0.8</p></td>
+<td><p>KEMET</p></td>
+<td><p>C320C104K1</p></td>
+</tr>
+<tr class="row-even"><td><p>DC/DC converter 12 to 24V</p></td>
+<td><p>2</p></td>
+<td><p>26.72</p></td>
+<td><p>53.44</p></td>
+<td><p>TracoPower</p></td>
+<td><p>TRN 3-1215</p></td>
+</tr>
+</tbody>
+</table>
 </section>
 </section>
 
diff --git a/sphinx/build/html/V2_00.html b/sphinx/build/html/V2_00.html
index 67cb06f65eb4323808a4eef31938ee0a8b3d47f3..68cf5ff6b5ceccdb3a4e8a90a24b55ca24f60c0a 100644
--- a/sphinx/build/html/V2_00.html
+++ b/sphinx/build/html/V2_00.html
@@ -4,7 +4,7 @@
 <html class="writer-html5" lang="en" >
 <head>
   <meta charset="utf-8">
-  <meta name="generator" content="Docutils 0.17: http://docutils.sourceforge.net/" />
+  <meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
@@ -14,6 +14,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,11 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
+        <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
@@ -90,7 +92,7 @@
 <li class="toctree-l1 current"><a class="current reference internal" href="#">OhmPi V 2.00 (64 or 128 électrodes)</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="#the-philosophy-of-ohmpi">The philosophy of Ohmpi</a></li>
 <li class="toctree-l2"><a class="reference internal" href="#technical-data">Technical data</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#raspberry-pi-configuration">Raspberry Pi  configuration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="#step-n1-raspberry-pi-configuration"><strong>STEP n°1</strong> : Raspberry Pi  configuration</a><ul>
 <li class="toctree-l3"><a class="reference internal" href="#os-installation">OS installation</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#virtual-environnement-and-packages">Virtual Environnement and packages</a></li>
 <li class="toctree-l3"><a class="reference internal" href="#activate-virtual-environnement-on-thonny-python-ide-on-rapberry-pi">Activate virtual environnement on Thonny (Python IDE)  (on Rapberry Pi)</a></li>
@@ -184,83 +186,154 @@
             
   <section id="ohmpi-v-2-00-64-or-128-electrodes">
 <h1>OhmPi V 2.00 (64 or 128 électrodes)<a class="headerlink" href="#ohmpi-v-2-00-64-or-128-electrodes" title="Permalink to this headline">¶</a></h1>
+<figure class="align-center">
+<a class="reference internal image-reference" href="_images/Under-Construction.png"><img alt="Ohmpi 2" src="_images/Under-Construction.png" style="width: 500px; height: 250px;" /></a>
+</figure>
+<figure class="align-center">
+<a class="reference internal image-reference" href="_images/image_ohmpi_2.jpg"><img alt="Ohmpi 2" src="_images/image_ohmpi_2.jpg" style="width: 800px; height: 600px;" /></a>
+</figure>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>In this version, we have improved the electronic measurement board. To upgrade from version 1.01 to 1.02,
-you just have to replace the measurement board by the new one proposed here.</p>
+<p>In this version, we have developed two new board types that allow the assembly of Ohmpi v2.00, a measurement board and a multiplexer board.
+This new version is made up of:</p>
+<ol class="arabic simple">
+<li><p>A measurement board for four-point measurement</p></li>
+<li><p>4 multiplexer cards</p></li>
+<li><p>A box</p></li>
+</ol>
 </div>
 <section id="the-philosophy-of-ohmpi">
 <h2>The philosophy of Ohmpi<a class="headerlink" href="#the-philosophy-of-ohmpi" title="Permalink to this headline">¶</a></h2>
-<p>The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available
-electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection,
-but suitable for small laboratory experiments and small field time monitoring</p>
+<p>The philosophy of Ohmpi V2.00 is to offer a new DIY multielectrode resistivity meter. It is a resistivity meter with 64 electrodes , which can be upgraded to 128 electrodes.
+It is limited to low-current injection,but suitable for small laboratory experiments and small field time-lapse monitoring.
+Ohmpi, is developed by a team that seeks to share all its experience and wishes to improve and offer a more and more robust tool to the community.Ohmpi V2.00 is a completely different version from the previous one.
+We will stop the development on the previous version, to dedicate our efforts on this new version.</p>
 </section>
 <section id="technical-data">
 <h2>Technical data<a class="headerlink" href="#technical-data" title="Permalink to this headline">¶</a></h2>
 <table class="docutils align-default">
 <colgroup>
-<col style="width: 50%" />
-<col style="width: 32%" />
-<col style="width: 18%" />
+<col style="width: 33%" />
+<col style="width: 22%" />
+<col style="width: 12%" />
+<col style="width: 22%" />
+<col style="width: 12%" />
 </colgroup>
 <tbody>
 <tr class="row-odd"><td><p><strong>Parameter</strong></p></td>
-<td><p><strong>Specifications</strong></p></td>
+<td><dl class="simple">
+<dt><strong>Specifications</strong></dt><dd><p><strong>V1</strong></p>
+</dd>
+</dl>
+</td>
+<td><p>Units</p></td>
+<td><dl class="simple">
+<dt><strong>Specifications</strong></dt><dd><p><strong>V2</strong></p>
+</dd>
+</dl>
+</td>
 <td><p>Units</p></td>
 </tr>
 <tr class="row-even"><td><p>Electrodes</p></td>
 <td><p>32</p></td>
 <td></td>
+<td><p>64 to 128</p></td>
+<td></td>
 </tr>
 <tr class="row-odd"><td><p>Operating temperature</p></td>
-<td><p>0 to 50</p></td>
+<td><p>-0 to 50</p></td>
+<td><p>°c</p></td>
+<td><p>-25 to 50</p></td>
 <td><p>°c</p></td>
 </tr>
 <tr class="row-even"><td><p>Power consumption of CPU and
 control system</p></td>
 <td><p>18.5</p></td>
 <td><p>W</p></td>
+<td><p>18.5</p></td>
+<td><p>W</p></td>
 </tr>
 <tr class="row-odd"><td><p>Voltage injection</p></td>
-<td><p>9</p></td>
+<td><p>12</p></td>
+<td><p>V</p></td>
+<td><p>12</p></td>
 <td><p>V</p></td>
 </tr>
 <tr class="row-even"><td><p>Battery</p></td>
+<td><p>9</p></td>
+<td><p>V</p></td>
 <td><p>12</p></td>
 <td><p>V</p></td>
 </tr>
 <tr class="row-odd"><td><p>Current</p></td>
-<td><p>0 to 50</p></td>
+<td><p>0 to 40</p></td>
+<td><p>mA</p></td>
+<td><p>0 to 40</p></td>
 <td><p>mA</p></td>
 </tr>
 <tr class="row-even"><td><p>Min pulse duration</p></td>
 <td><p>150</p></td>
 <td><p>mS</p></td>
+<td><p>150</p></td>
+<td><p>mS</p></td>
 </tr>
 <tr class="row-odd"><td><p>Input impedance</p></td>
-<td><p>36</p></td>
+<td><p>80</p></td>
+<td><p>Mohm</p></td>
+<td><p>80</p></td>
 <td><p>Mohm</p></td>
 </tr>
 <tr class="row-even"><td><p>Data storage</p></td>
 <td><p>micro SD card</p></td>
 <td></td>
+<td><p>micro SD card</p></td>
+<td></td>
 </tr>
 <tr class="row-odd"><td><p>Resolution</p></td>
 <td><p>O.O1</p></td>
 <td><p>ohm</p></td>
+<td><p>O.O1</p></td>
+<td><p>ohm</p></td>
 </tr>
 </tbody>
 </table>
 </section>
-<section id="raspberry-pi-configuration">
-<h2>Raspberry Pi  configuration<a class="headerlink" href="#raspberry-pi-configuration" title="Permalink to this headline">¶</a></h2>
+<section id="step-n1-raspberry-pi-configuration">
+<h2><strong>STEP n°1</strong> : Raspberry Pi  configuration<a class="headerlink" href="#step-n1-raspberry-pi-configuration" title="Permalink to this headline">¶</a></h2>
 <section id="os-installation">
 <h3>OS installation<a class="headerlink" href="#os-installation" title="Permalink to this headline">¶</a></h3>
+<table class="docutils align-default">
+<colgroup>
+<col style="width: 78%" />
+<col style="width: 22%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td><p><strong>Required components</strong></p></td>
+<td><p><strong>Quantity</strong></p></td>
+</tr>
+<tr class="row-even"><td><p>Raspberry Pi 4 Model B</p></td>
+<td><p>1</p></td>
+</tr>
+<tr class="row-odd"><td><p>Micro SD 32 Go</p></td>
+<td><p>1</p></td>
+</tr>
+<tr class="row-even"><td><p>HDMI Cable</p></td>
+<td><p>1</p></td>
+</tr>
+<tr class="row-odd"><td><p>Computer mouse</p></td>
+<td><p>1</p></td>
+</tr>
+<tr class="row-even"><td><p>Computer Keyboard</p></td>
+<td><p>1</p></td>
+</tr>
+</tbody>
+</table>
 <p>The first step is to start up the Raspberry Pi board, including installation of an OS (operating system).
 For this step, the installation instructions are well described on the Raspberry website</p>
 <ol class="arabic simple">
 <li><p>Watch the vidéo “how to set up your raspberry Pi” (<a class="reference external" href="https://www.youtube.com/watch?v=wjWZhV1v3Pk">https://www.youtube.com/watch?v=wjWZhV1v3Pk</a>)</p></li>
 <li><p>The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).</p></li>
+<li><p>or you can visit this website : (<a class="reference external" href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up">https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up</a>)</p></li>
 </ol>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
@@ -306,6 +379,8 @@ To ensure that the GPIOs are in Low position, you will need to modify the /boot/
 </section>
 <section id="virtual-environnement-and-packages">
 <h3>Virtual Environnement and packages<a class="headerlink" href="#virtual-environnement-and-packages" title="Permalink to this headline">¶</a></h3>
+<p>A virtual environment is a way to have multiple, parallel instances of the Python interpreter, each with different package sets and different configurations.
+Each virtual environment contains a discrete copy of the Python interpreter, including copies of its support utilities. It also protects your system in case of problems with the packages.</p>
 <p>All dependencies are specified in requirements.txt</p>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
@@ -433,23 +508,16 @@ it by following the steps described below and illustrated in the following figur
 \[coeff p2 = (R7 + R6) / R7\]</div>
 <div class="math notranslate nohighlight">
 \[coeff p3 = (R9 + R8) / R9\]</div>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">36</span>
-<span class="normal">37</span>
-<span class="normal">38</span>
-<span class="normal">39</span>
-<span class="normal">40</span>
-<span class="normal">41</span>
-<span class="normal">42</span>
-<span class="normal">43</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd"> hardware parameters</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
- <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
- <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
- <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
- <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">36</span> <span class="sd">&quot;&quot;&quot;</span>
+<span class="linenos">37</span><span class="sd"> hardware parameters</span>
+<span class="linenos">38</span><span class="sd"> &quot;&quot;&quot;</span>
+<span class="linenos">39</span> <span class="n">R_ref</span> <span class="o">=</span> <span class="mi">50</span> <span class="c1"># reference resistance value in ohm</span>
+<span class="linenos">40</span> <span class="n">coef_p0</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P0, measurement in V/V</span>
+<span class="linenos">41</span> <span class="n">coef_p1</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P1, measurement in V/V</span>
+<span class="linenos">42</span> <span class="n">coef_p2</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P2, measurement in V/V</span>
+<span class="linenos">43</span> <span class="n">coef_p3</span> <span class="o">=</span> <span class="mf">2.5</span> <span class="c1"># slope for current conversion for ADS.P3, measurement in V/V</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 <p>The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.</p>
 </div></blockquote>
 </dd>
@@ -665,19 +733,14 @@ are displayed on the screen. A measurement file is automatically created and nam
 <section id="electrical-resistivity-measurement-parameters-description">
 <h3>Electrical resistivity measurement parameters description<a class="headerlink" href="#electrical-resistivity-measurement-parameters-description" title="Permalink to this headline">¶</a></h3>
 <p>In the version 1.02, the measurement parameters are in the Jason file (ohmpi_param.json).</p>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
-<span class="normal">2</span>
-<span class="normal">3</span>
-<span class="normal">4</span>
-<span class="normal">5</span>
-<span class="normal">6</span></pre></div></td><td class="code"><div class="highlight"><pre><span></span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
- <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
- <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
- <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
- <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
- <span class="n">export_path</span><span class="o">=</span> <span class="s2">&quot;home/pi/Desktop/measurement.csv&quot;</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span> <span class="n">nb_electrodes</span> <span class="o">=</span> <span class="mi">32</span> <span class="c1"># maximum number of electrodes on the resistivity meter</span>
+<span class="linenos">2</span> <span class="n">injection_duration</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="c1"># Current injection duration in second</span>
+<span class="linenos">3</span> <span class="n">nbr_meas</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># Number of times the quadripole sequence is repeated</span>
+<span class="linenos">4</span> <span class="n">sequence_delay</span><span class="o">=</span> <span class="mi">30</span> <span class="c1"># Delay in seconds between 2 sequences</span>
+<span class="linenos">5</span> <span class="n">stack</span><span class="o">=</span> <span class="mi">1</span> <span class="c1"># repetition of the current injection for each quadripole</span>
+<span class="linenos">6</span> <span class="n">export_path</span><span class="o">=</span> <span class="s2">&quot;home/pi/Desktop/measurement.csv&quot;</span>
 </pre></div>
-</td></tr></table></div>
+</div>
 </section>
 </section>
 <section id="complete-list-of-components">
@@ -686,6 +749,175 @@ are displayed on the screen. A measurement file is automatically created and nam
 <p class="admonition-title">Warning</p>
 <p>The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date</p>
 </div>
+<table class="colwidths-given docutils align-default" id="id10">
+<caption><span class="caption-text">List of components</span><a class="headerlink" href="#id10" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col style="width: 8%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+<col style="width: 18%" />
+</colgroup>
+<thead>
+<tr class="row-odd"><th class="head"><p>Component</p></th>
+<th class="head"><p>Number</p></th>
+<th class="head"><p>Cost per unit</p></th>
+<th class="head"><p>Total cost</p></th>
+<th class="head"><p>Manufacturer</p></th>
+<th class="head"><p>Manufacturer s reference</p></th>
+</tr>
+</thead>
+<tbody>
+<tr class="row-even"><td><p>Raspberry Pi 3 Model B+</p></td>
+<td><p>1</p></td>
+<td><p>37</p></td>
+<td><p>37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 3 Model B</p></td>
+</tr>
+<tr class="row-odd"><td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+<td><p>1</p></td>
+<td><p>8.37</p></td>
+<td><p>8.37</p></td>
+<td><p>Raspberry</p></td>
+<td><p>Raspberry Pi 1 2 and 3 Power Supply</p></td>
+</tr>
+<tr class="row-even"><td><p>SainSmart 16-Channel 12V Relay</p></td>
+<td><p>8</p></td>
+<td><p>24.99</p></td>
+<td><p>199.92</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>101-70-103</p></td>
+</tr>
+<tr class="row-odd"><td><p>4-Channel 5V Relay Module</p></td>
+<td><p>1</p></td>
+<td><p>7.99</p></td>
+<td><p>7.99</p></td>
+<td><p>Sain Smart</p></td>
+<td><p>20-018-101-CMS</p></td>
+</tr>
+<tr class="row-even"><td><p>cable 1X1 mm2 (50 m)</p></td>
+<td><p>1</p></td>
+<td><p>19.66</p></td>
+<td><p>19.66</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1568649</p></td>
+</tr>
+<tr class="row-odd"><td><p>cable 1X0.5 mm2 (100 m)</p></td>
+<td><p>1</p></td>
+<td><p>29.71</p></td>
+<td><p>29.71</p></td>
+<td><p>TRU COMPONENTS</p></td>
+<td><p>1565235</p></td>
+</tr>
+<tr class="row-even"><td><p>Printed circuit board (packaging quantity x 3)</p></td>
+<td><p>1</p></td>
+<td><p>12</p></td>
+<td><p>12</p></td>
+<td><p>Asler</p></td>
+<td><p>0</p></td>
+</tr>
+<tr class="row-odd"><td><p>Header sets 1x10</p></td>
+<td><p>1</p></td>
+<td><p>2.68</p></td>
+<td><p>2.68</p></td>
+<td><p>Samtec</p></td>
+<td><p>SSW-110-02-G-S</p></td>
+</tr>
+<tr class="row-even"><td><p>Dual screw terminal (3.5-mm pitch)</p></td>
+<td><p>7</p></td>
+<td><p>0.648</p></td>
+<td><p>4.55</p></td>
+<td><p>RS PRO</p></td>
+<td><p>897-1332</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 1 Kohm 0.5W +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.858</p></td>
+<td><p>3.44</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K0BYA</p></td>
+</tr>
+<tr class="row-even"><td><p>Resistor 1.5 Kohms +- 0.1%</p></td>
+<td><p>4</p></td>
+<td><p>0.627</p></td>
+<td><p>2.52</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>H81K5BYA</p></td>
+</tr>
+<tr class="row-odd"><td><p>Resistor 50 +- 0.1%</p></td>
+<td><p>1</p></td>
+<td><p>8.7</p></td>
+<td><p>8.7</p></td>
+<td><p>TE Connectivity</p></td>
+<td><p>UPW50B50RV</p></td>
+</tr>
+<tr class="row-even"><td><p>LM358N AMP-o</p></td>
+<td><p>4</p></td>
+<td><p>0.8</p></td>
+<td><p>2.4</p></td>
+<td><p>Texas Instruments</p></td>
+<td><p>LM358AN/NOPB</p></td>
+</tr>
+<tr class="row-odd"><td><p>ADS1115</p></td>
+<td><p>1</p></td>
+<td><p>11.9</p></td>
+<td><p>11.9</p></td>
+<td><p>Adafruit</p></td>
+<td><p>1083</p></td>
+</tr>
+<tr class="row-even"><td><p>12V battery 7ah</p></td>
+<td><p>1</p></td>
+<td><p>19.58</p></td>
+<td><p>19.58</p></td>
+<td><p>RS PRO</p></td>
+<td><p>537-5488</p></td>
+</tr>
+<tr class="row-odd"><td><p>Battery Holder Type D LR20 (9V)</p></td>
+<td><p>1</p></td>
+<td><p>3.43</p></td>
+<td><p>3.43</p></td>
+<td><p>RS PRO</p></td>
+<td><p>185-4686</p></td>
+</tr>
+<tr class="row-even"><td><p>Ferrule Crimp Terminal (1 mm2) (500 pieces)</p></td>
+<td><p>1</p></td>
+<td><p>30.48</p></td>
+<td><p>30.48</p></td>
+<td><p>WEIDMULLER</p></td>
+<td><p>9004330000</p></td>
+</tr>
+<tr class="row-odd"><td><p>Electrical Crimp Terminal (0.5 mm2) (100 piece)</p></td>
+<td><p>1</p></td>
+<td><p>6.38</p></td>
+<td><p>6.38</p></td>
+<td><p>AMP - TE CONNECTIVITY</p></td>
+<td><p>966067-1</p></td>
+</tr>
+<tr class="row-even"><td><p>Fuse 1.0 A</p></td>
+<td><p>1</p></td>
+<td><p>0.2</p></td>
+<td></td>
+<td><p>LITTELFUSE</p></td>
+<td><p>0251001.PAT1L</p></td>
+</tr>
+<tr class="row-odd"><td><p>Capacitor 100nF 50Vdc 10% Ceramic</p></td>
+<td><p>4</p></td>
+<td><p>0.2</p></td>
+<td><p>0.8</p></td>
+<td><p>KEMET</p></td>
+<td><p>C320C104K1</p></td>
+</tr>
+<tr class="row-even"><td><p>DC/DC converter 12 to 24V</p></td>
+<td><p>2</p></td>
+<td><p>26.72</p></td>
+<td><p>53.44</p></td>
+<td><p>TracoPower</p></td>
+<td><p>TRN 3-1215</p></td>
+</tr>
+</tbody>
+</table>
 </section>
 </section>
 
diff --git a/sphinx/build/html/_images/Under-Construction.png b/sphinx/build/html/_images/Under-Construction.png
new file mode 100644
index 0000000000000000000000000000000000000000..52b5e449c814895d1cf90a37e92152e96cf3548a
Binary files /dev/null and b/sphinx/build/html/_images/Under-Construction.png differ
diff --git a/sphinx/build/html/_images/image_ohmpi_2.jpg b/sphinx/build/html/_images/image_ohmpi_2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d496aff74e226f6b0c683b983230273f7dd078ec
Binary files /dev/null and b/sphinx/build/html/_images/image_ohmpi_2.jpg differ
diff --git a/sphinx/build/html/_sources/V1_01.rst.txt b/sphinx/build/html/_sources/V1_01.rst.txt
index 877b4bd6f13852db79f164e4cba063fe43c59165..d40b2a5e04e40cb7b9b234b654c0c4ba90c67eeb 100644
--- a/sphinx/build/html/_sources/V1_01.rst.txt
+++ b/sphinx/build/html/_sources/V1_01.rst.txt
@@ -521,7 +521,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/build/html/_sources/V1_02.rst.txt b/sphinx/build/html/_sources/V1_02.rst.txt
index 8bc01da4892f617a14194c87ecf17301d9b720c8..8de1fa10f904aff510a9a3217225d6589169367b 100644
--- a/sphinx/build/html/_sources/V1_02.rst.txt
+++ b/sphinx/build/html/_sources/V1_02.rst.txt
@@ -533,7 +533,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list - 1_02.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/build/html/_sources/V2_00.rst.txt b/sphinx/build/html/_sources/V2_00.rst.txt
index 504003422002a50608a2a0e67b81a7c3497b2db9..5cffe76fe42144dafa816bb388dd2314b5826890 100644
--- a/sphinx/build/html/_sources/V2_00.rst.txt
+++ b/sphinx/build/html/_sources/V2_00.rst.txt
@@ -2,60 +2,95 @@
 OhmPi V 2.00 (64 or 128 électrodes)
 ***************************************** 
 
+.. figure:: Under-Construction.png
+	   :width: 500px
+	   :align: center
+	   :height: 250px
+	   :alt: Ohmpi 2
+	   :figclass: align-center
 
-
-
+.. figure:: image_ohmpi_2.jpg
+	   :width: 800px
+	   :align: center
+	   :height: 600px
+	   :alt: Ohmpi 2
+	   :figclass: align-center
 
 .. note::
+	 In this version, we have developed two new board types that allow the assembly of Ohmpi v2.00, a measurement board and a multiplexer board.
+	 This new version is made up of: 
+	 
+	 1. A measurement board for four-point measurement
 	 
-	 In this version, we have improved the electronic measurement board. To upgrade from version 1.01 to 1.02, 
-	 you just have to replace the measurement board by the new one proposed here.
+	 2. 4 multiplexer cards
+	 
+	 3. A box 
 
 The philosophy of Ohmpi 
 **************************
-The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available 
-electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection, 
-but suitable for small laboratory experiments and small field time monitoring
-
+The philosophy of Ohmpi V2.00 is to offer a new DIY multielectrode resistivity meter. It is a resistivity meter with 64 electrodes , which can be upgraded to 128 electrodes. 
+It is limited to low-current injection,but suitable for small laboratory experiments and small field time-lapse monitoring.
+Ohmpi, is developed by a team that seeks to share all its experience and wishes to improve and offer a more and more robust tool to the community.Ohmpi V2.00 is a completely different version from the previous one. 
+We will stop the development on the previous version, to dedicate our efforts on this new version. 
 
 Technical data
 ***************
-+-------------------------------+--------------------+-----------+
-| **Parameter**                 | **Specifications** | Units     |
-+-------------------------------+--------------------+-----------+
-|Electrodes                     |32                  |           |
-+-------------------------------+--------------------+-----------+
-|Operating temperature          |0 to 50             |°c         |
-+-------------------------------+--------------------+-----------+
-|Power consumption of CPU and   |18.5                |W          |             
-|control system                 |                    |           |
-+-------------------------------+--------------------+-----------+
-|Voltage injection              |9                   |V          |
-+-------------------------------+--------------------+-----------+
-|Battery                        |12                  |V          |
-+-------------------------------+--------------------+-----------+
-|Current                        |0 to 50             |mA         |
-+-------------------------------+--------------------+-----------+
-|Min pulse duration             |150                 |mS         |
-+-------------------------------+--------------------+-----------+
-|Input impedance                |36                  |Mohm       |
-+-------------------------------+--------------------+-----------+
-|Data storage                   |micro SD card       |           |
-+-------------------------------+--------------------+-----------+
-|Resolution                     |O.O1                |ohm        |
-+-------------------------------+--------------------+-----------+
-
-Raspberry Pi  configuration
-****************************************** 
+
++-------------------------------+--------------------+-----------+--------------------+-----------+
+| **Parameter**                 | **Specifications** | Units     | **Specifications** | Units     |
+|                               |       **V1**       |           |       **V2**       |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Electrodes                     |32                  |           |64 to 128           |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Operating temperature          |-0 to 50            |°c         |-25 to 50           |°c         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Power consumption of CPU and   |18.5                |W          |18.5                |W          |              
+|control system                 |                    |           |                    |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Voltage injection              |12                  |V          |12                  |V          |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Battery                        |9                   |V          |12                  |V          |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Current                        |0 to 40             |mA         |0 to 40             |mA         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Min pulse duration             |150                 |mS         |150                 |mS         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Input impedance                |80                  |Mohm       |80                  |Mohm       |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Data storage                   |micro SD card       |           |micro SD card       |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Resolution                     |O.O1                |ohm        |O.O1                |ohm        |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+
+**STEP n°1** : Raspberry Pi  configuration
+*******************************************
+
+
 OS installation  
 ================
 
++----------------------------------------------------+---------------+
+| **Required components**                            | **Quantity**  | 
++----------------------------------------------------+---------------+
+|Raspberry Pi 4 Model B                              |              1|
++----------------------------------------------------+---------------+
+|Micro SD 32 Go                                      |              1|
++----------------------------------------------------+---------------+
+|HDMI Cable                                          |              1|
++----------------------------------------------------+---------------+
+|Computer mouse                                      |              1|
++----------------------------------------------------+---------------+
+|Computer Keyboard                                   |              1|
++----------------------------------------------------+---------------+
+
 The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). 
 For this step, the installation instructions are well described on the Raspberry website 
 
 1. Watch the vidéo "how to set up your raspberry Pi" (https://www.youtube.com/watch?v=wjWZhV1v3Pk)
 
-2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer). 
+2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
+
+3. or you can visit this website : (https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)  
 
 .. note:: 
 	 All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
@@ -72,9 +107,6 @@ For this step, the installation instructions are well described on the Raspberry
 .. warning::
 	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
 
-
-
-
 3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly. 
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
 
@@ -102,10 +134,12 @@ To ensure that the GPIOs are in Low position, you will need to modify the /boot/
 8. Close the terminal
 
 
-
 Virtual Environnement and packages
 ==================================
 
+A virtual environment is a way to have multiple, parallel instances of the Python interpreter, each with different package sets and different configurations. 
+Each virtual environment contains a discrete copy of the Python interpreter, including copies of its support utilities. It also protects your system in case of problems with the packages.
+
 All dependencies are specified in requirements.txt
 
 .. note:: 
@@ -535,7 +569,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list - 1_02.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/build/html/_static/basic.css b/sphinx/build/html/_static/basic.css
index 56f5efc61ec4910592264c70ea1ae538fa83522d..912859b55d96750bff001bb79037a83a6c02332c 100644
--- a/sphinx/build/html/_static/basic.css
+++ b/sphinx/build/html/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -15,6 +15,12 @@ div.clearer {
     clear: both;
 }
 
+div.section::after {
+    display: block;
+    content: '';
+    clear: left;
+}
+
 /* -- relbar ---------------------------------------------------------------- */
 
 div.related {
@@ -124,7 +130,7 @@ ul.search li a {
     font-weight: bold;
 }
 
-ul.search li div.context {
+ul.search li p.context {
     color: #888;
     margin: 2px 0 0 30px;
     text-align: left;
@@ -271,25 +277,25 @@ p.rubric {
     font-weight: bold;
 }
 
-img.align-left, .figure.align-left, object.align-left {
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
     clear: left;
     float: left;
     margin-right: 1em;
 }
 
-img.align-right, .figure.align-right, object.align-right {
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
     clear: right;
     float: right;
     margin-left: 1em;
 }
 
-img.align-center, .figure.align-center, object.align-center {
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
   display: block;
   margin-left: auto;
   margin-right: auto;
 }
 
-img.align-default, .figure.align-default {
+img.align-default, figure.align-default, .figure.align-default {
   display: block;
   margin-left: auto;
   margin-right: auto;
@@ -313,7 +319,8 @@ img.align-default, .figure.align-default {
 
 /* -- sidebars -------------------------------------------------------------- */
 
-div.sidebar {
+div.sidebar,
+aside.sidebar {
     margin: 0 0 0.5em 1em;
     border: 1px solid #ddb;
     padding: 7px;
@@ -328,8 +335,8 @@ p.sidebar-title {
     font-weight: bold;
 }
 
-div.admonition, div.topic, pre, div[class|="highlight"] {
-    clear: both;
+div.admonition, div.topic, blockquote {
+    clear: left;
 }
 
 /* -- topics ---------------------------------------------------------------- */
@@ -338,7 +345,6 @@ div.topic {
     border: 1px solid #ccc;
     padding: 7px;
     margin: 10px 0 10px 0;
-    overflow-x: auto;
 }
 
 p.topic-title {
@@ -353,7 +359,6 @@ div.admonition {
     margin-top: 10px;
     margin-bottom: 10px;
     padding: 7px;
-    overflow-x: auto;
 }
 
 div.admonition dt {
@@ -373,11 +378,22 @@ div.body p.centered {
 /* -- content of sidebars/topics/admonitions -------------------------------- */
 
 div.sidebar > :last-child,
+aside.sidebar > :last-child,
 div.topic > :last-child,
 div.admonition > :last-child {
     margin-bottom: 0;
 }
 
+div.sidebar::after,
+aside.sidebar::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+    display: block;
+    content: '';
+    clear: both;
+}
+
 /* -- tables ---------------------------------------------------------------- */
 
 table.docutils {
@@ -442,20 +458,22 @@ td > :last-child {
 
 /* -- figures --------------------------------------------------------------- */
 
-div.figure {
+div.figure, figure {
     margin: 0.5em;
     padding: 0.5em;
 }
 
-div.figure p.caption {
+div.figure p.caption, figcaption {
     padding: 0.3em;
 }
 
-div.figure p.caption span.caption-number {
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
     font-style: italic;
 }
 
-div.figure p.caption span.caption-text {
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
 }
 
 /* -- field list styles ----------------------------------------------------- */
@@ -490,6 +508,63 @@ table.hlist td {
     vertical-align: top;
 }
 
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+	font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+.sig-name {
+	font-size: 1.1em;
+}
+
+code.descname {
+    font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+    background-color: transparent;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.sig-param.n {
+	font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+	font-family: unset;
+}
+
+.sig.c   .k, .sig.c   .kt,
+.sig.cpp .k, .sig.cpp .kt {
+	color: #0033B3;
+}
+
+.sig.c   .m,
+.sig.cpp .m {
+	color: #1750EB;
+}
+
+.sig.c   .s, .sig.c   .sc,
+.sig.cpp .s, .sig.cpp .sc {
+	color: #067D17;
+}
+
 
 /* -- other body styles ----------------------------------------------------- */
 
@@ -513,28 +588,31 @@ ol.upperroman {
     list-style: upper-roman;
 }
 
-ol > li:first-child > :first-child,
-ul > li:first-child > :first-child {
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
     margin-top: 0px;
 }
 
-ol ol > li:first-child > :first-child,
-ol ul > li:first-child > :first-child,
-ul ol > li:first-child > :first-child,
-ul ul > li:first-child > :first-child {
-    margin-top: revert;
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+    margin-bottom: 0px;
 }
 
-ol > li:last-child > :last-child,
-ul > li:last-child > :last-child {
-    margin-bottom: 0px;
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+    margin-top: 0;
 }
 
-ol ol > li:last-child > :last-child,
-ol ul > li:last-child > :last-child,
-ul ol > li:last-child > :last-child,
-ul ul > li:last-child > :last-child {
-    margin-bottom: revert;
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+    margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+    margin-bottom: 0;
 }
 
 dl.footnote > dt,
@@ -613,14 +691,6 @@ dl.glossary dt {
     font-size: 1.1em;
 }
 
-.optional {
-    font-size: 1.3em;
-}
-
-.sig-paren {
-    font-size: larger;
-}
-
 .versionmodified {
     font-style: italic;
 }
@@ -677,6 +747,10 @@ pre {
     overflow-y: hidden;  /* fixes display issues on Chrome browsers */
 }
 
+pre, div[class*="highlight-"] {
+    clear: both;
+}
+
 span.pre {
     -moz-hyphens: none;
     -ms-hyphens: none;
@@ -684,7 +758,7 @@ span.pre {
     hyphens: none;
 }
 
-div[class^="highlight-"] {
+div[class*="highlight-"] {
     margin: 1em 0;
 }
 
@@ -744,8 +818,13 @@ div.code-block-caption code {
 }
 
 table.highlighttable td.linenos,
-div.doctest > div.highlight span.gp {  /* gp: Generic.Prompt */
-    user-select: none;
+span.linenos,
+div.highlight span.gp {  /* gp: Generic.Prompt */
+  user-select: none;
+  -webkit-user-select: text; /* Safari fallback only */
+  -webkit-user-select: none; /* Chrome/Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* IE10+ */
 }
 
 div.code-block-caption span.caption-number {
@@ -760,16 +839,6 @@ div.literal-block-wrapper {
     margin: 1em 0;
 }
 
-code.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-code.descclassname {
-    background-color: transparent;
-}
-
 code.xref, a code {
     background-color: transparent;
     font-weight: bold;
diff --git a/sphinx/build/html/_static/doctools.js b/sphinx/build/html/_static/doctools.js
index daccd209dab05a75f5627390e37a6b764e93f547..8cbf1b161a6527c8c6ad1c4f1fdc156e065ab262 100644
--- a/sphinx/build/html/_static/doctools.js
+++ b/sphinx/build/html/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for all documentation.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -29,9 +29,14 @@ if (!window.console || !console.firebug) {
 
 /**
  * small helper function to urldecode strings
+ *
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
  */
 jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
+  if (!x) {
+    return x
+  }
+  return decodeURIComponent(x.replace(/\+/g, ' '));
 };
 
 /**
@@ -285,9 +290,10 @@ var Documentation = {
   initOnKeyListeners: function() {
     $(document).keydown(function(event) {
       var activeElementType = document.activeElement.tagName;
-      // don't navigate when in search box or textarea
+      // don't navigate when in search box, textarea, dropdown or button
       if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
-          && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
+          && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
+          && !event.shiftKey) {
         switch (event.keyCode) {
           case 37: // left
             var prevHref = $('link[rel="prev"]').prop('href');
@@ -295,12 +301,14 @@ var Documentation = {
               window.location.href = prevHref;
               return false;
             }
+            break;
           case 39: // right
             var nextHref = $('link[rel="next"]').prop('href');
             if (nextHref) {
               window.location.href = nextHref;
               return false;
             }
+            break;
         }
       }
     });
diff --git a/sphinx/build/html/_static/language_data.js b/sphinx/build/html/_static/language_data.js
index d2b4ee91b0da7308cf5693804779c7b18c26252a..863704b310d1539241ef20e26ccce6af27f0ffce 100644
--- a/sphinx/build/html/_static/language_data.js
+++ b/sphinx/build/html/_static/language_data.js
@@ -5,7 +5,7 @@
  * This script contains the language-specific data used by searchtools.js,
  * namely the list of stopwords, stemmer, scorer and splitter.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -13,7 +13,8 @@
 var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
 
 
-/* Non-minified version JS is _stemmer.js if file is provided */ 
+/* Non-minified version is copied as a separate JS file, is available */
+
 /**
  * Porter Stemmer
  */
@@ -199,7 +200,6 @@ var Stemmer = function() {
 
 
 
-
 var splitChars = (function() {
     var result = {};
     var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
diff --git a/sphinx/build/html/_static/searchtools.js b/sphinx/build/html/_static/searchtools.js
index ab56499655111429619df63a1dc6687646d22a3e..8eb14218b5a6f434c93949dabf10df694d392876 100644
--- a/sphinx/build/html/_static/searchtools.js
+++ b/sphinx/build/html/_static/searchtools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for the full-text search.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -59,10 +59,10 @@ var Search = {
   _pulse_status : -1,
 
   htmlToText : function(htmlString) {
-      var htmlElement = document.createElement('span');
-      htmlElement.innerHTML = htmlString;
-      $(htmlElement).find('.headerlink').remove();
-      docContent = $(htmlElement).find('[role=main]')[0];
+      var virtualDocument = document.implementation.createHTMLDocument('virtual');
+      var htmlElement = $(htmlString, virtualDocument);
+      htmlElement.find('.headerlink').remove();
+      docContent = htmlElement.find('[role=main]')[0];
       if(docContent === undefined) {
           console.warn("Content block not found. Sphinx search tries to obtain it " +
                        "via '[role=main]'. Could you check your theme or template.");
@@ -166,8 +166,7 @@ var Search = {
           objectterms.push(tmp[i].toLowerCase());
       }
 
-      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
-          tmp[i] === "") {
+      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
         // skip this "word"
         continue;
       }
@@ -249,7 +248,7 @@ var Search = {
       // results left, load the summary and display it
       if (results.length) {
         var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
+        var listItem = $('<li></li>');
         var requestUrl = "";
         var linkUrl = "";
         if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
@@ -274,10 +273,10 @@ var Search = {
         if (item[3]) {
           listItem.append($('<span> (' + item[3] + ')</span>'));
           Search.output.append(listItem);
-          listItem.slideDown(5, function() {
+          setTimeout(function() {
             displayNextItem();
-          });
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          }, 5);
+        } else {
           $.ajax({url: requestUrl,
                   dataType: "text",
                   complete: function(jqxhr, textstatus) {
@@ -286,16 +285,10 @@ var Search = {
                       listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
                     }
                     Search.output.append(listItem);
-                    listItem.slideDown(5, function() {
+                    setTimeout(function() {
                       displayNextItem();
-                    });
+                    }, 5);
                   }});
-        } else {
-          // no source available, just display title
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
         }
       }
       // search finished, update title and status message
@@ -380,6 +373,13 @@ var Search = {
     return results;
   },
 
+  /**
+   * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
+   */
+  escapeRegExp : function(string) {
+    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+  },
+
   /**
    * search for full-text terms in the index
    */
@@ -403,13 +403,14 @@ var Search = {
       ];
       // add support for partial matches
       if (word.length > 2) {
+        var word_regex = this.escapeRegExp(word);
         for (var w in terms) {
-          if (w.match(word) && !terms[word]) {
+          if (w.match(word_regex) && !terms[word]) {
             _o.push({files: terms[w], score: Scorer.partialTerm})
           }
         }
         for (var w in titleterms) {
-          if (w.match(word) && !titleterms[word]) {
+          if (w.match(word_regex) && !titleterms[word]) {
               _o.push({files: titleterms[w], score: Scorer.partialTitle})
           }
         }
@@ -502,7 +503,7 @@ var Search = {
     var excerpt = ((start > 0) ? '...' : '') +
       $.trim(text.substr(start, 240)) +
       ((start + 240 - text.length) ? '...' : '');
-    var rv = $('<div class="context"></div>').text(excerpt);
+    var rv = $('<p class="context"></p>').text(excerpt);
     $.each(hlwords, function() {
       rv = rv.highlightText(this, 'highlighted');
     });
diff --git a/sphinx/build/html/_static/underscore-1.13.1.js b/sphinx/build/html/_static/underscore-1.13.1.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffd77af9648a47d389f2d6976d4aa1c44d7ce7ce
--- /dev/null
+++ b/sphinx/build/html/_static/underscore-1.13.1.js
@@ -0,0 +1,2042 @@
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define('underscore', factory) :
+  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
+    var current = global._;
+    var exports = global._ = factory();
+    exports.noConflict = function () { global._ = current; return exports; };
+  }()));
+}(this, (function () {
+  //     Underscore.js 1.13.1
+  //     https://underscorejs.org
+  //     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+  //     Underscore may be freely distributed under the MIT license.
+
+  // Current version.
+  var VERSION = '1.13.1';
+
+  // Establish the root object, `window` (`self`) in the browser, `global`
+  // on the server, or `this` in some virtual machines. We use `self`
+  // instead of `window` for `WebWorker` support.
+  var root = typeof self == 'object' && self.self === self && self ||
+            typeof global == 'object' && global.global === global && global ||
+            Function('return this')() ||
+            {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var push = ArrayProto.push,
+      slice = ArrayProto.slice,
+      toString = ObjProto.toString,
+      hasOwnProperty = ObjProto.hasOwnProperty;
+
+  // Modern feature detection.
+  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+      supportsDataView = typeof DataView !== 'undefined';
+
+  // All **ECMAScript 5+** native function implementations that we hope to use
+  // are declared here.
+  var nativeIsArray = Array.isArray,
+      nativeKeys = Object.keys,
+      nativeCreate = Object.create,
+      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+  // Create references to these builtin functions because we override them.
+  var _isNaN = isNaN,
+      _isFinite = isFinite;
+
+  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+  // The largest integer that can be represented exactly.
+  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+  // Some functions take a variable number of arguments, or a few expected
+  // arguments at the beginning and then a variable number of values to operate
+  // on. This helper accumulates all remaining arguments past the function’s
+  // argument length (or an explicit `startIndex`), into an array that becomes
+  // the last argument. Similar to ES6’s "rest parameter".
+  function restArguments(func, startIndex) {
+    startIndex = startIndex == null ? func.length - 1 : +startIndex;
+    return function() {
+      var length = Math.max(arguments.length - startIndex, 0),
+          rest = Array(length),
+          index = 0;
+      for (; index < length; index++) {
+        rest[index] = arguments[index + startIndex];
+      }
+      switch (startIndex) {
+        case 0: return func.call(this, rest);
+        case 1: return func.call(this, arguments[0], rest);
+        case 2: return func.call(this, arguments[0], arguments[1], rest);
+      }
+      var args = Array(startIndex + 1);
+      for (index = 0; index < startIndex; index++) {
+        args[index] = arguments[index];
+      }
+      args[startIndex] = rest;
+      return func.apply(this, args);
+    };
+  }
+
+  // Is a given variable an object?
+  function isObject(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  }
+
+  // Is a given value equal to null?
+  function isNull(obj) {
+    return obj === null;
+  }
+
+  // Is a given variable undefined?
+  function isUndefined(obj) {
+    return obj === void 0;
+  }
+
+  // Is a given value a boolean?
+  function isBoolean(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  }
+
+  // Is a given value a DOM element?
+  function isElement(obj) {
+    return !!(obj && obj.nodeType === 1);
+  }
+
+  // Internal function for creating a `toString`-based type tester.
+  function tagTester(name) {
+    var tag = '[object ' + name + ']';
+    return function(obj) {
+      return toString.call(obj) === tag;
+    };
+  }
+
+  var isString = tagTester('String');
+
+  var isNumber = tagTester('Number');
+
+  var isDate = tagTester('Date');
+
+  var isRegExp = tagTester('RegExp');
+
+  var isError = tagTester('Error');
+
+  var isSymbol = tagTester('Symbol');
+
+  var isArrayBuffer = tagTester('ArrayBuffer');
+
+  var isFunction = tagTester('Function');
+
+  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+  var nodelist = root.document && root.document.childNodes;
+  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+    isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  var isFunction$1 = isFunction;
+
+  var hasObjectTag = tagTester('Object');
+
+  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+  // In IE 11, the most common among them, this problem also applies to
+  // `Map`, `WeakMap` and `Set`.
+  var hasStringTagBug = (
+        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+      ),
+      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+  var isDataView = tagTester('DataView');
+
+  // In IE 10 - Edge 13, we need a different heuristic
+  // to determine whether an object is a `DataView`.
+  function ie10IsDataView(obj) {
+    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+  }
+
+  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native `Array.isArray`.
+  var isArray = nativeIsArray || tagTester('Array');
+
+  // Internal function to check whether `key` is an own property name of `obj`.
+  function has$1(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  }
+
+  var isArguments = tagTester('Arguments');
+
+  // Define a fallback version of the method in browsers (ahem, IE < 9), where
+  // there isn't any inspectable "Arguments" type.
+  (function() {
+    if (!isArguments(arguments)) {
+      isArguments = function(obj) {
+        return has$1(obj, 'callee');
+      };
+    }
+  }());
+
+  var isArguments$1 = isArguments;
+
+  // Is a given object a finite number?
+  function isFinite$1(obj) {
+    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+  }
+
+  // Is the given value `NaN`?
+  function isNaN$1(obj) {
+    return isNumber(obj) && _isNaN(obj);
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function constant(value) {
+    return function() {
+      return value;
+    };
+  }
+
+  // Common internal logic for `isArrayLike` and `isBufferLike`.
+  function createSizePropertyCheck(getSizeProperty) {
+    return function(collection) {
+      var sizeProperty = getSizeProperty(collection);
+      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+    }
+  }
+
+  // Internal helper to generate a function to obtain property `key` from `obj`.
+  function shallowProperty(key) {
+    return function(obj) {
+      return obj == null ? void 0 : obj[key];
+    };
+  }
+
+  // Internal helper to obtain the `byteLength` property of an object.
+  var getByteLength = shallowProperty('byteLength');
+
+  // Internal helper to determine whether we should spend extensive checks against
+  // `ArrayBuffer` et al.
+  var isBufferLike = createSizePropertyCheck(getByteLength);
+
+  // Is a given value a typed array?
+  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+  function isTypedArray(obj) {
+    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+    // Otherwise, fall back on the above regular expression.
+    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+  }
+
+  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+  // Internal helper to obtain the `length` property of an object.
+  var getLength = shallowProperty('length');
+
+  // Internal helper to create a simple lookup structure.
+  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+  // circular imports. `emulatedSet` is a one-off solution that only works for
+  // arrays of strings.
+  function emulatedSet(keys) {
+    var hash = {};
+    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+    return {
+      contains: function(key) { return hash[key]; },
+      push: function(key) {
+        hash[key] = true;
+        return keys.push(key);
+      }
+    };
+  }
+
+  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+  // needed.
+  function collectNonEnumProps(obj, keys) {
+    keys = emulatedSet(keys);
+    var nonEnumIdx = nonEnumerableProps.length;
+    var constructor = obj.constructor;
+    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+    // Constructor is a special case.
+    var prop = 'constructor';
+    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+    while (nonEnumIdx--) {
+      prop = nonEnumerableProps[nonEnumIdx];
+      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+        keys.push(prop);
+      }
+    }
+  }
+
+  // Retrieve the names of an object's own properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`.
+  function keys(obj) {
+    if (!isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (has$1(obj, key)) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  function isEmpty(obj) {
+    if (obj == null) return true;
+    // Skip the more expensive `toString`-based type checks if `obj` has no
+    // `.length`.
+    var length = getLength(obj);
+    if (typeof length == 'number' && (
+      isArray(obj) || isString(obj) || isArguments$1(obj)
+    )) return length === 0;
+    return getLength(keys(obj)) === 0;
+  }
+
+  // Returns whether an object has a given set of `key:value` pairs.
+  function isMatch(object, attrs) {
+    var _keys = keys(attrs), length = _keys.length;
+    if (object == null) return !length;
+    var obj = Object(object);
+    for (var i = 0; i < length; i++) {
+      var key = _keys[i];
+      if (attrs[key] !== obj[key] || !(key in obj)) return false;
+    }
+    return true;
+  }
+
+  // If Underscore is called as a function, it returns a wrapped object that can
+  // be used OO-style. This wrapper holds altered versions of all functions added
+  // through `_.mixin`. Wrapped objects may be chained.
+  function _$1(obj) {
+    if (obj instanceof _$1) return obj;
+    if (!(this instanceof _$1)) return new _$1(obj);
+    this._wrapped = obj;
+  }
+
+  _$1.VERSION = VERSION;
+
+  // Extracts the result from a wrapped and chained object.
+  _$1.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // Provide unwrapping proxies for some methods used in engine operations
+  // such as arithmetic and JSON stringification.
+  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
+
+  _$1.prototype.toString = function() {
+    return String(this._wrapped);
+  };
+
+  // Internal function to wrap or shallow-copy an ArrayBuffer,
+  // typed array or DataView to a new view, reusing the buffer.
+  function toBufferView(bufferSource) {
+    return new Uint8Array(
+      bufferSource.buffer || bufferSource,
+      bufferSource.byteOffset || 0,
+      getByteLength(bufferSource)
+    );
+  }
+
+  // We use this string twice, so give it a name for minification.
+  var tagDataView = '[object DataView]';
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function eq(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // `null` or `undefined` only equal to itself (strict comparison).
+    if (a == null || b == null) return false;
+    // `NaN`s are equivalent, but non-reflexive.
+    if (a !== a) return b !== b;
+    // Exhaust primitive checks
+    var type = typeof a;
+    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+    return deepEq(a, b, aStack, bStack);
+  }
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function deepEq(a, b, aStack, bStack) {
+    // Unwrap any wrapped objects.
+    if (a instanceof _$1) a = a._wrapped;
+    if (b instanceof _$1) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    // Work around a bug in IE 10 - Edge 13.
+    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+      if (!isDataView$1(b)) return false;
+      className = tagDataView;
+    }
+    switch (className) {
+      // These types are compared by value.
+      case '[object RegExp]':
+        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN.
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+      case '[object Symbol]':
+        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+      case '[object ArrayBuffer]':
+      case tagDataView:
+        // Coerce to typed array so we can fall through.
+        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+    }
+
+    var areArrays = className === '[object Array]';
+    if (!areArrays && isTypedArray$1(a)) {
+        var byteLength = getByteLength(a);
+        if (byteLength !== getByteLength(b)) return false;
+        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+        areArrays = true;
+    }
+    if (!areArrays) {
+      if (typeof a != 'object' || typeof b != 'object') return false;
+
+      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+                               isFunction$1(bCtor) && bCtor instanceof bCtor)
+                          && ('constructor' in a && 'constructor' in b)) {
+        return false;
+      }
+    }
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+    // Initializing stack of traversed objects.
+    // It's done here since we only need them for objects and arrays comparison.
+    aStack = aStack || [];
+    bStack = bStack || [];
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+
+    // Recursively compare objects and arrays.
+    if (areArrays) {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      length = a.length;
+      if (length !== b.length) return false;
+      // Deep compare the contents, ignoring non-numeric properties.
+      while (length--) {
+        if (!eq(a[length], b[length], aStack, bStack)) return false;
+      }
+    } else {
+      // Deep compare objects.
+      var _keys = keys(a), key;
+      length = _keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      if (keys(b).length !== length) return false;
+      while (length--) {
+        // Deep compare each member
+        key = _keys[length];
+        if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return true;
+  }
+
+  // Perform a deep comparison to check if two objects are equal.
+  function isEqual(a, b) {
+    return eq(a, b);
+  }
+
+  // Retrieve all the enumerable property names of an object.
+  function allKeys(obj) {
+    if (!isObject(obj)) return [];
+    var keys = [];
+    for (var key in obj) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Since the regular `Object.prototype.toString` type tests don't work for
+  // some types in IE 11, we use a fingerprinting heuristic instead, based
+  // on the methods. It's not great, but it's the best we got.
+  // The fingerprint method lists are defined below.
+  function ie11fingerprint(methods) {
+    var length = getLength(methods);
+    return function(obj) {
+      if (obj == null) return false;
+      // `Map`, `WeakMap` and `Set` have no enumerable keys.
+      var keys = allKeys(obj);
+      if (getLength(keys)) return false;
+      for (var i = 0; i < length; i++) {
+        if (!isFunction$1(obj[methods[i]])) return false;
+      }
+      // If we are testing against `WeakMap`, we need to ensure that
+      // `obj` doesn't have a `forEach` method in order to distinguish
+      // it from a regular `Map`.
+      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+    };
+  }
+
+  // In the interest of compact minification, we write
+  // each string in the fingerprints only once.
+  var forEachName = 'forEach',
+      hasName = 'has',
+      commonInit = ['clear', 'delete'],
+      mapTail = ['get', hasName, 'set'];
+
+  // `Map`, `WeakMap` and `Set` each have slightly different
+  // combinations of the above sublists.
+  var mapMethods = commonInit.concat(forEachName, mapTail),
+      weakMapMethods = commonInit.concat(mapTail),
+      setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+  var isWeakSet = tagTester('WeakSet');
+
+  // Retrieve the values of an object's properties.
+  function values(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[_keys[i]];
+    }
+    return values;
+  }
+
+  // Convert an object into a list of `[key, value]` pairs.
+  // The opposite of `_.object` with one argument.
+  function pairs(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [_keys[i], obj[_keys[i]]];
+    }
+    return pairs;
+  }
+
+  // Invert the keys and values of an object. The values must be serializable.
+  function invert(obj) {
+    var result = {};
+    var _keys = keys(obj);
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      result[obj[_keys[i]]] = _keys[i];
+    }
+    return result;
+  }
+
+  // Return a sorted list of the function names available on the object.
+  function functions(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (isFunction$1(obj[key])) names.push(key);
+    }
+    return names.sort();
+  }
+
+  // An internal function for creating assigner functions.
+  function createAssigner(keysFunc, defaults) {
+    return function(obj) {
+      var length = arguments.length;
+      if (defaults) obj = Object(obj);
+      if (length < 2 || obj == null) return obj;
+      for (var index = 1; index < length; index++) {
+        var source = arguments[index],
+            keys = keysFunc(source),
+            l = keys.length;
+        for (var i = 0; i < l; i++) {
+          var key = keys[i];
+          if (!defaults || obj[key] === void 0) obj[key] = source[key];
+        }
+      }
+      return obj;
+    };
+  }
+
+  // Extend a given object with all the properties in passed-in object(s).
+  var extend = createAssigner(allKeys);
+
+  // Assigns a given object with all the own properties in the passed-in
+  // object(s).
+  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+  var extendOwn = createAssigner(keys);
+
+  // Fill in a given object with default properties.
+  var defaults = createAssigner(allKeys, true);
+
+  // Create a naked function reference for surrogate-prototype-swapping.
+  function ctor() {
+    return function(){};
+  }
+
+  // An internal function for creating a new object that inherits from another.
+  function baseCreate(prototype) {
+    if (!isObject(prototype)) return {};
+    if (nativeCreate) return nativeCreate(prototype);
+    var Ctor = ctor();
+    Ctor.prototype = prototype;
+    var result = new Ctor;
+    Ctor.prototype = null;
+    return result;
+  }
+
+  // Creates an object that inherits from the given prototype object.
+  // If additional properties are provided then they will be added to the
+  // created object.
+  function create(prototype, props) {
+    var result = baseCreate(prototype);
+    if (props) extendOwn(result, props);
+    return result;
+  }
+
+  // Create a (shallow-cloned) duplicate of an object.
+  function clone(obj) {
+    if (!isObject(obj)) return obj;
+    return isArray(obj) ? obj.slice() : extend({}, obj);
+  }
+
+  // Invokes `interceptor` with the `obj` and then returns `obj`.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  function tap(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  }
+
+  // Normalize a (deep) property `path` to array.
+  // Like `_.iteratee`, this function can be customized.
+  function toPath$1(path) {
+    return isArray(path) ? path : [path];
+  }
+  _$1.toPath = toPath$1;
+
+  // Internal wrapper for `_.toPath` to enable minification.
+  // Similar to `cb` for `_.iteratee`.
+  function toPath(path) {
+    return _$1.toPath(path);
+  }
+
+  // Internal function to obtain a nested property in `obj` along `path`.
+  function deepGet(obj, path) {
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      if (obj == null) return void 0;
+      obj = obj[path[i]];
+    }
+    return length ? obj : void 0;
+  }
+
+  // Get the value of the (deep) property on `path` from `object`.
+  // If any property in `path` does not exist or if the value is
+  // `undefined`, return `defaultValue` instead.
+  // The `path` is normalized through `_.toPath`.
+  function get(object, path, defaultValue) {
+    var value = deepGet(object, toPath(path));
+    return isUndefined(value) ? defaultValue : value;
+  }
+
+  // Shortcut function for checking if an object has a given property directly on
+  // itself (in other words, not on a prototype). Unlike the internal `has`
+  // function, this public version can also traverse nested properties.
+  function has(obj, path) {
+    path = toPath(path);
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      var key = path[i];
+      if (!has$1(obj, key)) return false;
+      obj = obj[key];
+    }
+    return !!length;
+  }
+
+  // Keep the identity function around for default iteratees.
+  function identity(value) {
+    return value;
+  }
+
+  // Returns a predicate for checking whether an object has a given set of
+  // `key:value` pairs.
+  function matcher(attrs) {
+    attrs = extendOwn({}, attrs);
+    return function(obj) {
+      return isMatch(obj, attrs);
+    };
+  }
+
+  // Creates a function that, when passed an object, will traverse that object’s
+  // properties down the given `path`, specified as an array of keys or indices.
+  function property(path) {
+    path = toPath(path);
+    return function(obj) {
+      return deepGet(obj, path);
+    };
+  }
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  function optimizeCb(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      // The 2-argument case is omitted because we’re not using it.
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  }
+
+  // An internal function to generate callbacks that can be applied to each
+  // element in a collection, returning the desired result — either `_.identity`,
+  // an arbitrary callback, a property matcher, or a property accessor.
+  function baseIteratee(value, context, argCount) {
+    if (value == null) return identity;
+    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+    if (isObject(value) && !isArray(value)) return matcher(value);
+    return property(value);
+  }
+
+  // External wrapper for our callback generator. Users may customize
+  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+  // This abstraction hides the internal-only `argCount` argument.
+  function iteratee(value, context) {
+    return baseIteratee(value, context, Infinity);
+  }
+  _$1.iteratee = iteratee;
+
+  // The function we call internally to generate a callback. It invokes
+  // `_.iteratee` if overridden, otherwise `baseIteratee`.
+  function cb(value, context, argCount) {
+    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
+    return baseIteratee(value, context, argCount);
+  }
+
+  // Returns the results of applying the `iteratee` to each element of `obj`.
+  // In contrast to `_.map` it returns an object.
+  function mapObject(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = keys(obj),
+        length = _keys.length,
+        results = {};
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys[index];
+      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function noop(){}
+
+  // Generates a function for a given object that returns a given property.
+  function propertyOf(obj) {
+    if (obj == null) return noop;
+    return function(path) {
+      return get(obj, path);
+    };
+  }
+
+  // Run a function **n** times.
+  function times(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = optimizeCb(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  }
+
+  // Return a random integer between `min` and `max` (inclusive).
+  function random(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  }
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  var now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+  // Internal helper to generate functions for escaping and unescaping strings
+  // to/from HTML interpolation.
+  function createEscaper(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped.
+    var source = '(?:' + keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  }
+
+  // Internal list of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+
+  // Function for escaping strings to HTML interpolation.
+  var _escape = createEscaper(escapeMap);
+
+  // Internal list of HTML entities for unescaping.
+  var unescapeMap = invert(escapeMap);
+
+  // Function for unescaping strings from HTML interpolation.
+  var _unescape = createEscaper(unescapeMap);
+
+  // By default, Underscore uses ERB-style template delimiters. Change the
+  // following template settings to use alternative delimiters.
+  var templateSettings = _$1.templateSettings = {
+    evaluate: /<%([\s\S]+?)%>/g,
+    interpolate: /<%=([\s\S]+?)%>/g,
+    escape: /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `_.templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'": "'",
+    '\\': '\\',
+    '\r': 'r',
+    '\n': 'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  function escapeChar(match) {
+    return '\\' + escapes[match];
+  }
+
+  // In order to prevent third-party code injection through
+  // `_.templateSettings.variable`, we test it against the following regular
+  // expression. It is intentionally a bit more liberal than just matching valid
+  // identifiers, but still prevents possible loopholes through defaults or
+  // destructuring assignment.
+  var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  function template(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = defaults({}, settings, _$1.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offset.
+      return match;
+    });
+    source += "';\n";
+
+    var argument = settings.variable;
+    if (argument) {
+      // Insure against third-party code injection. (CVE-2021-23358)
+      if (!bareIdentifier.test(argument)) throw new Error(
+        'variable is not a bare identifier: ' + argument
+      );
+    } else {
+      // If a variable is not specified, place data values in local scope.
+      source = 'with(obj||{}){\n' + source + '}\n';
+      argument = 'obj';
+    }
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    var render;
+    try {
+      render = new Function(argument, '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _$1);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  }
+
+  // Traverses the children of `obj` along `path`. If a child is a function, it
+  // is invoked with its parent as context. Returns the value of the final
+  // child, or `fallback` if any child is undefined.
+  function result(obj, path, fallback) {
+    path = toPath(path);
+    var length = path.length;
+    if (!length) {
+      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+    }
+    for (var i = 0; i < length; i++) {
+      var prop = obj == null ? void 0 : obj[path[i]];
+      if (prop === void 0) {
+        prop = fallback;
+        i = length; // Ensure we don't continue iterating.
+      }
+      obj = isFunction$1(prop) ? prop.call(obj) : prop;
+    }
+    return obj;
+  }
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  function uniqueId(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  }
+
+  // Start chaining a wrapped Underscore object.
+  function chain(obj) {
+    var instance = _$1(obj);
+    instance._chain = true;
+    return instance;
+  }
+
+  // Internal function to execute `sourceFunc` bound to `context` with optional
+  // `args`. Determines whether to execute a function as a constructor or as a
+  // normal function.
+  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+    var self = baseCreate(sourceFunc.prototype);
+    var result = sourceFunc.apply(self, args);
+    if (isObject(result)) return result;
+    return self;
+  }
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+  // as a placeholder by default, allowing any combination of arguments to be
+  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+  var partial = restArguments(function(func, boundArgs) {
+    var placeholder = partial.placeholder;
+    var bound = function() {
+      var position = 0, length = boundArgs.length;
+      var args = Array(length);
+      for (var i = 0; i < length; i++) {
+        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return executeBound(func, bound, this, this, args);
+    };
+    return bound;
+  });
+
+  partial.placeholder = _$1;
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally).
+  var bind = restArguments(function(func, context, args) {
+    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+    var bound = restArguments(function(callArgs) {
+      return executeBound(func, bound, context, this, args.concat(callArgs));
+    });
+    return bound;
+  });
+
+  // Internal helper for collection methods to determine whether a collection
+  // should be iterated as an array or as an object.
+  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+  var isArrayLike = createSizePropertyCheck(getLength);
+
+  // Internal implementation of a recursive `flatten` function.
+  function flatten$1(input, depth, strict, output) {
+    output = output || [];
+    if (!depth && depth !== 0) {
+      depth = Infinity;
+    } else if (depth <= 0) {
+      return output.concat(input);
+    }
+    var idx = output.length;
+    for (var i = 0, length = getLength(input); i < length; i++) {
+      var value = input[i];
+      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+        // Flatten current level of array or arguments object.
+        if (depth > 1) {
+          flatten$1(value, depth - 1, strict, output);
+          idx = output.length;
+        } else {
+          var j = 0, len = value.length;
+          while (j < len) output[idx++] = value[j++];
+        }
+      } else if (!strict) {
+        output[idx++] = value;
+      }
+    }
+    return output;
+  }
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  var bindAll = restArguments(function(obj, keys) {
+    keys = flatten$1(keys, false, false);
+    var index = keys.length;
+    if (index < 1) throw new Error('bindAll must be passed function names');
+    while (index--) {
+      var key = keys[index];
+      obj[key] = bind(obj[key], obj);
+    }
+    return obj;
+  });
+
+  // Memoize an expensive function by storing its results.
+  function memoize(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  }
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  var delay = restArguments(function(func, wait, args) {
+    return setTimeout(function() {
+      return func.apply(null, args);
+    }, wait);
+  });
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  var defer = partial(delay, _$1, 1);
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  function throttle(func, wait, options) {
+    var timeout, context, args, result;
+    var previous = 0;
+    if (!options) options = {};
+
+    var later = function() {
+      previous = options.leading === false ? 0 : now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+
+    var throttled = function() {
+      var _now = now();
+      if (!previous && options.leading === false) previous = _now;
+      var remaining = wait - (_now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        if (timeout) {
+          clearTimeout(timeout);
+          timeout = null;
+        }
+        previous = _now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+
+    throttled.cancel = function() {
+      clearTimeout(timeout);
+      previous = 0;
+      timeout = context = args = null;
+    };
+
+    return throttled;
+  }
+
+  // When a sequence of calls of the returned function ends, the argument
+  // function is triggered. The end of a sequence is defined by the `wait`
+  // parameter. If `immediate` is passed, the argument function will be
+  // triggered at the beginning of the sequence instead of at the end.
+  function debounce(func, wait, immediate) {
+    var timeout, previous, args, result, context;
+
+    var later = function() {
+      var passed = now() - previous;
+      if (wait > passed) {
+        timeout = setTimeout(later, wait - passed);
+      } else {
+        timeout = null;
+        if (!immediate) result = func.apply(context, args);
+        // This check is needed because `func` can recursively invoke `debounced`.
+        if (!timeout) args = context = null;
+      }
+    };
+
+    var debounced = restArguments(function(_args) {
+      context = this;
+      args = _args;
+      previous = now();
+      if (!timeout) {
+        timeout = setTimeout(later, wait);
+        if (immediate) result = func.apply(context, args);
+      }
+      return result;
+    });
+
+    debounced.cancel = function() {
+      clearTimeout(timeout);
+      timeout = args = context = null;
+    };
+
+    return debounced;
+  }
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  function wrap(func, wrapper) {
+    return partial(wrapper, func);
+  }
+
+  // Returns a negated version of the passed-in predicate.
+  function negate(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  }
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  function compose() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  }
+
+  // Returns a function that will only be executed on and after the Nth call.
+  function after(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  }
+
+  // Returns a function that will only be executed up to (but not including) the
+  // Nth call.
+  function before(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      }
+      if (times <= 1) func = null;
+      return memo;
+    };
+  }
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  var once = partial(before, 2);
+
+  // Returns the first key on an object that passes a truth test.
+  function findKey(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = keys(obj), key;
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      key = _keys[i];
+      if (predicate(obj[key], key, obj)) return key;
+    }
+  }
+
+  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+  function createPredicateIndexFinder(dir) {
+    return function(array, predicate, context) {
+      predicate = cb(predicate, context);
+      var length = getLength(array);
+      var index = dir > 0 ? 0 : length - 1;
+      for (; index >= 0 && index < length; index += dir) {
+        if (predicate(array[index], index, array)) return index;
+      }
+      return -1;
+    };
+  }
+
+  // Returns the first index on an array-like that passes a truth test.
+  var findIndex = createPredicateIndexFinder(1);
+
+  // Returns the last index on an array-like that passes a truth test.
+  var findLastIndex = createPredicateIndexFinder(-1);
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  function sortedIndex(array, obj, iteratee, context) {
+    iteratee = cb(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = getLength(array);
+    while (low < high) {
+      var mid = Math.floor((low + high) / 2);
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  }
+
+  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+  function createIndexFinder(dir, predicateFind, sortedIndex) {
+    return function(array, item, idx) {
+      var i = 0, length = getLength(array);
+      if (typeof idx == 'number') {
+        if (dir > 0) {
+          i = idx >= 0 ? idx : Math.max(idx + length, i);
+        } else {
+          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        }
+      } else if (sortedIndex && idx && length) {
+        idx = sortedIndex(array, item);
+        return array[idx] === item ? idx : -1;
+      }
+      if (item !== item) {
+        idx = predicateFind(slice.call(array, i, length), isNaN$1);
+        return idx >= 0 ? idx + i : -1;
+      }
+      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+        if (array[idx] === item) return idx;
+      }
+      return -1;
+    };
+  }
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+  // Return the position of the last occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+  // Return the first value which passes a truth test.
+  function find(obj, predicate, context) {
+    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+    var key = keyFinder(obj, predicate, context);
+    if (key !== void 0 && key !== -1) return obj[key];
+  }
+
+  // Convenience version of a common use case of `_.find`: getting the first
+  // object containing specific `key:value` pairs.
+  function findWhere(obj, attrs) {
+    return find(obj, matcher(attrs));
+  }
+
+  // The cornerstone for collection functions, an `each`
+  // implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  function each(obj, iteratee, context) {
+    iteratee = optimizeCb(iteratee, context);
+    var i, length;
+    if (isArrayLike(obj)) {
+      for (i = 0, length = obj.length; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var _keys = keys(obj);
+      for (i = 0, length = _keys.length; i < length; i++) {
+        iteratee(obj[_keys[i]], _keys[i], obj);
+      }
+    }
+    return obj;
+  }
+
+  // Return the results of applying the iteratee to each element.
+  function map(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length,
+        results = Array(length);
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Internal helper to create a reducing function, iterating left or right.
+  function createReduce(dir) {
+    // Wrap code that reassigns argument variables in a separate function than
+    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+    var reducer = function(obj, iteratee, memo, initial) {
+      var _keys = !isArrayLike(obj) && keys(obj),
+          length = (_keys || obj).length,
+          index = dir > 0 ? 0 : length - 1;
+      if (!initial) {
+        memo = obj[_keys ? _keys[index] : index];
+        index += dir;
+      }
+      for (; index >= 0 && index < length; index += dir) {
+        var currentKey = _keys ? _keys[index] : index;
+        memo = iteratee(memo, obj[currentKey], currentKey, obj);
+      }
+      return memo;
+    };
+
+    return function(obj, iteratee, memo, context) {
+      var initial = arguments.length >= 3;
+      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+    };
+  }
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  var reduce = createReduce(1);
+
+  // The right-associative version of reduce, also known as `foldr`.
+  var reduceRight = createReduce(-1);
+
+  // Return all the elements that pass a truth test.
+  function filter(obj, predicate, context) {
+    var results = [];
+    predicate = cb(predicate, context);
+    each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  }
+
+  // Return all the elements for which a truth test fails.
+  function reject(obj, predicate, context) {
+    return filter(obj, negate(cb(predicate)), context);
+  }
+
+  // Determine whether all of the elements pass a truth test.
+  function every(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  }
+
+  // Determine if at least one element in the object passes a truth test.
+  function some(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  }
+
+  // Determine if the array or object contains a given item (using `===`).
+  function contains(obj, item, fromIndex, guard) {
+    if (!isArrayLike(obj)) obj = values(obj);
+    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+    return indexOf(obj, item, fromIndex) >= 0;
+  }
+
+  // Invoke a method (with arguments) on every item in a collection.
+  var invoke = restArguments(function(obj, path, args) {
+    var contextPath, func;
+    if (isFunction$1(path)) {
+      func = path;
+    } else {
+      path = toPath(path);
+      contextPath = path.slice(0, -1);
+      path = path[path.length - 1];
+    }
+    return map(obj, function(context) {
+      var method = func;
+      if (!method) {
+        if (contextPath && contextPath.length) {
+          context = deepGet(context, contextPath);
+        }
+        if (context == null) return void 0;
+        method = context[path];
+      }
+      return method == null ? method : method.apply(context, args);
+    });
+  });
+
+  // Convenience version of a common use case of `_.map`: fetching a property.
+  function pluck(obj, key) {
+    return map(obj, property(key));
+  }
+
+  // Convenience version of a common use case of `_.filter`: selecting only
+  // objects containing specific `key:value` pairs.
+  function where(obj, attrs) {
+    return filter(obj, matcher(attrs));
+  }
+
+  // Return the maximum element (or element-based computation).
+  function max(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Return the minimum element (or element-based computation).
+  function min(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Sample **n** random values from a collection using the modern version of the
+  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `_.map`.
+  function sample(obj, n, guard) {
+    if (n == null || guard) {
+      if (!isArrayLike(obj)) obj = values(obj);
+      return obj[random(obj.length - 1)];
+    }
+    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+    var length = getLength(sample);
+    n = Math.max(Math.min(n, length), 0);
+    var last = length - 1;
+    for (var index = 0; index < n; index++) {
+      var rand = random(index, last);
+      var temp = sample[index];
+      sample[index] = sample[rand];
+      sample[rand] = temp;
+    }
+    return sample.slice(0, n);
+  }
+
+  // Shuffle a collection.
+  function shuffle(obj) {
+    return sample(obj, Infinity);
+  }
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  function sortBy(obj, iteratee, context) {
+    var index = 0;
+    iteratee = cb(iteratee, context);
+    return pluck(map(obj, function(value, key, list) {
+      return {
+        value: value,
+        index: index++,
+        criteria: iteratee(value, key, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  }
+
+  // An internal function used for aggregate "group by" operations.
+  function group(behavior, partition) {
+    return function(obj, iteratee, context) {
+      var result = partition ? [[], []] : {};
+      iteratee = cb(iteratee, context);
+      each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  }
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  var groupBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+  // when you know that your index values will be unique.
+  var indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  var countBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Split a collection into two arrays: one whose elements all pass the given
+  // truth test, and one whose elements all do not pass the truth test.
+  var partition = group(function(result, value, pass) {
+    result[pass ? 0 : 1].push(value);
+  }, true);
+
+  // Safely create a real, live array from anything iterable.
+  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+  function toArray(obj) {
+    if (!obj) return [];
+    if (isArray(obj)) return slice.call(obj);
+    if (isString(obj)) {
+      // Keep surrogate pair characters together.
+      return obj.match(reStrSymbol);
+    }
+    if (isArrayLike(obj)) return map(obj, identity);
+    return values(obj);
+  }
+
+  // Return the number of elements in a collection.
+  function size(obj) {
+    if (obj == null) return 0;
+    return isArrayLike(obj) ? obj.length : keys(obj).length;
+  }
+
+  // Internal `_.pick` helper function to determine whether `key` is an enumerable
+  // property name of `obj`.
+  function keyInObj(value, key, obj) {
+    return key in obj;
+  }
+
+  // Return a copy of the object only containing the allowed properties.
+  var pick = restArguments(function(obj, keys) {
+    var result = {}, iteratee = keys[0];
+    if (obj == null) return result;
+    if (isFunction$1(iteratee)) {
+      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+      keys = allKeys(obj);
+    } else {
+      iteratee = keyInObj;
+      keys = flatten$1(keys, false, false);
+      obj = Object(obj);
+    }
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = keys[i];
+      var value = obj[key];
+      if (iteratee(value, key, obj)) result[key] = value;
+    }
+    return result;
+  });
+
+  // Return a copy of the object without the disallowed properties.
+  var omit = restArguments(function(obj, keys) {
+    var iteratee = keys[0], context;
+    if (isFunction$1(iteratee)) {
+      iteratee = negate(iteratee);
+      if (keys.length > 1) context = keys[1];
+    } else {
+      keys = map(flatten$1(keys, false, false), String);
+      iteratee = function(value, key) {
+        return !contains(keys, key);
+      };
+    }
+    return pick(obj, iteratee, context);
+  });
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N.
+  function initial(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  }
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  function first(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[0];
+    return initial(array, array.length - n);
+  }
+
+  // Returns everything but the first entry of the `array`. Especially useful on
+  // the `arguments` object. Passing an **n** will return the rest N values in the
+  // `array`.
+  function rest(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  }
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array.
+  function last(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[array.length - 1];
+    return rest(array, Math.max(0, array.length - n));
+  }
+
+  // Trim out all falsy values from an array.
+  function compact(array) {
+    return filter(array, Boolean);
+  }
+
+  // Flatten out an array, either recursively (by default), or up to `depth`.
+  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+  function flatten(array, depth) {
+    return flatten$1(array, depth, false);
+  }
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  var difference = restArguments(function(array, rest) {
+    rest = flatten$1(rest, true, true);
+    return filter(array, function(value){
+      return !contains(rest, value);
+    });
+  });
+
+  // Return a version of the array that does not contain the specified value(s).
+  var without = restArguments(function(array, otherArrays) {
+    return difference(array, otherArrays);
+  });
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // The faster algorithm will not work with an iteratee if the iteratee
+  // is not a one-to-one function, so providing an iteratee will disable
+  // the faster algorithm.
+  function uniq(array, isSorted, iteratee, context) {
+    if (!isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = cb(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var value = array[i],
+          computed = iteratee ? iteratee(value, i, array) : value;
+      if (isSorted && !iteratee) {
+        if (!i || seen !== computed) result.push(value);
+        seen = computed;
+      } else if (iteratee) {
+        if (!contains(seen, computed)) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (!contains(result, value)) {
+        result.push(value);
+      }
+    }
+    return result;
+  }
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  var union = restArguments(function(arrays) {
+    return uniq(flatten$1(arrays, true, true));
+  });
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  function intersection(array) {
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var item = array[i];
+      if (contains(result, item)) continue;
+      var j;
+      for (j = 1; j < argsLength; j++) {
+        if (!contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  }
+
+  // Complement of zip. Unzip accepts an array of arrays and groups
+  // each array's elements on shared indices.
+  function unzip(array) {
+    var length = array && max(array, getLength).length || 0;
+    var result = Array(length);
+
+    for (var index = 0; index < length; index++) {
+      result[index] = pluck(array, index);
+    }
+    return result;
+  }
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  var zip = restArguments(unzip);
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+  function object(list, values) {
+    var result = {};
+    for (var i = 0, length = getLength(list); i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  }
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](https://docs.python.org/library/functions.html#range).
+  function range(start, stop, step) {
+    if (stop == null) {
+      stop = start || 0;
+      start = 0;
+    }
+    if (!step) {
+      step = stop < start ? -1 : 1;
+    }
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  }
+
+  // Chunk a single array into multiple arrays, each containing `count` or fewer
+  // items.
+  function chunk(array, count) {
+    if (count == null || count < 1) return [];
+    var result = [];
+    var i = 0, length = array.length;
+    while (i < length) {
+      result.push(slice.call(array, i, i += count));
+    }
+    return result;
+  }
+
+  // Helper function to continue chaining intermediate results.
+  function chainResult(instance, obj) {
+    return instance._chain ? _$1(obj).chain() : obj;
+  }
+
+  // Add your own custom functions to the Underscore object.
+  function mixin(obj) {
+    each(functions(obj), function(name) {
+      var func = _$1[name] = obj[name];
+      _$1.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return chainResult(this, func.apply(_$1, args));
+      };
+    });
+    return _$1;
+  }
+
+  // Add all mutator `Array` functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) {
+        method.apply(obj, arguments);
+        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+          delete obj[0];
+        }
+      }
+      return chainResult(this, obj);
+    };
+  });
+
+  // Add all accessor `Array` functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) obj = method.apply(obj, arguments);
+      return chainResult(this, obj);
+    };
+  });
+
+  // Named Exports
+
+  var allExports = {
+    __proto__: null,
+    VERSION: VERSION,
+    restArguments: restArguments,
+    isObject: isObject,
+    isNull: isNull,
+    isUndefined: isUndefined,
+    isBoolean: isBoolean,
+    isElement: isElement,
+    isString: isString,
+    isNumber: isNumber,
+    isDate: isDate,
+    isRegExp: isRegExp,
+    isError: isError,
+    isSymbol: isSymbol,
+    isArrayBuffer: isArrayBuffer,
+    isDataView: isDataView$1,
+    isArray: isArray,
+    isFunction: isFunction$1,
+    isArguments: isArguments$1,
+    isFinite: isFinite$1,
+    isNaN: isNaN$1,
+    isTypedArray: isTypedArray$1,
+    isEmpty: isEmpty,
+    isMatch: isMatch,
+    isEqual: isEqual,
+    isMap: isMap,
+    isWeakMap: isWeakMap,
+    isSet: isSet,
+    isWeakSet: isWeakSet,
+    keys: keys,
+    allKeys: allKeys,
+    values: values,
+    pairs: pairs,
+    invert: invert,
+    functions: functions,
+    methods: functions,
+    extend: extend,
+    extendOwn: extendOwn,
+    assign: extendOwn,
+    defaults: defaults,
+    create: create,
+    clone: clone,
+    tap: tap,
+    get: get,
+    has: has,
+    mapObject: mapObject,
+    identity: identity,
+    constant: constant,
+    noop: noop,
+    toPath: toPath$1,
+    property: property,
+    propertyOf: propertyOf,
+    matcher: matcher,
+    matches: matcher,
+    times: times,
+    random: random,
+    now: now,
+    escape: _escape,
+    unescape: _unescape,
+    templateSettings: templateSettings,
+    template: template,
+    result: result,
+    uniqueId: uniqueId,
+    chain: chain,
+    iteratee: iteratee,
+    partial: partial,
+    bind: bind,
+    bindAll: bindAll,
+    memoize: memoize,
+    delay: delay,
+    defer: defer,
+    throttle: throttle,
+    debounce: debounce,
+    wrap: wrap,
+    negate: negate,
+    compose: compose,
+    after: after,
+    before: before,
+    once: once,
+    findKey: findKey,
+    findIndex: findIndex,
+    findLastIndex: findLastIndex,
+    sortedIndex: sortedIndex,
+    indexOf: indexOf,
+    lastIndexOf: lastIndexOf,
+    find: find,
+    detect: find,
+    findWhere: findWhere,
+    each: each,
+    forEach: each,
+    map: map,
+    collect: map,
+    reduce: reduce,
+    foldl: reduce,
+    inject: reduce,
+    reduceRight: reduceRight,
+    foldr: reduceRight,
+    filter: filter,
+    select: filter,
+    reject: reject,
+    every: every,
+    all: every,
+    some: some,
+    any: some,
+    contains: contains,
+    includes: contains,
+    include: contains,
+    invoke: invoke,
+    pluck: pluck,
+    where: where,
+    max: max,
+    min: min,
+    shuffle: shuffle,
+    sample: sample,
+    sortBy: sortBy,
+    groupBy: groupBy,
+    indexBy: indexBy,
+    countBy: countBy,
+    partition: partition,
+    toArray: toArray,
+    size: size,
+    pick: pick,
+    omit: omit,
+    first: first,
+    head: first,
+    take: first,
+    initial: initial,
+    last: last,
+    rest: rest,
+    tail: rest,
+    drop: rest,
+    compact: compact,
+    flatten: flatten,
+    without: without,
+    uniq: uniq,
+    unique: uniq,
+    union: union,
+    intersection: intersection,
+    difference: difference,
+    unzip: unzip,
+    transpose: unzip,
+    zip: zip,
+    object: object,
+    range: range,
+    chunk: chunk,
+    mixin: mixin,
+    'default': _$1
+  };
+
+  // Default Export
+
+  // Add all of the Underscore functions to the wrapper object.
+  var _ = mixin(allExports);
+  // Legacy Node.js API.
+  _._ = _;
+
+  return _;
+
+})));
+//# sourceMappingURL=underscore-umd.js.map
diff --git a/sphinx/build/html/_static/underscore.js b/sphinx/build/html/_static/underscore.js
index 5b55f32beaca186f84cca115514f02cddbd1bbd5..cf177d4285ab55fbc16406a5ec827b80e7eecd53 100644
--- a/sphinx/build/html/_static/underscore.js
+++ b/sphinx/build/html/_static/underscore.js
@@ -1,31 +1,6 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
-return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
-b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
-return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
-d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
-var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
-c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
+//     Underscore.js 1.13.1
+//     https://underscorejs.org
+//     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var o=Array(r+1);for(u=0;u<r;u++)o[u]=arguments[u];return o[r]=e,n.apply(this,o)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function w(n){return void 0===n}function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function x(n){var r="[object "+n+"]";return function(n){return a.call(n)===r}}var S=x("String"),O=x("Number"),M=x("Date"),E=x("RegExp"),B=x("Error"),N=x("Symbol"),I=x("ArrayBuffer"),T=x("Function"),k=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof k&&(T=function(n){return"function"==typeof n||!1});var D=T,R=x("Object"),F=l&&R(new DataView(new ArrayBuffer(8))),V="undefined"!=typeof Map&&R(new Map),P=x("DataView");var q=F?function(n){return null!=n&&D(n.getInt8)&&I(n.buffer)}:P,U=s||x("Array");function W(n,r){return null!=n&&f.call(n,r)}var z=x("Arguments");!function(){z(arguments)||(z=function(n){return W(n,"callee")})}();var L=z;function $(n){return O(n)&&y(n)}function C(n){return function(){return n}}function K(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=b.length,u=n.constructor,o=D(u)&&u.prototype||e,i="constructor";for(W(n,i)&&!r.contains(i)&&r.push(i);t--;)(i=b[t])in n&&n[i]!==o[i]&&!r.contains(i)&&r.push(i)}function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in n)W(n,t)&&r.push(t);return g&&Z(n,r),r}function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Object(n),o=0;o<e;o++){var i=t[o];if(r[i]!==u[i]||!(i in u))return!1}return!0}function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wrapped=n):new tn(n)}function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}tn.VERSION=n,tn.prototype.value=function(){return this._wrapped},tn.prototype.valueOf=tn.prototype.toJSON=tn.prototype.value,tn.prototype.toString=function(){return String(this._wrapped)};var un="[object DataView]";function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var o=typeof n;return("function"===o||"object"===o||"object"==typeof r)&&function n(r,t,e,o){r instanceof tn&&(r=r._wrapped);t instanceof tn&&(t=t._wrapped);var i=a.call(r);if(i!==a.call(t))return!1;if(F&&"[object Object]"==i&&q(r)){if(!q(t))return!1;i=un}switch(i){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":case un:return n(en(r),en(t),e,o)}var f="[object Array]"===i;if(!f&&X(r)){if(G(r)!==G(t))return!1;if(r.buffer===t.buffer&&r.byteOffset===t.byteOffset)return!0;f=!0}if(!f){if("object"!=typeof r||"object"!=typeof t)return!1;var c=r.constructor,l=t.constructor;if(c!==l&&!(D(c)&&c instanceof c&&D(l)&&l instanceof l)&&"constructor"in r&&"constructor"in t)return!1}o=o||[];var s=(e=e||[]).length;for(;s--;)if(e[s]===r)return o[s]===t;if(e.push(r),o.push(t),f){if((s=r.length)!==t.length)return!1;for(;s--;)if(!on(r[s],t[s],e,o))return!1}else{var p,v=nn(r);if(s=v.length,nn(t).length!==s)return!1;for(;s--;)if(p=v[s],!W(t,p)||!on(r[p],t[p],e,o))return!1}return e.pop(),o.pop(),!0}(n,r,t,e)}function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return g&&Z(n,r),r}function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=an(t);if(Y(e))return!1;for(var u=0;u<r;u++)if(!D(t[n[u]]))return!1;return n!==hn||!D(t[cn])}}var cn="forEach",ln="has",sn=["clear","delete"],pn=["get",ln,"set"],vn=sn.concat(cn,pn),hn=sn.concat(pn),yn=["add"].concat(sn,cn,ln),dn=V?fn(vn):x("Map"),gn=V?fn(hn):x("WeakMap"),bn=V?fn(yn):x("Set"),mn=x("WeakSet");function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var o=arguments[u],i=n(o),a=i.length,f=0;f<a;f++){var c=i[f];r&&void 0!==t[c]||(t[c]=o[c])}return t}}var xn=An(an),Sn=An(nn),On=An(an,!0);function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function En(n){return _(n)?U(n)?n.slice():xn({},n):n}function Bn(n){return U(n)?n:[n]}function Nn(n){return tn.toPath(n)}function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function Tn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}function kn(n){return n}function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}function Rn(n){return n=Nn(n),function(r){return In(r,n)}}function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return function(){return n.apply(r,arguments)}}function Vn(n,r,t){return null==n?kn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn(n)}function Pn(n,r){return Vn(n,r,1/0)}function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}function Un(){}function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}tn.toPath=Bn,tn.iteratee=Pn;var zn=Date.now||function(){return(new Date).getTime()};function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var $n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a<o;a++)i[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)i.push(arguments[u++]);return nr(n,e,this,this,i)};return e}));rr.placeholder=tn;var tr=j((function(n,r,t){if(!D(n))throw new TypeError("Bind must be called on a function");var e=j((function(u){return nr(n,e,r,this,t.concat(u))}));return e})),er=K(Y);function ur(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,o=0,i=Y(n);o<i;o++){var a=n[o];if(er(a)&&(U(a)||L(a)))if(r>1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var or=j((function(n,r){var t=(r=ur(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=tr(n[e],n)}return n}));var ir=j((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),ar=rr(ir,tn,1);function fr(n){return function(){return!n.apply(this,arguments)}}function cr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if(r(n[e=u[o]],e,n))return e}function pr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u-1;o>=0&&o<u;o+=n)if(t(r[o],o,r))return o;return-1}}var vr=pr(1),hr=pr(-1);function yr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=Math.floor((o+i)/2);t(n[a])<u?o=a+1:i=a}return o}function dr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==typeof o)n>0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o<f;o+=n)if(e[o]===u)return o;return-1}}var gr=dr(1,vr,yr),br=dr(-1,hr);function mr(n,r,t){var e=(er(n)?vr:sr)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function jr(n,r,t){var e,u;if(r=Fn(r,t),er(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var o=nn(n);for(e=0,u=o.length;e<u;e++)r(n[o[e]],o[e],n)}return n}function _r(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=Array(u),i=0;i<u;i++){var a=e?e[i]:i;o[i]=r(n[a],a,n)}return o}function wr(n){var r=function(r,t,e,u){var o=!er(r)&&nn(r),i=(o||r).length,a=n>0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a<i;a+=n){var f=o?o[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var o=arguments.length>=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(!r(n[i],i,n))return!1}return!0}function Mr(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(r(n[i],i,n))return!0}return!1}function Er(n,r,t,e){return er(n)||(n=jn(n)),("number"!=typeof t||e)&&(t=0),gr(n,r,t)>=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e>o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i<r;i++){var a=Wn(i,o),f=e[i];e[i]=e[a],e[a]=f}return e.slice(0,r)}function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e,u),jr(t,(function(r,u){var i=e(r,u,t);n(o,r,i)})),o}}var Dr=kr((function(n,r,t){W(n,t)?n[t].push(r):n[t]=[r]})),Rr=kr((function(n,r,t){n[t]=r})),Fr=kr((function(n,r,t){W(n,t)?n[t]++:n[t]=1})),Vr=kr((function(n,r,t){n[t?0:1].push(r)}),!0),Pr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qr(n,r,t){return r in t}var Ur=j((function(n,r){var t={},e=r[0];if(null==n)return t;D(e)?(r.length>1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u<o;u++){var i=r[u],a=n[i];e(a,i,n)&&(t[i]=a)}return t})),Wr=j((function(n,r){var t,e=r[0];return D(e)?(e=fr(e),r.length>1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);i<a;i++){var f=n[i],c=t?t(f,i,n):f;r&&!t?(i&&o===c||u.push(f),o=c):t?Er(o,c)||(o.push(c),u.push(f)):Er(u,f)||u.push(f)}return u}var Gr=j((function(n){return Jr(ur(n,!0,!0))}));function Hr(n){for(var r=n&&Ir(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e]=Nr(n,e);return t}var Qr=j(Hr);function Xr(n,r){return n._chain?tn(r).chain():r}function Yr(n){return jr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototype[r]=function(){var n=[this._wrapped];return o.apply(n,arguments),Xr(this,t.apply(tn,n))}})),tn}jr(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];tn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Xr(this,t)}})),jr(["concat","join","slice"],(function(n){var r=t[n];tn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Xr(this,n)}}));var Zr=Yr({__proto__:null,VERSION:n,restArguments:j,isObject:_,isNull:function(n){return null===n},isUndefined:w,isBoolean:A,isElement:function(n){return!(!n||1!==n.nodeType)},isString:S,isNumber:O,isDate:M,isRegExp:E,isError:B,isSymbol:N,isArrayBuffer:I,isDataView:q,isArray:U,isFunction:D,isArguments:L,isFinite:function(n){return!N(n)&&d(n)&&!isNaN(parseFloat(n))},isNaN:$,isTypedArray:X,isEmpty:function(n){if(null==n)return!0;var r=Y(n);return"number"==typeof r&&(U(n)||S(n)||L(n))?0===r:0===Y(nn(n))},isMatch:rn,isEqual:function(n,r){return on(n,r)},isMap:dn,isWeakMap:gn,isSet:bn,isWeakSet:mn,keys:nn,allKeys:an,values:jn,pairs:function(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:_n,functions:wn,methods:wn,extend:xn,extendOwn:Sn,assign:Sn,defaults:On,create:function(n,r){var t=Mn(n);return r&&Sn(t,r),t},clone:En,tap:function(n,r){return r(n),n},get:Tn,has:function(n,r){for(var t=(r=Nn(r)).length,e=0;e<t;e++){var u=r[e];if(!W(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=qn(r,t);for(var e=nn(n),u=e.length,o={},i=0;i<u;i++){var a=e[i];o[a]=r(n[a],a,n)}return o},identity:kn,constant:C,noop:Un,toPath:Bn,property:Rn,propertyOf:function(n){return null==n?Un:function(r){return Tn(n,r)}},matcher:Dn,matches:Dn,times:function(n,r,t){var e=Array(Math.max(0,n));r=Fn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:Wn,now:zn,escape:Cn,unescape:Kn,templateSettings:Jn,template:function(n,r,t){!r&&t&&(r=t),r=On({},r,tn.templateSettings);var e=RegExp([(r.escape||Gn).source,(r.interpolate||Gn).source,(r.evaluate||Gn).source].join("|")+"|$","g"),u=0,o="__p+='";n.replace(e,(function(r,t,e,i,a){return o+=n.slice(u,a).replace(Qn,Xn),u=a+r.length,t?o+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?o+="'+\n((__t=("+e+"))==null?'':__t)+\n'":i&&(o+="';\n"+i+"\n__p+='"),r})),o+="';\n";var i,a=r.variable;if(a){if(!Yn.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{i=new Function(a,"_",o)}catch(n){throw n.source=o,n}var f=function(n){return i.call(this,n,tn)};return f.source="function("+a+"){\n"+o+"}",f},result:function(n,r,t){var e=(r=Nn(r)).length;if(!e)return D(t)?t.call(n):t;for(var u=0;u<e;u++){var o=null==n?void 0:n[r[u]];void 0===o&&(o=t,u=e),n=D(o)?o.call(n):o}return n},uniqueId:function(n){var r=++Zn+"";return n?n+r:r},chain:function(n){var r=tn(n);return r._chain=!0,r},iteratee:Pn,partial:rr,bind:tr,bindAll:or,memoize:function(n,r){var t=function(e){var u=t.cache,o=""+(r?r.apply(this,arguments):e);return W(u,o)||(u[o]=n.apply(this,arguments)),u[o]};return t.cache={},t},delay:ir,defer:ar,throttle:function(n,r,t){var e,u,o,i,a=0;t||(t={});var f=function(){a=!1===t.leading?0:zn(),e=null,i=n.apply(u,o),e||(u=o=null)},c=function(){var c=zn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,o=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e<o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))<i||u===1/0&&o===1/0)&&(o=n,i=u)}));return o},shuffle:function(n){return Tr(n,1/0)},sample:Tr,sortBy:function(n,r,t){var e=0;return r=qn(r,t),Nr(_r(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:Dr,indexBy:Rr,countBy:Fr,partition:Vr,toArray:function(n){return n?U(n)?i.call(n):S(n)?n.match(Pr):er(n)?_r(n,kn):jn(n):[]},size:function(n){return null==n?0:er(n)?n.length:nn(n).length},pick:Ur,omit:Wr,first:Lr,head:Lr,take:Lr,initial:zr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:$r(n,Math.max(0,n.length-r))},rest:$r,tail:$r,drop:$r,compact:function(n){return Sr(n,Boolean)},flatten:function(n,r){return ur(n,r,!1)},without:Kr,uniq:Jr,unique:Jr,union:Gr,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Y(n);e<u;e++){var o=n[e];if(!Er(r,o)){var i;for(i=1;i<t&&Er(arguments[i],o);i++);i===t&&r.push(o)}}return r},difference:Cr,unzip:Hr,transpose:Hr,zip:Qr,object:function(n,r){for(var t={},e=0,u=Y(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),o=0;o<e;o++,n+=t)u[o]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(i.call(n,e,e+=r));return t},mixin:Yr,default:tn});return Zr._=Zr,Zr}));
\ No newline at end of file
diff --git a/sphinx/build/html/genindex.html b/sphinx/build/html/genindex.html
index b34a403e29a80aa97d4acac4bcedfa9519346132..672b424b4b3542d0efeeb07707a0e565ebe7e2ea 100644
--- a/sphinx/build/html/genindex.html
+++ b/sphinx/build/html/genindex.html
@@ -13,6 +13,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -26,11 +28,10 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
diff --git a/sphinx/build/html/index.html b/sphinx/build/html/index.html
index a9bf70b7857ad53c0a5f2e875c22e36719ff0716..93a710c17f3a80e7d711bc9e22e5d1cba45a9b6c 100644
--- a/sphinx/build/html/index.html
+++ b/sphinx/build/html/index.html
@@ -4,7 +4,7 @@
 <html class="writer-html5" lang="en" >
 <head>
   <meta charset="utf-8">
-  <meta name="generator" content="Docutils 0.17: http://docutils.sourceforge.net/" />
+  <meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
@@ -14,6 +14,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,10 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
@@ -219,7 +220,7 @@
 <li class="toctree-l1"><a class="reference internal" href="V2_00.html">OhmPi V 2.00 (64 or 128 électrodes)</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="V2_00.html#the-philosophy-of-ohmpi">The philosophy of Ohmpi</a></li>
 <li class="toctree-l2"><a class="reference internal" href="V2_00.html#technical-data">Technical data</a></li>
-<li class="toctree-l2"><a class="reference internal" href="V2_00.html#raspberry-pi-configuration">Raspberry Pi  configuration</a></li>
+<li class="toctree-l2"><a class="reference internal" href="V2_00.html#step-n1-raspberry-pi-configuration"><strong>STEP n°1</strong> : Raspberry Pi  configuration</a></li>
 <li class="toctree-l2"><a class="reference internal" href="V2_00.html#assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi">Assembly of the measuring/current injection cards, and connection with the Raspberry Pi</a></li>
 <li class="toctree-l2"><a class="reference internal" href="V2_00.html#multiplexer-implentation">Multiplexer implentation</a></li>
 <li class="toctree-l2"><a class="reference internal" href="V2_00.html#electrode-connection">Electrode connection</a></li>
diff --git a/sphinx/build/html/search.html b/sphinx/build/html/search.html
index 2e2413516d55185e9f0ea0cb29887b829e1a6e7e..1b855133ac20a0841c8f41bd7e3080ccbf63c43b 100644
--- a/sphinx/build/html/search.html
+++ b/sphinx/build/html/search.html
@@ -13,6 +13,8 @@
   
   <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
 
   
   
@@ -27,11 +29,10 @@
   
     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
-        <script src="_static/language_data.js"></script>
-        <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
     
     <script type="text/javascript" src="_static/js/theme.js"></script>
 
diff --git a/sphinx/build/html/searchindex.js b/sphinx/build/html/searchindex.js
index 283a2879aaf70b38bf26d4e6692ce4c636feac5d..cbd93c057972e746d171e1cf525d3059accd03cd 100644
--- a/sphinx/build/html/searchindex.js
+++ b/sphinx/build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["Ohmpi","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["Ohmpi.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"100nf":[2,3],"10v":[2,3],"12v":[2,3],"1x0":[],"1x1":[],"1x10":[],"24v":[],"50vdc":[2,3],"5vcc":[1,2,3],"5vdc":[1,2,3],"7ah":[],"\u00e9lectrod":4,"ao\u00fbt":0,"case":[1,2,3],"final":[1,2,3],"function":[0,1,2,3],"h\u00e9l\u00e8ne":[0,4],"mm\u00b2":[1,2,3],"new":[1,2,3],"orl\u00e9an":0,"public":[1,2,3],"r\u00e9mi":[0,4],"return":[1,2,3],"switch":[1,2,3],"universit\u00e9":0,"vid\u00e9o":[1,2,3],ADS:[1,2,3],CMS:[],For:[1,2,3],IGE:0,Its:[1,2,3],The:4,These:[1,2,3],With:[1,2,3],abmn:[1,2,3],abov:[1,2,3],acc:[1,2,3],access:[1,2,3],accord:[1,2,3],accur:[1,2,3],accuraci:[1,2,3],acid:[1,2,3],actual:[1,2,3],adafruit:[1,2,3],adapt:[1,2,3],adc:[1,2,3],add:[1,2,3],added:[1,2,3],adding:[1,2,3],addit:[1,2,3],address:[1,2,3],adjust:[1,2,3],ads1115:[1,2,3],ads115:[1,2,3],ads1x15:[1,2,3],after:[1,2,3],all:[1,2,3],allow:[0,1,2,3],alp:0,also:[1,2,3],altern:[1,2,3],amp:[],amplifi:[1,2,3],analog:[1,2,3],ani:[1,2,3],anoth:[1,2,3],appear:[1,2,3],appli:[1,2,3],applic:0,apt:[1,2,3],arduino:[],arm:[],arrai:[1,2,3],articl:[1,2,3],asler:[],assembl:4,assist:[1,2,3],associ:0,attent:[1,2,3],attribut:[1,2,3],author:[0,1,2,3,4],automat:[0,1,2,3],automobil:[1,2,3],avail:[1,2,3],avr:[],bank:[1,2,3],base:[1,2,3],basic:0,batteri:[1,2,3],been:[1,2,3],befor:[1,2,3],behavior:[1,2,3],being:[1,2,3],below:[1,2,3],between:[1,2,3],bin:[1,2,3],bit:[1,2,3],black:[1,2,3],blinka:[1,2,3],block:[1,2,3],blue:[1,2,3],boot:[1,2,3],both:[1,2,3],bottom:[1,2,3],bought:[1,2,3],bridg:[1,2,3],bug:1,build:[1,2,3],button:[1,2,3],c320c104k1:[],cabl:[1,2,3],calcul:[1,2,3],calibr:[1,2,3],call:0,can:[1,2,3],canal:[],cap:[1,2,3],capac:[1,2,3],capacitor:[2,3],car:[],card:4,carri:[1,2,3],caus:[1,2,3],cedex:0,ceram:[2,3],channel:[1,2,3],characterist:[1,2,3],charg:[1,2,3],check:[1,2,3],chosen:[1,2,3],circuit:[1,2,3],circuitpython:[1,2,3],circul:[1,2,3],clean:[1,2,3],clement:[0,4],click:[1,2,3],close:[1,2,3],code:[1,2,3],coef_p0:[1,2,3],coef_p1:[1,2,3],coef_p2:[1,2,3],coef_p3:[1,2,3],coeff:[1,2,3],coeffici:[1,2,3],com:[1,2,3],command:[1,2,3],commerci:[1,2,3],common:[1,2,3],commun:0,complet:4,compon:4,comput:[1,2,3],conduct:[1,2,3],config:[1,2,3],configur:4,congratul:[1,2,3],connect:4,connector:[1,2,3],consequ:[1,2,3],consist:[1,2,3],constitut:[1,2,3],construct:[1,2,3],consumpt:[1,2,3],contact:[1,2,3],contain:[1,2,3],content:4,control:[1,2,3],convers:[1,2,3],convert:[1,2,3],correct:[1,2,3],correspond:1,cost:[0,2,3],could:[1,2,3],cpu:[1,2,3],creat:[1,2,3],creation:0,crimp:[],csv:[1,2,3],ctrl:[1,2,3],current:[0,4],damag:[1,2,3],data:[0,4],date:[0,1,2,3,4],dcconvert:[2,3],deactiv:[1,2,3],dec:[],decid:[1,2,3],decoupl:[2,3],dedic:0,delai:[1,2,3],deliv:[1,2,3],depend:[1,2,3],describ:[1,2,3],design:[1,2,3],desktop:[2,3],despit:[1,2,3],detail:1,dev:[1,2,3],develop:[0,1,2,3,4],diagram:[1,2,3],differ:[1,2,3],digit:[1,2,3],din:[1,2,3],direct:[1,2,3],directli:[1,2,3],directori:[1,2,3],disconnect:[1,2,3],displai:[1,2,3],distanc:[1,2,3],disturb:[1,2,3],divid:[1,2,3],document:[0,1],done:[1,2,3],down:[1,2,3],download:[1,2,3],dsp:[],dual:[1,2,3],duboi:[0,4],durat:[1,2,3],dure:[1,2,3],dzwb4:[1,2,3],e00122ff:0,each:[1,2,3],editor:[1,2,3],eiffel:0,either:[1,2,3],electr:0,electrod:[0,4],electron:[1,2,3],elsevi:0,emil:0,enabl:[1,2,3],end:[1,2,3],energ:[1,2,3],enough:[1,2,3],ensur:[1,2,3],enter:[1,2,3],entir:[1,2,3],environ:[1,2,3],environnementshould:[1,2,3],equal:[1,2,3],equival:[1,2,3],ert:[1,2,3],escap:[1,2,3],estim:[1,2,3],everyon:0,evolv:[1,2,3],exampl:[1,2,3],excess:[1,2,3],execut:[1,2,3],exist:[1,2,3],experi:[0,1,2,3],explain:1,export_path:[2,3],extra:[1,2,3],failur:[1,2,3],fargier:[0,4],fast:[2,3],featur:[1,2,3],femal:[1,2,3],ferrul:[],fewer:[1,2,3],ff10:0,fhac0002zxj:[],field:[1,2,3],fig:[1,2,3],figur:[1,2,3],file:[1,2,3],find:[1,2,3],first:[1,2,3],flexibl:0,florsch:[1,2,3],flow:[1,2,3],folder:[1,2,3],follow:[1,2,3],forquet:[0,4],framework:[1,2,3],franc:0,from:[1,2,3],full:[1,2,3],fulli:0,fuse:[1,2,3],gain:[1,2,3],ganc:[0,4],gather:[1,2,3],gener:[1,2,3,4],ger:0,get:[0,1,2,3],gitlab:[1,2,3],gnd:[1,2,3],gnu:[1,2,3],gpio:[1,2,3],grenobl:0,gro:0,ground:[1,2,3],gui:[1,2,3],guidelin:4,gustav:0,guyard:[0,4],h81k0bya:[],h81k5bya:[],had:[1,2,3],hand:[1,2,3],handl:[1,2,3],hardwar:[0,1,2,3],hardwarex:0,has:[1,2,3],have:[1,2,3],hazard:[1,2,3],header:[1,2,3],hear:[1,2,3],here:[2,3],high:[1,2,3],higher:[2,3],holder:[1,2,3],hole:[1,2,3],home:[1,2,3],horizont:[1,2,3],hous:[1,2,3],how:[1,2,3],howev:[1,2,3],http:[1,2,3],ifsttar:0,illustr:[1,2,3],imag:0,imped:[1,2,3],implent:4,improv:[2,3],in1:[1,2,3],in2:[1,2,3],in3:[1,2,3],in4:[1,2,3],includ:[1,2,3],incom:[1,2,3],increas:[1,2,3],inde:[1,2,3],inject:[0,4],injection_dur:[1,2,3],input:[1,2,3],inra:0,insert:[1,2,3],insid:[1,2,3],instead:[1,2,3],instruct:4,instrument:0,intens:[1,2,3],interfac:[1,2,3],interpret:[1,2,3],introduc:[1,2,3],invit:1,involv:0,ion:[1,2,3],iri:0,irstea:[1,2,3],its:[1,2,3],jason:[2,3],journal:1,json:[2,3],juillet:0,jul:4,juli:4,julien:[0,4],just:[2,3],kemet:[],keyboard:[1,2,3],known:[1,2,3],kohm:[1,2,3],laboratori:[0,1,2,3],last:[2,3],lastli:[1,2,3],latest:[1,2,3],lead:[1,2,3],leav:[1,2,3],length:[1,2,3],less:[1,2,3],let:[1,2,3],libatla:[1,2,3],librari:[1,2,3],lie:[1,2,3],limit:[3,4],line:[1,2,3],list:4,lithium:[1,2,3],littelfus:[],littl:[1,2,3],lm358an:[],lm358n:[1,2,3],locat:[1,2,3],logger:[0,1,2,3],low:[0,1,2,3],lr20:[],lying:[1,2,3],lyon:0,made:[1,2,3],mai:[1,2,3],main:[1,2,3],make:[1,2,3],manag:[1,2,3],manual:[1,2,3],manufactur:[],manuscript:[1,2,3],master:[1,2,3],matur:4,maximum:[1,2,3],measur:[0,4],mechan:[1,2,3],meet:[1,2,3],mega:[1,2,3],menu:[1,2,3],met:[1,2,3],meter:[0,1,2,3],meterfeatur:0,micro:[1,2,3],mimic:[1,2,3],min:[1,2,3],miss:1,mm2:[1,2,3],model:[1,2,3],modif:[1,2,3],modifi:[1,2,3],modul:[1,2,3],mohm:[1,2,3],monitor:[1,2,3],moreov:[1,2,3],mount:[1,2,3],mous:[1,2,3],multi:[1,2,3],multiplex:[0,4],multipli:[1,2,3],must:[1,2,3],mux:[1,2,3],name:[1,2,3],nano:[1,2,3],nb_electrod:[1,2,3],nbr_mea:[1,2,3],necessari:[1,2,3],need:[1,2,3],neg:[1,2,3],next:[1,2,3],nicola:[0,4],noob:[1,2,3],nopb:[],normal:[1,2,3],note:[1,2,3],now:[1,2,3],number:[1,2,3],numer:[1,2,3],numpi:[1,2,3],obtain:[1,2,3],offcial:4,offer:[1,2,3],ohm:[1,2,3],ohmmet:[1,2,3],ohmpi_param:[2,3],ohx:0,onc:[1,2,3],one:[1,2,3],onto:[1,2,3],open:[0,1,2,3],oper:4,optim:[1,2,3],option:[1,2,3],order:[1,2,3],orient:[2,3],osf:[1,2,3],other:[1,2,3],our:[1,2,3],out:[1,2,3],output:[1,2,3],overh:[2,3],pai:[1,2,3],panda:[1,2,3],part:[1,2,3],parten:0,partenair:4,pat1l:[],path:[1,2,3],pcb:[1,2,3],per:[1,2,3],perform:[0,1,2,3],permut:[1,2,3],philosophi:[0,4],pic:[],piec:[],pin:[1,2,3],pip:[1,2,3],pitch:[1,2,3],place:[1,2,3],pleas:[1,2,3],plug:[1,2,3],point:[1,2,3],polar:[1,2,3],pole:[1,2,3],posit:[1,2,3],possibl:[1,2,3],potenti:[1,2,3],potentiomet:[1,2,3],pour:[],power:[1,2,3],practic:[1,2,3],precis:[1,2,3],prefer:[1,2,3],prepar:[1,2,3],present:[0,1,2,3],press:[1,2,3],prevent:[2,3],previous:[1,2,3],print:[1,2,3],pro:[],produc:[1,2,3],program:[1,2,3],progress:[0,4],project:4,propos:[1,2,3],protocol:[1,2,3],provid:[0,1,2,3],publish:1,puls:[1,2,3],purpos:[1,2,3],pyhton3:[1,2,3],python3:[1,2,3],pythonid:[1,2,3],quadripol:[1,2,3],quadrupol:[1,2,3],quantiti:[],r10:[1,2,3],r11:[1,2,3],r12:[1,2,3],r_ref:[1,2,3],rail:[1,2,3],rang:[1,2,3],raspberri:4,raspbian:[1,2,3],raspebrri:[1,2,3],readm:[1,2,3],recommend:[1,2,3],red:[1,2,3],reduct:[1,2,3],refer:[1,2,3],relai:[1,2,3],releas:4,remain:[1,2,3],rememb:[1,2,3],remot:[1,2,3],repeat:[1,2,3],repetit:[1,2,3],replac:[2,3],repositori:[1,2,3],repres:[1,2,3],requir:[1,2,3],research:4,resist:[0,4],resistor:[1,2,3],resolut:[1,2,3],respect:[1,2,3],result:[1,2,3],revers:[1,2,3],reversa:[0,1,2,3],robust:[0,1,2,3],role:[1,2,3],root:[1,2,3],rpi:[1,2,3],rro:0,run:[1,2,3],safeti:[1,2,3],sain:[],sainsmart:[],same:[1,2,3],samtec:[],save:[1,2,3],scale:0,schemat:[1,2,3],scienc:[1,2,3],scientif:0,screen:[1,2,3],screw:[1,2,3],second:[1,2,3],section:[1,2,3],see:[1,2,3],select:[1,2,3],sequenc:[1,2,3],sequence_delai:[1,2,3],seri:[1,2,3],serv:[1,2,3],set:[1,2,3],setp:[2,3],setup:[1,2,3],sever:[1,2,3],shield:[1,2,3],shortcut:[1,2,3],should:[1,2,3],show:[1,2,3],shown:[1,2,3],signal:[1,2,3],simpl:[1,2,3],simpli:[1,2,3],simultan:[1,2,3],singl:[1,2,3],slope:[1,2,3],small:[0,1,2,3],smaller:[1,2,3],smart:[],softwar:[1,2,3],soil:[1,2,3],solder:[1,2,3],solut:[1,2,3],some:[1,2,3,4],sound:[1,2,3],sourc:[0,1,2,3],specif:[1,2,3],specifi:[1,2,3],spi:[1,2,3],ssw:[],stabl:[1,2,3],stack:[1,2,3],stainless:[1,2,3],start:[1,2,3,4],statu:[0,4],steel:[1,2,3],step:[1,2,3],still:[1,2,3],storag:[1,2,3],strict:[1,2,3],strip:[1,2,3],strong:[1,2,3],stronger:[1,2,3],strongli:[1,2,3],stuck:[1,2,3],studi:[1,2,3],subject:[1,2,3],sudo:[1,2,3],suffici:[1,2,3],suggest:[1,2,3],suitabl:[1,2,3],sum:[1,2,3],suppli:[1,2,3],suppress:[2,3],sure:[1,2,3],surfac:0,system:[1,2,3],tab:[1,2,3],tabl:[1,2,3],target:4,task:[1,2,3],technic:4,temperatur:[1,2,3],ten:[1,2,3],termin:[1,2,3],test:[1,2,3],texa:[],than:[1,2,3],the9:[1,2,3],thei:[1,2,3],them:[1,2,3],therefor:[1,2,3],thi:[0,1,2,3],thousand:[1,2,3],three:[1,2,3],through:[1,2,3],thu:[1,2,3],time:[1,2,3],togeth:[1,2,3],toler:[2,3],tool:0,total:[1,2,3],track:[1,2,3],traco:[2,3],tracopow:[],trn3:[2,3],trn:[],tru:[],turn:[1,2,3],tutori:4,two:[1,2,3],txt:[1,2,3],type:[1,2,3],typic:[1,2,3],under:[1,2,3],unexpectedli:[1,2,3],unit:[1,2,3],univ:0,unzip:[1,2,3],updat:0,upgrad:[2,3],upping:[1,2,3],upw50b50rv:[],use:[1,2,3],used:[1,2,3],user:[1,2,3,4],using:[1,2,3],usr:[1,2,3],valid:[1,2,3],valu:[1,2,3],variou:[1,2,3],velleman:[1,2,3],venv:[1,2,3],veri:[2,3],version:[1,2,3],vertic:[1,2,3],via:[1,2,3],villeurbann:0,vivien:[0,4],voltag:[1,2,3],voltmet:[1,2,3],wai:[1,2,3],want:[2,3],watch:[1,2,3],weaker:1,websit:[1,2,3],weidmul:[],welcom:0,well:[1,2,3],were:[1,2,3],when:[1,2,3],where:[1,2,3],which:[1,2,3],whose:[1,2,3],willing:0,window:[1,2,3],wire:[1,2,3],within:[1,2,3],without:[1,2,3],wjwzhv1v3pk:[1,2,3],would:[1,2,3],wpm404:[1,2,3],write:[1,2,3],www:[1,2,3],yannick:[0,4],you:[1,2,3],your:[1,2,3],youtub:[1,2,3]},titles:["OhmPi project","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.00 (64 or 128 \u00e9lectrodes)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"\u00e9lectrod":3,IDE:[1,2,3],The:[1,2,3],activ:[1,2,3],assembl:[1,2,3],board:[1,2,3],card:[1,2,3],center:4,cite:0,complet:[1,2,3],compon:[1,2,3],configur:[1,2,3],connect:[1,2,3],current:[1,2,3],data:[1,2,3],descript:[1,2,3],document:4,electr:[1,2,3],electrod:[1,2,3],environn:[1,2,3],four:[1,2,3],frist:[1,2,3],hardwar:4,implement:[1,2,3],implent:[1,2,3],initi:[1,2,3],inject:[1,2,3],instal:[1,2,3],instruct:[1,2,3],introduct:0,limit:[1,2],list:[1,2,3],measur:[1,2,3],mesur:[1,2,3],meter:4,multiplex:[1,2,3],ohmpi:[0,1,2,3,4],onli:[1,2,3],open:4,oper:[1,2,3],packag:[1,2,3],paramet:[1,2,3],partenair:0,philosophi:[1,2,3],preliminari:[1,2,3],procedur:[1,2,3],project:0,python:[1,2,3],rapberri:[1,2,3],raspberri:[1,2,3],resist:[1,2,3],resit:4,sourc:4,startup:[1,2,3],summari:4,tabl:[],technic:[1,2,3],thonni:[1,2,3],titl:[],virtual:[1,2,3]}})
\ No newline at end of file
+Search.setIndex({docnames:["Ohmpi","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["Ohmpi.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[1,2,3],"00":4,"000":[1,2,3],"01":[2,3,4],"018":[1,2,3],"02":[1,3,4],"0251001":[2,3],"04":[1,2,3],"05":[1,2,3],"06":[1,2,3],"09":[1,2,3],"1":4,"10":[1,2,3],"100":[1,2,3],"100nf":[2,3],"101":[1,2,3],"1016":0,"103":[1,2,3],"1083":[1,2,3],"10v":[2,3],"11":[1,2,3],"110":[1,2,3],"1115":[1,2,3],"114":[1,2,3],"12":[1,2,3],"1215":[2,3],"128":4,"12v":[1,2,3],"13":[1,2,3],"1332":[1,2,3],"14":4,"15":[1,2,3],"150":[1,2,3],"1565235":[1,2,3],"1568649":[1,2,3],"16":[1,2,3],"17":[1,2,3],"18":[1,2,3],"185":[1,2,3],"19":[1,2,3],"199":[1,2,3],"1x0":[1,2,3],"1x1":[1,2,3],"1x10":[1,2,3],"2":[1,2,4],"20":[1,2,3],"2016":4,"2020":0,"2021":4,"21":[0,1,2,3],"22":[1,2,3],"23":[1,2,3],"24":[0,1,2,3],"24v":[2,3],"25":[1,2,3],"26":[1,2,3],"27":[1,2,3],"29":[1,2,3],"2a":[1,2,3],"3":[1,2,3],"30":[1,2,3],"32":[0,3,4],"36":[1,2,3],"37":[1,2,3],"38":[1,2,3],"39":[1,2,3],"4":[1,2,3],"40":[1,2,3],"43":[1,2,3],"44":[1,2,3],"45100":0,"4686":[1,2,3],"48":[1,2,3],"5":[1,2,3],"50":[1,2,3],"500":[1,2,3],"50vdc":[2,3],"52":[1,2,3],"53":[2,3],"537":[1,2,3],"5488":[1,2,3],"55":[1,2,3],"576":1,"58":[1,2,3],"5v":[1,2,3],"5vcc":[1,2,3],"5vdc":[1,2,3],"5w":[1,2,3],"6":[1,2,3],"627":[1,2,3],"64":[1,2,4],"648":[1,2,3],"66":[1,2,3],"68":[1,2,3],"69626":0,"69675":0,"7":[1,2,3],"70":[1,2,3],"71":[1,2,3],"72":[2,3],"7ah":[1,2,3],"8":[0,1,2,3],"80":3,"858":[1,2,3],"897":[1,2,3],"9":[1,2,3],"9004330000":[1,2,3],"92":[1,2,3],"96":1,"966067":[1,2,3],"99":[1,2,3],"9v":[1,2,3],"\u00e9lectrod":4,"ao\u00fbt":0,"case":[1,2,3],"final":[1,2,3],"function":[0,1,2,3],"h\u00e9l\u00e8ne":[0,4],"mm\u00b2":[1,2,3],"new":[1,2,3],"orl\u00e9an":0,"public":[1,2,3],"r\u00e9mi":[0,4],"return":[1,2,3],"switch":[1,2,3],"universit\u00e9":0,"vid\u00e9o":[1,2,3],A:[1,2,3],As:[1,2,3],At:[1,2,3],For:[1,2,3],If:[1,2,3],In:[0,1,2,3],It:[1,2,3],Its:[1,2,3],On:[1,2,3],The:4,These:[1,2,3],To:[1,2,3],With:[1,2,3],a0:[1,2,3],a1:[1,2,3],a2:[1,2,3],a3:[1,2,3],abmn:[1,2,3],abov:[1,2,3],acc:[1,2,3],access:[1,2,3],accord:[1,2,3],accur:[1,2,3],accuraci:[1,2,3],acid:[1,2,3],actual:[1,2,3],ad:[1,2,3],adafruit:[1,2,3],adapt:[1,2,3],adc:[1,2,3],add:[1,2,3],addit:[1,2,3],address:[1,2,3],adjust:[1,2,3],ads1115:[1,2,3],ads115:[1,2,3],ads1x15:[1,2,3],after:[1,2,3],al:0,all:[1,2,3],allow:[0,1,2,3],alp:0,also:[1,2,3],altern:[1,2,3],amp:[1,2,3],amplifi:[1,2,3],an:[0,1,2,3],analog:[1,2,3],ani:[1,2,3],anoth:[1,2,3],appear:[1,2,3],appli:[1,2,3],applic:0,apt:[1,2,3],ar:[1,2,3],arduino:1,arm:1,arrai:[1,2,3],articl:[1,2,3],asler:[1,2,3],assembl:4,assist:[1,2,3],associ:0,attent:[1,2,3],attribut:[1,2,3],author:[0,1,2,3,4],automat:[0,1,2,3],automobil:[1,2,3],avail:[1,2,3],avr:1,bank:[1,2,3],base:[1,2,3],basic:0,batteri:[1,2,3],been:[1,2,3],befor:[1,2,3],behavior:[1,2,3],being:[1,2,3],below:[1,2,3],between:[1,2,3],bin:[1,2,3],bit:[1,2,3],black:[1,2,3],blinka:[1,2,3],block:[1,2,3],blue:[1,2,3],boot:[1,2,3],both:[1,2,3],bottom:[1,2,3],bought:[1,2,3],box:3,bridg:[1,2,3],bug:1,build:[1,2,3],button:[1,2,3],c320c104k1:[2,3],c:[1,2,3],cabl:[1,2,3],calcul:[1,2,3],calibr:[1,2,3],call:0,can:[1,2,3],canal:1,cap:[1,2,3],capac:[1,2,3],capacitor:[2,3],car:1,card:4,carri:[1,2,3],caus:[1,2,3],cd:[1,2,3],cedex:0,ceram:[2,3],channel:[1,2,3],characterist:[1,2,3],charg:[1,2,3],check:[1,2,3],chosen:[1,2,3],circuit:[1,2,3],circuitpython:[1,2,3],circul:[1,2,3],clean:[1,2,3],clement:[0,4],click:[1,2,3],close:[1,2,3],cm:[1,2,3],code:[1,2,3],coef_p0:[1,2,3],coef_p1:[1,2,3],coef_p2:[1,2,3],coef_p3:[1,2,3],coeff:[1,2,3],coeffici:[1,2,3],com:[1,2,3],command:[1,2,3],commerci:[1,2],common:[1,2,3],commun:[0,3],complet:4,compon:4,comput:[1,2,3],conduct:[1,2,3],config:[1,2,3],configur:4,congratul:[1,2,3],connect:4,connector:[1,2,3],consequ:[1,2,3],consist:[1,2,3],constitut:[1,2,3],construct:[1,2,3],consumpt:[1,2,3],contact:[1,2,3],contain:[1,2,3],content:4,control:[1,2,3],convers:[1,2,3],convert:[1,2,3],copi:3,correct:[1,2,3],correspond:1,cost:[0,1,2,3],could:[1,2,3],cpu:[1,2,3],creat:[1,2,3],creation:0,crimp:[1,2,3],csv:[1,2,3],ctrl:[1,2,3],current:[0,4],d:[1,2,3],damag:[1,2,3],data:[0,4],date:[0,1,2,3,4],dc:[1,2,3],dcconvert:[2,3],deactiv:[1,2,3],decid:[1,2,3],decoupl:[2,3],dedic:[0,3],delai:[1,2,3],deliv:[1,2,3],depend:[1,2,3],describ:[1,2,3],design:[1,2,3],desktop:[2,3],despit:[1,2,3],detail:1,dev:[1,2,3],develop:[0,1,2,3,4],diagram:[1,2,3],differ:[1,2,3],digit:[1,2,3],dii:3,din:[1,2,3],direct:[1,2,3],directli:[1,2,3],directori:[1,2,3],disconnect:[1,2,3],discret:3,displai:[1,2,3],distanc:[1,2,3],disturb:[1,2,3],divid:[1,2,3],dl:[1,2,3],document:[0,1],done:[1,2,3],down:[1,2,3],download:[1,2,3],dsp:1,dual:[1,2,3],duboi:[0,4],durat:[1,2,3],dure:[1,2,3],dzwb4:[1,2,3],e00122ff:0,e:[1,2,3],each:[1,2,3],editor:[1,2,3],effort:3,eiffel:0,either:[1,2,3],electr:0,electrod:[0,4],electron:[1,2,3],elsevi:0,emil:0,en:3,enabl:[1,2,3],end:[1,2,3],energ:[1,2,3],enough:[1,2,3],ensur:[1,2,3],enter:[1,2,3],entir:[1,2,3],environ:[1,2,3],environnementshould:[1,2,3],equal:[1,2,3],equival:[1,2,3],ert:[1,2,3],escap:[1,2,3],estim:[1,2,3],et:0,everyon:0,evolv:[1,2,3],exampl:[1,2,3],excess:[1,2,3],execut:[1,2,3],exist:[1,2,3],experi:[0,1,2,3],explain:1,export_path:[2,3],extra:[1,2,3],f:[0,1,2,3],failur:[1,2,3],fargier:[0,4],fast:[2,3],featur:[1,2,3],femal:[1,2,3],ferrul:[1,2,3],fewer:[1,2,3],ff10:0,fhac0002zxj:1,field:[1,2,3],fig:[1,2,3],figur:[1,2,3],file:[1,2,3],find:[1,2,3],first:[1,2,3],flexibl:0,florsch:[1,2,3],flow:[1,2,3],folder:[1,2,3],follow:[1,2,3],forquet:[0,4],fr:[1,2,3],framework:[1,2,3],franc:0,from:[1,2,3],full:[1,2,3],fulli:0,fuse:[1,2,3],g:[1,2,3],gain:[1,2,3],ganc:[0,4],gather:[1,2,3],gener:[1,2,3,4],ger:0,get:[0,1,2,3],gitlab:[1,2,3],gnd:[1,2,3],gnu:[1,2,3],go:3,gpio:[1,2,3],grenobl:0,gro:0,ground:[1,2,3],gui:[1,2,3],guidelin:4,gustav:0,guyard:[0,4],h81k0bya:[1,2,3],h81k5bya:[1,2,3],h:[2,3],ha:[1,2,3],had:[1,2,3],hand:[1,2,3],handl:[1,2,3],hardwar:[0,1,2,3],hardwarex:0,have:[1,2,3],hazard:[1,2,3],hdmi:3,header:[1,2,3],hear:[1,2,3],here:2,high:[1,2,3],higher:[2,3],holder:[1,2,3],hole:[1,2,3],home:[1,2,3],horizont:[1,2,3],hous:[1,2,3],how:[1,2,3],howev:[1,2,3],http:[1,2,3],i:[1,2,3],ifsttar:0,ig:0,illustr:[1,2,3],imag:0,imped:[1,2,3],implent:4,improv:[2,3],in1:[1,2,3],in2:[1,2,3],in3:[1,2,3],in4:[1,2,3],includ:[1,2,3],incom:[1,2,3],increas:[1,2,3],inde:[1,2,3],inject:[0,4],injection_dur:[1,2,3],input:[1,2,3],inra:0,insert:[1,2,3],insid:[1,2,3],instanc:3,instead:[1,2,3],instruct:4,instrument:[0,1,2,3],intens:[1,2,3],interfac:[1,2,3],interpret:[1,2,3],introduc:[1,2,3],invit:1,involv:0,io:[1,2,3],ion:[1,2,3],iri:0,irstea:[1,2,3],its:[1,2,3],j:0,jason:[2,3],journal:1,json:[2,3],juillet:0,jul:4,juli:4,julien:[0,4],just:2,kemet:[2,3],keyboard:[1,2,3],known:[1,2,3],kohm:[1,2,3],laboratori:[0,1,2,3],laps:3,last:[2,3],lastli:[1,2,3],latest:[1,2,3],lead:[1,2,3],leav:[1,2,3],length:[1,2,3],less:[1,2,3],let:[1,2,3],libatla:[1,2,3],librari:[1,2,3],lie:[1,2,3],limit:[3,4],line:[1,2,3],list:4,lithium:[1,2,3],littelfus:[1,2,3],littl:[1,2,3],ll:[1,2,3],lm358an:[1,2,3],lm358n:[1,2,3],locat:[1,2,3],logger:[0,1,2,3],low:[0,1,2,3],lr20:[1,2,3],ly:[1,2,3],lyon:0,m:[1,2,3],ma:[1,2,3],made:[1,2,3],mai:[1,2,3],main:[1,2,3],make:[1,2,3],manag:[1,2,3],manual:[1,2,3],manufactur:[1,2,3],manuscript:[1,2,3],master:[1,2,3],matur:4,maximum:[1,2,3],measur:[0,4],mechan:[1,2,3],meet:[1,2,3],mega:[1,2,3],menu:[1,2,3],met:[1,2,3],meter:[0,1,2,3],meterfeatur:0,micro:[1,2,3],mimic:[1,2,3],min:[1,2,3],miss:1,mm2:[1,2,3],mm:[1,2,3],model:[1,2,3],modif:[1,2,3],modifi:[1,2,3],modul:[1,2,3],mohm:[1,2,3],monitor:[1,2,3],more:3,moreov:[1,2,3],mount:[1,2,3],mous:[1,2,3],ms:[1,2,3],multi:[1,2],multielectrod:3,multipl:3,multiplex:[0,4],multipli:[1,2,3],must:[1,2,3],mux:[1,2,3],n:[1,2,4],name:[1,2,3],nano:[1,2,3],nb_electrod:[1,2,3],nbr_mea:[1,2,3],necessari:[1,2,3],need:[1,2,3],neg:[1,2,3],next:[1,2,3],nf:[2,3],nicola:[0,4],noob:[1,2,3],nopb:[1,2,3],normal:[1,2,3],note:[1,2,3],now:[1,2,3],number:[1,2,3],numer:[1,2,3],numpi:[1,2,3],o1:[1,2,3],o:[1,2,3],obtain:[1,2,3],offcial:4,offer:[1,2,3],ohm:[1,2,3],ohmmet:[1,2,3],ohmpi_param:[2,3],ohx:0,ok:[1,2,3],onc:[1,2,3],one:[1,2,3],onto:[1,2,3],op:[1,2,3],open:[0,1,2,3],oper:4,optim:[1,2,3],option:[1,2,3],order:[1,2,3],org:3,orient:[2,3],osf:[1,2,3],other:[1,2,3],our:[1,2,3],out:[1,2,3],output:[1,2,3],overh:[2,3],p0:[1,2,3],p1:[1,2,3],p2:[1,2,3],p3:[1,2,3],p:0,pai:[1,2,3],panda:[1,2,3],parallel:3,part:[1,2,3],parten:0,partenair:4,pat1l:[2,3],path:[1,2,3],pcb:[1,2,3],per:[1,2,3],perform:[0,1,2,3],permut:[1,2,3],philosophi:[0,4],pi:4,pic:1,piec:[1,2,3],pin:[1,2,3],pip:[1,2,3],pitch:[1,2,3],place:[1,2,3],pleas:[1,2,3],plug:[1,2,3],po:[1,2,3],point:[1,2,3],polar:[1,2,3],pole:[1,2,3],posit:[1,2,3],possibl:[1,2,3],potenti:[1,2,3],potentiomet:[1,2,3],pour:1,power:[1,2,3],practic:[1,2,3],precis:[1,2,3],prefer:[1,2,3],prepar:[1,2,3],present:[0,1,2,3],press:[1,2,3],prevent:[2,3],previou:3,previous:[1,2,3],print:[1,2,3],pro:[1,2,3],problem:3,produc:[1,2,3],program:[1,2,3],progress:[0,4],project:[3,4],propos:[1,2,3],protect:3,protocol:[1,2,3],provid:[0,1,2,3],publish:1,puls:[1,2,3],purpos:[1,2,3],py:[1,2,3],pyhton3:[1,2,3],python3:[1,2,3],pythonid:[1,2,3],quadripol:[1,2,3],quadrupol:[1,2,3],quantiti:[1,2,3],r10:[1,2,3],r11:[1,2,3],r12:[1,2,3],r1:[1,2,3],r2:[1,2,3],r3:[1,2,3],r4:[1,2,3],r5:[1,2,3],r6:[1,2,3],r7:[1,2,3],r8:[1,2,3],r9:[1,2,3],r_ref:[1,2,3],rail:[1,2,3],rang:[1,2,3],raspberri:4,raspberrypi:3,raspbian:[1,2,3],raspebrri:[1,2,3],readm:[1,2,3],recommend:[1,2,3],red:[1,2,3],reduct:[1,2,3],refer:[1,2,3],relai:[1,2,3],releas:4,remain:[1,2,3],rememb:[1,2,3],remot:[1,2,3],repeat:[1,2,3],repetit:[1,2,3],replac:[2,3],repositori:[1,2,3],repres:[1,2,3],requir:[1,2,3],research:4,resist:[0,4],resistor:[1,2,3],resolut:[1,2,3],respect:[1,2,3],result:[1,2,3],revers:[1,2,3],reversa:[0,1,2,3],robust:[0,1,2,3],role:[1,2,3],root:[1,2,3],rpi:[1,2,3],rro:0,rs:[1,2,3],rubric:[],run:[1,2,3],s:[0,1,2,3],safeti:[1,2,3],sain:[1,2,3],sainsmart:[1,2,3],same:[1,2,3],samtec:[1,2,3],save:[1,2,3],scale:0,schemat:[1,2,3],scienc:[1,2,3],scientif:0,screen:[1,2,3],screw:[1,2,3],sd:[1,2,3],second:[1,2,3],section:[1,2,3],see:[1,2,3],seek:3,select:[1,2,3],sequenc:[1,2,3],sequence_delai:[1,2,3],seri:[1,2,3],serv:[1,2,3],set:[1,2,3],setp:[2,3],setup:[1,2,3],sever:[1,2,3],share:3,shield:[1,2,3],shortcut:[1,2,3],should:[1,2,3],show:[1,2,3],shown:[1,2,3],signal:[1,2,3],simpl:[1,2,3],simpli:[1,2,3],simultan:[1,2,3],singl:[1,2,3],slope:[1,2,3],small:[0,1,2,3],smaller:[1,2,3],smart:[1,2,3],so:[1,2,3],softwar:[1,2,3],soil:[1,2,3],solder:[1,2,3],solut:[1,2,3],some:[1,2,3,4],sound:[1,2,3],sourc:[0,1,2,3],specif:[1,2,3],specifi:[1,2,3],spi:[1,2,3],ssw:[1,2,3],stabl:[1,2,3],stack:[1,2,3],stainless:[1,2,3],start:[1,2,3,4],statu:[0,4],steel:[1,2,3],step:[1,2,4],still:[1,2,3],stop:3,storag:[1,2,3],strict:[1,2,3],strip:[1,2,3],strong:[1,2,3],stronger:[1,2,3],strongli:[1,2,3],stuck:[1,2,3],studi:[1,2,3],subject:[1,2,3],sudo:[1,2,3],suffici:[1,2,3],suggest:[1,2,3],suitabl:[1,2,3],sum:[1,2,3],suppli:[1,2,3],support:3,suppress:[2,3],sure:[1,2,3],surfac:0,system:[1,2,3],tab:[1,2,3],tabl:[2,3],target:4,task:[1,2,3],te:[1,2,3],team:3,technic:4,temperatur:[1,2,3],ten:[1,2,3],termin:[1,2,3],test:[1,2,3],texa:[1,2,3],than:[1,2,3],the9:[1,2,3],thei:[1,2,3],them:[1,2,3],therefor:[1,2,3],thi:[0,1,2,3],thousand:[1,2,3],three:[1,2,3],through:[1,2,3],thu:[1,2,3],time:[1,2,3],togeth:[1,2,3],toler:[2,3],tool:[0,3],total:[1,2,3],track:[1,2,3],traco:[2,3],tracopow:[2,3],trn3:[2,3],trn:[2,3],tru:[1,2,3],turn:[1,2,3],tutori:4,two:[1,2,3],tx:[1,2,3],txt:[1,2,3],type:[1,2,3],typic:[1,2,3],under:[1,2,3],unexpectedli:[1,2,3],unit:[1,2,3],univ:0,unzip:[1,2,3],up:[0,1,2,3],updat:0,upgrad:[2,3],upw50b50rv:[1,2,3],us:[1,2,3],user:[1,2,3,4],usr:[1,2,3],util:3,v1:[1,2,3],v2:3,v:4,valid:[1,2,3],valu:[1,2,3],variou:[1,2,3],velleman:[1,2,3],venv:[1,2,3],veri:[2,3],version:[1,2,3],vertic:[1,2,3],via:[1,2,3],villeurbann:0,visit:3,vivien:[0,4],voltag:[1,2,3],voltmet:[1,2,3],w:[1,2,3],wa:[1,2,3],wai:[1,2,3],want:[2,3],watch:[1,2,3],we:[1,2,3],weaker:1,websit:[1,2,3],weidmul:[1,2,3],welcom:0,well:[1,2,3],were:[1,2,3],when:[1,2,3],where:[1,2,3],which:[1,2,3],whose:[1,2,3],willing:0,window:[1,2,3],wire:[1,2,3],wish:3,within:[1,2,3],without:[1,2,3],wjwzhv1v3pk:[1,2,3],would:[1,2,3],wpm404:[1,2,3],write:[1,2,3],www:[1,2,3],x:[1,2,3],yannick:[0,4],you:[1,2,3],your:[1,2,3],youtub:[1,2,3]},titles:["OhmPi project","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.00 (64 or 128 \u00e9lectrodes)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"00":3,"01":1,"02":2,"1":[1,2,3],"128":3,"2":3,"32":[1,2],"64":3,"\u00e9lectrod":3,The:[1,2,3],activ:[1,2,3],assembl:[1,2,3],b:[1,2,3],board:[1,2,3],card:[1,2,3],center:4,cite:0,complet:[1,2,3],compon:[1,2,3],configur:[1,2,3],connect:[1,2,3],current:[1,2,3],data:[1,2,3],descript:[1,2,3],document:4,electr:[1,2,3],electrod:[1,2,3],environn:[1,2,3],four:[1,2,3],frist:[1,2,3],hardwar:4,id:[1,2,3],implement:[1,2,3],implent:[1,2,3],initi:[1,2,3],inject:[1,2,3],instal:[1,2,3],instruct:[1,2,3],introduct:0,limit:[1,2],list:[1,2,3],measur:[1,2,3],mesur:[1,2,3],meter:4,multiplex:[1,2,3],n:3,ohmpi:[0,1,2,3,4],onli:[1,2,3],open:4,oper:[1,2,3],os:[1,2,3],packag:[1,2,3],paramet:[1,2,3],partenair:0,philosophi:[1,2,3],pi:[1,2,3],preliminari:[1,2,3],procedur:[1,2,3],project:0,python:[1,2,3],rapberri:[1,2,3],raspberri:[1,2,3],resist:[1,2,3],resit:4,sourc:4,startup:[1,2,3],step:3,summari:4,tabl:1,technic:[1,2,3],thonni:[1,2,3],titl:1,v:[1,2,3],virtual:[1,2,3]}})
\ No newline at end of file
diff --git a/sphinx/build/latex/LICRcyr2utf8.xdy b/sphinx/build/latex/LICRcyr2utf8.xdy
new file mode 100644
index 0000000000000000000000000000000000000000..a9ca1c82cd661cfa1583e86fa881644d029d061f
--- /dev/null
+++ b/sphinx/build/latex/LICRcyr2utf8.xdy
@@ -0,0 +1,101 @@
+;; -*- coding: utf-8; mode: Lisp; -*-
+;; style file for xindy
+;; filename: LICRcyr2utf8.xdy
+;; description: style file for xindy which maps back LaTeX Internal
+;;   Character Representation of Cyrillic to utf-8
+;; usage: for use with pdflatex produced .idx files.
+;; Contributed by the Sphinx team, July 2018.
+(merge-rule "\IeC {\'\CYRG }" "Ѓ" :string)
+(merge-rule "\IeC {\'\CYRK }" "Ќ" :string)
+(merge-rule "\IeC {\'\cyrg }" "Ñ“" :string)
+(merge-rule "\IeC {\'\cyrk }" "ќ" :string)
+(merge-rule "\IeC {\CYRA }" "А" :string)
+(merge-rule "\IeC {\CYRB }" "Б" :string)
+(merge-rule "\IeC {\CYRC }" "Ц" :string)
+(merge-rule "\IeC {\CYRCH }" "Ч" :string)
+(merge-rule "\IeC {\CYRD }" "Д" :string)
+(merge-rule "\IeC {\CYRDJE }" "Ђ" :string)
+(merge-rule "\IeC {\CYRDZE }" "Ð…" :string)
+(merge-rule "\IeC {\CYRDZHE }" "Џ" :string)
+(merge-rule "\IeC {\CYRE }" "Е" :string)
+(merge-rule "\IeC {\CYREREV }" "Э" :string)
+(merge-rule "\IeC {\CYRERY }" "Ы" :string)
+(merge-rule "\IeC {\CYRF }" "Ф" :string)
+(merge-rule "\IeC {\CYRG }" "Г" :string)
+(merge-rule "\IeC {\CYRGUP }" "Ґ" :string)
+(merge-rule "\IeC {\CYRH }" "Ð¥" :string)
+(merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string)
+(merge-rule "\IeC {\CYRI }" "И" :string)
+(merge-rule "\IeC {\CYRIE }" "Є" :string)
+(merge-rule "\IeC {\CYRII }" "І" :string)
+(merge-rule "\IeC {\CYRISHRT }" "Й" :string)
+(merge-rule "\IeC {\CYRJE }" "Ј" :string)
+(merge-rule "\IeC {\CYRK }" "К" :string)
+(merge-rule "\IeC {\CYRL }" "Л" :string)
+(merge-rule "\IeC {\CYRLJE }" "Љ" :string)
+(merge-rule "\IeC {\CYRM }" "М" :string)
+(merge-rule "\IeC {\CYRN }" "Н" :string)
+(merge-rule "\IeC {\CYRNJE }" "Њ" :string)
+(merge-rule "\IeC {\CYRO }" "О" :string)
+(merge-rule "\IeC {\CYRP }" "П" :string)
+(merge-rule "\IeC {\CYRR }" "Р" :string)
+(merge-rule "\IeC {\CYRS }" "С" :string)
+(merge-rule "\IeC {\CYRSFTSN }" "Ь" :string)
+(merge-rule "\IeC {\CYRSH }" "Ш" :string)
+(merge-rule "\IeC {\CYRSHCH }" "Щ" :string)
+(merge-rule "\IeC {\CYRT }" "Т" :string)
+(merge-rule "\IeC {\CYRTSHE }" "Ћ" :string)
+(merge-rule "\IeC {\CYRU }" "У" :string)
+(merge-rule "\IeC {\CYRUSHRT }" "ÐŽ" :string)
+(merge-rule "\IeC {\CYRV }" "Ð’" :string)
+(merge-rule "\IeC {\CYRYA }" "Я" :string)
+(merge-rule "\IeC {\CYRYI }" "Ї" :string)
+(merge-rule "\IeC {\CYRYO }" "Ё" :string)
+(merge-rule "\IeC {\CYRYU }" "Ю" :string)
+(merge-rule "\IeC {\CYRZ }" "З" :string)
+(merge-rule "\IeC {\CYRZH }" "Ж" :string)
+(merge-rule "\IeC {\cyra }" "а" :string)
+(merge-rule "\IeC {\cyrb }" "б" :string)
+(merge-rule "\IeC {\cyrc }" "ц" :string)
+(merge-rule "\IeC {\cyrch }" "ч" :string)
+(merge-rule "\IeC {\cyrd }" "д" :string)
+(merge-rule "\IeC {\cyrdje }" "Ñ’" :string)
+(merge-rule "\IeC {\cyrdze }" "Ñ•" :string)
+(merge-rule "\IeC {\cyrdzhe }" "ÑŸ" :string)
+(merge-rule "\IeC {\cyre }" "е" :string)
+(merge-rule "\IeC {\cyrerev }" "э" :string)
+(merge-rule "\IeC {\cyrery }" "Ñ‹" :string)
+(merge-rule "\IeC {\cyrf }" "Ñ„" :string)
+(merge-rule "\IeC {\cyrg }" "г" :string)
+(merge-rule "\IeC {\cyrgup }" "Ò‘" :string)
+(merge-rule "\IeC {\cyrh }" "Ñ…" :string)
+(merge-rule "\IeC {\cyrhrdsn }" "ÑŠ" :string)
+(merge-rule "\IeC {\cyri }" "и" :string)
+(merge-rule "\IeC {\cyrie }" "Ñ”" :string)
+(merge-rule "\IeC {\cyrii }" "Ñ–" :string)
+(merge-rule "\IeC {\cyrishrt }" "й" :string)
+(merge-rule "\IeC {\cyrje }" "ј" :string)
+(merge-rule "\IeC {\cyrk }" "к" :string)
+(merge-rule "\IeC {\cyrl }" "л" :string)
+(merge-rule "\IeC {\cyrlje }" "Ñ™" :string)
+(merge-rule "\IeC {\cyrm }" "м" :string)
+(merge-rule "\IeC {\cyrn }" "н" :string)
+(merge-rule "\IeC {\cyrnje }" "Ñš" :string)
+(merge-rule "\IeC {\cyro }" "о" :string)
+(merge-rule "\IeC {\cyrp }" "п" :string)
+(merge-rule "\IeC {\cyrr }" "Ñ€" :string)
+(merge-rule "\IeC {\cyrs }" "с" :string)
+(merge-rule "\IeC {\cyrsftsn }" "ь" :string)
+(merge-rule "\IeC {\cyrsh }" "ш" :string)
+(merge-rule "\IeC {\cyrshch }" "щ" :string)
+(merge-rule "\IeC {\cyrt }" "Ñ‚" :string)
+(merge-rule "\IeC {\cyrtshe }" "Ñ›" :string)
+(merge-rule "\IeC {\cyru }" "у" :string)
+(merge-rule "\IeC {\cyrushrt }" "Ñž" :string)
+(merge-rule "\IeC {\cyrv }" "в" :string)
+(merge-rule "\IeC {\cyrya }" "я" :string)
+(merge-rule "\IeC {\cyryi }" "Ñ—" :string)
+(merge-rule "\IeC {\cyryo }" "Ñ‘" :string)
+(merge-rule "\IeC {\cyryu }" "ÑŽ" :string)
+(merge-rule "\IeC {\cyrz }" "з" :string)
+(merge-rule "\IeC {\cyrzh }" "ж" :string)
diff --git a/sphinx/build/latex/LICRlatin2utf8.xdy b/sphinx/build/latex/LICRlatin2utf8.xdy
new file mode 100644
index 0000000000000000000000000000000000000000..31c80f97ce0bff10be2125d818241a829e014a4e
--- /dev/null
+++ b/sphinx/build/latex/LICRlatin2utf8.xdy
@@ -0,0 +1,239 @@
+;; style file for xindy
+;; filename: LICRlatin2utf8.xdy
+;; description: style file for xindy which maps back LaTeX Internal
+;;   Character Representation of letters (as arising in .idx index
+;;   file) to UTF-8 encoding for correct sorting by xindy.
+;; usage: for use with the pdflatex engine,
+;;        *not* for use with xelatex or lualatex.
+;;
+;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy.
+;; The modifications include:
+;;
+;; - Updates for compatibility with current LaTeX macro encoding.
+;;
+;; - Systematic usage of the \IeC {...} mark-up, because mark-up in
+;;   tex/inputenc/utf8.xdy was using it on seemingly random basis, and
+;;   Sphinx coercing of xindy usability for both Latin and Cyrillic scripts
+;;   with pdflatex requires its systematic presence here.
+;;
+;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ.
+;;
+;;   Indeed Sphinx needs to support for pdflatex engine all Unicode letters
+;;   available in TeX T1 font encoding.  The above letters are found in
+;;   that encoding but not in the Latin1, 2, 3 charsets which are those
+;;   covered by original tex/inputenc/utf8.xdy.
+;;
+;; - There is a problem that È· is not supported out-of-the box by LaTeX
+;;   with inputenc, one must add explicitely
+;;       \DeclareUnicodeCharacter{0237}{\j}
+;;   to preamble of LaTeX document.  However this character is not supported
+;;   by the TeX "times" font used by default by Sphinx for pdflatex engine.
+;;
+;;     **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and
+;;                  \.{} need no extra user declaration anymore.
+;;
+;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up).
+;;
+;; - U+02DB (Ë›) and U+02D9 (Ë™) are also not supported by inputenc
+;;   out of the box and require
+;;       \DeclareUnicodeCharacter{02DB}{\k{}}
+;;       \DeclareUnicodeCharacter{02D9}{\.{}}
+;;   to be added to preamble.
+;;
+;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings.
+;;
+;; - Characters ÅŠ and Å‹ are not supported by TeX font "times" used by
+;;   default by Sphinx for pdflatex engine but they are supported by
+;;   some TeX fonts, in particular by the default LaTeX font for T1
+;;   encoding.
+;;
+;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules.
+;;
+;; Contributed by the Sphinx team, July 2018.
+;;
+;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer.
+(merge-rule "\IeC {\textonesuperior }" "¹" :string)
+(merge-rule "\IeC {\texttwosuperior }" "²" :string)
+(merge-rule "\IeC {\textthreesuperior }" "³" :string)
+(merge-rule "\IeC {\'a}" "á" :string)
+(merge-rule "\IeC {\'A}" "Á" :string)
+(merge-rule "\IeC {\`a}" "à" :string)
+(merge-rule "\IeC {\`A}" "À" :string)
+(merge-rule "\IeC {\^a}" "â" :string)
+(merge-rule "\IeC {\^A}" "Â" :string)
+(merge-rule "\IeC {\~"a}" "ä" :string)
+(merge-rule "\IeC {\~"A}" "Ä" :string)
+(merge-rule "\IeC {\~~a}" "ã" :string)
+(merge-rule "\IeC {\~~A}" "Ã" :string)
+(merge-rule "\IeC {\c c}" "ç" :string)
+(merge-rule "\IeC {\c C}" "Ç" :string)
+(merge-rule "\IeC {\'c}" "ć" :string)
+(merge-rule "\IeC {\'C}" "Ć" :string)
+(merge-rule "\IeC {\^c}" "ĉ" :string)
+(merge-rule "\IeC {\^C}" "Ĉ" :string)
+(merge-rule "\IeC {\.c}" "Ä‹" :string)
+(merge-rule "\IeC {\.C}" "ÄŠ" :string)
+(merge-rule "\IeC {\c s}" "ÅŸ" :string)
+(merge-rule "\IeC {\c S}" "Åž" :string)
+(merge-rule "\IeC {\c t}" "Å£" :string)
+(merge-rule "\IeC {\c T}" "Å¢" :string)
+(merge-rule "\IeC {\-}" "­" :string); soft hyphen
+(merge-rule "\IeC {\textdiv }" "÷" :string)
+(merge-rule "\IeC {\'e}" "é" :string)
+(merge-rule "\IeC {\'E}" "É" :string)
+(merge-rule "\IeC {\`e}" "è" :string)
+(merge-rule "\IeC {\`E}" "È" :string)
+(merge-rule "\IeC {\^e}" "ê" :string)
+(merge-rule "\IeC {\^E}" "Ê" :string)
+(merge-rule "\IeC {\~"e}" "ë" :string)
+(merge-rule "\IeC {\~"E}" "Ë" :string)
+(merge-rule "\IeC {\^g}" "ĝ" :string)
+(merge-rule "\IeC {\^G}" "Ĝ" :string)
+(merge-rule "\IeC {\.g}" "Ä¡" :string)
+(merge-rule "\IeC {\.G}" "Ä " :string)
+(merge-rule "\IeC {\^h}" "Ä¥" :string)
+(merge-rule "\IeC {\^H}" "Ĥ" :string)
+(merge-rule "\IeC {\H o}" "Å‘" :string)
+(merge-rule "\IeC {\H O}" "Ő" :string)
+(merge-rule "\IeC {\textacutedbl }" "˝" :string)
+(merge-rule "\IeC {\H u}" "ű" :string)
+(merge-rule "\IeC {\H U}" "Å°" :string)
+(merge-rule "\IeC {\ae }" "æ" :string)
+(merge-rule "\IeC {\AE }" "Æ" :string)
+(merge-rule "\IeC {\textcopyright }" "©" :string)
+(merge-rule "\IeC {\c \ }" "¸" :string)
+(merge-rule "\IeC {\dh }" "ð" :string)
+(merge-rule "\IeC {\DH }" "Ð" :string)
+(merge-rule "\IeC {\dj }" "Ä‘" :string)
+(merge-rule "\IeC {\DJ }" "Đ" :string)
+(merge-rule "\IeC {\guillemotleft }" "«" :string)
+(merge-rule "\IeC {\guillemotright }" "»" :string)
+(merge-rule "\IeC {\'\i }" "í" :string)
+(merge-rule "\IeC {\`\i }" "ì" :string)
+(merge-rule "\IeC {\^\i }" "î" :string)
+(merge-rule "\IeC {\~"\i }" "ï" :string)
+(merge-rule "\IeC {\i }" "ı" :string)
+(merge-rule "\IeC {\^\j }" "ĵ" :string)
+(merge-rule "\IeC {\k {}}" "Ë›" :string)
+(merge-rule "\IeC {\l }" "Å‚" :string)
+(merge-rule "\IeC {\L }" "Ł" :string)
+(merge-rule "\IeC {\nobreakspace }" " " :string)
+(merge-rule "\IeC {\o }" "ø" :string)
+(merge-rule "\IeC {\O }" "Ø" :string)
+(merge-rule "\IeC {\textsterling }" "£" :string)
+(merge-rule "\IeC {\textparagraph }" "¶" :string)
+(merge-rule "\IeC {\ss }" "ß" :string)
+(merge-rule "\IeC {\textsection }" "§" :string)
+(merge-rule "\IeC {\textbrokenbar }" "¦" :string)
+(merge-rule "\IeC {\textcent }" "¢" :string)
+(merge-rule "\IeC {\textcurrency }" "¤" :string)
+(merge-rule "\IeC {\textdegree }" "°" :string)
+(merge-rule "\IeC {\textexclamdown }" "¡" :string)
+(merge-rule "\IeC {\texthbar }" "ħ" :string)
+(merge-rule "\IeC {\textHbar }" "Ħ" :string)
+(merge-rule "\IeC {\textonehalf }" "½" :string)
+(merge-rule "\IeC {\textonequarter }" "¼" :string)
+(merge-rule "\IeC {\textordfeminine }" "ª" :string)
+(merge-rule "\IeC {\textordmasculine }" "º" :string)
+(merge-rule "\IeC {\textperiodcentered }" "·" :string)
+(merge-rule "\IeC {\textquestiondown }" "¿" :string)
+(merge-rule "\IeC {\textregistered }" "®" :string)
+(merge-rule "\IeC {\textthreequarters }" "¾" :string)
+(merge-rule "\IeC {\textyen }" "Â¥" :string)
+(merge-rule "\IeC {\th }" "þ" :string)
+(merge-rule "\IeC {\TH }" "Þ" :string)
+(merge-rule "\IeC {\'I}" "Í" :string)
+(merge-rule "\IeC {\`I}" "Ì" :string)
+(merge-rule "\IeC {\^I}" "ÃŽ" :string)
+(merge-rule "\IeC {\~"I}" "Ï" :string)
+(merge-rule "\IeC {\.I}" "Ä°" :string)
+(merge-rule "\IeC {\^J}" "Ä´" :string)
+(merge-rule "\IeC {\k a}" "Ä…" :string)
+(merge-rule "\IeC {\k A}" "Ä„" :string)
+(merge-rule "\IeC {\k e}" "Ä™" :string)
+(merge-rule "\IeC {\k E}" "Ę" :string)
+(merge-rule "\IeC {\'l}" "ĺ" :string)
+(merge-rule "\IeC {\'L}" "Ĺ" :string)
+(merge-rule "\IeC {\textlnot }" "¬" :string)
+(merge-rule "\IeC {\textmu }" "µ" :string)
+(merge-rule "\IeC {\'n}" "Å„" :string)
+(merge-rule "\IeC {\'N}" "Ń" :string)
+(merge-rule "\IeC {\~~n}" "ñ" :string)
+(merge-rule "\IeC {\~~N}" "Ñ" :string)
+(merge-rule "\IeC {\'o}" "ó" :string)
+(merge-rule "\IeC {\'O}" "Ó" :string)
+(merge-rule "\IeC {\`o}" "ò" :string)
+(merge-rule "\IeC {\`O}" "Ã’" :string)
+(merge-rule "\IeC {\^o}" "ô" :string)
+(merge-rule "\IeC {\^O}" "Ô" :string)
+(merge-rule "\IeC {\~"o}" "ö" :string)
+(merge-rule "\IeC {\~"O}" "Ö" :string)
+(merge-rule "\IeC {\~~o}" "õ" :string)
+(merge-rule "\IeC {\~~O}" "Õ" :string)
+(merge-rule "\IeC {\textpm }" "±" :string)
+(merge-rule "\IeC {\r a}" "Ã¥" :string)
+(merge-rule "\IeC {\r A}" "Ã…" :string)
+(merge-rule "\IeC {\'r}" "Å•" :string)
+(merge-rule "\IeC {\'R}" "Å”" :string)
+(merge-rule "\IeC {\r u}" "ů" :string)
+(merge-rule "\IeC {\r U}" "Å®" :string)
+(merge-rule "\IeC {\'s}" "Å›" :string)
+(merge-rule "\IeC {\'S}" "Åš" :string)
+(merge-rule "\IeC {\^s}" "ŝ" :string)
+(merge-rule "\IeC {\^S}" "Ŝ" :string)
+(merge-rule "\IeC {\textasciidieresis }" "¨" :string)
+(merge-rule "\IeC {\textasciimacron }" "¯" :string)
+(merge-rule "\IeC {\.{}}" "Ë™" :string)
+(merge-rule "\IeC {\textasciiacute }" "´" :string)
+(merge-rule "\IeC {\texttimes }" "×" :string)
+(merge-rule "\IeC {\u a}" "ă" :string)
+(merge-rule "\IeC {\u A}" "Ä‚" :string)
+(merge-rule "\IeC {\u g}" "ÄŸ" :string)
+(merge-rule "\IeC {\u G}" "Äž" :string)
+(merge-rule "\IeC {\textasciibreve }" "˘" :string)
+(merge-rule "\IeC {\'u}" "ú" :string)
+(merge-rule "\IeC {\'U}" "Ú" :string)
+(merge-rule "\IeC {\`u}" "ù" :string)
+(merge-rule "\IeC {\`U}" "Ù" :string)
+(merge-rule "\IeC {\^u}" "û" :string)
+(merge-rule "\IeC {\^U}" "Û" :string)
+(merge-rule "\IeC {\~"u}" "ü" :string)
+(merge-rule "\IeC {\~"U}" "Ü" :string)
+(merge-rule "\IeC {\u u}" "Å­" :string)
+(merge-rule "\IeC {\u U}" "Ŭ" :string)
+(merge-rule "\IeC {\v c}" "č" :string)
+(merge-rule "\IeC {\v C}" "Č" :string)
+(merge-rule "\IeC {\v d}" "ď" :string)
+(merge-rule "\IeC {\v D}" "ÄŽ" :string)
+(merge-rule "\IeC {\v e}" "Ä›" :string)
+(merge-rule "\IeC {\v E}" "Äš" :string)
+(merge-rule "\IeC {\v l}" "ľ" :string)
+(merge-rule "\IeC {\v L}" "Ľ" :string)
+(merge-rule "\IeC {\v n}" "ň" :string)
+(merge-rule "\IeC {\v N}" "Ň" :string)
+(merge-rule "\IeC {\v r}" "Å™" :string)
+(merge-rule "\IeC {\v R}" "Ř" :string)
+(merge-rule "\IeC {\v s}" "Å¡" :string)
+(merge-rule "\IeC {\v S}" "Å " :string)
+(merge-rule "\IeC {\textasciicaron }" "ˇ" :string)
+(merge-rule "\IeC {\v t}" "Å¥" :string)
+(merge-rule "\IeC {\v T}" "Ť" :string)
+(merge-rule "\IeC {\v z}" "ž" :string)
+(merge-rule "\IeC {\v Z}" "Ž" :string)
+(merge-rule "\IeC {\'y}" "ý" :string)
+(merge-rule "\IeC {\'Y}" "Ý" :string)
+(merge-rule "\IeC {\~"y}" "ÿ" :string)
+(merge-rule "\IeC {\'z}" "ź" :string)
+(merge-rule "\IeC {\'Z}" "Ź" :string)
+(merge-rule "\IeC {\.z}" "ż" :string)
+(merge-rule "\IeC {\.Z}" "Å»" :string)
+;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding
+(merge-rule "\IeC {\~"Y}" "Ÿ" :string)
+(merge-rule "\IeC {\NG }" "ÅŠ" :string)
+(merge-rule "\IeC {\ng }" "Å‹" :string)
+(merge-rule "\IeC {\OE }" "Å’" :string)
+(merge-rule "\IeC {\oe }" "Å“" :string)
+(merge-rule "\IeC {\IJ }" "IJ" :string)
+(merge-rule "\IeC {\ij }" "ij" :string)
+(merge-rule "\IeC {\j }" "È·" :string)
+(merge-rule "\IeC {\SS }" "ẞ" :string)
diff --git a/sphinx/build/latex/LatinRules.xdy b/sphinx/build/latex/LatinRules.xdy
new file mode 100644
index 0000000000000000000000000000000000000000..99f14a2ee856d0ec3078dd78700f43524f4a702c
--- /dev/null
+++ b/sphinx/build/latex/LatinRules.xdy
@@ -0,0 +1,607 @@
+;; style file for xindy
+;; filename: LatinRules.xdy
+;;
+;; It is based upon xindy's files lang/general/utf8.xdy and
+;; lang/general/utf8-lang.xdy which implement
+;; "a general sorting order for Western European languages"
+;;
+;; The aim for Sphinx is to be able to index in a Cyrillic document
+;; also terms using the Latin alphabets, inclusive of letters
+;; with diacritics.  To this effect the xindy rules from lang/general
+;; got manually re-coded to avoid collisions with the encoding
+;; done by xindy for sorting words in Cyrillic languages, which was
+;; observed not to use bytes with octal encoding 0o266 or higher.
+;;
+;; So here we use only 0o266 or higher bytes.
+;; (Ŋ, ŋ, IJ, and ij are absent from
+;; lang/general/utf8.xdy and not included here)
+;; Contributed by the Sphinx team, 2018.
+
+(define-letter-group "A" :prefixes ("¶"))
+(define-letter-group "B" :after "A" :prefixes ("·"))
+(define-letter-group "C" :after "B" :prefixes ("¸"))
+(define-letter-group "D" :after "C" :prefixes ("¹"))
+(define-letter-group "E" :after "D" :prefixes ("º"))
+(define-letter-group "F" :after "E" :prefixes ("»"))
+(define-letter-group "G" :after "F" :prefixes ("¼"))
+(define-letter-group "H" :after "G" :prefixes ("½"))
+(define-letter-group "I" :after "H" :prefixes ("¾"))
+(define-letter-group "J" :after "I" :prefixes ("¿"))
+(define-letter-group "K" :after "J" :prefixes ("À"))
+(define-letter-group "L" :after "K" :prefixes ("Á"))
+(define-letter-group "M" :after "L" :prefixes ("Â"))
+(define-letter-group "N" :after "M" :prefixes ("Ã"))
+(define-letter-group "O" :after "N" :prefixes ("Ä"))
+(define-letter-group "P" :after "O" :prefixes ("È"))
+(define-letter-group "Q" :after "P" :prefixes ("Ê"))
+(define-letter-group "R" :after "Q" :prefixes ("Ë"))
+(define-letter-group "S" :after "R" :prefixes ("Ð"))
+(define-letter-group "T" :after "S" :prefixes ("Ú"))
+(define-letter-group "U" :after "T" :prefixes ("à"))
+(define-letter-group "V" :after "U" :prefixes ("å"))
+(define-letter-group "W" :after "V" :prefixes ("æ"))
+(define-letter-group "X" :after "W" :prefixes ("ë"))
+(define-letter-group "Y" :after "X" :prefixes ("í"))
+(define-letter-group "Z" :after "Y" :prefixes ("ð"))
+
+(define-rule-set "sphinx-xy-alphabetize"
+
+  :rules  (("À" "¶" :string)
+           ("Ä‚" "¶" :string)
+           ("â" "¶" :string)
+           ("Ä" "¶" :string)
+           ("à" "¶" :string)
+           ("Ã…" "¶" :string)
+           ("Ã" "¶" :string)
+           ("Á" "¶" :string)
+           ("á" "¶" :string)
+           ("ã" "¶" :string)
+           ("Â" "¶" :string)
+           ("ă" "¶" :string)
+           ("Ã¥" "¶" :string)
+           ("Ä…" "¶" :string)
+           ("ä" "¶" :string)
+           ("Ä„" "¶" :string)
+           ("æ" "¶º" :string)
+           ("Æ" "¶º" :string)
+           ("ć" "¸" :string)
+           ("ĉ" "¸" :string)
+           ("ç" "¸" :string)
+           ("ÄŒ" "¸" :string)
+           ("č" "¸" :string)
+           ("Ĉ" "¸" :string)
+           ("Ç" "¸" :string)
+           ("Ć" "¸" :string)
+           ("ď" "¹" :string)
+           ("Đ" "¹" :string)
+           ("ÄŽ" "¹" :string)
+           ("Ä‘" "¹" :string)
+           ("ê" "º" :string)
+           ("Ę" "º" :string)
+           ("Äš" "º" :string)
+           ("ë" "º" :string)
+           ("Ä›" "º" :string)
+           ("é" "º" :string)
+           ("È" "º" :string)
+           ("Ë" "º" :string)
+           ("É" "º" :string)
+           ("è" "º" :string)
+           ("Ê" "º" :string)
+           ("Ä™" "º" :string)
+           ("ĝ" "¼" :string)
+           ("ÄŸ" "¼" :string)
+           ("Äž" "¼" :string)
+           ("Äœ" "¼" :string)
+           ("Ä¥" "½" :string)
+           ("Ĥ" "½" :string)
+           ("Ï" "¾" :string)
+           ("Í" "¾" :string)
+           ("ï" "¾" :string)
+           ("ÃŽ" "¾" :string)
+           ("î" "¾" :string)
+           ("ı" "¾" :string)
+           ("Ä°" "¾" :string)
+           ("í" "¾" :string)
+           ("ÃŒ" "¾" :string)
+           ("ì" "¾" :string)
+           ("Ä´" "¿" :string)
+           ("ĵ" "¿" :string)
+           ("Å‚" "Á" :string)
+           ("Ł" "Á" :string)
+           ("ľ" "Á" :string)
+           ("Ľ" "Á" :string)
+           ("Å„" "Ã" :string)
+           ("Ń" "Ã" :string)
+           ("ñ" "Ã" :string)
+           ("ň" "Ã" :string)
+           ("Ñ" "Ã" :string)
+           ("Ň" "Ã" :string)
+           ("Õ" "Ä" :string)
+           ("Ő" "Ä" :string)
+           ("ó" "Ä" :string)
+           ("ö" "Ä" :string)
+           ("ô" "Ä" :string)
+           ("Å‘" "Ä" :string)
+           ("Ø" "Ä" :string)
+           ("Ö" "Ä" :string)
+           ("õ" "Ä" :string)
+           ("Ô" "Ä" :string)
+           ("ø" "Ä" :string)
+           ("Ó" "Ä" :string)
+           ("Ã’" "Ä" :string)
+           ("ò" "Ä" :string)
+           ("œ" "ĺ" :string)
+           ("Œ" "ĺ" :string)
+           ("Ř" "Ë" :string)
+           ("Å™" "Ë" :string)
+           ("Å”" "Ë" :string)
+           ("Å•" "Ë" :string)
+           ("ŝ" "Ð" :string)
+           ("Åš" "Ð" :string)
+           ("È™" "Ð" :string)
+           ("ÅŸ" "Ð" :string)
+           ("Åœ" "Ð" :string)
+           ("Å›" "Ð" :string)
+           ("Ș" "Ð" :string)
+           ("Å¡" "Ð" :string)
+           ("Åž" "Ð" :string)
+           ("Å " "Ð" :string)
+           ("ß" "ÐÐ" :string)
+           ("Èš" "Ú" :string)
+           ("Ť" "Ú" :string)
+           ("È›" "Ú" :string)
+           ("Å¥" "Ú" :string)
+           ("û" "à" :string)
+           ("Å­" "à" :string)
+           ("ů" "à" :string)
+           ("ű" "à" :string)
+           ("ù" "à" :string)
+           ("Ŭ" "à" :string)
+           ("Ù" "à" :string)
+           ("Å°" "à" :string)
+           ("Ãœ" "à" :string)
+           ("Å®" "à" :string)
+           ("ú" "à" :string)
+           ("Ú" "à" :string)
+           ("Û" "à" :string)
+           ("ü" "à" :string)
+           ("ÿ" "í" :string)
+           ("Ý" "í" :string)
+           ("Ÿ" "í" :string)
+           ("ý" "í" :string)
+           ("Å»" "ð" :string)
+           ("Ž" "ð" :string)
+           ("Ź" "ð" :string)
+           ("ž" "ð" :string)
+           ("ż" "ð" :string)
+           ("ź" "ð" :string)
+           ("a" "¶" :string)
+           ("A" "¶" :string)
+           ("b" "·" :string)
+           ("B" "·" :string)
+           ("c" "¸" :string)
+           ("C" "¸" :string)
+           ("d" "¹" :string)
+           ("D" "¹" :string)
+           ("e" "º" :string)
+           ("E" "º" :string)
+           ("F" "»" :string)
+           ("f" "»" :string)
+           ("G" "¼" :string)
+           ("g" "¼" :string)
+           ("H" "½" :string)
+           ("h" "½" :string)
+           ("i" "¾" :string)
+           ("I" "¾" :string)
+           ("J" "¿" :string)
+           ("j" "¿" :string)
+           ("K" "À" :string)
+           ("k" "À" :string)
+           ("L" "Á" :string)
+           ("l" "Á" :string)
+           ("M" "Â" :string)
+           ("m" "Â" :string)
+           ("n" "Ã" :string)
+           ("N" "Ã" :string)
+           ("O" "Ä" :string)
+           ("o" "Ä" :string)
+           ("p" "È" :string)
+           ("P" "È" :string)
+           ("Q" "Ê" :string)
+           ("q" "Ê" :string)
+           ("r" "Ë" :string)
+           ("R" "Ë" :string)
+           ("S" "Ð" :string)
+           ("s" "Ð" :string)
+           ("t" "Ú" :string)
+           ("T" "Ú" :string)
+           ("u" "à" :string)
+           ("U" "à" :string)
+           ("v" "å" :string)
+           ("V" "å" :string)
+           ("W" "æ" :string)
+           ("w" "æ" :string)
+           ("x" "ë" :string)
+           ("X" "ë" :string)
+           ("Y" "í" :string)
+           ("y" "í" :string)
+           ("z" "ð" :string)
+           ("Z" "ð" :string)
+           ))
+
+(define-rule-set "sphinx-xy-resolve-diacritics"
+
+  :rules  (("Ĥ" "£" :string)
+           ("ó" "£" :string)
+           ("ľ" "£" :string)
+           ("Ř" "£" :string)
+           ("ĝ" "£" :string)
+           ("ď" "£" :string)
+           ("Äš" "£" :string)
+           ("Ä¥" "£" :string)
+           ("ÄŒ" "£" :string)
+           ("Ä´" "£" :string)
+           ("Ä›" "£" :string)
+           ("ž" "£" :string)
+           ("ÄŽ" "£" :string)
+           ("Å™" "£" :string)
+           ("Ž" "£" :string)
+           ("ı" "£" :string)
+           ("Ť" "£" :string)
+           ("á" "£" :string)
+           ("č" "£" :string)
+           ("Á" "£" :string)
+           ("ň" "£" :string)
+           ("Å " "£" :string)
+           ("Ň" "£" :string)
+           ("ĵ" "£" :string)
+           ("Å¥" "£" :string)
+           ("Ó" "£" :string)
+           ("ý" "£" :string)
+           ("Äœ" "£" :string)
+           ("Ú" "£" :string)
+           ("Ľ" "£" :string)
+           ("Å¡" "£" :string)
+           ("Ý" "£" :string)
+           ("ú" "£" :string)
+           ("Åš" "¤" :string)
+           ("ć" "¤" :string)
+           ("Ł" "¤" :string)
+           ("Å‚" "¤" :string)
+           ("Å„" "¤" :string)
+           ("À" "¤" :string)
+           ("Ź" "¤" :string)
+           ("à" "¤" :string)
+           ("Ń" "¤" :string)
+           ("Đ" "¤" :string)
+           ("ÿ" "¤" :string)
+           ("Å›" "¤" :string)
+           ("Äž" "¤" :string)
+           ("ÄŸ" "¤" :string)
+           ("Ù" "¤" :string)
+           ("Ä°" "¤" :string)
+           ("Ä‘" "¤" :string)
+           ("ù" "¤" :string)
+           ("Èš" "¤" :string)
+           ("é" "¤" :string)
+           ("Å•" "¤" :string)
+           ("Ć" "¤" :string)
+           ("È›" "¤" :string)
+           ("ò" "¤" :string)
+           ("ź" "¤" :string)
+           ("Ã’" "¤" :string)
+           ("Ÿ" "¤" :string)
+           ("Å”" "¤" :string)
+           ("É" "¤" :string)
+           ("ĉ" "¥" :string)
+           ("ô" "¥" :string)
+           ("Í" "¥" :string)
+           ("ŝ" "¥" :string)
+           ("Å»" "¥" :string)
+           ("Ä‚" "¥" :string)
+           ("Åœ" "¥" :string)
+           ("ñ" "¥" :string)
+           ("Å­" "¥" :string)
+           ("í" "¥" :string)
+           ("È" "¥" :string)
+           ("Ô" "¥" :string)
+           ("Ŭ" "¥" :string)
+           ("ż" "¥" :string)
+           ("Ñ" "¥" :string)
+           ("è" "¥" :string)
+           ("Ĉ" "¥" :string)
+           ("ă" "¥" :string)
+           ("â" "¦" :string)
+           ("û" "¦" :string)
+           ("ê" "¦" :string)
+           ("Õ" "¦" :string)
+           ("õ" "¦" :string)
+           ("È™" "¦" :string)
+           ("ç" "¦" :string)
+           ("Â" "¦" :string)
+           ("Ê" "¦" :string)
+           ("Û" "¦" :string)
+           ("Ç" "¦" :string)
+           ("ì" "¦" :string)
+           ("ÃŒ" "¦" :string)
+           ("Ș" "¦" :string)
+           ("ö" "§" :string)
+           ("Ö" "§" :string)
+           ("ÅŸ" "§" :string)
+           ("ů" "§" :string)
+           ("ë" "§" :string)
+           ("ã" "§" :string)
+           ("î" "§" :string)
+           ("ÃŽ" "§" :string)
+           ("Ã" "§" :string)
+           ("Åž" "§" :string)
+           ("Å®" "§" :string)
+           ("Ë" "§" :string)
+           ("ï" "¨" :string)
+           ("Ő" "¨" :string)
+           ("Ï" "¨" :string)
+           ("Ę" "¨" :string)
+           ("Å‘" "¨" :string)
+           ("Ãœ" "¨" :string)
+           ("Ã…" "¨" :string)
+           ("ü" "¨" :string)
+           ("Ä™" "¨" :string)
+           ("Ã¥" "¨" :string)
+           ("Ä" "©" :string)
+           ("ű" "©" :string)
+           ("Ø" "©" :string)
+           ("ø" "©" :string)
+           ("Å°" "©" :string)
+           ("ä" "©" :string)
+           ("Ä„" "ª" :string)
+           ("Ä…" "ª" :string)
+           ("Å“" "ÿ" :string)
+           ("ß" "ÿ" :string)
+           ("Æ" "ÿ" :string)
+           ("Å’" "ÿ" :string)
+           ("æ" "ÿ" :string)
+           ("e" "¢" :string)
+           ("t" "¢" :string)
+           ("L" "¢" :string)
+           ("Y" "¢" :string)
+           ("J" "¢" :string)
+           ("a" "¢" :string)
+           ("p" "¢" :string)
+           ("u" "¢" :string)
+           ("j" "¢" :string)
+           ("b" "¢" :string)
+           ("G" "¢" :string)
+           ("U" "¢" :string)
+           ("F" "¢" :string)
+           ("H" "¢" :string)
+           ("i" "¢" :string)
+           ("z" "¢" :string)
+           ("c" "¢" :string)
+           ("l" "¢" :string)
+           ("A" "¢" :string)
+           ("Q" "¢" :string)
+           ("w" "¢" :string)
+           ("D" "¢" :string)
+           ("R" "¢" :string)
+           ("d" "¢" :string)
+           ("s" "¢" :string)
+           ("r" "¢" :string)
+           ("k" "¢" :string)
+           ("v" "¢" :string)
+           ("m" "¢" :string)
+           ("P" "¢" :string)
+           ("y" "¢" :string)
+           ("K" "¢" :string)
+           ("q" "¢" :string)
+           ("S" "¢" :string)
+           ("I" "¢" :string)
+           ("C" "¢" :string)
+           ("M" "¢" :string)
+           ("Z" "¢" :string)
+           ("T" "¢" :string)
+           ("W" "¢" :string)
+           ("B" "¢" :string)
+           ("h" "¢" :string)
+           ("x" "¢" :string)
+           ("X" "¢" :string)
+           ("f" "¢" :string)
+           ("E" "¢" :string)
+           ("V" "¢" :string)
+           ("N" "¢" :string)
+           ("O" "¢" :string)
+           ("o" "¢" :string)
+           ("g" "¢" :string)
+           ("n" "¢" :string)
+           ))
+
+(define-rule-set "sphinx-xy-resolve-case"
+
+  :rules  (("Ú" "8" :string)
+           ("Ÿ" "8" :string)
+           ("Ç" "8" :string)
+           ("Ĉ" "8" :string)
+           ("Å”" "8" :string)
+           ("Ľ" "8" :string)
+           ("Å®" "8" :string)
+           ("Ý" "8" :string)
+           ("É" "8" :string)
+           ("Ë" "8" :string)
+           ("Ș" "8" :string)
+           ("Ì" "8" :string)
+           ("Ê" "8" :string)
+           ("Ň" "8" :string)
+           ("Ä„" "8" :string)
+           ("Å " "8" :string)
+           ("Û" "8" :string)
+           ("Åž" "8" :string)
+           ("Ć" "8" :string)
+           ("Ã’" "8" :string)
+           ("Ĝ" "8" :string)
+           ("Ñ" "8" :string)
+           ("Ó" "8" :string)
+           ("ÃŽ" "8" :string)
+           ("Á" "8" :string)
+           ("Ã" "8" :string)
+           ("Èš" "8" :string)
+           ("Ã…" "8" :string)
+           ("Äž" "8" :string)
+           ("Ü" "8" :string)
+           ("È" "8" :string)
+           ("Ô" "8" :string)
+           ("Ä°" "8" :string)
+           ("Å°" "8" :string)
+           ("Ù" "8" :string)
+           ("Ŭ" "8" :string)
+           ("Â" "8" :string)
+           ("Ť" "8" :string)
+           ("Ń" "8" :string)
+           ("ÄŽ" "8" :string)
+           ("Ź" "8" :string)
+           ("Ž" "8" :string)
+           ("Đ" "8" :string)
+           ("Ŝ" "8" :string)
+           ("Č" "8" :string)
+           ("Ä´" "8" :string)
+           ("Ö" "8" :string)
+           ("Ø" "8" :string)
+           ("Å»" "8" :string)
+           ("Ł" "8" :string)
+           ("Ä‚" "8" :string)
+           ("Äš" "8" :string)
+           ("Ő" "8" :string)
+           ("Õ" "8" :string)
+           ("Ę" "8" :string)
+           ("Ï" "8" :string)
+           ("À" "8" :string)
+           ("Ĥ" "8" :string)
+           ("Ä" "8" :string)
+           ("Åš" "8" :string)
+           ("Ř" "8" :string)
+           ("Í" "8" :string)
+           ("Å’" "89" :string)
+           ("Æ" "89" :string)
+           ("ì" "9" :string)
+           ("è" "9" :string)
+           ("Ä…" "9" :string)
+           ("Å¡" "9" :string)
+           ("ú" "9" :string)
+           ("Ã¥" "9" :string)
+           ("ă" "9" :string)
+           ("Ä™" "9" :string)
+           ("ü" "9" :string)
+           ("ź" "9" :string)
+           ("ò" "9" :string)
+           ("Å¥" "9" :string)
+           ("È›" "9" :string)
+           ("ĵ" "9" :string)
+           ("Å•" "9" :string)
+           ("ż" "9" :string)
+           ("ä" "9" :string)
+           ("ý" "9" :string)
+           ("ù" "9" :string)
+           ("á" "9" :string)
+           ("é" "9" :string)
+           ("č" "9" :string)
+           ("ň" "9" :string)
+           ("Å›" "9" :string)
+           ("ø" "9" :string)
+           ("í" "9" :string)
+           ("Ä‘" "9" :string)
+           ("ı" "9" :string)
+           ("ÄŸ" "9" :string)
+           ("î" "9" :string)
+           ("ã" "9" :string)
+           ("à" "9" :string)
+           ("Å™" "9" :string)
+           ("Å‘" "9" :string)
+           ("ů" "9" :string)
+           ("È™" "9" :string)
+           ("ÿ" "9" :string)
+           ("ë" "9" :string)
+           ("Å­" "9" :string)
+           ("ç" "9" :string)
+           ("ű" "9" :string)
+           ("ñ" "9" :string)
+           ("õ" "9" :string)
+           ("Ä›" "9" :string)
+           ("ÅŸ" "9" :string)
+           ("ž" "9" :string)
+           ("ĝ" "9" :string)
+           ("ŝ" "9" :string)
+           ("Å„" "9" :string)
+           ("û" "9" :string)
+           ("Å‚" "9" :string)
+           ("ď" "9" :string)
+           ("Ä¥" "9" :string)
+           ("ê" "9" :string)
+           ("ô" "9" :string)
+           ("ĉ" "9" :string)
+           ("â" "9" :string)
+           ("ć" "9" :string)
+           ("ï" "9" :string)
+           ("ö" "9" :string)
+           ("ľ" "9" :string)
+           ("ó" "9" :string)
+           ("æ" "99" :string)
+           ("ß" "99" :string)
+           ("Å“" "99" :string)
+           ("N" "8" :string)
+           ("V" "8" :string)
+           ("O" "8" :string)
+           ("X" "8" :string)
+           ("E" "8" :string)
+           ("P" "8" :string)
+           ("K" "8" :string)
+           ("T" "8" :string)
+           ("Z" "8" :string)
+           ("M" "8" :string)
+           ("C" "8" :string)
+           ("I" "8" :string)
+           ("S" "8" :string)
+           ("B" "8" :string)
+           ("W" "8" :string)
+           ("D" "8" :string)
+           ("R" "8" :string)
+           ("H" "8" :string)
+           ("F" "8" :string)
+           ("Q" "8" :string)
+           ("A" "8" :string)
+           ("G" "8" :string)
+           ("U" "8" :string)
+           ("J" "8" :string)
+           ("Y" "8" :string)
+           ("L" "8" :string)
+           ("o" "9" :string)
+           ("n" "9" :string)
+           ("g" "9" :string)
+           ("x" "9" :string)
+           ("f" "9" :string)
+           ("y" "9" :string)
+           ("q" "9" :string)
+           ("h" "9" :string)
+           ("w" "9" :string)
+           ("s" "9" :string)
+           ("d" "9" :string)
+           ("v" "9" :string)
+           ("k" "9" :string)
+           ("r" "9" :string)
+           ("m" "9" :string)
+           ("z" "9" :string)
+           ("c" "9" :string)
+           ("i" "9" :string)
+           ("l" "9" :string)
+           ("b" "9" :string)
+           ("j" "9" :string)
+           ("a" "9" :string)
+           ("p" "9" :string)
+           ("u" "9" :string)
+           ("t" "9" :string)
+           ("e" "9" :string)
+           ))
+
+(use-rule-set :run 0
+	      :rule-set ("sphinx-xy-alphabetize"))
+(use-rule-set :run 1
+	      :rule-set ("sphinx-xy-resolve-diacritics"))
+(use-rule-set :run 2
+	      :rule-set ("sphinx-xy-resolve-case"))
diff --git a/sphinx/build/latex/Makefile b/sphinx/build/latex/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..b1a5d2d2ff9f53a8a206a1ad6cbad76ea7f59c55
--- /dev/null
+++ b/sphinx/build/latex/Makefile
@@ -0,0 +1,81 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+ALLPS  = $(addsuffix .ps,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPREFIX =
+# Additional LaTeX options
+LATEXOPTS =
+# format: pdf or dvi
+FMT = pdf
+
+LATEX = latex
+PDFLATEX = pdflatex
+MAKEINDEX = makeindex
+
+
+all: $(ALLPDF)
+all-pdf: $(ALLPDF)
+all-dvi: $(ALLDVI)
+all-ps: $(ALLPS)
+
+all-pdf-ja:
+	for f in *.pdf *.png *.gif *.jpg *.jpeg; do extractbb $$f; done
+	for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done
+	for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done
+	for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done
+	-for f in *.idx; do mendex -U -f -d "`basename $$f .idx`.dic" -s python.ist $$f; done
+	for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done
+	for f in *.tex; do platex -kanji=utf8 $(LATEXOPTS) $$f; done
+	for f in *.dvi; do dvipdfmx $$f; done
+
+zip: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+	mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+	cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+	tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+	rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+gz: tar
+	gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz
+
+bz2: tar
+	bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+xz: tar
+	xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+# The number of LaTeX runs is quite conservative, but I don't expect it
+# to get run often, so the little extra time won't hurt.
+%.dvi: %.tex
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+	-$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+
+%.pdf: %.tex
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	-$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+
+%.ps: %.dvi
+	dvips '$<'
+
+clean:
+	rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI)
+
+.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz
+.PHONY: all-pdf-ja
diff --git a/sphinx/build/latex/Under-Construction.png b/sphinx/build/latex/Under-Construction.png
new file mode 100644
index 0000000000000000000000000000000000000000..52b5e449c814895d1cf90a37e92152e96cf3548a
Binary files /dev/null and b/sphinx/build/latex/Under-Construction.png differ
diff --git a/sphinx/build/latex/cable.jpg b/sphinx/build/latex/cable.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ac41ddaa8a5fce47d255ab87a89d3baf0a01d7a6
Binary files /dev/null and b/sphinx/build/latex/cable.jpg differ
diff --git a/sphinx/build/latex/connection.jpg b/sphinx/build/latex/connection.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e2b5e01b748d01d8eeed57b2526b83dd00822605
Binary files /dev/null and b/sphinx/build/latex/connection.jpg differ
diff --git a/sphinx/build/latex/current_board.jpg b/sphinx/build/latex/current_board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..02ae47cf8b521a846fa3a7cb19aee6235abc5e37
Binary files /dev/null and b/sphinx/build/latex/current_board.jpg differ
diff --git a/sphinx/build/latex/electrode_cable.jpg b/sphinx/build/latex/electrode_cable.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b08e282454dc329e4f08635d10e1e64ff9a9af29
Binary files /dev/null and b/sphinx/build/latex/electrode_cable.jpg differ
diff --git a/sphinx/build/latex/footnotehyper-sphinx.sty b/sphinx/build/latex/footnotehyper-sphinx.sty
new file mode 100644
index 0000000000000000000000000000000000000000..b6692cfb859b90c91dff079bb08fc12bbde2ccd1
--- /dev/null
+++ b/sphinx/build/latex/footnotehyper-sphinx.sty
@@ -0,0 +1,269 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{footnotehyper-sphinx}%
+ [2017/10/27 v1.7 hyperref aware footnote.sty for sphinx (JFB)]
+%%
+%% Package: footnotehyper-sphinx
+%% Version: based on footnotehyper.sty 2017/03/07 v1.0
+%% as available at https://www.ctan.org/pkg/footnotehyper
+%% License: the one applying to Sphinx
+%%
+%% Refer to the PDF documentation  at https://www.ctan.org/pkg/footnotehyper for
+%% the code comments.
+%%
+%% Differences:
+%% 1. a partial tabulary compatibility layer added (enough for Sphinx mark-up),
+%% 2. use of \spx@opt@BeforeFootnote from sphinx.sty,
+%% 3. use of \sphinxunactivateextrasandspace from sphinx.sty,
+%% 4. macro definition \sphinxfootnotemark,
+%% 5. macro definition \sphinxlongtablepatch
+%% 6. replaced an \undefined by \@undefined
+\DeclareOption*{\PackageWarning{footnotehyper-sphinx}{Option `\CurrentOption' is unknown}}%
+\ProcessOptions\relax
+\newbox\FNH@notes
+\newdimen\FNH@width
+\let\FNH@colwidth\columnwidth
+\newif\ifFNH@savingnotes
+\AtBeginDocument {%
+    \let\FNH@latex@footnote    \footnote
+    \let\FNH@latex@footnotetext\footnotetext
+    \let\FNH@H@@footnotetext   \@footnotetext
+    \newenvironment{savenotes}
+        {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}%
+    \let\spewnotes      \FNH@spewnotes
+    \let\footnote       \FNH@footnote
+    \let\footnotetext   \FNH@footnotetext
+    \let\endfootnote    \FNH@endfntext
+    \let\endfootnotetext\FNH@endfntext
+    \@ifpackageloaded{hyperref}
+     {\ifHy@hyperfootnotes
+         \let\FNH@H@@footnotetext\H@@footnotetext
+      \else
+         \let\FNH@hyper@fntext\FNH@nohyp@fntext
+      \fi}%
+     {\let\FNH@hyper@fntext\FNH@nohyp@fntext}%
+}%
+\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}%
+\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}%
+\def\FNH@fntext #1{%
+  \ifx\ifmeasuring@\@undefined
+    \expandafter\@secondoftwo\else\expandafter\@firstofone\fi
+% these two lines modified for Sphinx (tabulary compatibility):
+    {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}%
+    {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$
+}%
+\long\def\FNH@hyper@fntext@i#1{%
+  \global\setbox\FNH@notes\vbox
+  {\unvbox\FNH@notes
+   \FNH@startnote
+   \@makefntext
+    {\rule\z@\footnotesep\ignorespaces
+     \ifHy@nesting\expandafter\ltx@firstoftwo
+             \else\expandafter\ltx@secondoftwo
+     \fi
+     {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}%
+     {\Hy@raisedlink
+       {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}%
+       {\relax}}%
+      \let\@currentHref\Hy@footnote@currentHref
+      \let\@currentlabelname\@empty
+      #1}%
+     \@finalstrut\strutbox
+    }%
+   \FNH@endnote
+  }%
+}%
+\long\def\FNH@nohyp@fntext@i#1{%
+  \global\setbox\FNH@notes\vbox
+  {\unvbox\FNH@notes
+   \FNH@startnote
+   \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+   \FNH@endnote
+  }%
+}%
+\def\FNH@startnote{%
+  \hsize\FNH@colwidth
+  \interlinepenalty\interfootnotelinepenalty
+  \reset@font\footnotesize
+  \floatingpenalty\@MM
+  \@parboxrestore
+  \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}%
+  \color@begingroup
+}%
+\def\FNH@endnote{\color@endgroup}%
+\def\FNH@savenotes{%
+  \begingroup
+  \ifFNH@savingnotes\else
+    \FNH@savingnotestrue
+    \let\@footnotetext    \FNH@hyper@fntext
+    \let\@mpfootnotetext  \FNH@hyper@fntext
+    \let\H@@mpfootnotetext\FNH@nohyp@fntext
+    \FNH@width\columnwidth
+    \let\FNH@colwidth\FNH@width
+    \global\setbox\FNH@notes\box\voidb@x
+    \let\FNH@thempfn\thempfn
+    \let\FNH@mpfn\@mpfn
+    \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi
+    \expandafter\def\expandafter\@minipagerestore\expandafter{%
+      \@minipagerestore
+      \let\thempfn\FNH@thempfn
+      \let\@mpfn\FNH@mpfn
+    }%
+  \fi
+}%
+\def\FNH@spewnotes {%
+  \endgroup
+  \ifFNH@savingnotes\else
+   \ifvoid\FNH@notes\else
+    \begingroup
+     \let\@makefntext\@empty
+     \let\@finalstrut\@gobble
+     \let\rule\@gobbletwo
+     \FNH@H@@footnotetext{\unvbox\FNH@notes}%
+    \endgroup
+   \fi
+  \fi
+}%
+\def\FNH@footnote@envname    {footnote}%
+\def\FNH@footnotetext@envname{footnotetext}%
+\def\FNH@footnote{%
+% this line added for Sphinx:
+    \spx@opt@BeforeFootnote
+    \ifx\@currenvir\FNH@footnote@envname
+        \expandafter\FNH@footnoteenv
+    \else
+        \expandafter\FNH@latex@footnote
+    \fi
+}%
+\def\FNH@footnoteenv{%
+% this line added for Sphinx (footnotes in parsed literal blocks):
+    \catcode13=5 \sphinxunactivateextrasandspace
+    \@ifnextchar[%
+      \FNH@footnoteenv@i %]
+      {\stepcounter\@mpfn
+       \protected@xdef\@thefnmark{\thempfn}%
+       \@footnotemark
+       \def\FNH@endfntext@fntext{\@footnotetext}%
+       \FNH@startfntext}%
+}%
+\def\FNH@footnoteenv@i[#1]{%
+    \begingroup
+     \csname c@\@mpfn\endcsname #1\relax
+     \unrestored@protected@xdef\@thefnmark{\thempfn}%
+    \endgroup
+    \@footnotemark
+    \def\FNH@endfntext@fntext{\@footnotetext}%
+    \FNH@startfntext
+}%
+\def\FNH@footnotetext{%
+    \ifx\@currenvir\FNH@footnotetext@envname
+        \expandafter\FNH@footnotetextenv
+    \else
+        \expandafter\FNH@latex@footnotetext
+    \fi
+}%
+\def\FNH@footnotetextenv{%
+    \@ifnextchar[%
+      \FNH@footnotetextenv@i %]
+      {\protected@xdef\@thefnmark{\thempfn}%
+       \def\FNH@endfntext@fntext{\@footnotetext}%
+       \FNH@startfntext}%
+}%
+\def\FNH@footnotetextenv@i[#1]{%
+    \begingroup
+     \csname c@\@mpfn\endcsname #1\relax
+     \unrestored@protected@xdef\@thefnmark{\thempfn}%
+    \endgroup
+    \ifFNH@savingnotes
+      \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}%
+    \else
+      \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}%
+    \fi
+    \FNH@startfntext
+}%
+\def\FNH@startfntext{%
+  \setbox\z@\vbox\bgroup
+    \FNH@startnote
+    \FNH@prefntext
+    \rule\z@\footnotesep\ignorespaces
+}%
+\def\FNH@endfntext {%
+    \@finalstrut\strutbox
+    \FNH@postfntext
+    \FNH@endnote
+    \egroup
+  \begingroup
+    \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo
+    \FNH@endfntext@fntext {\unvbox\z@}%
+  \endgroup
+}%
+\AtBeginDocument{%
+   \let\FNH@@makefntext\@makefntext
+   \ifx\@makefntextFB\@undefined
+   \expandafter\@gobble\else\expandafter\@firstofone\fi
+   {\ifFBFrenchFootnotes \let\FNH@@makefntext\@makefntextFB \else
+                         \let\FNH@@makefntext\@makefntextORI\fi}%
+   \expandafter\FNH@check@a\FNH@@makefntext{1.2!3?4,}%
+               \FNH@@@1.2!3?4,\FNH@@@\relax
+}%
+\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{%
+    \ifx\relax#3\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+    \FNH@bad@makefntext@alert
+    {\def\FNH@prefntext{#1}\def\FNH@postfntext{#2}\FNH@check@b}%
+}%
+\def\FNH@check@b #1\relax{%
+    \expandafter\expandafter\expandafter\FNH@check@c
+    \expandafter\meaning\expandafter\FNH@prefntext
+    \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax
+}%
+\def\FNH@check@c #11.2!3?4,#2#3\relax{%
+    \ifx\FNH@check@c#2\expandafter\@gobble\fi\FNH@bad@makefntext@alert
+}%
+% slight reformulation for Sphinx
+\def\FNH@bad@makefntext@alert{%
+  \PackageWarningNoLine{footnotehyper-sphinx}%
+    {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J
+  some package modifying macro \string\@makefntext.^^J
+  You can try to report this incompatibility at^^J
+  https://github.com/sphinx-doc/sphinx with this info:}%
+    \typeout{\meaning\@makefntext}%
+    \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty
+}%
+% this macro from original footnote.sty is not used anymore by Sphinx
+% but for simplicity sake let's just keep it as is
+\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%]
+\def\FNH@msne@i #1{%
+  \expandafter\let\csname FNH$#1\expandafter\endcsname %$
+                  \csname #1\endcsname
+  \expandafter\let\csname endFNH$#1\expandafter\endcsname %$
+                  \csname end#1\endcsname
+  \FNH@msne@ii[#1]{FNH$#1}%$
+}%
+\def\FNH@msne@ii[#1]#2{%
+  \expandafter\edef\csname#1\endcsname{%
+    \noexpand\savenotes
+    \expandafter\noexpand\csname#2\endcsname
+  }%
+  \expandafter\edef\csname end#1\endcsname{%
+    \expandafter\noexpand\csname end#2\endcsname
+    \noexpand\expandafter
+    \noexpand\spewnotes
+    \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi
+  }%
+}%
+% end of footnotehyper 2017/02/16 v0.99
+% some extras for Sphinx :
+% \sphinxfootnotemark: usable in section titles and silently removed from TOCs.
+\def\sphinxfootnotemark [#1]%
+   {\ifx\thepage\relax\else\protect\spx@opt@BeforeFootnote
+                             \protect\footnotemark[#1]\fi}%
+\AtBeginDocument{%
+   % let hyperref less complain
+   \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}%
+   % to obtain hyperlinked footnotes in longtable environment we must replace
+   % hyperref's patch of longtable's patch of \@footnotetext by our own
+   \let\LT@p@ftntext\FNH@hyper@fntext
+   % this *requires* longtable to be used always wrapped in savenotes environment
+}%
+\endinput
+%%
+%% End of file `footnotehyper-sphinx.sty'.
diff --git a/sphinx/build/latex/ige.png b/sphinx/build/latex/ige.png
new file mode 100644
index 0000000000000000000000000000000000000000..772ddd99b7baf222f7d82559c86d12e5b3450083
Binary files /dev/null and b/sphinx/build/latex/ige.png differ
diff --git a/sphinx/build/latex/image_ohmpi_2.jpg b/sphinx/build/latex/image_ohmpi_2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d496aff74e226f6b0c683b983230273f7dd078ec
Binary files /dev/null and b/sphinx/build/latex/image_ohmpi_2.jpg differ
diff --git a/sphinx/build/latex/installation_current_board.jpg b/sphinx/build/latex/installation_current_board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2674efdd8fbdbc6cd539fad3e16858783f26bfac
Binary files /dev/null and b/sphinx/build/latex/installation_current_board.jpg differ
diff --git a/sphinx/build/latex/installation_current_board_1_02.jpg b/sphinx/build/latex/installation_current_board_1_02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cb07ab41eb64cf197a32f751708395f584d69914
Binary files /dev/null and b/sphinx/build/latex/installation_current_board_1_02.jpg differ
diff --git a/sphinx/build/latex/latexmkjarc b/sphinx/build/latex/latexmkjarc
new file mode 100644
index 0000000000000000000000000000000000000000..6e36b195b2d3083c18c06bafa280ce86729aa546
--- /dev/null
+++ b/sphinx/build/latex/latexmkjarc
@@ -0,0 +1,22 @@
+$latex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S';
+$dvipdf = 'dvipdfmx %O -o %D %S';
+$makeindex = 'internal mendex %S %B %D';
+sub mendex {
+  my ($source, $basename, $destination) = @_;
+  my $dictfile = $basename . ".dic";
+  unlink($destination);
+  system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source);
+  if ($? > 0) {
+    print("mendex exited with error code $? (ignored)\n");
+  }
+  if (!-e $destination) {
+    # create an empty .ind file if nothing
+    open(FH, ">" . $destination);
+    close(FH);
+  }
+  return 0;
+}
+add_cus_dep( "glo", "gls", 0, "makeglo" );
+sub makeglo {
+ return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
+}
\ No newline at end of file
diff --git a/sphinx/build/latex/latexmkrc b/sphinx/build/latex/latexmkrc
new file mode 100644
index 0000000000000000000000000000000000000000..bba17fa6bc6aa2e1a0f08088b7bd685077463e8e
--- /dev/null
+++ b/sphinx/build/latex/latexmkrc
@@ -0,0 +1,9 @@
+$latex = 'latex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$pdflatex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$makeindex = 'makeindex -s python.ist %O -o %D %S';
+add_cus_dep( "glo", "gls", 0, "makeglo" );
+sub makeglo {
+ return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
+}
\ No newline at end of file
diff --git a/sphinx/build/latex/logo-iris.jpg b/sphinx/build/latex/logo-iris.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fad2ca03927ffbcc771222c86b6f4026700567ef
Binary files /dev/null and b/sphinx/build/latex/logo-iris.jpg differ
diff --git a/sphinx/build/latex/logo_inrae.jpg b/sphinx/build/latex/logo_inrae.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..132e189fa1c59a702242eb42b4ea85a6a34a191e
Binary files /dev/null and b/sphinx/build/latex/logo_inrae.jpg differ
diff --git a/sphinx/build/latex/logo_ohmpi.JPG b/sphinx/build/latex/logo_ohmpi.JPG
new file mode 100644
index 0000000000000000000000000000000000000000..2fe9b5d6b5248b0c31baae591b0d6706f3877945
Binary files /dev/null and b/sphinx/build/latex/logo_ohmpi.JPG differ
diff --git a/sphinx/build/latex/logo_univ_gustave.png b/sphinx/build/latex/logo_univ_gustave.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac3f6d9676b1dba15f6897f8f11d75b84d3d30a
Binary files /dev/null and b/sphinx/build/latex/logo_univ_gustave.png differ
diff --git a/sphinx/build/latex/make.bat b/sphinx/build/latex/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..94bda2139156340fc42bb1cb678e49ac9ac8d3c6
--- /dev/null
+++ b/sphinx/build/latex/make.bat
@@ -0,0 +1,31 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+pushd %~dp0
+
+set PDFLATEX=latexmk -pdf -dvi- -ps-
+
+set "LATEXOPTS= "
+
+if "%1" == "" goto all-pdf
+
+if "%1" == "all-pdf" (
+	:all-pdf
+	for %%i in (*.tex) do (
+		%PDFLATEX% %LATEXMKOPTS% %%i
+	)
+	goto end
+)
+
+if "%1" == "all-pdf-ja" (
+	goto all-pdf
+)
+
+if "%1" == "clean" (
+	del /q /s *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz *.fls *.fdb_latexmk
+	goto end
+)
+
+:end
+popd
\ No newline at end of file
diff --git a/sphinx/build/latex/measurement_board-2-V1-02.jpg b/sphinx/build/latex/measurement_board-2-V1-02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7f89781d91d32ebe5b304bcffbaa5d32e75bfa04
Binary files /dev/null and b/sphinx/build/latex/measurement_board-2-V1-02.jpg differ
diff --git a/sphinx/build/latex/measurement_board-2.jpg b/sphinx/build/latex/measurement_board-2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..938973dfd80ae4514a11be61f2390437fa3aacdf
Binary files /dev/null and b/sphinx/build/latex/measurement_board-2.jpg differ
diff --git a/sphinx/build/latex/measurement_board.jpg b/sphinx/build/latex/measurement_board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..62d2489b567ceeb408207350d4770d3ae84d24f7
Binary files /dev/null and b/sphinx/build/latex/measurement_board.jpg differ
diff --git a/sphinx/build/latex/measurement_board1-02.jpg b/sphinx/build/latex/measurement_board1-02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..559aead766a8549f1ab9c35991a912cb3dfc7be0
Binary files /dev/null and b/sphinx/build/latex/measurement_board1-02.jpg differ
diff --git a/sphinx/build/latex/multiplexer_implementation.jpg b/sphinx/build/latex/multiplexer_implementation.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..377cb81376e357aebc238fa10bf38a3b3aa90b49
Binary files /dev/null and b/sphinx/build/latex/multiplexer_implementation.jpg differ
diff --git a/sphinx/build/latex/ohmpi.aux b/sphinx/build/latex/ohmpi.aux
new file mode 100644
index 0000000000000000000000000000000000000000..f23e54680b733bda6c050da350d99bdea7fb9933
--- /dev/null
+++ b/sphinx/build/latex/ohmpi.aux
@@ -0,0 +1 @@
+\relax 
diff --git a/sphinx/build/latex/ohmpi.fdb_latexmk b/sphinx/build/latex/ohmpi.fdb_latexmk
new file mode 100644
index 0000000000000000000000000000000000000000..d3caf111c742ae4edb60fd4043826f2e1e2d3164
--- /dev/null
+++ b/sphinx/build/latex/ohmpi.fdb_latexmk
@@ -0,0 +1,7 @@
+# Fdb version 3
+["pdflatex"] 1626415617 "ohmpi.tex" "ohmpi.pdf" "ohmpi" 1626415617
+  "ohmpi.aux" 1626357507 9 a94a2480d3289e625eea47cd1b285758 ""
+  "ohmpi.tex" 1626415616 127133 4519dd2ec76f75bcc0c87a1728335d15 ""
+  (generated)
+  "ohmpi.pdf"
+  "ohmpi.log"
diff --git a/sphinx/build/latex/ohmpi.tex b/sphinx/build/latex/ohmpi.tex
new file mode 100644
index 0000000000000000000000000000000000000000..2f1edbb55c41e5368738fe35028469647c2fc800
--- /dev/null
+++ b/sphinx/build/latex/ohmpi.tex
@@ -0,0 +1,3963 @@
+%% Generated by Sphinx.
+\def\sphinxdocclass{report}
+\documentclass[letterpaper,10pt,english]{sphinxmanual}
+\ifdefined\pdfpxdimen
+   \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
+\fi \sphinxpxdimen=.75bp\relax
+\ifdefined\pdfimageresolution
+    \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax
+\fi
+%% let collapsable pdf bookmarks panel have high depth per default
+\PassOptionsToPackage{bookmarksdepth=5}{hyperref}
+
+\PassOptionsToPackage{warn}{textcomp}
+\usepackage[utf8]{inputenc}
+\ifdefined\DeclareUnicodeCharacter
+% support both utf8 and utf8x syntaxes
+  \ifdefined\DeclareUnicodeCharacterAsOptional
+    \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}}
+  \else
+    \let\sphinxDUC\DeclareUnicodeCharacter
+  \fi
+  \sphinxDUC{00A0}{\nobreakspace}
+  \sphinxDUC{2500}{\sphinxunichar{2500}}
+  \sphinxDUC{2502}{\sphinxunichar{2502}}
+  \sphinxDUC{2514}{\sphinxunichar{2514}}
+  \sphinxDUC{251C}{\sphinxunichar{251C}}
+  \sphinxDUC{2572}{\textbackslash}
+\fi
+\usepackage{cmap}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath,amssymb,amstext}
+\usepackage{babel}
+
+
+
+\usepackage{tgtermes}
+\usepackage{tgheros}
+\renewcommand{\ttdefault}{txtt}
+
+
+
+\usepackage[Bjarne]{fncychap}
+\usepackage{sphinx}
+
+\fvset{fontsize=auto}
+\usepackage{geometry}
+
+
+% Include hyperref last.
+\usepackage{hyperref}
+% Fix anchor placement for figures with captions.
+\usepackage{hypcap}% it must be loaded after hyperref.
+% Set up styles of URL: it should be placed after hyperref.
+\urlstyle{same}
+
+
+\usepackage{sphinxmessages}
+\setcounter{tocdepth}{1}
+
+
+
+\title{Ohmpi:}
+\date{Jul 16, 2021}
+\release{open hardware resistivity\sphinxhyphen{}meter}
+\author{Rémi CLEMENT}
+\newcommand{\sphinxlogo}{\vbox{}}
+\renewcommand{\releasename}{Release}
+\makeindex
+\begin{document}
+
+\pagestyle{empty}
+\sphinxmaketitle
+\pagestyle{plain}
+\sphinxtableofcontents
+\pagestyle{normal}
+\phantomsection\label{\detokenize{index::doc}}
+
+
+\begin{sphinxShadowBox}
+\sphinxstylesidebartitle{Summary}
+\begin{quote}\begin{description}
+\item[{Release}] \leavevmode
+\sphinxAtStartPar
+open hardware resistivity\sphinxhyphen{}meter
+
+\item[{Date}] \leavevmode
+\sphinxAtStartPar
+Jul 14, 2021
+
+\item[{Date start}] \leavevmode
+\sphinxAtStartPar
+July 2016
+
+\item[{Authors}] \leavevmode
+\sphinxAtStartPar
+\sphinxstylestrong{Rémi CLEMENT, Nicolas FORQUET, Julien GANCE, Yannick FARGIER, Vivien DUBOIS, Hélène GUYARD}
+
+\item[{Target}] \leavevmode
+\sphinxAtStartPar
+users, researchers and developers
+
+\item[{status}] \leavevmode
+\sphinxAtStartPar
+some mature, some in progress
+
+\end{description}\end{quote}
+\end{sphinxShadowBox}
+
+\begin{sphinxShadowBox}
+\sphinxstyletopictitle{OhmPi Document Center}
+\begin{itemize}
+\item {} 
+\sphinxAtStartPar
+OhmPi offcial documents
+
+\item {} 
+\sphinxAtStartPar
+Release guidelines
+
+\item {} 
+\sphinxAtStartPar
+General tutorials
+
+\end{itemize}
+\end{sphinxShadowBox}
+
+\noindent{\hspace*{\fill}\sphinxincludegraphics[width=200\sphinxpxdimen,height=150\sphinxpxdimen]{{logo_ohmpi}.JPG}\hspace*{\fill}}
+
+\sphinxAtStartPar
+Contents:
+
+
+\chapter{OhmPi project}
+\label{\detokenize{Ohmpi:ohmpi-project}}\label{\detokenize{Ohmpi::doc}}
+
+\section{\sphinxstylestrong{Partenaires}}
+\label{\detokenize{Ohmpi:partenaires}}
+\noindent{\hspace*{\fill}\sphinxincludegraphics[width=350\sphinxpxdimen,height=250\sphinxpxdimen]{{logo_ohmpi}.JPG}\hspace*{\fill}}
+
+\sphinxAtStartPar
+Authors:
+
+\begin{DUlineblock}{0em}
+\item[] Rémi CLEMENT,Vivien DUBOIS,Nicolas Forquet, INRAE, REVERSAAL, F\sphinxhyphen{}69626, Villeurbanne Cedex, France.
+\item[] Yannick FARGIER, GERS\sphinxhyphen{}RRO, Univ Gustave Eiffel, IFSTTAR, Univ Lyon, F\sphinxhyphen{}69675 Lyon, France.
+\item[] Julien GANCE, IRIS Instruments, 45100 Orléans, France.
+\item[] Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble.
+\end{DUlineblock}
+
+\sphinxAtStartPar
+Parteners:
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|T|}
+\hline
+
+\noindent\sphinxincludegraphics{{logo_inrae}.jpg}
+&
+\noindent\sphinxincludegraphics{{logo_univ_gustave}.png}
+&
+\noindent\sphinxincludegraphics{{logo-iris}.jpg}
+&
+\noindent\sphinxincludegraphics{{ige}.png}
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+
+\sphinxAtStartPar
+Creation date : Juillet 2020.
+
+\sphinxAtStartPar
+Update : 21 août 2020.
+
+\sphinxAtStartPar
+Status of document: In progress.
+
+
+\subsection{\sphinxstylestrong{Citing OhmPi}}
+\label{\detokenize{Ohmpi:citing-ohmpi}}
+\sphinxAtStartPar
+\sphinxstyleemphasis{Rémi Clement, Yannick Fargier, Vivien Dubois, Julien Gance, Emile Gros, et al.. OhmPi: An open}
+\sphinxstyleemphasis{source data logger for dedicated applications of electrical resistivity imaging at the small and laboratory}
+\sphinxstyleemphasis{scale. HardwareX, Elsevier, 2020, 8, 24 p. ff10.1016/j.ohx.2020.e00122ff.}
+
+
+\subsection{\sphinxstylestrong{Introduction to OhmPi}}
+\label{\detokenize{Ohmpi:introduction-to-ohmpi}}
+\sphinxAtStartPar
+This documentation presents the development of a low\sphinxhyphen{}cost, open hardware resistivity meter to provide the scientific community with a robust and flexible tool for small\sphinxhyphen{}scale experiments. Called OhmPi, this basic resistivity meterfeatures current injection and measurement functions associated with a multiplexer that allows performing automatic measurements with up to 32 electrodes.OhmPi’s philosophy is to provide a fully open source and open hardware tool /
+to the near surface scientific community.
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+Everyone willing to get involved is  welcome in OhmPi Project!.
+\end{sphinxadmonition}
+
+
+\chapter{OhmPi V 1.01 (limited to 32 electrodes)}
+\label{\detokenize{V1_01:ohmpi-v-1-01-limited-to-32-electrodes}}\label{\detokenize{V1_01::doc}}
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+This version corresponds to the version published in the Hardware X journal.
+However, we have corrected the bugs that existed on this version and explained the missing mounting points in detail below.
+We invite you to refer to this document to assemble Ohmpi V1.01.
+\end{sphinxadmonition}
+
+
+\section{The philosophy of Ohmpi}
+\label{\detokenize{V1_01:the-philosophy-of-ohmpi}}
+\sphinxAtStartPar
+The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available
+electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low\sphinxhyphen{}current injection,
+but suitable for small laboratory experiments and small field time monitoring
+
+
+\section{Technical data}
+\label{\detokenize{V1_01:technical-data}}
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|}
+\hline
+
+\sphinxAtStartPar
+\sphinxstylestrong{Parameter}
+&
+\sphinxAtStartPar
+\sphinxstylestrong{Specifications}
+&
+\sphinxAtStartPar
+Units
+\\
+\hline
+\sphinxAtStartPar
+Electrodes
+&
+\sphinxAtStartPar
+32
+&\\
+\hline
+\sphinxAtStartPar
+Operating temperature
+&
+\sphinxAtStartPar
+0 to 50
+&
+\sphinxAtStartPar
+°c
+\\
+\hline
+\sphinxAtStartPar
+Power consumption of CPU and
+control system
+&
+\sphinxAtStartPar
+18.5
+&
+\sphinxAtStartPar
+W
+\\
+\hline
+\sphinxAtStartPar
+Voltage injection
+&
+\sphinxAtStartPar
+9
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Battery
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Current
+&
+\sphinxAtStartPar
+0 to 50
+&
+\sphinxAtStartPar
+mA
+\\
+\hline
+\sphinxAtStartPar
+Min pulse duration
+&
+\sphinxAtStartPar
+150
+&
+\sphinxAtStartPar
+mS
+\\
+\hline
+\sphinxAtStartPar
+Input impedance
+&
+\sphinxAtStartPar
+36
+&
+\sphinxAtStartPar
+Mohm
+\\
+\hline
+\sphinxAtStartPar
+Data storage
+&
+\sphinxAtStartPar
+micro SD card
+&\\
+\hline
+\sphinxAtStartPar
+Resolution
+&
+\sphinxAtStartPar
+O.O1
+&
+\sphinxAtStartPar
+ohm
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+
+
+\section{Raspberry Pi  configuration}
+\label{\detokenize{V1_01:raspberry-pi-configuration}}
+
+\subsection{OS installation}
+\label{\detokenize{V1_01:os-installation}}
+\sphinxAtStartPar
+The first step is to start up the Raspberry Pi board, including installation of an OS (operating system).
+For this step, the installation instructions are well described on the Raspberry website
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\item {} 
+\sphinxAtStartPar
+Watch the vidéo “how to set up your raspberry Pi” (\sphinxurl{https://www.youtube.com/watch?v=wjWZhV1v3Pk})
+
+\item {} 
+\sphinxAtStartPar
+The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple\sphinxhyphen{}to\sphinxhyphen{}use operating system installer).
+
+\end{enumerate}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
+
+\begin{figure}[H]
+\centering
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{raspbian_version}.jpg}
+\end{figure}
+\end{sphinxadmonition}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+Once the OS has been installed,  \sphinxstylestrong{1\sphinxhyphen{}wire, spi and GPIO remote option} must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly.
+To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
+\begin{quote}
+
+\sphinxAtStartPar
+Run the terminal, and write
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{cd} \PYG{o}{/}\PYG{n}{boot}\PYG{o}{/}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{3}
+\item {} 
+\sphinxAtStartPar
+Open config.txt with GNU nano editor
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{nano} \PYG{n}{config}\PYG{o}{.}\PYG{n}{txt}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{4}
+\item {} 
+\sphinxAtStartPar
+At the end of the file write :
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{8}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{7}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{5}
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +O to save the modifications and press enter
+
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +x to escap and return to the terminal
+
+\item {} 
+\sphinxAtStartPar
+Close the terminal
+
+\end{enumerate}
+
+
+\subsection{Virtual Environnement and packages}
+\label{\detokenize{V1_01:virtual-environnement-and-packages}}
+\sphinxAtStartPar
+All dependencies are specified in requirements.txt
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All instructions below should be typed in the terminal
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+It is first necessary to ensure that the libatlas\sphinxhyphen{}base\sphinxhyphen{}dev library is installed:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{apt}\PYG{o}{\PYGZhy{}}\PYG{n}{get} \PYG{n}{install} \PYG{n}{libatlas}\PYG{o}{\PYGZhy{}}\PYG{n}{base}\PYG{o}{\PYGZhy{}}\PYG{n}{dev}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+We strongly recommend users to create a virtual environment to run the code and installed all required dependencies. It can be done either in a directory gathering all virtual environments used on the computer or within the ohmpy directory.
+
+\sphinxAtStartPar
+Create the virtual environment:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{python3} \PYG{o}{\PYGZhy{}}\PYG{n}{m} \PYG{n}{venv} \PYG{n}{ohmpy}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Activate it using the following command:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{source} \PYG{n}{ohmpy}\PYG{o}{/}\PYG{n+nb}{bin}\PYG{o}{/}\PYG{n}{activate}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n}{install} \PYG{n}{RPi}\PYG{o}{.}\PYG{n}{GPIO} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{blinka} \PYG{n}{numpy} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{circuitpython}\PYG{o}{\PYGZhy{}}\PYG{n}{ads1x15} \PYG{n}{pandas}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Check that requirements are met using
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n+nb}{list}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+You should run you code within the virtual environment
+to leave the virtual environment simply type:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{deactivate}
+\end{sphinxVerbatim}
+
+
+\subsection{Activate virtual environnement on Thonny (Python IDE)  (on Rapberry Pi)}
+\label{\detokenize{V1_01:activate-virtual-environnement-on-thonny-python-ide-on-rapberry-pi}}
+\sphinxAtStartPar
+If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.
+
+\sphinxAtStartPar
+1\sphinxhyphen{} Run the Thonny Python IDE software, Click on raspebrry acces \sphinxstylestrong{menu \textgreater{} programming\textgreater{} Thonny pythonIDE}
+
+\sphinxAtStartPar
+2\sphinxhyphen{} Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_first_interface}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+3\sphinxhyphen{}Click on \sphinxstylestrong{Run\textgreater{}select interpreter}, a new window opens click on interpret
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_option}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+4\sphinxhyphen{}On the new open windows select \sphinxstylestrong{alternative Pyhton3 or virtual environnement}
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+5\sphinxhyphen{} New buttons appeared, selected \sphinxstylestrong{“locate another python executable “}
+
+\sphinxAtStartPar
+6\sphinxhyphen{} A new window opens, find the folder where there is the python 3 file in the virtual environment folder previously created \sphinxstylestrong{/home/pi/ohmpi/bin/python3}.
+
+\sphinxAtStartPar
+7\sphinxhyphen{} In the \sphinxstylestrong{known interpreter} tab the path of the virtual environnementshould appear
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter_folder}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+8\sphinxhyphen{} Close the window by clicking on \sphinxstylestrong{ok}.
+
+\sphinxAtStartPar
+9\sphinxhyphen{} Close thonny to save modifications
+
+
+\section{Assembly of the measuring/current injection cards, and connection with the Raspberry Pi}
+\label{\detokenize{V1_01:assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi}}
+
+\subsection{Electrical resistivity measurements board}
+\label{\detokenize{V1_01:electrical-resistivity-measurements-board}}
+
+\subsubsection{a) Description}
+\label{\detokenize{V1_01:a-description}}
+\sphinxAtStartPar
+To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch {[}7{]}. The ADS1115
+is a 16\sphinxhyphen{}bit ADC (Analog\sphinxhyphen{}to\sphinxhyphen{}Digital Converter), with an adaptable gain. Its value has been set at 2/3 in this study. The
+input signal value could lie between \sphinxhyphen{} to + 6.114 V. The ADS1115 is mounted on a board adapted from an in\sphinxhyphen{}house design.
+Figure 5 shows the general diagram for the electronic measurement board developed. This figure also displays the test
+circuit used to test the board in the laboratory, which mimics the behavior of a soil subjected to current injection.
+In this test circuit, resistance R11 represents the soil resistance.
+Soil resistance R11 is connected to electrodes A and B for the current injection. Resistors R10 and R12 constitute
+the contact resistances between soil and electrodes; they are typically made of stainless steel. The battery, which
+allows for direct current injection, is connected in series with resistors R10, R11 and R12. In this part of the board,
+resistance R9 has been added to measure the current flowing between electrodes A and B. This resistance value has been
+set at 50 ohms in order to ensure:
+•       a precise resistance,
+•       a resistance less than the sum of resistors R10, R11 and R12; indeed, R10 and R12 generally lie between 100 and 5,000 ohms.
+To measure the current intensity between A and B, the electrical potential difference at the pole of the reference resistor (R9)
+is measured. The intensity (in mA) is calculated by inserting the resulting value into the following: ?
+To measure the potential difference needed to measure current intensity, the ADS 1115 is connected to the ground of the circuit.
+In our case, the ground reference is electrode B. The analog inputs A1 and A0 of the ADS1115 are connected to each pole of the
+reference resistor (R9). In order to increase input impedance and adapt the signal gain, tracking amplifiers have been included
+and completed by a divider bridge (R5, R8, R6 and R7) located between the two amplifiers. The resistance of the divider bridge
+ensures that the signal remains between 0 and 5 V, in accordance with the ADS1115 signal gain. To measure the potential difference,
+the M and N electrodes are connected to analog inputs A2 and A3 of the ADS 1115. Between the ADC and the electrodes, two tracking
+amplifiers and a divider bridge have been positioned so as to obtain a potential lying within the 0\sphinxhyphen{}5 V range at the analog input of the ADS 1115.
+Let’s note that the potential difference value would equal the potential measured with ADS1115 multiplied by the voltage reduction
+value of the divider bridge (see Section 5.2). Despite the use of high\sphinxhyphen{}resolution resistance (i.e. accurate to within 1\%), it is
+still necessary to calibrate the divider bridge using a precision voltmeter. For this purpose, the input and output potentials
+of the divider bridge must be measured using an equivalent circuit for various electrical potential values. These values serve
+to calculate the gain. With this electronic board, it is possible to measure the potential and intensity without disturbing the
+electric field in the ground, with the total input impedance value being estimated at 36 mega\sphinxhyphen{}ohms.
+A shortcut between Electrodes A and B will generate excessive currents, whose intensities depend on the type of battery used.
+A lithium ion battery or automobile\sphinxhyphen{}type lead\sphinxhyphen{}acid battery can deliver a strong enough current to damage the board and, as such,
+constitutes a potential hazard. We therefore recommend adding a 1.5\sphinxhyphen{}A fuse between the battery and resistor R9.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{schema_measurement_board}.jpg}
+\caption{Measurement board}\label{\detokenize{V1_01:id1}}\end{figure}
+
+
+\subsubsection{b) Implementation}
+\label{\detokenize{V1_01:b-implementation}}
+\sphinxAtStartPar
+The measurement board must be printed using the PCB file (Source file repository), with components soldered onto
+it by following the steps described below and illustrated in the following figure :
+\begin{itemize}
+\item {} \begin{description}
+\item[{Step no. 1: test divider bridge}] \leavevmode
+\sphinxAtStartPar
+For each measurement channel, we have installed a bridge divider, it is necessary to test with ohmmeter the value of the resistances, to adjust  each coefficients (coef\_p0, coef\_p1, coef\_p2, coef\_p3) in the Ohmpi.py code..
+\begin{quote}
+\begin{equation*}
+\begin{split}coeff po = (R1 + R2) / R1\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p1 = (R3 + R4) / R3\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p2 = (R7 + R6) / R7\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p3 = (R9 + R8) / R9\end{split}
+\end{equation*}
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=36,stepnumber=1]
+ \PYG{l+s+sd}{\PYGZdq{}\PYGZdq{}\PYGZdq{}}
+\PYG{l+s+sd}{ hardware parameters}
+\PYG{l+s+sd}{ \PYGZdq{}\PYGZdq{}\PYGZdq{}}
+ \PYG{n}{R\PYGZus{}ref} \PYG{o}{=} \PYG{l+m+mi}{50} \PYG{c+c1}{\PYGZsh{} reference resistance value in ohm}
+ \PYG{n}{coef\PYGZus{}p0} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P0, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p1} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P1, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p2} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P2, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p3} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P3, measurement in V/V}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.
+\end{quote}
+
+\end{description}
+
+\item {} 
+\sphinxAtStartPar
+Step no. 2: installation of the 1\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\%.
+
+\item {} 
+\sphinxAtStartPar
+Step no. 3: installation of the 1.5\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\%.
+
+\item {} 
+\sphinxAtStartPar
+Step no. 4: installation of both the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal blocks
+
+\item {} 
+\sphinxAtStartPar
+Step no. 5: installation of the 50\sphinxhyphen{}Ohm reference resistor \(\pm\) 0.1\%, please check the value and correct the line 39 in ohmpi.py code
+
+\item {} 
+\sphinxAtStartPar
+Step no. 6: addition of both the ADS115 directly onto the header (pins must be plugged according to the figure) and the LM358N operational amplifiers (pay attention to the direction).
+
+\end{itemize}
+
+\sphinxAtStartPar
+1\sphinxhyphen{}Kohm and 1.5\sphinxhyphen{}Kohm resistors apply to the divider bridge. If, for example, you prefer using a weaker
+or stronger power supply, it would be possible to adjust the divider bridge value by simply modifying these resistors.
+Once all the components have been soldered together, the measurement board can be connected to the Raspberry Pi and the
+battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to
+place a fuse holder with a 1.5\sphinxhyphen{}A fuse for safety purposes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=500\sphinxpxdimen]{{measurement_board}.jpg}
+\caption{Measurement circuit board assembly: a) printed circuit board, b) adding the 1\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, c)adding the 1.5\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, d) adding the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal block(2 pin, 3.5\sphinxhyphen{}mm pitch), e) adding the 50\sphinxhyphen{}ohm reference resistor \(\pm\) 0.1\%, and f) adding the ADS1115 and the LM358N low\sphinxhyphen{}power dual operational amplifiers}\label{\detokenize{V1_01:id2}}\end{figure}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{measurement_board-2}.jpg}
+\caption{Measurement board installation with Raspberry Pi}\label{\detokenize{V1_01:id3}}\end{figure}
+
+
+\subsection{Current injection board}
+\label{\detokenize{V1_01:current-injection-board}}
+\sphinxAtStartPar
+To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground.
+In our case, a simple 9\sphinxhyphen{}V lead\sphinxhyphen{}acid battery is used to create an electrical potential difference that results
+in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This
+injection is controlled via a 4\sphinxhyphen{}channel relay module board connected to the Raspberry Pi. The mechanical relay
+module board is shown in Figure 4. Relays 1 and 2 serve to switch on the current source. The common contacts
+of relays 1 and 2 are connected to the positive and negative battery poles, respectively. The normally open
+contacts of both relays are connected to the common contacts of relays 3 and 4. Relays 1 and 2 are connected
+to the GPIO 7 on the Raspberry Pi and therefore activate simultaneously. The role of relays 3 and 4 is to reverse
+the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by the GPIO 8 in the open position,
+the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized,
+they remain in the normally closed position. This set\sphinxhyphen{}up offers a simple and robust solution to inject current.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{current_board}.jpg}
+\caption{Wiring of the 4\sphinxhyphen{}channel relay module board for current injection management}\label{\detokenize{V1_01:id4}}\end{figure}
+
+\sphinxAtStartPar
+The next step consists of featuring the 4\sphinxhyphen{}channel relay module used for current injection and its assembly. The wiring
+between the relays must be carried out in strict accordance with Fig. 10. This card must then be connected to the Raspberry
+Pi and the measurement card. On the Raspberry Pi, it is necessary to connect inputs In1 and In2 to the same GPIO. For this
+purpose, it is necessary to solder together the two pins on the 4\sphinxhyphen{}channel relay shield module and connect them to the Raspberry Pi GPIO\sphinxhyphen{}7 (Fig. 10). The same must be performed for inputs In3 and In4 with GPIO\sphinxhyphen{}8. Connect the GND and 5Vdc pins of
+the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspberry Pi. Now connect relays 1, 2, 3 and 4, as
+shown in the diagram, using 1\sphinxhyphen{}mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
+to terminals B and A of the measurement board.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{installation_current_board}.jpg}
+\caption{Current injection board installation with Raspberry Pi}\label{\detokenize{V1_01:id5}}\end{figure}
+
+\sphinxAtStartPar
+Congratulations, you have build a 4 electrodes resistivity\sphinxhyphen{}meter.
+
+
+\subsection{Frist four electrodes resistivity mesurement}
+\label{\detokenize{V1_01:frist-four-electrodes-resistivity-mesurement}}
+\sphinxAtStartPar
+Under construction !
+
+\sphinxAtStartPar
+Describe the way to valide the first part of the instruction.
+Electrical resistivity measurement on test circuit
+
+
+\section{Multiplexer implentation}
+\label{\detokenize{V1_01:multiplexer-implentation}}
+\sphinxAtStartPar
+The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement
+by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands
+of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of
+the 32 electrodes stuck into the ground, all of which are connected to the data logger.
+
+\sphinxAtStartPar
+We will describe below how to assemble the four multiplexers (MUX), one per terminal. A multiplexer consists of 2 relay
+modules with 16 channels each. On the first board, on each MUX, 15 relays out of the 16 available will be used. Please note that the suggested
+configuration enables making smaller multiplexers (8 or 16 electrodes only). On the other hand, if you prefer upping to 64 electrodes,
+which is entirely possible, a GPIO channel multiplier will have to be used.
+To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=500\sphinxpxdimen]{{multiplexer_implementation}.jpg}
+\caption{Schematic diagram of the wiring of two 16\sphinxhyphen{}channel relay shields}\label{\detokenize{V1_01:id6}}\end{figure}
+
+\sphinxAtStartPar
+For this purpose, 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly.
+The length was adjusted so that the distance between the two points to be connected could be directly measured on the board once they had
+been assembled one above the other, in adding an extra 3 cm. The wires at the ends need to be stripped and the end caps added.
+As a final step, connect the cables to the correct connectors. This operation must be repeated in order to carry out all the wiring shown in Figure below.
+
+\sphinxAtStartPar
+Once the operation has been completed, the 16 control pins of each 16\sphinxhyphen{}channel relay shield card must be prepared. Each card actually contains 16 input channels
+for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
+see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
+\begin{quote}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{connection}.jpg}
+\caption{Connection to the 16\sphinxhyphen{}channel relay shield}\label{\detokenize{V1_01:id7}}\end{figure}
+\end{quote}
+
+\sphinxAtStartPar
+For the 16\sphinxhyphen{}channel relay shield no. 1, these steps must be followed:
+*       Position a test circuit with 10 horizontal and 10 vertical holes on the pins of the 16\sphinxhyphen{}channel relay shield board.
+*       Follow the diagram and solder the pins as shown in Fig.
+*       Lastly, solder 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) wires 1 m in length to the test circuit.
+
+\sphinxAtStartPar
+For relay shield no. 2, follow the same procedure, but solder all the pins together (d\sphinxhyphen{}e\sphinxhyphen{}f).
+This same operation must be repeated for the other three multiplexers as well.
+The next step consists of connecting the relay card inputs to the Raspberry Pi according to Table 5 for all four multiplexers.
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|T|T|T|}
+\hline
+\sphinxmultirow{2}{1}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{6}}
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxstartmulticolumn{4}%
+\begin{varwidth}[t]{\sphinxcolwidth{4}{6}}
+\sphinxAtStartPar
+Relay shield n°1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+\sphinxstopmulticolumn
+&
+\sphinxAtStartPar
+Relay Shield n°2
+\\
+\cline{2-6}\sphinxtablestrut{1}&
+\sphinxAtStartPar
+Pin 1
+&
+\sphinxAtStartPar
+Pin 2\sphinxhyphen{}3
+&
+\sphinxAtStartPar
+Pin 4\sphinxhyphen{}7
+&
+\sphinxAtStartPar
+Pin 8\sphinxhyphen{}16
+&
+\sphinxAtStartPar
+Pin 1\sphinxhyphen{} 16
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer A
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+16
+&
+\sphinxAtStartPar
+20
+&
+\sphinxAtStartPar
+21
+&
+\sphinxAtStartPar
+26
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer B
+&
+\sphinxAtStartPar
+18
+&
+\sphinxAtStartPar
+23
+&
+\sphinxAtStartPar
+24
+&
+\sphinxAtStartPar
+25
+&
+\sphinxAtStartPar
+19
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer M
+&
+\sphinxAtStartPar
+06
+&
+\sphinxAtStartPar
+13
+&
+\sphinxAtStartPar
+04
+&
+\sphinxAtStartPar
+17
+&
+\sphinxAtStartPar
+27
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer N
+&
+\sphinxAtStartPar
+22
+&
+\sphinxAtStartPar
+10
+&
+\sphinxAtStartPar
+09
+&
+\sphinxAtStartPar
+11
+&
+\sphinxAtStartPar
+05
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+\begin{quote}
+
+\sphinxAtStartPar
+Connection of the GPIOs to each multiplexer
+\end{quote}
+
+
+\section{Electrode connection}
+\label{\detokenize{V1_01:electrode-connection}}
+\sphinxAtStartPar
+At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set\sphinxhyphen{}up, screw terminals assembled on a din rail were used.
+According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming
+connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=300\sphinxpxdimen]{{cable}.jpg}
+\caption{Wire cabling for multiplexer and terminal screw connection}\label{\detokenize{V1_01:id8}}\end{figure}
+
+\sphinxAtStartPar
+the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B
+must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block.
+This operation must be repeated for all 32 electrodes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=800\sphinxpxdimen]{{electrode_cable}.jpg}
+\caption{Example of a multiplexer connection to the screw terminal for electrode no. 1.}\label{\detokenize{V1_01:id9}}\end{figure}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The 16 channel relay cards exist in 5\sphinxhyphen{}V and 12\sphinxhyphen{}V , in the bottom figure we have 12\sphinxhyphen{}V cards that we will directly connect to the battery.
+In case you bought 16 channel relay 5\sphinxhyphen{}V cards, you will need to add a DC/DC 12\sphinxhyphen{}V/5\sphinxhyphen{}V converter. You can use a STEP DOWN MODULE DC\sphinxhyphen{}DC (Velleman WPM404) and set the voltage to 5V with the potentiometer.
+\end{sphinxadmonition}
+
+
+\section{Operating instruction}
+\label{\detokenize{V1_01:operating-instruction}}
+
+\subsection{Preliminary procedure (Only for the initial operation)}
+\label{\detokenize{V1_01:preliminary-procedure-only-for-the-initial-operation}}
+\sphinxAtStartPar
+The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (\sphinxurl{https://osf.io/dzwb4/})
+or at the following Gitlab repository address: \sphinxurl{https://gitlab.irstea.fr/reversaal/OhmPi}. The code must be then unzipped into a selected folder (e.g. OhmPi\sphinxhyphen{}master). A “readme” file
+is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing
+the required packages and running the code.
+
+
+\subsection{Startup procedure}
+\label{\detokenize{V1_01:startup-procedure}}
+\sphinxAtStartPar
+As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer)
+into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply
+(for laboratory measurements) or a power bank (5V \sphinxhyphen{} 2A for field measurements). At this point, you’ll need to access the Raspbian operating system. Inside the previously created folder “ohmPi”,
+the protocol file “ABMN.txt” must be created or modified; this file contains all quadrupole ABMN numeration (an example is proposed with the source code). Some input parameters of the main “ohmpi.py”
+function may be adjusted/optimized depending on the measurement attributes. For example, both the current injection duration and number of stacks can be adjusted. At this point, the9 V and 12\sphinxhyphen{}V battery can be
+plugged into the hardware; the “ohmpi.py” source code must be run within a python3 environment (or a virtual environment if one has been created) either in the terminal or using Thonny. You should now
+hear the characteristic sound of a relay switching as a result of electrode permutation. After each quadrupole measurement, the potential difference as well as the current intensity and resistance
+are displayed on the screen. A measurement file is automatically created and named “measure.csv”; it will be placed in the same folder.
+
+
+\subsection{Electrical resistivity measurement parameters description}
+\label{\detokenize{V1_01:electrical-resistivity-measurement-parameters-description}}
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=27,stepnumber=1]
+ \PYG{l+s+sd}{\PYGZdq{}\PYGZdq{}\PYGZdq{}}
+\PYG{l+s+sd}{ measurement parameters}
+\PYG{l+s+sd}{ \PYGZdq{}\PYGZdq{}\PYGZdq{}}
+ \PYG{n}{nb\PYGZus{}electrodes} \PYG{o}{=} \PYG{l+m+mi}{32} \PYG{c+c1}{\PYGZsh{} maximum number of electrodes on the resistivity meter}
+ \PYG{n}{injection\PYGZus{}duration} \PYG{o}{=} \PYG{l+m+mf}{0.5} \PYG{c+c1}{\PYGZsh{} Current injection duration in second}
+ \PYG{n}{nbr\PYGZus{}meas}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} Number of times the quadripole sequence is repeated}
+ \PYG{n}{sequence\PYGZus{}delay}\PYG{o}{=} \PYG{l+m+mi}{30} \PYG{c+c1}{\PYGZsh{} Delay in seconds between 2 sequences}
+ \PYG{n}{stack}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} repetition of the current injection for each quadripole}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+The measurement parameters can be adjusted in lines 27 to 30 of the ohmpi.py code.
+
+
+\section{Complete list of components}
+\label{\detokenize{V1_01:complete-list-of-components}}
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date
+\end{sphinxadmonition}
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{Table Title}\label{\detokenize{V1_01:id10}}
+\sphinxaftertopcaption
+\begin{tabular}[t]{|\X{30}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|}
+\hline
+\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Component
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Number
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Cost per unit
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Total cost
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer s reference
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 3 Model B+
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 3 Model B
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+\\
+\hline
+\sphinxAtStartPar
+SainSmart 16\sphinxhyphen{}Channel Canal 12V Relay Relais Module pour Arduino DSP AVR PIC ARM
+&
+\sphinxAtStartPar
+8
+&
+\sphinxAtStartPar
+24.99
+&
+\sphinxAtStartPar
+199.92
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+101\sphinxhyphen{}70\sphinxhyphen{}103
+\\
+\hline
+\sphinxAtStartPar
+4\sphinxhyphen{}Channel 5V Relay Module
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+20\sphinxhyphen{}018\sphinxhyphen{}101\sphinxhyphen{}CMS
+\\
+\hline
+\sphinxAtStartPar
+cable 1X1 mm2 (50 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1568649
+\\
+\hline
+\sphinxAtStartPar
+cable 1X0.5 mm2 (100 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1565235
+\\
+\hline
+\sphinxAtStartPar
+Printed circuit board (packaging quantity x 3)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+Asler
+&
+\sphinxAtStartPar
+0
+\\
+\hline
+\sphinxAtStartPar
+Header sets 1x10
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+Samtec
+&
+\sphinxAtStartPar
+SSW\sphinxhyphen{}110\sphinxhyphen{}02\sphinxhyphen{}G\sphinxhyphen{}S
+\\
+\hline
+\sphinxAtStartPar
+Dual screw terminal (3.5\sphinxhyphen{}mm pitch)
+&
+\sphinxAtStartPar
+7
+&
+\sphinxAtStartPar
+0.648
+&
+\sphinxAtStartPar
+4.55
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+897\sphinxhyphen{}1332
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1 Kohm 0.5W +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.858
+&
+\sphinxAtStartPar
+3.44
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K0BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1.5 Kohms +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.627
+&
+\sphinxAtStartPar
+2.52
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K5BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 50 +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+UPW50B50RV
+\\
+\hline
+\sphinxAtStartPar
+LM358N AMP\sphinxhyphen{}o
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.8
+&
+\sphinxAtStartPar
+2.4
+&
+\sphinxAtStartPar
+Texas Instruments
+&
+\sphinxAtStartPar
+LM358AN/NOPB
+\\
+\hline
+\sphinxAtStartPar
+ADS1115
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+Adafruit
+&
+\sphinxAtStartPar
+1083
+\\
+\hline
+\sphinxAtStartPar
+12V battery 7ah
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+537\sphinxhyphen{}5488
+\\
+\hline
+\sphinxAtStartPar
+Battery Holder Type D LR20 (9V)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+185\sphinxhyphen{}4686
+\\
+\hline
+\sphinxAtStartPar
+Ferrule Crimp Terminal (1 mm2) (500 pieces)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+WEIDMULLER
+&
+\sphinxAtStartPar
+9004330000
+\\
+\hline
+\sphinxAtStartPar
+Electrical Crimp Terminal (0.5 mm2) (100 piece)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+AMP \sphinxhyphen{} TE CONNECTIVITY
+&
+\sphinxAtStartPar
+966067\sphinxhyphen{}1
+\\
+\hline
+\sphinxAtStartPar
+Car Fuse 1.0 A
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+0.2
+&&
+\sphinxAtStartPar
+LITTELFUSE
+&
+\sphinxAtStartPar
+LITTELFUSE
+\\
+\hline
+\sphinxAtStartPar
+Fuse holder (576\sphinxhyphen{}FHAC0002ZXJ)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+4.96
+&
+\sphinxAtStartPar
+4.96
+&
+\sphinxAtStartPar
+LITTELFUSE
+&
+\sphinxAtStartPar
+FHAC0002ZXJ
+\\
+\hline
+\end{tabular}
+\par
+\sphinxattableend\end{savenotes}
+
+
+\chapter{OhmPi V 1.02 (limited to 32 electrodes)}
+\label{\detokenize{V1_02:ohmpi-v-1-02-limited-to-32-electrodes}}\label{\detokenize{V1_02::doc}}
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+In this version, we have improved the electronic measurement board. To upgrade from version 1.01 to 1.02, you just have to replace the measurement board by the new one proposed here.
+\end{sphinxadmonition}
+
+
+\section{The philosophy of Ohmpi}
+\label{\detokenize{V1_02:the-philosophy-of-ohmpi}}
+\sphinxAtStartPar
+The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available
+electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low\sphinxhyphen{}current injection,
+but suitable for small laboratory experiments and small field time monitoring
+
+
+\section{Technical data}
+\label{\detokenize{V1_02:technical-data}}
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|}
+\hline
+
+\sphinxAtStartPar
+\sphinxstylestrong{Parameter}
+&
+\sphinxAtStartPar
+\sphinxstylestrong{Specifications}
+&
+\sphinxAtStartPar
+Units
+\\
+\hline
+\sphinxAtStartPar
+Electrodes
+&
+\sphinxAtStartPar
+32
+&\\
+\hline
+\sphinxAtStartPar
+Operating temperature
+&
+\sphinxAtStartPar
+0 to 50
+&
+\sphinxAtStartPar
+°c
+\\
+\hline
+\sphinxAtStartPar
+Power consumption of CPU and
+control system
+&
+\sphinxAtStartPar
+18.5
+&
+\sphinxAtStartPar
+W
+\\
+\hline
+\sphinxAtStartPar
+Voltage injection
+&
+\sphinxAtStartPar
+9
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Battery
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Current
+&
+\sphinxAtStartPar
+0 to 50
+&
+\sphinxAtStartPar
+mA
+\\
+\hline
+\sphinxAtStartPar
+Min pulse duration
+&
+\sphinxAtStartPar
+150
+&
+\sphinxAtStartPar
+mS
+\\
+\hline
+\sphinxAtStartPar
+Input impedance
+&
+\sphinxAtStartPar
+36
+&
+\sphinxAtStartPar
+Mohm
+\\
+\hline
+\sphinxAtStartPar
+Data storage
+&
+\sphinxAtStartPar
+micro SD card
+&\\
+\hline
+\sphinxAtStartPar
+Resolution
+&
+\sphinxAtStartPar
+O.O1
+&
+\sphinxAtStartPar
+ohm
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+
+
+\section{Raspberry Pi  configuration}
+\label{\detokenize{V1_02:raspberry-pi-configuration}}
+
+\subsection{OS installation}
+\label{\detokenize{V1_02:os-installation}}
+\sphinxAtStartPar
+The first step is to start up the Raspberry Pi board, including installation of an OS (operating system).
+For this step, the installation instructions are well described on the Raspberry website
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\item {} 
+\sphinxAtStartPar
+Watch the vidéo “how to set up your raspberry Pi” (\sphinxurl{https://www.youtube.com/watch?v=wjWZhV1v3Pk})
+
+\item {} 
+\sphinxAtStartPar
+The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple\sphinxhyphen{}to\sphinxhyphen{}use operating system installer).
+
+\end{enumerate}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
+
+\begin{figure}[H]
+\centering
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{raspbian_version}.jpg}
+\end{figure}
+\end{sphinxadmonition}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+Once the OS has been installed,  \sphinxstylestrong{1\sphinxhyphen{}wire, spi and GPIO remote option} must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly.
+To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
+\begin{quote}
+
+\sphinxAtStartPar
+Run the terminal, and write
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{cd} \PYG{o}{/}\PYG{n}{boot}\PYG{o}{/}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{3}
+\item {} 
+\sphinxAtStartPar
+Open config.txt with GNU nano editor
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{nano} \PYG{n}{config}\PYG{o}{.}\PYG{n}{txt}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{4}
+\item {} 
+\sphinxAtStartPar
+At the end of the file write :
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{8}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{7}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{5}
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +O to save the modifications and press enter
+
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +x to escap and return to the terminal
+
+\item {} 
+\sphinxAtStartPar
+Close the terminal
+
+\end{enumerate}
+
+
+\subsection{Virtual Environnement and packages}
+\label{\detokenize{V1_02:virtual-environnement-and-packages}}
+\sphinxAtStartPar
+All dependencies are specified in requirements.txt
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All instructions below should be typed in the terminal
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+It is first necessary to ensure that the libatlas\sphinxhyphen{}base\sphinxhyphen{}dev library is installed:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{apt}\PYG{o}{\PYGZhy{}}\PYG{n}{get} \PYG{n}{install} \PYG{n}{libatlas}\PYG{o}{\PYGZhy{}}\PYG{n}{base}\PYG{o}{\PYGZhy{}}\PYG{n}{dev}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+We strongly recommend users to create a virtual environment to run the code and installed all required dependencies. It can be done either in a directory gathering all virtual environments used on the computer or within the ohmpy directory.
+
+\sphinxAtStartPar
+Create the virtual environment:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{python3} \PYG{o}{\PYGZhy{}}\PYG{n}{m} \PYG{n}{venv} \PYG{n}{ohmpy}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Activate it using the following command:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{source} \PYG{n}{ohmpy}\PYG{o}{/}\PYG{n+nb}{bin}\PYG{o}{/}\PYG{n}{activate}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n}{install} \PYG{n}{RPi}\PYG{o}{.}\PYG{n}{GPIO} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{blinka} \PYG{n}{numpy} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{circuitpython}\PYG{o}{\PYGZhy{}}\PYG{n}{ads1x15} \PYG{n}{pandas}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Check that requirements are met using
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n+nb}{list}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+You should run you code within the virtual environment
+to leave the virtual environment simply type:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{deactivate}
+\end{sphinxVerbatim}
+
+
+\subsection{Activate virtual environnement on Thonny (Python IDE)  (on Rapberry Pi)}
+\label{\detokenize{V1_02:activate-virtual-environnement-on-thonny-python-ide-on-rapberry-pi}}
+\sphinxAtStartPar
+If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.
+
+\sphinxAtStartPar
+1\sphinxhyphen{} Run the Thonny Python IDE software, Click on raspebrry acces \sphinxstylestrong{menu \textgreater{} programming\textgreater{} Thonny pythonIDE}
+
+\sphinxAtStartPar
+2\sphinxhyphen{} Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_first_interface}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+3\sphinxhyphen{}Click on \sphinxstylestrong{Run\textgreater{}select interpreter}, a new window opens click on interpret
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_option}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+4\sphinxhyphen{}On the new open windows select \sphinxstylestrong{alternative Pyhton3 or virtual environnement}
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+5\sphinxhyphen{} New buttons appeared, selected \sphinxstylestrong{“locate another python executable “}
+
+\sphinxAtStartPar
+6\sphinxhyphen{} A new window opens, find the folder where there is the python 3 file in the virtual environment folder previously created \sphinxstylestrong{/home/pi/ohmpi/bin/python3}.
+
+\sphinxAtStartPar
+7\sphinxhyphen{} In the \sphinxstylestrong{known interpreter} tab the path of the virtual environnementshould appear
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter_folder}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+8\sphinxhyphen{} Close the window by clicking on \sphinxstylestrong{ok}.
+
+\sphinxAtStartPar
+9\sphinxhyphen{} Close thonny to save modifications
+
+
+\section{Assembly of the measuring/current injection cards, and connection with the Raspberry Pi}
+\label{\detokenize{V1_02:assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi}}
+
+\subsection{Electrical resistivity measurements board}
+\label{\detokenize{V1_02:electrical-resistivity-measurements-board}}
+
+\subsubsection{a) Description}
+\label{\detokenize{V1_02:a-description}}
+\sphinxAtStartPar
+To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch {[}7{]}. The ADS1115
+is a 16\sphinxhyphen{}bit ADC (Analog\sphinxhyphen{}to\sphinxhyphen{}Digital Converter), with an adaptable gain. Its value has been set at 2/3 in this study. The
+input signal value could lie between \sphinxhyphen{} to + 6.114 V. The ADS1115 is mounted on a board adapted from an in\sphinxhyphen{}house design.
+Figure 5 shows the general diagram for the electronic measurement board developed. This figure also displays the test
+circuit used to test the board in the laboratory, which mimics the behavior of a soil subjected to current injection.
+In this test circuit, resistance R11 represents the soil resistance.
+Soil resistance R11 is connected to electrodes A and B for the current injection. Resistors R10 and R12 constitute
+the contact resistances between soil and electrodes; they are typically made of stainless steel. The battery, which
+allows for direct current injection, is connected in series with resistors R10, R11 and R12. In this part of the board,
+resistance R9 has been added to measure the current flowing between electrodes A and B. This resistance value has been
+set at 50 ohms in order to ensure:
+•       a precise resistance,
+•       a resistance less than the sum of resistors R10, R11 and R12; indeed, R10 and R12 generally lie between 100 and 5,000 ohms.
+To measure the current intensity between A and B, the electrical potential difference at the pole of the reference resistor (R9)
+is measured. The intensity (in mA) is calculated by inserting the resulting value into the following: ?
+To measure the potential difference needed to measure current intensity, the ADS 1115 is connected to the ground of the circuit.
+In our case, the ground reference is electrode B. The analog inputs A1 and A0 of the ADS1115 are connected to each pole of the
+reference resistor (R9). In order to increase input impedance and adapt the signal gain, tracking amplifiers have been included
+and completed by a divider bridge (R5, R8, R6 and R7) located between the two amplifiers. The resistance of the divider bridge
+ensures that the signal remains between 0 and 5 V, in accordance with the ADS1115 signal gain. To measure the potential difference,
+the M and N electrodes are connected to analog inputs A2 and A3 of the ADS 1115. Between the ADC and the electrodes, two tracking
+amplifiers and a divider bridge have been positioned so as to obtain a potential lying within the 0\sphinxhyphen{}5 V range at the analog input of the ADS 1115.
+Let’s note that the potential difference value would equal the potential measured with ADS1115 multiplied by the voltage reduction
+value of the divider bridge (see Section 5.2). Despite the use of high\sphinxhyphen{}resolution resistance (i.e. accurate to within 1\%), it is
+still necessary to calibrate the divider bridge using a precision voltmeter. For this purpose, the input and output potentials
+of the divider bridge must be measured using an equivalent circuit for various electrical potential values. These values serve
+to calculate the gain. With this electronic board, it is possible to measure the potential and intensity without disturbing the
+electric field in the ground, with the total input impedance value being estimated at 36 mega\sphinxhyphen{}ohms.
+A shortcut between Electrodes A and B will generate excessive currents, whose intensities depend on the type of battery used.
+A lithium ion battery or automobile\sphinxhyphen{}type lead\sphinxhyphen{}acid battery can deliver a strong enough current to damage the board and, as such,
+constitutes a potential hazard. We therefore recommend adding a 1.5\sphinxhyphen{}A fuse between the battery and resistor R9.
+In version 1.02, we have improved the electronic board of measurement. we have added a DC/DC converter to supply the operational amplifiers
+(2 Traco power DC/DCconverter TRN3\sphinxhyphen{}1215). These converters allow to limit the suppression of the signal when the injected voltage is higher than 10V.
+We also added 4 capacitors on the +12v inputs of the fast operational amplifiers. These are decoupling capacitors (typically 100nF ceramic)
+between each power supply terminal and ground. The last point, we have added a four very high resistances of 10 MOhm, between the ground and
+the signal input on the operational amplifiers. This prevents the operational amplifiers from overheating.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{schema_measurement_board1_02}.png}
+\caption{Measurement board (Ohmpi version 1.02)}\label{\detokenize{V1_02:id1}}\end{figure}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+If you want to have very accurate measurements you can replace the resistors with a tolerance of 1\% by resistors with a tolerance of 0.01\% which will improve the measurement, but the cost will be higher.
+\end{sphinxadmonition}
+
+
+\subsubsection{b) Implementation}
+\label{\detokenize{V1_02:b-implementation}}
+\sphinxAtStartPar
+The measurement board must be printed using the PCB file (Source file repository), with components soldered onto
+it by following the steps described below and illustrated in the following figure :
+\begin{itemize}
+\item {} \begin{description}
+\item[{Step no. 1: test divider bridge}] \leavevmode
+\sphinxAtStartPar
+For each measurement channel, we have installed a bridge divider, it is necessary to test with ohmmeter the value of the resistances, to adjust  each coefficients (coef\_p0, coef\_p1, coef\_p2, coef\_p3) in the Ohmpi.py code..
+\begin{quote}
+\begin{equation*}
+\begin{split}coeff po = (R1 + R2) / R1\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p1 = (R3 + R4) / R3\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p2 = (R7 + R6) / R7\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p3 = (R9 + R8) / R9\end{split}
+\end{equation*}
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=36,stepnumber=1]
+ \PYG{l+s+sd}{\PYGZdq{}\PYGZdq{}\PYGZdq{}}
+\PYG{l+s+sd}{ hardware parameters}
+\PYG{l+s+sd}{ \PYGZdq{}\PYGZdq{}\PYGZdq{}}
+ \PYG{n}{R\PYGZus{}ref} \PYG{o}{=} \PYG{l+m+mi}{50} \PYG{c+c1}{\PYGZsh{} reference resistance value in ohm}
+ \PYG{n}{coef\PYGZus{}p0} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P0, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p1} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P1, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p2} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P2, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p3} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P3, measurement in V/V}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.
+\end{quote}
+
+\end{description}
+
+\item {} 
+\sphinxAtStartPar
+Step no. 2: installation of the 1\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\% (b\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 3: installation of the 1.5\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\%(C\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 4: installation of both the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal blocks (c\sphinxhyphen{}in the figure)
+
+\item {} 
+\sphinxAtStartPar
+Step no. 5: installation of the 50\sphinxhyphen{}Ohm reference resistor \(\pm\) 0.1\%, please check the value and correct the line 39 in ohmpi.py code (d\sphinxhyphen{}in the figure)
+
+\item {} 
+\sphinxAtStartPar
+Step no. 6: addition of both the ADS115 directly onto the header (pins must be plugged according to the figure) and the LM358N operational amplifiers (pay attention to the orientation) (e\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 7: installation of the 10\sphinxhyphen{}Mohm resistors with an accuracy of \(\pm\) 5\% (f\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 8: installation of the two DC/DC converter TRN3\sphinxhyphen{}1215 (h\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Setp no. 9: installation of the four capacitor on 100\sphinxhyphen{}nF/50vDC and the fuse of 10\sphinxhyphen{}A (h\sphinxhyphen{}in the figure).
+
+\end{itemize}
+
+\sphinxAtStartPar
+1\sphinxhyphen{}Kohm and 1.5\sphinxhyphen{}Kohm resistors apply to the divider bridge. If, for example, you prefer using a stronger power supply, it would be possible to adjust the divider bridge value by simply modifying these resistors.
+Once all the components have been soldered together, the measurement board can be connected to the Raspberry Pi and the
+battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to
+place a fuse holder with a 1.5\sphinxhyphen{}A fuse for safety purposes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{measurement_board1-02}.jpg}
+\caption{Measurement circuit board assembly: a) printed circuit board, b) adding the 1\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, c)adding the 1.5\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, d) adding the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal block(2 pin, 3.5\sphinxhyphen{}mm pitch), e) adding the 50\sphinxhyphen{}ohm reference resistor \(\pm\) 0.1\%, and f) adding the ADS1115 and the LM358N low\sphinxhyphen{}power dual operational amplifiers}\label{\detokenize{V1_02:id2}}\end{figure}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{measurement_board-2-V1-02}.jpg}
+\caption{Measurement board installation with Raspberry Pi}\label{\detokenize{V1_02:id3}}\end{figure}
+
+
+\subsection{Current injection board}
+\label{\detokenize{V1_02:current-injection-board}}
+\sphinxAtStartPar
+To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground.
+In our case, a simple 9\sphinxhyphen{}V lead\sphinxhyphen{}acid battery is used to create an electrical potential difference that results
+in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This
+injection is controlled via a 4\sphinxhyphen{}channel relay module board connected to the Raspberry Pi. The mechanical relay
+module board is shown in Figure 4. Relays 1 and 2 serve to switch on the current source. The common contacts
+of relays 1 and 2 are connected to the positive and negative battery poles, respectively. The normally open
+contacts of both relays are connected to the common contacts of relays 3 and 4. Relays 1 and 2 are connected
+to the GPIO 7 on the Raspberry Pi and therefore activate simultaneously. The role of relays 3 and 4 is to reverse
+the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by the GPIO 8 in the open position,
+the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized,
+they remain in the normally closed position. This set\sphinxhyphen{}up offers a simple and robust solution to inject current.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{current_board}.jpg}
+\caption{Wiring of the 4\sphinxhyphen{}channel relay module board for current injection management}\label{\detokenize{V1_02:id4}}\end{figure}
+
+\sphinxAtStartPar
+The next step consists of featuring the 4\sphinxhyphen{}channel relay module used for current injection and its assembly. The wiring
+between the relays must be carried out in strict accordance with Fig. 10. This card must then be connected to the Raspberry
+Pi and the measurement card. On the Raspberry Pi, it is necessary to connect inputs In1 and In2 to the same GPIO. For this
+purpose, it is necessary to solder together the two pins on the 4\sphinxhyphen{}channel relay shield module and connect them to the Raspberry Pi GPIO\sphinxhyphen{}7 (Fig. 10). The same must be performed for inputs In3 and In4 with GPIO\sphinxhyphen{}8. Connect the GND and 5Vdc pins of
+the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspberry Pi. Now connect relays 1, 2, 3 and 4, as
+shown in the diagram, using 1\sphinxhyphen{}mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
+to terminals B and A of the measurement board.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{installation_current_board_1_02}.jpg}
+\caption{Current injection board installation with Raspberry Pi}\label{\detokenize{V1_02:id5}}\end{figure}
+
+\sphinxAtStartPar
+Congratulations, you have build a 4 electrodes resistivity\sphinxhyphen{}meter.
+
+
+\subsection{Frist four electrodes resistivity mesurement}
+\label{\detokenize{V1_02:frist-four-electrodes-resistivity-mesurement}}
+\sphinxAtStartPar
+Under construction !
+
+\sphinxAtStartPar
+Describe the way to valide the first part of the instruction.
+Electrical resistivity measurement on test circuit
+
+
+\section{Multiplexer implentation}
+\label{\detokenize{V1_02:multiplexer-implentation}}
+\sphinxAtStartPar
+The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement
+by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands
+of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of
+the 32 electrodes stuck into the ground, all of which are connected to the data logger.
+
+\sphinxAtStartPar
+We will describe below how to assemble the four multiplexers (MUX), one per terminal. A multiplexer consists of 2 relay
+modules with 16 channels each. On the first board, on each MUX, 15 relays out of the 16 available will be used. Please note that the suggested
+configuration enables making smaller multiplexers (8 or 16 electrodes only). On the other hand, if you prefer upping to 64 electrodes,
+which is entirely possible, a GPIO channel multiplier will have to be used.
+To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=500\sphinxpxdimen]{{multiplexer_implementation}.jpg}
+\caption{Schematic diagram of the wiring of two 16\sphinxhyphen{}channel relay shields}\label{\detokenize{V1_02:id6}}\end{figure}
+
+\sphinxAtStartPar
+For this purpose, 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly.
+The length was adjusted so that the distance between the two points to be connected could be directly measured on the board once they had
+been assembled one above the other, in adding an extra 3 cm. The wires at the ends need to be stripped and the end caps added.
+As a final step, connect the cables to the correct connectors. This operation must be repeated in order to carry out all the wiring shown in Figure below.
+
+\sphinxAtStartPar
+Once the operation has been completed, the 16 control pins of each 16\sphinxhyphen{}channel relay shield card must be prepared. Each card actually contains 16 input channels
+for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
+see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
+\begin{quote}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{connection}.jpg}
+\caption{Connection to the 16\sphinxhyphen{}channel relay shield}\label{\detokenize{V1_02:id7}}\end{figure}
+\end{quote}
+
+\sphinxAtStartPar
+For the 16\sphinxhyphen{}channel relay shield no. 1, these steps must be followed:
+*       Position a test circuit with 10 horizontal and 10 vertical holes on the pins of the 16\sphinxhyphen{}channel relay shield board.
+*       Follow the diagram and solder the pins as shown in Fig.
+*       Lastly, solder 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) wires 1 m in length to the test circuit.
+
+\sphinxAtStartPar
+For relay shield no. 2, follow the same procedure, but solder all the pins together (d\sphinxhyphen{}e\sphinxhyphen{}f).
+This same operation must be repeated for the other three multiplexers as well.
+The next step consists of connecting the relay card inputs to the Raspberry Pi according to Table 5 for all four multiplexers.
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|T|T|T|}
+\hline
+\sphinxmultirow{2}{1}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{6}}
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxstartmulticolumn{4}%
+\begin{varwidth}[t]{\sphinxcolwidth{4}{6}}
+\sphinxAtStartPar
+Relay shield n°1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+\sphinxstopmulticolumn
+&
+\sphinxAtStartPar
+Relay Shield n°2
+\\
+\cline{2-6}\sphinxtablestrut{1}&
+\sphinxAtStartPar
+Pin 1
+&
+\sphinxAtStartPar
+Pin 2\sphinxhyphen{}3
+&
+\sphinxAtStartPar
+Pin 4\sphinxhyphen{}7
+&
+\sphinxAtStartPar
+Pin 8\sphinxhyphen{}16
+&
+\sphinxAtStartPar
+Pin 1\sphinxhyphen{} 16
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer A
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+16
+&
+\sphinxAtStartPar
+20
+&
+\sphinxAtStartPar
+21
+&
+\sphinxAtStartPar
+26
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer B
+&
+\sphinxAtStartPar
+18
+&
+\sphinxAtStartPar
+23
+&
+\sphinxAtStartPar
+24
+&
+\sphinxAtStartPar
+25
+&
+\sphinxAtStartPar
+19
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer M
+&
+\sphinxAtStartPar
+06
+&
+\sphinxAtStartPar
+13
+&
+\sphinxAtStartPar
+04
+&
+\sphinxAtStartPar
+17
+&
+\sphinxAtStartPar
+27
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer N
+&
+\sphinxAtStartPar
+22
+&
+\sphinxAtStartPar
+10
+&
+\sphinxAtStartPar
+09
+&
+\sphinxAtStartPar
+11
+&
+\sphinxAtStartPar
+05
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+\begin{quote}
+
+\sphinxAtStartPar
+Connection of the GPIOs to each multiplexer
+\end{quote}
+
+
+\section{Electrode connection}
+\label{\detokenize{V1_02:electrode-connection}}
+\sphinxAtStartPar
+At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set\sphinxhyphen{}up, screw terminals assembled on a din rail were used.
+According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming
+connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=300\sphinxpxdimen]{{cable}.jpg}
+\caption{Wire cabling for multiplexer and terminal screw connection}\label{\detokenize{V1_02:id8}}\end{figure}
+
+\sphinxAtStartPar
+the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B
+must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block.
+This operation must be repeated for all 32 electrodes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=800\sphinxpxdimen]{{electrode_cable}.jpg}
+\caption{Example of a multiplexer connection to the screw terminal for electrode no. 1.}\label{\detokenize{V1_02:id9}}\end{figure}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The 16 channel relay cards exist in 5\sphinxhyphen{}V and 12\sphinxhyphen{}V , in the bottom figure we have 12\sphinxhyphen{}V cards that we will directly connect to the battery.
+In case you bought 16 channel relay 5\sphinxhyphen{}V cards, you will need to add a DC/DC 12\sphinxhyphen{}V/5\sphinxhyphen{}V converter. You can use a STEP DOWN MODULE DC\sphinxhyphen{}DC (Velleman WPM404) and set the voltage to 5V with the potentiometer.
+\end{sphinxadmonition}
+
+
+\section{Operating instruction}
+\label{\detokenize{V1_02:operating-instruction}}
+
+\subsection{Preliminary procedure (Only for the initial operation)}
+\label{\detokenize{V1_02:preliminary-procedure-only-for-the-initial-operation}}
+\sphinxAtStartPar
+The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (\sphinxurl{https://osf.io/dzwb4/})
+or at the following Gitlab repository address: \sphinxurl{https://gitlab.irstea.fr/reversaal/OhmPi}. The code must be then unzipped into a selected folder (e.g. OhmPi\sphinxhyphen{}master). A “readme” file
+is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing
+the required packages and running the code.
+
+
+\subsection{Startup procedure}
+\label{\detokenize{V1_02:startup-procedure}}
+\sphinxAtStartPar
+As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer)
+into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply
+(for laboratory measurements) or a power bank (5V \sphinxhyphen{} 2A for field measurements). At this point, you’ll need to access the Raspbian operating system. Inside the previously created folder “ohmPi”,
+the protocol file “ABMN.txt” must be created or modified; this file contains all quadrupole ABMN numeration (an example is proposed with the source code). Some input parameters of the main “ohmpi.py”
+function may be adjusted/optimized depending on the measurement attributes. For example, both the current injection duration and number of stacks can be adjusted. At this point, the9 V and 12\sphinxhyphen{}V battery can be
+plugged into the hardware; the “ohmpi.py” source code must be run within a python3 environment (or a virtual environment if one has been created) either in the terminal or using Thonny. You should now
+hear the characteristic sound of a relay switching as a result of electrode permutation. After each quadrupole measurement, the potential difference as well as the current intensity and resistance
+are displayed on the screen. A measurement file is automatically created and named “measure.csv”; it will be placed in the same folder.
+
+
+\subsection{Electrical resistivity measurement parameters description}
+\label{\detokenize{V1_02:electrical-resistivity-measurement-parameters-description}}
+\sphinxAtStartPar
+In the version 1.02, the measurement parameters are in the Jason file (ohmpi\_param.json).
+
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=1,stepnumber=1]
+ \PYG{n}{nb\PYGZus{}electrodes} \PYG{o}{=} \PYG{l+m+mi}{32} \PYG{c+c1}{\PYGZsh{} maximum number of electrodes on the resistivity meter}
+ \PYG{n}{injection\PYGZus{}duration} \PYG{o}{=} \PYG{l+m+mf}{0.5} \PYG{c+c1}{\PYGZsh{} Current injection duration in second}
+ \PYG{n}{nbr\PYGZus{}meas}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} Number of times the quadripole sequence is repeated}
+ \PYG{n}{sequence\PYGZus{}delay}\PYG{o}{=} \PYG{l+m+mi}{30} \PYG{c+c1}{\PYGZsh{} Delay in seconds between 2 sequences}
+ \PYG{n}{stack}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} repetition of the current injection for each quadripole}
+ \PYG{n}{export\PYGZus{}path}\PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{home/pi/Desktop/measurement.csv}\PYG{l+s+s2}{\PYGZdq{}}
+\end{sphinxVerbatim}
+
+
+\section{Complete list of components}
+\label{\detokenize{V1_02:complete-list-of-components}}
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date
+\end{sphinxadmonition}
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{List of components}\label{\detokenize{V1_02:id10}}
+\sphinxaftertopcaption
+\begin{tabular}[t]{|\X{30}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|}
+\hline
+\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Component
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Number
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Cost per unit
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Total cost
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer s reference
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 3 Model B+
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 3 Model B
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+\\
+\hline
+\sphinxAtStartPar
+SainSmart 16\sphinxhyphen{}Channel 12V Relay
+&
+\sphinxAtStartPar
+8
+&
+\sphinxAtStartPar
+24.99
+&
+\sphinxAtStartPar
+199.92
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+101\sphinxhyphen{}70\sphinxhyphen{}103
+\\
+\hline
+\sphinxAtStartPar
+4\sphinxhyphen{}Channel 5V Relay Module
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+20\sphinxhyphen{}018\sphinxhyphen{}101\sphinxhyphen{}CMS
+\\
+\hline
+\sphinxAtStartPar
+cable 1X1 mm2 (50 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1568649
+\\
+\hline
+\sphinxAtStartPar
+cable 1X0.5 mm2 (100 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1565235
+\\
+\hline
+\sphinxAtStartPar
+Printed circuit board (packaging quantity x 3)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+Asler
+&
+\sphinxAtStartPar
+0
+\\
+\hline
+\sphinxAtStartPar
+Header sets 1x10
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+Samtec
+&
+\sphinxAtStartPar
+SSW\sphinxhyphen{}110\sphinxhyphen{}02\sphinxhyphen{}G\sphinxhyphen{}S
+\\
+\hline
+\sphinxAtStartPar
+Dual screw terminal (3.5\sphinxhyphen{}mm pitch)
+&
+\sphinxAtStartPar
+7
+&
+\sphinxAtStartPar
+0.648
+&
+\sphinxAtStartPar
+4.55
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+897\sphinxhyphen{}1332
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1 Kohm 0.5W +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.858
+&
+\sphinxAtStartPar
+3.44
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K0BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1.5 Kohms +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.627
+&
+\sphinxAtStartPar
+2.52
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K5BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 50 +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+UPW50B50RV
+\\
+\hline
+\sphinxAtStartPar
+LM358N AMP\sphinxhyphen{}o
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.8
+&
+\sphinxAtStartPar
+2.4
+&
+\sphinxAtStartPar
+Texas Instruments
+&
+\sphinxAtStartPar
+LM358AN/NOPB
+\\
+\hline
+\sphinxAtStartPar
+ADS1115
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+Adafruit
+&
+\sphinxAtStartPar
+1083
+\\
+\hline
+\sphinxAtStartPar
+12V battery 7ah
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+537\sphinxhyphen{}5488
+\\
+\hline
+\sphinxAtStartPar
+Battery Holder Type D LR20 (9V)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+185\sphinxhyphen{}4686
+\\
+\hline
+\sphinxAtStartPar
+Ferrule Crimp Terminal (1 mm2) (500 pieces)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+WEIDMULLER
+&
+\sphinxAtStartPar
+9004330000
+\\
+\hline
+\sphinxAtStartPar
+Electrical Crimp Terminal (0.5 mm2) (100 piece)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+AMP \sphinxhyphen{} TE CONNECTIVITY
+&
+\sphinxAtStartPar
+966067\sphinxhyphen{}1
+\\
+\hline
+\sphinxAtStartPar
+Fuse 1.0 A
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+0.2
+&&
+\sphinxAtStartPar
+LITTELFUSE
+&
+\sphinxAtStartPar
+0251001.PAT1L
+\\
+\hline
+\sphinxAtStartPar
+Capacitor 100nF 50Vdc 10\% Ceramic
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.2
+&
+\sphinxAtStartPar
+0.8
+&
+\sphinxAtStartPar
+KEMET
+&
+\sphinxAtStartPar
+C320C104K1
+\\
+\hline
+\sphinxAtStartPar
+DC/DC converter 12 to 24V
+&
+\sphinxAtStartPar
+2
+&
+\sphinxAtStartPar
+26.72
+&
+\sphinxAtStartPar
+53.44
+&
+\sphinxAtStartPar
+TracoPower
+&
+\sphinxAtStartPar
+TRN 3\sphinxhyphen{}1215
+\\
+\hline
+\end{tabular}
+\par
+\sphinxattableend\end{savenotes}
+
+
+\chapter{OhmPi V 2.00 (64 or 128 électrodes)}
+\label{\detokenize{V2_00:ohmpi-v-2-00-64-or-128-electrodes}}\label{\detokenize{V2_00::doc}}
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=500\sphinxpxdimen,height=250\sphinxpxdimen]{{Under-Construction}.png}
+\end{figure}
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=500\sphinxpxdimen]{{image_ohmpi_2}.jpg}
+\end{figure}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+In this version, we have developed two new board types that allow the assembly of Ohmpi v2.00, a measurement board and a multiplexer board.
+This new version is made up of:
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\item {} 
+\sphinxAtStartPar
+a measurement board for four\sphinxhyphen{}point measurement
+
+\item {} 
+\sphinxAtStartPar
+4 multiplexer cards
+
+\item {} 
+\sphinxAtStartPar
+a box
+
+\end{enumerate}
+\end{sphinxadmonition}
+
+
+\section{The philosophy of Ohmpi}
+\label{\detokenize{V2_00:the-philosophy-of-ohmpi}}
+\sphinxAtStartPar
+The philosophy of Ohmpi V2.00 is to offer a new DIY multielectrode resistivity meter. It is a resistivity meter with 64 electrodes , which can be upgraded to 128 electrodes.
+It is limited to low\sphinxhyphen{}current injection,but suitable for small laboratory experiments and small field time\sphinxhyphen{}lapse monitoring.
+Ohmpi, is developed by a team that seeks to share all its experience and wishes to improve and offer a more and more robust tool to the community.Ohmpi V2.00 is a completely different version from the previous one.
+We will stop the development on the previous version, to dedicate our efforts on this new version.
+
+
+\section{Technical data}
+\label{\detokenize{V2_00:technical-data}}
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabular}[t]{|*{5}{\X{1}{5}|}}
+\hline
+
+\sphinxAtStartPar
+\sphinxstylestrong{Parameter}
+&\begin{description}
+\item[{\sphinxstylestrong{Specifications}}] \leavevmode
+\sphinxAtStartPar
+\sphinxstylestrong{V1}
+
+\end{description}
+&
+\sphinxAtStartPar
+Units
+&\begin{description}
+\item[{\sphinxstylestrong{Specifications}}] \leavevmode
+\sphinxAtStartPar
+\sphinxstylestrong{V2}
+
+\end{description}
+&
+\sphinxAtStartPar
+Units
+\\
+\hline
+\sphinxAtStartPar
+Electrodes
+&
+\sphinxAtStartPar
+32
+&&
+\sphinxAtStartPar
+64 to 128
+&\\
+\hline
+\sphinxAtStartPar
+Operating temperature
+&
+\sphinxAtStartPar
+\sphinxhyphen{}0 to 50
+&
+\sphinxAtStartPar
+°c
+&
+\sphinxAtStartPar
+\sphinxhyphen{}25 to 50
+&
+\sphinxAtStartPar
+°c
+\\
+\hline
+\sphinxAtStartPar
+Power consumption of CPU and
+control system
+&
+\sphinxAtStartPar
+18.5
+&
+\sphinxAtStartPar
+W
+&
+\sphinxAtStartPar
+18.5
+&
+\sphinxAtStartPar
+W
+\\
+\hline
+\sphinxAtStartPar
+Voltage injection
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+V
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Battery
+&
+\sphinxAtStartPar
+9
+&
+\sphinxAtStartPar
+V
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+V
+\\
+\hline
+\sphinxAtStartPar
+Current
+&
+\sphinxAtStartPar
+0 to 40
+&
+\sphinxAtStartPar
+mA
+&
+\sphinxAtStartPar
+0 to 40
+&
+\sphinxAtStartPar
+mA
+\\
+\hline
+\sphinxAtStartPar
+Min pulse duration
+&
+\sphinxAtStartPar
+150
+&
+\sphinxAtStartPar
+mS
+&
+\sphinxAtStartPar
+150
+&
+\sphinxAtStartPar
+mS
+\\
+\hline
+\sphinxAtStartPar
+Input impedance
+&
+\sphinxAtStartPar
+80
+&
+\sphinxAtStartPar
+Mohm
+&
+\sphinxAtStartPar
+80
+&
+\sphinxAtStartPar
+Mohm
+\\
+\hline
+\sphinxAtStartPar
+Data storage
+&
+\sphinxAtStartPar
+micro SD card
+&&
+\sphinxAtStartPar
+micro SD card
+&\\
+\hline
+\sphinxAtStartPar
+Resolution
+&
+\sphinxAtStartPar
+O.O1
+&
+\sphinxAtStartPar
+ohm
+&
+\sphinxAtStartPar
+O.O1
+&
+\sphinxAtStartPar
+ohm
+\\
+\hline
+\end{tabular}
+\par
+\sphinxattableend\end{savenotes}
+
+
+\section{Raspberry Pi  configuration}
+\label{\detokenize{V2_00:raspberry-pi-configuration}}
+
+\subsection{OS installation}
+\label{\detokenize{V2_00:os-installation}}
+\sphinxAtStartPar
+The first step is to start up the Raspberry Pi board, including installation of an OS (operating system).
+For this step, the installation instructions are well described on the Raspberry website
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\item {} 
+\sphinxAtStartPar
+Watch the vidéo “how to set up your raspberry Pi” (\sphinxurl{https://www.youtube.com/watch?v=wjWZhV1v3Pk})
+
+\item {} 
+\sphinxAtStartPar
+The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple\sphinxhyphen{}to\sphinxhyphen{}use operating system installer).
+
+\end{enumerate}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
+
+\begin{figure}[H]
+\centering
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{raspbian_version}.jpg}
+\end{figure}
+\end{sphinxadmonition}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+Once the OS has been installed,  \sphinxstylestrong{1\sphinxhyphen{}wire, spi and GPIO remote option} must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly.
+To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
+\begin{quote}
+
+\sphinxAtStartPar
+Run the terminal, and write
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{cd} \PYG{o}{/}\PYG{n}{boot}\PYG{o}{/}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{3}
+\item {} 
+\sphinxAtStartPar
+Open config.txt with GNU nano editor
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{nano} \PYG{n}{config}\PYG{o}{.}\PYG{n}{txt}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{4}
+\item {} 
+\sphinxAtStartPar
+At the end of the file write :
+
+\end{enumerate}
+\begin{quote}
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{8}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\PYG{n}{gpio}\PYG{o}{=}\PYG{l+m+mi}{7}\PYG{o}{=}\PYG{n}{op}\PYG{p}{,}\PYG{n}{dl}
+\end{sphinxVerbatim}
+\end{quote}
+\begin{enumerate}
+\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
+\setcounter{enumi}{5}
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +O to save the modifications and press enter
+
+\item {} 
+\sphinxAtStartPar
+Press Ctrl +x to escap and return to the terminal
+
+\item {} 
+\sphinxAtStartPar
+Close the terminal
+
+\end{enumerate}
+
+
+\subsection{Virtual Environnement and packages}
+\label{\detokenize{V2_00:virtual-environnement-and-packages}}
+\sphinxAtStartPar
+All dependencies are specified in requirements.txt
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+All instructions below should be typed in the terminal
+\end{sphinxadmonition}
+
+\sphinxAtStartPar
+It is first necessary to ensure that the libatlas\sphinxhyphen{}base\sphinxhyphen{}dev library is installed:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{sudo} \PYG{n}{apt}\PYG{o}{\PYGZhy{}}\PYG{n}{get} \PYG{n}{install} \PYG{n}{libatlas}\PYG{o}{\PYGZhy{}}\PYG{n}{base}\PYG{o}{\PYGZhy{}}\PYG{n}{dev}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+We strongly recommend users to create a virtual environment to run the code and installed all required dependencies. It can be done either in a directory gathering all virtual environments used on the computer or within the ohmpy directory.
+
+\sphinxAtStartPar
+Create the virtual environment:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{python3} \PYG{o}{\PYGZhy{}}\PYG{n}{m} \PYG{n}{venv} \PYG{n}{ohmpy}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Activate it using the following command:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{source} \PYG{n}{ohmpy}\PYG{o}{/}\PYG{n+nb}{bin}\PYG{o}{/}\PYG{n}{activate}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n}{install} \PYG{n}{RPi}\PYG{o}{.}\PYG{n}{GPIO} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{blinka} \PYG{n}{numpy} \PYG{n}{adafruit}\PYG{o}{\PYGZhy{}}\PYG{n}{circuitpython}\PYG{o}{\PYGZhy{}}\PYG{n}{ads1x15} \PYG{n}{pandas}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+Check that requirements are met using
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{pip} \PYG{n+nb}{list}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+You should run you code within the virtual environment
+to leave the virtual environment simply type:
+
+\begin{sphinxVerbatim}[commandchars=\\\{\}]
+\PYG{n}{deactivate}
+\end{sphinxVerbatim}
+
+
+\subsection{Activate virtual environnement on Thonny (Python IDE)  (on Rapberry Pi)}
+\label{\detokenize{V2_00:activate-virtual-environnement-on-thonny-python-ide-on-rapberry-pi}}
+\sphinxAtStartPar
+If you decided to use a virtual environment, it is necessary to setup Thonny Python IDE the first time you use it.
+
+\sphinxAtStartPar
+1\sphinxhyphen{} Run the Thonny Python IDE software, Click on raspebrry acces \sphinxstylestrong{menu \textgreater{} programming\textgreater{} Thonny pythonIDE}
+
+\sphinxAtStartPar
+2\sphinxhyphen{} Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_first_interface}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+3\sphinxhyphen{}Click on \sphinxstylestrong{Run\textgreater{}select interpreter}, a new window opens click on interpret
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_option}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+4\sphinxhyphen{}On the new open windows select \sphinxstylestrong{alternative Pyhton3 or virtual environnement}
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+5\sphinxhyphen{} New buttons appeared, selected \sphinxstylestrong{“locate another python executable “}
+
+\sphinxAtStartPar
+6\sphinxhyphen{} A new window opens, find the folder where there is the python 3 file in the virtual environment folder previously created \sphinxstylestrong{/home/pi/ohmpi/bin/python3}.
+
+\sphinxAtStartPar
+7\sphinxhyphen{} In the \sphinxstylestrong{known interpreter} tab the path of the virtual environnementshould appear
+
+\begin{figure}[htbp]
+\centering
+
+\noindent\sphinxincludegraphics[width=600\sphinxpxdimen,height=450\sphinxpxdimen]{{thonny_interpreter_folder}.jpg}
+\end{figure}
+
+\sphinxAtStartPar
+8\sphinxhyphen{} Close the window by clicking on \sphinxstylestrong{ok}.
+
+\sphinxAtStartPar
+9\sphinxhyphen{} Close thonny to save modifications
+
+
+\section{Assembly of the measuring/current injection cards, and connection with the Raspberry Pi}
+\label{\detokenize{V2_00:assembly-of-the-measuring-current-injection-cards-and-connection-with-the-raspberry-pi}}
+
+\subsection{Electrical resistivity measurements board}
+\label{\detokenize{V2_00:electrical-resistivity-measurements-board}}
+
+\subsubsection{a) Description}
+\label{\detokenize{V2_00:a-description}}
+\sphinxAtStartPar
+To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch {[}7{]}. The ADS1115
+is a 16\sphinxhyphen{}bit ADC (Analog\sphinxhyphen{}to\sphinxhyphen{}Digital Converter), with an adaptable gain. Its value has been set at 2/3 in this study. The
+input signal value could lie between \sphinxhyphen{} to + 6.114 V. The ADS1115 is mounted on a board adapted from an in\sphinxhyphen{}house design.
+Figure 5 shows the general diagram for the electronic measurement board developed. This figure also displays the test
+circuit used to test the board in the laboratory, which mimics the behavior of a soil subjected to current injection.
+In this test circuit, resistance R11 represents the soil resistance.
+Soil resistance R11 is connected to electrodes A and B for the current injection. Resistors R10 and R12 constitute
+the contact resistances between soil and electrodes; they are typically made of stainless steel. The battery, which
+allows for direct current injection, is connected in series with resistors R10, R11 and R12. In this part of the board,
+resistance R9 has been added to measure the current flowing between electrodes A and B. This resistance value has been
+set at 50 ohms in order to ensure:
+•       a precise resistance,
+•       a resistance less than the sum of resistors R10, R11 and R12; indeed, R10 and R12 generally lie between 100 and 5,000 ohms.
+To measure the current intensity between A and B, the electrical potential difference at the pole of the reference resistor (R9)
+is measured. The intensity (in mA) is calculated by inserting the resulting value into the following: ?
+To measure the potential difference needed to measure current intensity, the ADS 1115 is connected to the ground of the circuit.
+In our case, the ground reference is electrode B. The analog inputs A1 and A0 of the ADS1115 are connected to each pole of the
+reference resistor (R9). In order to increase input impedance and adapt the signal gain, tracking amplifiers have been included
+and completed by a divider bridge (R5, R8, R6 and R7) located between the two amplifiers. The resistance of the divider bridge
+ensures that the signal remains between 0 and 5 V, in accordance with the ADS1115 signal gain. To measure the potential difference,
+the M and N electrodes are connected to analog inputs A2 and A3 of the ADS 1115. Between the ADC and the electrodes, two tracking
+amplifiers and a divider bridge have been positioned so as to obtain a potential lying within the 0\sphinxhyphen{}5 V range at the analog input of the ADS 1115.
+Let’s note that the potential difference value would equal the potential measured with ADS1115 multiplied by the voltage reduction
+value of the divider bridge (see Section 5.2). Despite the use of high\sphinxhyphen{}resolution resistance (i.e. accurate to within 1\%), it is
+still necessary to calibrate the divider bridge using a precision voltmeter. For this purpose, the input and output potentials
+of the divider bridge must be measured using an equivalent circuit for various electrical potential values. These values serve
+to calculate the gain. With this electronic board, it is possible to measure the potential and intensity without disturbing the
+electric field in the ground, with the total input impedance value being estimated at 36 mega\sphinxhyphen{}ohms.
+A shortcut between Electrodes A and B will generate excessive currents, whose intensities depend on the type of battery used.
+A lithium ion battery or automobile\sphinxhyphen{}type lead\sphinxhyphen{}acid battery can deliver a strong enough current to damage the board and, as such,
+constitutes a potential hazard. We therefore recommend adding a 1.5\sphinxhyphen{}A fuse between the battery and resistor R9.
+In version 1.02, we have improved the electronic board of measurement. we have added a DC/DC converter to supply the operational amplifiers
+(2 Traco power DC/DCconverter TRN3\sphinxhyphen{}1215). These converters allow to limit the suppression of the signal when the injected voltage is higher than 10V.
+We also added 4 capacitors on the +12v inputs of the fast operational amplifiers. These are decoupling capacitors (typically 100nF ceramic)
+between each power supply terminal and ground. The last point, we have added a four very high resistances of 10 MOhm, between the ground and
+the signal input on the operational amplifiers. This prevents the operational amplifiers from overheating.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{schema_measurement_board1_02}.png}
+\caption{Measurement board (Ohmpi version 1.02)}\label{\detokenize{V2_00:id1}}\end{figure}
+
+\begin{sphinxadmonition}{note}{Note:}
+\sphinxAtStartPar
+If you want to have very accurate measurements you can replace the resistors with a tolerance of 1\% by resistors with a tolerance of 0.01\% which will improve the measurement, but the cost will be higher.
+\end{sphinxadmonition}
+
+
+\subsubsection{b) Implementation}
+\label{\detokenize{V2_00:b-implementation}}
+\sphinxAtStartPar
+The measurement board must be printed using the PCB file (Source file repository), with components soldered onto
+it by following the steps described below and illustrated in the following figure :
+\begin{itemize}
+\item {} \begin{description}
+\item[{Step no. 1: test divider bridge}] \leavevmode
+\sphinxAtStartPar
+For each measurement channel, we have installed a bridge divider, it is necessary to test with ohmmeter the value of the resistances, to adjust  each coefficients (coef\_p0, coef\_p1, coef\_p2, coef\_p3) in the Ohmpi.py code..
+\begin{quote}
+\begin{equation*}
+\begin{split}coeff po = (R1 + R2) / R1\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p1 = (R3 + R4) / R3\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p2 = (R7 + R6) / R7\end{split}
+\end{equation*}\begin{equation*}
+\begin{split}coeff p3 = (R9 + R8) / R9\end{split}
+\end{equation*}
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=36,stepnumber=1]
+ \PYG{l+s+sd}{\PYGZdq{}\PYGZdq{}\PYGZdq{}}
+\PYG{l+s+sd}{ hardware parameters}
+\PYG{l+s+sd}{ \PYGZdq{}\PYGZdq{}\PYGZdq{}}
+ \PYG{n}{R\PYGZus{}ref} \PYG{o}{=} \PYG{l+m+mi}{50} \PYG{c+c1}{\PYGZsh{} reference resistance value in ohm}
+ \PYG{n}{coef\PYGZus{}p0} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P0, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p1} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P1, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p2} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P2, measurement in V/V}
+ \PYG{n}{coef\PYGZus{}p3} \PYG{o}{=} \PYG{l+m+mf}{2.5} \PYG{c+c1}{\PYGZsh{} slope for current conversion for ADS.P3, measurement in V/V}
+\end{sphinxVerbatim}
+
+\sphinxAtStartPar
+The coefficient parameters can be adjusted in lines 40 to 43 of the ohmpi.py code.
+\end{quote}
+
+\end{description}
+
+\item {} 
+\sphinxAtStartPar
+Step no. 2: installation of the 1\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\% (b\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 3: installation of the 1.5\sphinxhyphen{}Kohm resistors with an accuracy of \(\pm\) 1\%(C\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 4: installation of both the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal blocks (c\sphinxhyphen{}in the figure)
+
+\item {} 
+\sphinxAtStartPar
+Step no. 5: installation of the 50\sphinxhyphen{}Ohm reference resistor \(\pm\) 0.1\%, please check the value and correct the line 39 in ohmpi.py code (d\sphinxhyphen{}in the figure)
+
+\item {} 
+\sphinxAtStartPar
+Step no. 6: addition of both the ADS115 directly onto the header (pins must be plugged according to the figure) and the LM358N operational amplifiers (pay attention to the orientation) (e\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 7: installation of the 10\sphinxhyphen{}Mohm resistors with an accuracy of \(\pm\) 5\% (f\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Step no. 8: installation of the two DC/DC converter TRN3\sphinxhyphen{}1215 (h\sphinxhyphen{}in the figure).
+
+\item {} 
+\sphinxAtStartPar
+Setp no. 9: installation of the four capacitor on 100\sphinxhyphen{}nF/50vDC and the fuse of 10\sphinxhyphen{}A (h\sphinxhyphen{}in the figure).
+
+\end{itemize}
+
+\sphinxAtStartPar
+1\sphinxhyphen{}Kohm and 1.5\sphinxhyphen{}Kohm resistors apply to the divider bridge. If, for example, you prefer using a stronger power supply, it would be possible to adjust the divider bridge value by simply modifying these resistors.
+Once all the components have been soldered together, the measurement board can be connected to the Raspberry Pi and the
+battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to
+place a fuse holder with a 1.5\sphinxhyphen{}A fuse for safety purposes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{measurement_board1-02}.jpg}
+\caption{Measurement circuit board assembly: a) printed circuit board, b) adding the 1\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, c)adding the 1.5\sphinxhyphen{}Kohm resistors \(\pm\) 1\%, d) adding the black female 1 x 10 header and the 7\sphinxhyphen{}blue screw terminal block(2 pin, 3.5\sphinxhyphen{}mm pitch), e) adding the 50\sphinxhyphen{}ohm reference resistor \(\pm\) 0.1\%, and f) adding the ADS1115 and the LM358N low\sphinxhyphen{}power dual operational amplifiers}\label{\detokenize{V2_00:id2}}\end{figure}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{measurement_board-2-V1-02}.jpg}
+\caption{Measurement board installation with Raspberry Pi}\label{\detokenize{V2_00:id3}}\end{figure}
+
+
+\subsection{Current injection board}
+\label{\detokenize{V2_00:current-injection-board}}
+\sphinxAtStartPar
+To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground.
+In our case, a simple 9\sphinxhyphen{}V lead\sphinxhyphen{}acid battery is used to create an electrical potential difference that results
+in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This
+injection is controlled via a 4\sphinxhyphen{}channel relay module board connected to the Raspberry Pi. The mechanical relay
+module board is shown in Figure 4. Relays 1 and 2 serve to switch on the current source. The common contacts
+of relays 1 and 2 are connected to the positive and negative battery poles, respectively. The normally open
+contacts of both relays are connected to the common contacts of relays 3 and 4. Relays 1 and 2 are connected
+to the GPIO 7 on the Raspberry Pi and therefore activate simultaneously. The role of relays 3 and 4 is to reverse
+the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by the GPIO 8 in the open position,
+the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized,
+they remain in the normally closed position. This set\sphinxhyphen{}up offers a simple and robust solution to inject current.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{current_board}.jpg}
+\caption{Wiring of the 4\sphinxhyphen{}channel relay module board for current injection management}\label{\detokenize{V2_00:id4}}\end{figure}
+
+\sphinxAtStartPar
+The next step consists of featuring the 4\sphinxhyphen{}channel relay module used for current injection and its assembly. The wiring
+between the relays must be carried out in strict accordance with Fig. 10. This card must then be connected to the Raspberry
+Pi and the measurement card. On the Raspberry Pi, it is necessary to connect inputs In1 and In2 to the same GPIO. For this
+purpose, it is necessary to solder together the two pins on the 4\sphinxhyphen{}channel relay shield module and connect them to the Raspberry Pi GPIO\sphinxhyphen{}7 (Fig. 10). The same must be performed for inputs In3 and In4 with GPIO\sphinxhyphen{}8. Connect the GND and 5Vdc pins of
+the relay card’s 4 channels respectively to the GND pin and 5Vcc of the Raspberry Pi. Now connect relays 1, 2, 3 and 4, as
+shown in the diagram, using 1\sphinxhyphen{}mm2 cables (red and black in Fig. 10). Lastly, connect the inputs of relay 1 and 2 respectively
+to terminals B and A of the measurement board.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=700\sphinxpxdimen]{{installation_current_board_1_02}.jpg}
+\caption{Current injection board installation with Raspberry Pi}\label{\detokenize{V2_00:id5}}\end{figure}
+
+\sphinxAtStartPar
+Congratulations, you have build a 4 electrodes resistivity\sphinxhyphen{}meter.
+
+
+\subsection{Frist four electrodes resistivity mesurement}
+\label{\detokenize{V2_00:frist-four-electrodes-resistivity-mesurement}}
+\sphinxAtStartPar
+Under construction !
+
+\sphinxAtStartPar
+Describe the way to valide the first part of the instruction.
+Electrical resistivity measurement on test circuit
+
+
+\section{Multiplexer implentation}
+\label{\detokenize{V2_00:multiplexer-implentation}}
+\sphinxAtStartPar
+The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement
+by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands
+of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of
+the 32 electrodes stuck into the ground, all of which are connected to the data logger.
+
+\sphinxAtStartPar
+We will describe below how to assemble the four multiplexers (MUX), one per terminal. A multiplexer consists of 2 relay
+modules with 16 channels each. On the first board, on each MUX, 15 relays out of the 16 available will be used. Please note that the suggested
+configuration enables making smaller multiplexers (8 or 16 electrodes only). On the other hand, if you prefer upping to 64 electrodes,
+which is entirely possible, a GPIO channel multiplier will have to be used.
+To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=500\sphinxpxdimen]{{multiplexer_implementation}.jpg}
+\caption{Schematic diagram of the wiring of two 16\sphinxhyphen{}channel relay shields}\label{\detokenize{V2_00:id6}}\end{figure}
+
+\sphinxAtStartPar
+For this purpose, 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly.
+The length was adjusted so that the distance between the two points to be connected could be directly measured on the board once they had
+been assembled one above the other, in adding an extra 3 cm. The wires at the ends need to be stripped and the end caps added.
+As a final step, connect the cables to the correct connectors. This operation must be repeated in order to carry out all the wiring shown in Figure below.
+
+\sphinxAtStartPar
+Once the operation has been completed, the 16 control pins of each 16\sphinxhyphen{}channel relay shield card must be prepared. Each card actually contains 16 input channels
+for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
+see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
+\begin{quote}
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=400\sphinxpxdimen]{{connection}.jpg}
+\caption{Connection to the 16\sphinxhyphen{}channel relay shield}\label{\detokenize{V2_00:id7}}\end{figure}
+\end{quote}
+
+\sphinxAtStartPar
+For the 16\sphinxhyphen{}channel relay shield no. 1, these steps must be followed:
+*       Position a test circuit with 10 horizontal and 10 vertical holes on the pins of the 16\sphinxhyphen{}channel relay shield board.
+*       Follow the diagram and solder the pins as shown in Fig.
+*       Lastly, solder 0.5\sphinxhyphen{}mm\(\sp{\text{2}}\) wires 1 m in length to the test circuit.
+
+\sphinxAtStartPar
+For relay shield no. 2, follow the same procedure, but solder all the pins together (d\sphinxhyphen{}e\sphinxhyphen{}f).
+This same operation must be repeated for the other three multiplexers as well.
+The next step consists of connecting the relay card inputs to the Raspberry Pi according to Table 5 for all four multiplexers.
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|T|T|T|}
+\hline
+\sphinxmultirow{2}{1}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{6}}
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxstartmulticolumn{4}%
+\begin{varwidth}[t]{\sphinxcolwidth{4}{6}}
+\sphinxAtStartPar
+Relay shield n°1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+\sphinxstopmulticolumn
+&
+\sphinxAtStartPar
+Relay Shield n°2
+\\
+\cline{2-6}\sphinxtablestrut{1}&
+\sphinxAtStartPar
+Pin 1
+&
+\sphinxAtStartPar
+Pin 2\sphinxhyphen{}3
+&
+\sphinxAtStartPar
+Pin 4\sphinxhyphen{}7
+&
+\sphinxAtStartPar
+Pin 8\sphinxhyphen{}16
+&
+\sphinxAtStartPar
+Pin 1\sphinxhyphen{} 16
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer A
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+16
+&
+\sphinxAtStartPar
+20
+&
+\sphinxAtStartPar
+21
+&
+\sphinxAtStartPar
+26
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer B
+&
+\sphinxAtStartPar
+18
+&
+\sphinxAtStartPar
+23
+&
+\sphinxAtStartPar
+24
+&
+\sphinxAtStartPar
+25
+&
+\sphinxAtStartPar
+19
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer M
+&
+\sphinxAtStartPar
+06
+&
+\sphinxAtStartPar
+13
+&
+\sphinxAtStartPar
+04
+&
+\sphinxAtStartPar
+17
+&
+\sphinxAtStartPar
+27
+\\
+\hline
+\sphinxAtStartPar
+Multiplexer N
+&
+\sphinxAtStartPar
+22
+&
+\sphinxAtStartPar
+10
+&
+\sphinxAtStartPar
+09
+&
+\sphinxAtStartPar
+11
+&
+\sphinxAtStartPar
+05
+\\
+\hline
+\end{tabulary}
+\par
+\sphinxattableend\end{savenotes}
+\begin{quote}
+
+\sphinxAtStartPar
+Connection of the GPIOs to each multiplexer
+\end{quote}
+
+
+\section{Electrode connection}
+\label{\detokenize{V2_00:electrode-connection}}
+\sphinxAtStartPar
+At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set\sphinxhyphen{}up, screw terminals assembled on a din rail were used.
+According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming
+connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=300\sphinxpxdimen]{{cable}.jpg}
+\caption{Wire cabling for multiplexer and terminal screw connection}\label{\detokenize{V2_00:id8}}\end{figure}
+
+\sphinxAtStartPar
+the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B
+must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block.
+This operation must be repeated for all 32 electrodes.
+
+\begin{figure}[htbp]
+\centering
+\capstart
+
+\noindent\sphinxincludegraphics[width=800\sphinxpxdimen,height=800\sphinxpxdimen]{{electrode_cable}.jpg}
+\caption{Example of a multiplexer connection to the screw terminal for electrode no. 1.}\label{\detokenize{V2_00:id9}}\end{figure}
+
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The 16 channel relay cards exist in 5\sphinxhyphen{}V and 12\sphinxhyphen{}V , in the bottom figure we have 12\sphinxhyphen{}V cards that we will directly connect to the battery.
+In case you bought 16 channel relay 5\sphinxhyphen{}V cards, you will need to add a DC/DC 12\sphinxhyphen{}V/5\sphinxhyphen{}V converter. You can use a STEP DOWN MODULE DC\sphinxhyphen{}DC (Velleman WPM404) and set the voltage to 5V with the potentiometer.
+\end{sphinxadmonition}
+
+
+\section{Operating instruction}
+\label{\detokenize{V2_00:operating-instruction}}
+
+\subsection{Preliminary procedure (Only for the initial operation)}
+\label{\detokenize{V2_00:preliminary-procedure-only-for-the-initial-operation}}
+\sphinxAtStartPar
+The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (\sphinxurl{https://osf.io/dzwb4/})
+or at the following Gitlab repository address: \sphinxurl{https://gitlab.irstea.fr/reversaal/OhmPi}. The code must be then unzipped into a selected folder (e.g. OhmPi\sphinxhyphen{}master). A “readme” file
+is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing
+the required packages and running the code.
+
+
+\subsection{Startup procedure}
+\label{\detokenize{V2_00:startup-procedure}}
+\sphinxAtStartPar
+As an initial operating instruction, all batteries must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer)
+into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply
+(for laboratory measurements) or a power bank (5V \sphinxhyphen{} 2A for field measurements). At this point, you’ll need to access the Raspbian operating system. Inside the previously created folder “ohmPi”,
+the protocol file “ABMN.txt” must be created or modified; this file contains all quadrupole ABMN numeration (an example is proposed with the source code). Some input parameters of the main “ohmpi.py”
+function may be adjusted/optimized depending on the measurement attributes. For example, both the current injection duration and number of stacks can be adjusted. At this point, the9 V and 12\sphinxhyphen{}V battery can be
+plugged into the hardware; the “ohmpi.py” source code must be run within a python3 environment (or a virtual environment if one has been created) either in the terminal or using Thonny. You should now
+hear the characteristic sound of a relay switching as a result of electrode permutation. After each quadrupole measurement, the potential difference as well as the current intensity and resistance
+are displayed on the screen. A measurement file is automatically created and named “measure.csv”; it will be placed in the same folder.
+
+
+\subsection{Electrical resistivity measurement parameters description}
+\label{\detokenize{V2_00:electrical-resistivity-measurement-parameters-description}}
+\sphinxAtStartPar
+In the version 1.02, the measurement parameters are in the Jason file (ohmpi\_param.json).
+
+\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=1,stepnumber=1]
+ \PYG{n}{nb\PYGZus{}electrodes} \PYG{o}{=} \PYG{l+m+mi}{32} \PYG{c+c1}{\PYGZsh{} maximum number of electrodes on the resistivity meter}
+ \PYG{n}{injection\PYGZus{}duration} \PYG{o}{=} \PYG{l+m+mf}{0.5} \PYG{c+c1}{\PYGZsh{} Current injection duration in second}
+ \PYG{n}{nbr\PYGZus{}meas}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} Number of times the quadripole sequence is repeated}
+ \PYG{n}{sequence\PYGZus{}delay}\PYG{o}{=} \PYG{l+m+mi}{30} \PYG{c+c1}{\PYGZsh{} Delay in seconds between 2 sequences}
+ \PYG{n}{stack}\PYG{o}{=} \PYG{l+m+mi}{1} \PYG{c+c1}{\PYGZsh{} repetition of the current injection for each quadripole}
+ \PYG{n}{export\PYGZus{}path}\PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{home/pi/Desktop/measurement.csv}\PYG{l+s+s2}{\PYGZdq{}}
+\end{sphinxVerbatim}
+
+
+\section{Complete list of components}
+\label{\detokenize{V2_00:complete-list-of-components}}
+\begin{sphinxadmonition}{warning}{Warning:}
+\sphinxAtStartPar
+The list evolve a little bit after the publication of the article, it is necessary to refer to this list, the article is out of date
+\end{sphinxadmonition}
+
+
+\begin{savenotes}\sphinxattablestart
+\centering
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{List of components}\label{\detokenize{V2_00:id10}}
+\sphinxaftertopcaption
+\begin{tabular}[t]{|\X{30}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|\X{70}{380}|}
+\hline
+\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Component
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Number
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Cost per unit
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Total cost
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer
+&\sphinxstyletheadfamily 
+\sphinxAtStartPar
+Manufacturer s reference
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 3 Model B+
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 3 Model B
+\\
+\hline
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+8.37
+&
+\sphinxAtStartPar
+Raspberry
+&
+\sphinxAtStartPar
+Raspberry Pi 1 2 and 3 Power Supply
+\\
+\hline
+\sphinxAtStartPar
+SainSmart 16\sphinxhyphen{}Channel 12V Relay
+&
+\sphinxAtStartPar
+8
+&
+\sphinxAtStartPar
+24.99
+&
+\sphinxAtStartPar
+199.92
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+101\sphinxhyphen{}70\sphinxhyphen{}103
+\\
+\hline
+\sphinxAtStartPar
+4\sphinxhyphen{}Channel 5V Relay Module
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+7.99
+&
+\sphinxAtStartPar
+Sain Smart
+&
+\sphinxAtStartPar
+20\sphinxhyphen{}018\sphinxhyphen{}101\sphinxhyphen{}CMS
+\\
+\hline
+\sphinxAtStartPar
+cable 1X1 mm2 (50 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+19.66
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1568649
+\\
+\hline
+\sphinxAtStartPar
+cable 1X0.5 mm2 (100 m)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+29.71
+&
+\sphinxAtStartPar
+TRU COMPONENTS
+&
+\sphinxAtStartPar
+1565235
+\\
+\hline
+\sphinxAtStartPar
+Printed circuit board (packaging quantity x 3)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+12
+&
+\sphinxAtStartPar
+Asler
+&
+\sphinxAtStartPar
+0
+\\
+\hline
+\sphinxAtStartPar
+Header sets 1x10
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+2.68
+&
+\sphinxAtStartPar
+Samtec
+&
+\sphinxAtStartPar
+SSW\sphinxhyphen{}110\sphinxhyphen{}02\sphinxhyphen{}G\sphinxhyphen{}S
+\\
+\hline
+\sphinxAtStartPar
+Dual screw terminal (3.5\sphinxhyphen{}mm pitch)
+&
+\sphinxAtStartPar
+7
+&
+\sphinxAtStartPar
+0.648
+&
+\sphinxAtStartPar
+4.55
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+897\sphinxhyphen{}1332
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1 Kohm 0.5W +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.858
+&
+\sphinxAtStartPar
+3.44
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K0BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 1.5 Kohms +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.627
+&
+\sphinxAtStartPar
+2.52
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+H81K5BYA
+\\
+\hline
+\sphinxAtStartPar
+Resistor 50 +\sphinxhyphen{} 0.1\%
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+8.7
+&
+\sphinxAtStartPar
+TE Connectivity
+&
+\sphinxAtStartPar
+UPW50B50RV
+\\
+\hline
+\sphinxAtStartPar
+LM358N AMP\sphinxhyphen{}o
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.8
+&
+\sphinxAtStartPar
+2.4
+&
+\sphinxAtStartPar
+Texas Instruments
+&
+\sphinxAtStartPar
+LM358AN/NOPB
+\\
+\hline
+\sphinxAtStartPar
+ADS1115
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+11.9
+&
+\sphinxAtStartPar
+Adafruit
+&
+\sphinxAtStartPar
+1083
+\\
+\hline
+\sphinxAtStartPar
+12V battery 7ah
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+19.58
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+537\sphinxhyphen{}5488
+\\
+\hline
+\sphinxAtStartPar
+Battery Holder Type D LR20 (9V)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+3.43
+&
+\sphinxAtStartPar
+RS PRO
+&
+\sphinxAtStartPar
+185\sphinxhyphen{}4686
+\\
+\hline
+\sphinxAtStartPar
+Ferrule Crimp Terminal (1 mm2) (500 pieces)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+30.48
+&
+\sphinxAtStartPar
+WEIDMULLER
+&
+\sphinxAtStartPar
+9004330000
+\\
+\hline
+\sphinxAtStartPar
+Electrical Crimp Terminal (0.5 mm2) (100 piece)
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+6.38
+&
+\sphinxAtStartPar
+AMP \sphinxhyphen{} TE CONNECTIVITY
+&
+\sphinxAtStartPar
+966067\sphinxhyphen{}1
+\\
+\hline
+\sphinxAtStartPar
+Fuse 1.0 A
+&
+\sphinxAtStartPar
+1
+&
+\sphinxAtStartPar
+0.2
+&&
+\sphinxAtStartPar
+LITTELFUSE
+&
+\sphinxAtStartPar
+0251001.PAT1L
+\\
+\hline
+\sphinxAtStartPar
+Capacitor 100nF 50Vdc 10\% Ceramic
+&
+\sphinxAtStartPar
+4
+&
+\sphinxAtStartPar
+0.2
+&
+\sphinxAtStartPar
+0.8
+&
+\sphinxAtStartPar
+KEMET
+&
+\sphinxAtStartPar
+C320C104K1
+\\
+\hline
+\sphinxAtStartPar
+DC/DC converter 12 to 24V
+&
+\sphinxAtStartPar
+2
+&
+\sphinxAtStartPar
+26.72
+&
+\sphinxAtStartPar
+53.44
+&
+\sphinxAtStartPar
+TracoPower
+&
+\sphinxAtStartPar
+TRN 3\sphinxhyphen{}1215
+\\
+\hline
+\end{tabular}
+\par
+\sphinxattableend\end{savenotes}
+
+
+
+\renewcommand{\indexname}{Index}
+\printindex
+\end{document}
\ No newline at end of file
diff --git a/sphinx/build/latex/python.ist b/sphinx/build/latex/python.ist
new file mode 100644
index 0000000000000000000000000000000000000000..70536a6683577925167e84e0b0f6a06228754d0a
--- /dev/null
+++ b/sphinx/build/latex/python.ist
@@ -0,0 +1,16 @@
+line_max 100
+headings_flag 1
+heading_prefix "  \\bigletter "
+
+preamble "\\begin{sphinxtheindex}
+\\let\\bigletter\\sphinxstyleindexlettergroup
+\\let\\spxpagem \\sphinxstyleindexpagemain
+\\let\\spxentry \\sphinxstyleindexentry
+\\let\\spxextra \\sphinxstyleindexextra
+
+"
+
+postamble "\n\n\\end{sphinxtheindex}\n"
+
+symhead_positive "{\\sphinxsymbolsname}"
+numhead_positive "{\\sphinxnumbersname}"
diff --git a/sphinx/build/latex/raspbian_version.jpg b/sphinx/build/latex/raspbian_version.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3b60d4f3924ef361d1fac6fd9453bc031a5c92ec
Binary files /dev/null and b/sphinx/build/latex/raspbian_version.jpg differ
diff --git a/sphinx/build/latex/schema_measurement_board.jpg b/sphinx/build/latex/schema_measurement_board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..067f79537545338f96b3db86198f8ecbabb3e6e4
Binary files /dev/null and b/sphinx/build/latex/schema_measurement_board.jpg differ
diff --git a/sphinx/build/latex/schema_measurement_board1_02.png b/sphinx/build/latex/schema_measurement_board1_02.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d015e1f9bcd6bdb5e54de3b5485592cb1c8ca54
Binary files /dev/null and b/sphinx/build/latex/schema_measurement_board1_02.png differ
diff --git a/sphinx/build/latex/sphinx.sty b/sphinx/build/latex/sphinx.sty
new file mode 100644
index 0000000000000000000000000000000000000000..94a46175dbc28b04bddd46270354a327c807bc85
--- /dev/null
+++ b/sphinx/build/latex/sphinx.sty
@@ -0,0 +1,351 @@
+%
+% sphinx.sty
+%
+% Adapted from the old python.sty, mostly written by Fred Drake,
+% by Georg Brandl.
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinx}[2021/01/27 v4.0.0 LaTeX package (Sphinx markup)]
+
+% provides \ltx@ifundefined
+% (many packages load ltxcmds: graphicx does for pdftex and lualatex but
+% not xelatex, and anyhow kvoptions does, but it may be needed in future to
+% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined)
+\RequirePackage{ltxcmds}
+
+%% for deprecation warnings
+\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name,
+% #2 = when deprecated, #3 = when removed, #4 = additional info
+  \edef\spx@tempa{\detokenize{#1}}%
+  \ltx@ifundefined{sphinx_depr_\spx@tempa}{%
+     \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa
+     \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter
+         \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname
+         \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J
+         \sphinxdeprecatedmacro^^J
+         \@spaces- is deprecated at Sphinx #2^^J
+         \@spaces- and removed at Sphinx #3.^^J
+         #4^^J****}}%
+  }{% warning already emitted (at end of latex log), don't repeat
+  }}
+
+
+%% OPTION HANDLING
+%
+
+% We first handle options then load packages, but we need \definecolor from
+% xcolor/color.
+
+% FIXME: we should \RequirePackage{xcolor} always now
+% The xcolor package draws better fcolorboxes around verbatim code
+\IfFileExists{xcolor.sty}{
+    \RequirePackage{xcolor}
+}{
+    \RequirePackage{color}
+}
+
+% Handle options via "kvoptions" (later loaded by hyperref anyhow)
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix
+
+% Sphinx legacy text layout: 1in margins on all four sides
+\ifx\@jsc@uplatextrue\@undefined
+\DeclareStringOption[1in]{hmargin}
+\DeclareStringOption[1in]{vmargin}
+\DeclareStringOption[.5in]{marginpar}
+\else
+% Japanese standard document classes handle \mag in a special way
+\DeclareStringOption[\inv@mag in]{hmargin}
+\DeclareStringOption[\inv@mag in]{vmargin}
+\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar}
+\fi
+
+\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0}
+\DeclareStringOption[-1]{numfigreset}
+\DeclareBoolOption[false]{nonumfigreset}
+\DeclareBoolOption[false]{mathnumfig}
+\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}}
+\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}}
+% \DeclareBoolOption[false]{usespart}% not used
+% dimensions, we declare the \dimen registers here.
+\newdimen\sphinxverbatimsep
+\newdimen\sphinxverbatimborder
+\newdimen\sphinxshadowsep
+\newdimen\sphinxshadowsize
+\newdimen\sphinxshadowrule
+% \DeclareStringOption is not convenient for the handling of these dimensions
+% because we want to assign the values to the corresponding registers. Even if
+% we added the code to the key handler it would be too late for the initial
+% set-up and we would need to do initial assignments explicitely. We end up
+% using \define@key directly.
+% verbatim
+\sphinxverbatimsep=\fboxsep
+  \define@key{sphinx}{verbatimsep}{\sphinxverbatimsep\dimexpr #1\relax}
+\sphinxverbatimborder=\fboxrule
+  \define@key{sphinx}{verbatimborder}{\sphinxverbatimborder\dimexpr #1\relax}
+% topic boxes
+\sphinxshadowsep =5pt
+  \define@key{sphinx}{shadowsep}{\sphinxshadowsep\dimexpr #1\relax}
+\sphinxshadowsize=4pt
+  \define@key{sphinx}{shadowsize}{\sphinxshadowsize\dimexpr #1\relax}
+\sphinxshadowrule=\fboxrule
+  \define@key{sphinx}{shadowrule}{\sphinxshadowrule\dimexpr #1\relax}
+% verbatim
+\DeclareBoolOption[true]{verbatimwithframe}
+\DeclareBoolOption[true]{verbatimwrapslines}
+\DeclareBoolOption[false]{verbatimforcewraps}
+\DeclareStringOption[3]{verbatimmaxoverfull}
+\DeclareStringOption[100]{verbatimmaxunderfull}
+\DeclareBoolOption[true]{verbatimhintsturnover}
+\DeclareBoolOption[true]{inlineliteralwraps}
+\DeclareStringOption[t]{literalblockcappos}
+\DeclareStringOption[r]{verbatimcontinuedalign}
+\DeclareStringOption[r]{verbatimcontinuesalign}
+% parsed literal
+\DeclareBoolOption[true]{parsedliteralwraps}
+% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX
+\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace}
+\DeclareStringOption % must use braces to hide the brackets
+  [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]%
+  {verbatimcontinued}
+% notices/admonitions
+% the dimensions for notices/admonitions are kept as macros and assigned to
+% \spx@notice@border at time of use, hence \DeclareStringOption is ok for this
+\newdimen\spx@notice@border
+\DeclareStringOption[0.5pt]{noteborder}
+\DeclareStringOption[0.5pt]{hintborder}
+\DeclareStringOption[0.5pt]{importantborder}
+\DeclareStringOption[0.5pt]{tipborder}
+\DeclareStringOption[1pt]{warningborder}
+\DeclareStringOption[1pt]{cautionborder}
+\DeclareStringOption[1pt]{attentionborder}
+\DeclareStringOption[1pt]{dangerborder}
+\DeclareStringOption[1pt]{errorborder}
+% footnotes
+\DeclareStringOption[\mbox{ }]{AtStartFootnote}
+% we need a public macro name for direct use in latex file
+\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote}
+% no such need for this one, as it is used inside other macros
+\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote}
+% some font styling.
+\DeclareStringOption[\sffamily\bfseries]{HeaderFamily}
+% colours
+% same problems as for dimensions: we want the key handler to use \definecolor.
+% first, some colours with no prefix, for backwards compatibility
+\newcommand*{\sphinxDeclareColorOption}[2]{%
+   \definecolor{#1}#2%
+   \define@key{sphinx}{#1}{\definecolor{#1}##1}%
+}%
+\sphinxDeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}}
+\sphinxDeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}}
+\sphinxDeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}}
+\sphinxDeclareColorOption{VerbatimColor}{{rgb}{1,1,1}}
+\sphinxDeclareColorOption{VerbatimBorderColor}{{rgb}{0,0,0}}
+% now the colours defined with "sphinx" prefix in their names
+\newcommand*{\sphinxDeclareSphinxColorOption}[2]{%
+   % set the initial default
+   \definecolor{sphinx#1}#2%
+   % set the key handler. The "value" ##1 must be acceptable by \definecolor.
+   \define@key{sphinx}{#1}{\definecolor{sphinx#1}##1}%
+}%
+% Default color chosen to be as in minted.sty LaTeX package!
+\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}}
+% admonition boxes, "light" style
+\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{importantBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{tipBorderColor}{{rgb}{0,0,0}}
+% admonition boxes, "heavy" style
+\sphinxDeclareSphinxColorOption{warningBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{cautionBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{attentionBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{dangerBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{errorBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{warningBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{cautionBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{attentionBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{dangerBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{errorBgColor}{{rgb}{1,1,1}}
+
+\DeclareDefaultOption{\@unknownoptionerror}
+\ProcessKeyvalOptions*
+% don't allow use of maxlistdepth via \sphinxsetup.
+\DisableKeyvalOption{sphinx}{maxlistdepth}
+\DisableKeyvalOption{sphinx}{numfigreset}
+\DisableKeyvalOption{sphinx}{nonumfigreset}
+\DisableKeyvalOption{sphinx}{mathnumfig}
+% FIXME: this is unrelated to an option, move this elsewhere
+% To allow hyphenation of first word in narrow contexts; no option,
+% customization to be done via 'preamble' key
+\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip}
+% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex
+\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi
+% user interface: options can be changed midway in a document!
+\newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}}
+
+
+%% MISCELLANEOUS CONTEXT
+%
+% flag to be set in a framed environment
+% (defined here as currently needed by three sphinxlatex....sty files and
+% even if not needed if such files are replaced, the definition does no harm)
+\newif\ifspx@inframed
+%
+% \spx@ifcaptionpackage (defined at begin document)
+%     is needed currently in macros from:
+%     sphinxlatexliterals.sty (sphinxVerbatim)
+%     sphinxlatextables.sty   (for some macros used in the table templates)
+%
+% \sphinxcaption is mark-up injected by the tabular and tabulary templates
+%     it is defined in sphinxlatextables.sty
+%
+% store the original \caption macro for usage with figures inside longtable
+% and tabulary cells. Make sure we get the final \caption in presence of
+% caption package, whether the latter was loaded before or after sphinx.
+\AtBeginDocument{%
+    \let\spx@originalcaption\caption
+    \@ifpackageloaded{caption}
+      {\let\spx@ifcaptionpackage\@firstoftwo
+       \caption@AtBeginDocument*{\let\spx@originalcaption\caption}%
+% in presence of caption package, drop our own \sphinxcaption whose aim was to
+% ensure same width of caption to all kinds of tables (tabular(y), longtable),
+% because caption package has its own width (or margin) option
+       \def\sphinxcaption{\caption}%
+      }%
+      {\let\spx@ifcaptionpackage\@secondoftwo}%
+}
+
+%% PASS OPTIONS
+%
+% pass options to hyperref; it must not have been loaded already
+\input{sphinxoptionshyperref.sty}
+% pass options to geometry; it must not have been loaded already
+\input{sphinxoptionsgeometry.sty}
+
+
+%% COLOR (general)
+%
+% FIXME: these two should be deprecated
+%
+% FIXME: \normalcolor should be used and \py@NormalColor never defined
+\def\py@NormalColor{\color{black}}
+% FIXME: \color{TitleColor} should be used directly and \py@TitleColor
+% should never get defined.
+\def\py@TitleColor{\color{TitleColor}}
+
+
+%% PACKAGES
+%
+% as will be indicated below, secondary style files load some more packages
+%
+% For \text macro (sphinx.util.texescape)
+% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty
+\RequirePackage{amstext}
+% It was passed "warn" option from latex template in case it is already loaded
+% via some other package before \usepackage{sphinx} in preamble
+\RequirePackage{textcomp}
+% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code
+% for allowing figures in tables.
+\RequirePackage{float}
+% For floating figures in the text. Better to load after float.
+\RequirePackage{wrapfig}
+% Provides \captionof, used once by latex writer (\captionof{figure})
+\RequirePackage{capt-of}
+% Support hlist directive
+\RequirePackage{multicol}
+
+
+%% GRAPHICS
+%
+% It will always be needed, so let's load it here
+\RequirePackage{graphicx}
+\input{sphinxlatexgraphics.sty}
+
+
+%% FRAMED ENVIRONMENTS
+%
+\input{sphinxlatexadmonitions.sty}
+\input{sphinxlatexliterals.sty}
+\input{sphinxlatexshadowbox.sty}
+
+
+%% CONTAINERS
+%
+\input{sphinxlatexcontainers.sty}
+
+
+%% PYGMENTS
+% stylesheet for highlighting with pygments
+\RequirePackage{sphinxhighlight}
+
+
+%% TABLES
+%
+\input{sphinxlatextables.sty}
+
+
+%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS
+%
+\input{sphinxlatexnumfig.sty}
+
+
+%% LISTS
+%
+\input{sphinxlatexlists.sty}
+
+
+%% FOOTNOTES
+%
+% Support scopes for footnote numbering
+\newcounter{sphinxscope}
+\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}}
+% Explicitly numbered footnotes may be referred to, and for this to be
+% clickable we need to have only one target. So we will step this at each
+% explicit footnote and let \thesphinxscope take it into account
+\newcounter{sphinxexplicit}
+\newcommand{\sphinxstepexplicit}{\stepcounter{sphinxexplicit}}
+% Some babel/polyglossia languages fiddle with \@arabic, so let's be extra
+% cautious and redefine \thesphinxscope with \number not \@arabic.
+% Memo: we expect some subtle redefinition of \thesphinxscope to be a part of page
+% scoping for footnotes, when we shall implement it.
+\renewcommand{\thesphinxscope}{\number\value{sphinxscope}.\number\value{sphinxexplicit}}
+\newcommand\sphinxthefootnotemark[2]{%
+   % this is used to make reference to an explicitly numbered footnote not on same page
+   % #1=label of footnote text, #2=page number where footnote text was printed
+   \ifdefined\pagename
+      \pagename\space#2, % <- space
+    \else
+      p. #2, % <- space
+   \fi #1% no space
+}
+% support large numbered footnotes in minipage; but this is now obsolete
+% from systematic use of savenotes environment around minipages
+\def\thempfootnote{\arabic{mpfootnote}}
+% This package is needed to support hyperlinked footnotes in tables and
+% framed contents, and to allow code-blocks in footnotes.
+\RequirePackage{sphinxpackagefootnote}
+
+
+%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS
+%
+\input{sphinxlatexindbibtoc.sty}
+
+
+%% STYLING
+%
+\input{sphinxlatexstylepage.sty}
+\input{sphinxlatexstyleheadings.sty}
+\input{sphinxlatexstyletext.sty}
+
+
+%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS
+%
+\input{sphinxlatexobjects.sty}
+
+
+% FIXME: this line should be dropped, as "9" is default anyhow.
+\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi
+
+
+\endinput
diff --git a/sphinx/build/latex/sphinx.xdy b/sphinx/build/latex/sphinx.xdy
new file mode 100644
index 0000000000000000000000000000000000000000..edca178742edb53fc0c430403bea1ec323ca4a9e
--- /dev/null
+++ b/sphinx/build/latex/sphinx.xdy
@@ -0,0 +1,230 @@
+;;; -*- mode: lisp; coding: utf-8; -*-
+
+;; Unfortunately xindy is out-of-the-box hyperref-incompatible.  This
+;; configuration is a workaround, which requires to pass option
+;; hyperindex=false to hyperref.
+;; textit and emph not currently used, spxpagem replaces former textbf
+(define-attributes (("textbf" "textit" "emph" "spxpagem" "default")))
+(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf")
+(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit")
+(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph")
+(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem")
+(markup-locref :open "\hyperpage{" :close "}" :attr "default")
+
+(require "numeric-sort.xdy")
+
+;; xindy base module latex.xdy loads tex.xdy and the latter instructs
+;; xindy to ignore **all** TeX macros in .idx entries, except those
+;; explicitely described in merge rule.  But when after applying all
+;; merge rules an empty string results, xindy raises an error:
+
+;;   ERROR: CHAR: index 0 should be less than the length of the string
+
+;; For example when using pdflatex with utf-8 characters the index
+;; file will contain \IeC macros and they will get ignored except if
+;; suitable merge rules are loaded early.  The texindy script coming
+;; with xindy provides this, but only for Latin scripts.  The texindy
+;; man page says to use rather xelatex or lualatex in case of Cyrillic
+;; scripts.
+
+;; Sphinx contributes LICRcyr2utf8.xdy to provide support for Cyrillic
+;; scripts for the pdflatex engine.
+
+;; Another issue caused by xindy ignoring all TeX macros except those
+;; explicitely declared reveals itself when attempting to index ">>>",
+;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX
+;; escaping.
+
+;; To fix this, Sphinx does **not** use texindy, and does not even
+;; load the xindy latex.xdy base module.
+
+;(require "latex.xdy")
+
+;; Rather it incorporates some suitable extracts from latex.xdy and
+;; tex.xdy with additional Sphinx contributed rules.
+
+;; But, this means for pdflatex and Latin scripts that the xindy file
+;; tex/inputenc/uf8.xdy is not usable because it refers to the macro
+;; \IeC only sporadically, and as tex.xdy is not loaded, a rule such as
+;;     (merge-rule "\'e" "é" :string)
+;; does not work, it must be
+;;     (merge-rule "\IeC {\'e}" "é" :string)
+;; So Sphinx contributes LICRlatin2utf8.xdy to mitigate that problem.
+
+;;;;;;;; extracts from tex.xdy (discarding most original comments):
+
+;;;
+;;; TeX conventions
+;;;
+
+;; Discard leading and trailing white space. Collapse multiple white
+;; space characters to blank.
+
+(merge-rule "^ +" "" :eregexp)
+(merge-rule " +$" "" :eregexp)
+(merge-rule "  +" " " :eregexp)
+
+;; Handle TeX markup
+
+(merge-rule "\\([{}$%&#])" "\1" :eregexp)
+
+;;;;;;;; end of extracts from xindy's tex.xdy
+
+;;;;;;;; extracts from latex.xdy:
+
+;; Standard location classes: arabic and roman numbers, and alphabets.
+
+(define-location-class "arabic-page-numbers" ("arabic-numbers"))
+(define-location-class "roman-page-numbers"  ("roman-numbers-lowercase"))
+(define-location-class "Roman-page-numbers"  ("roman-numbers-uppercase"))
+(define-location-class "alpha-page-numbers"  ("alpha"))
+(define-location-class "Alpha-page-numbers"  ("ALPHA"))
+
+;; Output Markup
+
+(markup-letter-group-list :sep "~n~n  \indexspace~n")
+
+(markup-indexentry :open "~n  \item "           :depth 0)
+(markup-indexentry :open "~n    \subitem "      :depth 1)
+(markup-indexentry :open "~n      \subsubitem " :depth 2)
+
+(markup-locclass-list :open ", " :sep ", ")
+(markup-locref-list   :sep ", ")
+
+;;;;;;;; end of extracts from latex.xdy
+
+;; The LaTeX \index command turns \ into normal character so the TeX macros
+;; written to .idx files are not followed by a blank. This is different
+;; from non-ascii letters which end up (with pdflatex) as \IeC macros in .idx
+;; file, with a blank space after \IeC
+
+;; Details of the syntax are explained at
+;;     http://xindy.sourceforge.net/doc/manual-3.html
+;; In absence of :string, "xindy uses an auto-detection mechanism to decide,
+;; if the pattern is a regular expression or not". But it is not obvious to
+;; guess, for example "\\_" is not detected as RE but "\\P\{\}" is, so for
+;; being sure we apply the :string switch everywhere and do not use \\ etc...
+
+;; Go back from sphinx.util.texescape TeX macros to UTF-8
+
+(merge-rule "\sphinxleftcurlybrace{}" "{" :string)
+(merge-rule "\sphinxrightcurlybrace{}" "}" :string)
+(merge-rule "\_" "_" :string)
+(merge-rule "{[}" "[" :string)
+(merge-rule "{]}" "]" :string)
+(merge-rule "\textbackslash{}" "\" :string)  ; " for Emacs syntax highlighting
+(merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here
+(merge-rule "\textasciicircum{}" "^" :string)
+(merge-rule "\sphinxhyphen{}" "-" :string)
+(merge-rule "\textquotesingle{}" "'" :string)
+(merge-rule "\textasciigrave{}" "`" :string)
+(merge-rule "\textless{}" "<" :string)
+(merge-rule "\textgreater{}" ">" :string)
+(merge-rule "\P{}" "¶" :string)
+(merge-rule "\S{}" "§" :string)
+(merge-rule "\texteuro{}" "€" :string)
+(merge-rule "\(\infty\)" "∞" :string)
+(merge-rule "\(\pm\)" "±" :string)
+(merge-rule "\(\rightarrow\)" "→" :string)
+(merge-rule "\(\checkmark\)" "✓" :string)
+(merge-rule "\textendash{}" "–" :string)
+(merge-rule "\textbar{}" "|" :string)
+(merge-rule "\(\sp{\text{0}}\)" "⁰" :string)
+(merge-rule "\(\sp{\text{1}}\)" "¹" :string)
+(merge-rule "\(\sp{\text{2}}\)" "²" :string)
+(merge-rule "\(\sp{\text{3}}\)" "³" :string)
+(merge-rule "\(\sp{\text{4}}\)" "⁴" :string)
+(merge-rule "\(\sp{\text{5}}\)" "⁵" :string)
+(merge-rule "\(\sp{\text{6}}\)" "⁶" :string)
+(merge-rule "\(\sp{\text{7}}\)" "⁷" :string)
+(merge-rule "\(\sp{\text{8}}\)" "⁸" :string)
+(merge-rule "\(\sp{\text{9}}\)" "⁹" :string)
+(merge-rule "\(\sb{\text{0}}\)" "â‚€" :string)
+(merge-rule "\(\sb{\text{1}}\)" "₁" :string)
+(merge-rule "\(\sb{\text{2}}\)" "â‚‚" :string)
+(merge-rule "\(\sb{\text{3}}\)" "₃" :string)
+(merge-rule "\(\sb{\text{4}}\)" "â‚„" :string)
+(merge-rule "\(\sb{\text{5}}\)" "â‚…" :string)
+(merge-rule "\(\sb{\text{6}}\)" "₆" :string)
+(merge-rule "\(\sb{\text{7}}\)" "₇" :string)
+(merge-rule "\(\sb{\text{8}}\)" "₈" :string)
+(merge-rule "\(\sb{\text{9}}\)" "₉" :string)
+(merge-rule "\IeC {\textalpha }" "α" :string)
+(merge-rule "\IeC {\textbeta }" "β" :string)
+(merge-rule "\IeC {\textgamma }" "γ" :string)
+(merge-rule "\IeC {\textdelta }" "δ" :string)
+(merge-rule "\IeC {\textepsilon }" "ε" :string)
+(merge-rule "\IeC {\textzeta }" "ζ" :string)
+(merge-rule "\IeC {\texteta }" "η" :string)
+(merge-rule "\IeC {\texttheta }" "θ" :string)
+(merge-rule "\IeC {\textiota }" "ι" :string)
+(merge-rule "\IeC {\textkappa }" "κ" :string)
+(merge-rule "\IeC {\textlambda }" "λ" :string)
+(merge-rule "\IeC {\textmu }" "μ" :string)
+(merge-rule "\IeC {\textnu }" "ν" :string)
+(merge-rule "\IeC {\textxi }" "ξ" :string)
+(merge-rule "\IeC {\textomicron }" "ο" :string)
+(merge-rule "\IeC {\textpi }" "Ï€" :string)
+(merge-rule "\IeC {\textrho }" "ρ" :string)
+(merge-rule "\IeC {\textsigma }" "σ" :string)
+(merge-rule "\IeC {\texttau }" "Ï„" :string)
+(merge-rule "\IeC {\textupsilon }" "Ï…" :string)
+(merge-rule "\IeC {\textphi }" "φ" :string)
+(merge-rule "\IeC {\textchi }" "χ" :string)
+(merge-rule "\IeC {\textpsi }" "ψ" :string)
+(merge-rule "\IeC {\textomega }" "ω" :string)
+(merge-rule "\IeC {\textAlpha }" "Α" :string)
+(merge-rule "\IeC {\textBeta }" "Î’" :string)
+(merge-rule "\IeC {\textGamma }" "Γ" :string)
+(merge-rule "\IeC {\textDelta }" "Δ" :string)
+(merge-rule "\IeC {\textEpsilon }" "Ε" :string)
+(merge-rule "\IeC {\textZeta }" "Ζ" :string)
+(merge-rule "\IeC {\textEta }" "Η" :string)
+(merge-rule "\IeC {\textTheta }" "Θ" :string)
+(merge-rule "\IeC {\textIota }" "Ι" :string)
+(merge-rule "\IeC {\textKappa }" "Κ" :string)
+(merge-rule "\IeC {\textLambda }" "Λ" :string)
+(merge-rule "\IeC {\textMu }" "Μ" :string)
+(merge-rule "\IeC {\textNu }" "Ν" :string)
+(merge-rule "\IeC {\textTheta }" "Θ" :string)
+(merge-rule "\IeC {\textIota }" "Ι" :string)
+(merge-rule "\IeC {\textKappa }" "Κ" :string)
+(merge-rule "\IeC {\textLambda }" "Λ" :string)
+(merge-rule "\IeC {\textMu }" "Μ" :string)
+(merge-rule "\IeC {\textNu }" "Ν" :string)
+(merge-rule "\IeC {\textXi }" "Ξ" :string)
+(merge-rule "\IeC {\textOmicron }" "Ο" :string)
+(merge-rule "\IeC {\textPi }" "Π" :string)
+(merge-rule "\IeC {\textRho }" "Ρ" :string)
+(merge-rule "\IeC {\textSigma }" "Σ" :string)
+(merge-rule "\IeC {\textTau }" "Τ" :string)
+(merge-rule "\IeC {\textUpsilon }" "Î¥" :string)
+(merge-rule "\IeC {\textPhi }" "Φ" :string)
+(merge-rule "\IeC {\textChi }" "Χ" :string)
+(merge-rule "\IeC {\textPsi }" "Ψ" :string)
+(merge-rule "\IeC {\textOmega }" "Ω" :string)
+(merge-rule "\IeC {\textohm }" "Ω" :string)
+
+;; This xindy module provides some basic support for "see"
+(require "makeindex.xdy")
+
+;; This creates one-letter headings and works fine with utf-8 letters.
+;; For Cyrillic with pdflatex works thanks to LICRcyr2utf8.xdy
+(require "latin-lettergroups.xdy")
+
+;; currently we don't (know how to easily) separate "Numbers" from
+;; "Symbols" with xindy as is the case with makeindex.
+(markup-index :open  "\begin{sphinxtheindex}
+\let\lettergroup\sphinxstyleindexlettergroup
+\let\lettergroupDefault\sphinxstyleindexlettergroupDefault
+\let\spxpagem\sphinxstyleindexpagemain
+\let\spxentry\sphinxstyleindexentry
+\let\spxextra\sphinxstyleindexextra
+
+"
+	      :close "
+
+\end{sphinxtheindex}
+"
+	      :tree)
+
diff --git a/sphinx/build/latex/sphinxcyrillic.sty b/sphinx/build/latex/sphinxcyrillic.sty
new file mode 100644
index 0000000000000000000000000000000000000000..482b4e3f750df1f9d6cdf83b6dcd078e49316564
--- /dev/null
+++ b/sphinx/build/latex/sphinxcyrillic.sty
@@ -0,0 +1,55 @@
+%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only)
+%
+% refs: https://tex.stackexchange.com/q/460271/
+\ProvidesPackage{sphinxcyrillic}%
+  [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents]
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix
+\DeclareBoolOption[false]{Xtwo}
+\DeclareBoolOption[false]{TtwoA}
+\DeclareDefaultOption{\@unknownoptionerror}
+\ProcessLocalKeyvalOptions* % ignore class options
+
+\ifspx@cyropt@Xtwo
+% original code by tex.sx user egreg (updated 2019/10/28):
+%   https://tex.stackexchange.com/a/460325/
+% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding
+% This assumes inputenc loaded with utf8 option, or LaTeX release
+% as recent as 2018/04/01 which does it automatically. 
+  \@tfor\next:=%
+    {Ё}{Ђ}{Є}{Ѕ}{І}{Ј}{Љ}{Њ}{Ћ}{Ў}{Џ}{А}{Б}{В}{Г}{Д}{Е}{Ж}{З}{И}{Й}%
+    {К}{Л}{М}{Н}{О}{П}{Р}{С}{Т}{У}{Ф}{Х}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}%
+    {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{р}{с}{т}{у}%
+    {ф}{х}{ц}{ч}{ш}{щ}{ъ}{ы}{ь}{э}{ю}{я}{ё}{ђ}{є}{ѕ}{і}{ј}{љ}{њ}{ћ}%
+    {ў}{џ}{Ѣ}{ѣ}{Ѫ}{ѫ}{Ѵ}{ѵ}{Ґ}{ґ}{Ғ}{ғ}{Ҕ}{ҕ}{Җ}{җ}{Ҙ}{ҙ}{Қ}{қ}{Ҝ}{ҝ}%
+    {Òž}{ÒŸ}{Ò }{Ò¡}{Ò¢}{Ò£}{Ò¤}{Ò¥}{Ò¦}{Ò§}{Ò¨}{Ò©}{Òª}{Ò«}{Ò¬}{Ò­}{Ò®}{Ò¯}{Ò°}{Ò±}{Ò²}{Ò³}%
+    {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}%
+    {Ӎ}{ӎ}{Ӕ}{ӕ}{Ә}{ә}{Ӡ}{ӡ}{Ө}{ө}\do
+  {%
+    \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}%
+    \protected@edef\@temp{\endgroup
+    \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}%
+    \@temp{X2}%
+  }%
+\else
+\ifspx@cyropt@TtwoA
+% original code by tex.sx user jfbu:
+%   https://tex.stackexchange.com/a/460305/
+% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding
+  \@tfor\@tempa:=%
+    {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}%
+    {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}%
+    {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}%
+    {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}%
+    {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do
+  {%
+    \expandafter\DeclareTextSymbolDefault\expandafter
+               {\csname cyr\@tempa\endcsname}{T2A}%
+    \expandafter\uppercase\expandafter{\expandafter
+                 \def\expandafter\@tempa\expandafter{\@tempa}}%
+    \expandafter\DeclareTextSymbolDefault\expandafter
+      {\csname CYR\@tempa\endcsname}{T2A}%
+  }%
+  \DeclareTextSymbolDefault{\CYRpalochka}{T2A}%
+\fi\fi
+\endinput
diff --git a/sphinx/build/latex/sphinxhighlight.sty b/sphinx/build/latex/sphinxhighlight.sty
new file mode 100644
index 0000000000000000000000000000000000000000..83b523cba01c5fe06efe78c786c68b99e006a1ef
--- /dev/null
+++ b/sphinx/build/latex/sphinxhighlight.sty
@@ -0,0 +1,106 @@
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinxhighlight}[2016/05/29 stylesheet for highlighting with pygments]
+% Its contents depend on pygments_style configuration variable.
+
+
+\makeatletter
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
+    \let\PYG@ul=\relax \let\PYG@tc=\relax%
+    \let\PYG@bc=\relax \let\PYG@ff=\relax}
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
+\def\PYG@toks#1+{\ifx\relax#1\empty\else%
+    \PYG@tok{#1}\expandafter\PYG@toks\fi}
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
+    \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
+
+\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
+\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@cs}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}}
+\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}}
+\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}}
+\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}}
+\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}}
+\@namedef{PYG@tok@ne}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
+\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}}
+\@namedef{PYG@tok@nl}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}}
+\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}}
+\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}}
+\@namedef{PYG@tok@nd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}}
+\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@si}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}}
+\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}}
+\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
+\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}}
+\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
+\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
+\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
+\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}}
+\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
+\@namedef{PYG@tok@ge}{\let\PYG@it=\textit}
+\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf}
+\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}}
+\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}}
+\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
+\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}}
+\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}}
+\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
+\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
+\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
+\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
+\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}}
+\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
+\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+
+\def\PYGZbs{\char`\\}
+\def\PYGZus{\char`\_}
+\def\PYGZob{\char`\{}
+\def\PYGZcb{\char`\}}
+\def\PYGZca{\char`\^}
+\def\PYGZam{\char`\&}
+\def\PYGZlt{\char`\<}
+\def\PYGZgt{\char`\>}
+\def\PYGZsh{\char`\#}
+\def\PYGZpc{\char`\%}
+\def\PYGZdl{\char`\$}
+\def\PYGZhy{\char`\-}
+\def\PYGZsq{\char`\'}
+\def\PYGZdq{\char`\"}
+\def\PYGZti{\char`\~}
+% for compatibility with earlier versions
+\def\PYGZat{@}
+\def\PYGZlb{[}
+\def\PYGZrb{]}
+\makeatother
+
+\renewcommand\PYGZsq{\textquotesingle}
diff --git a/sphinx/build/latex/sphinxhowto.cls b/sphinx/build/latex/sphinxhowto.cls
new file mode 100644
index 0000000000000000000000000000000000000000..0848a79fdb5d0a788338d4b079579b481c50e31a
--- /dev/null
+++ b/sphinx/build/latex/sphinxhowto.cls
@@ -0,0 +1,102 @@
+%
+% sphinxhowto.cls for Sphinx (http://sphinx-doc.org/)
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)]
+
+% 'oneside' option overriding the 'twoside' default
+\newif\if@oneside
+\DeclareOption{oneside}{\@onesidetrue}
+% Pass remaining document options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}}
+\ProcessOptions\relax
+
+% Default to two-side document
+\if@oneside
+% nothing to do (oneside is the default)
+\else
+\PassOptionsToClass{twoside}{\sphinxdocclass}
+\fi
+
+\LoadClass{\sphinxdocclass}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{2}% i.e. section and subsection
+
+% Adapt \and command to the flushright context of \sphinxmaketitle, to
+% avoid ragged line endings if author names do not fit all on one single line
+\DeclareRobustCommand{\and}{%
+    \end{tabular}\kern-\tabcolsep
+    \allowbreak
+    \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}%
+}%
+% If it is desired that each author name be on its own line, use in preamble:
+%\DeclareRobustCommand{\and}{%
+%   \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}%
+%}%
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\newcommand{\sphinxmaketitle}{%
+  \noindent\rule{\textwidth}{1pt}\par
+    \begingroup % for PDF information dictionary
+       \def\endgraf{ }\def\and{\& }%
+       \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup
+       \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}%
+    \endgroup
+  \begin{flushright}
+    \sphinxlogo
+    \py@HeaderFamily
+    {\Huge \@title }\par
+    {\itshape\large \py@release \releaseinfo}\par
+    \vspace{25pt}
+    {\Large
+      \begin{tabular}[t]{c}
+        \@author
+      \end{tabular}\kern-\tabcolsep}\par
+    \vspace{25pt}
+    \@date \par
+    \py@authoraddress \par
+  \end{flushright}
+  \@thanks
+  \setcounter{footnote}{0}
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+\newcommand{\sphinxtableofcontents}{%
+  \begingroup
+    \parskip \z@skip
+    \sphinxtableofcontentshook
+    \tableofcontents
+  \endgroup
+  \noindent\rule{\textwidth}{1pt}\par
+  \vspace{12pt}%
+}
+\newcommand\sphinxtableofcontentshook{}
+\pagenumbering{arabic}
+
+% Fix the bibliography environment to add an entry to the Table of
+% Contents.
+% For an article document class this environment is a section,
+% so no page break before it.
+%
+\newenvironment{sphinxthebibliography}[1]{%
+  % \phantomsection % not needed here since TeXLive 2010's hyperref
+  \begin{thebibliography}{#1}%
+  \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}}
+
+
+% Same for the indices.
+% The memoir class already does this, so we don't duplicate it in that case.
+%
+\@ifclassloaded{memoir}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}
+ {\newenvironment{sphinxtheindex}{%
+    \phantomsection % needed because no chapter, section, ... is created by theindex
+    \begin{theindex}%
+    \addcontentsline{toc}{section}{\indexname}}{\end{theindex}}}
diff --git a/sphinx/build/latex/sphinxlatexadmonitions.sty b/sphinx/build/latex/sphinxlatexadmonitions.sty
new file mode 100644
index 0000000000000000000000000000000000000000..1e418c8c2229d12b62df6fec6412818c2ea4c263
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexadmonitions.sty
@@ -0,0 +1,148 @@
+%% NOTICES AND ADMONITIONS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexadmonitions.sty}[2021/01/27 admonitions]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - sphinxadmonition (environment)
+%   This is a dispatch supporting
+%
+%   - note, hint, important, tip                 (via sphinxlightbox)
+%   - warning, caution, attention, danger, error (via sphinxheavybox)
+%
+%   Each sphinx<notice name> environment can be redefined by user.
+%   The defaults are customizable via various colour and dimension
+%   settings, cf sphinx docs (latex customization).
+%
+% Requires:
+\RequirePackage{framed}% used by sphinxheavybox
+%
+% Dependencies (they do not need to be defined at time of loading):
+% - of course the various colour and dimension options handled via sphinx.sty
+% - \sphinxstrong (for sphinxlightbox and sphinxheavybox)
+% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
+% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox)
+
+% Provides: (also in sphinxlatexliterals.sty)
+\providecommand*\sphinxvspacefixafterfrenchlists{%
+   \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi
+}
+
+% Some are quite plain
+% the spx@notice@bordercolor etc are set in the sphinxadmonition environment
+\newenvironment{sphinxlightbox}{%
+  \par
+  \noindent{\color{spx@notice@bordercolor}%
+            \rule{\linewidth}{\spx@notice@border}}\par\nobreak
+  {\parskip\z@skip\noindent}%
+  }
+  {%
+  % counteract previous possible negative skip (French lists!):
+  % (we can't cancel that any earlier \vskip introduced a potential pagebreak)
+  \sphinxvspacefixafterfrenchlists
+  \nobreak\vbox{\noindent\kern\@totalleftmargin
+      {\color{spx@notice@bordercolor}%
+       \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax]
+             {\linewidth}{\spx@notice@border}}\hss}\allowbreak
+  }% end of sphinxlightbox environment definition
+% may be renewenvironment'd by user for complete customization
+\newenvironment{sphinxnote}[1]
+  {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
+\newenvironment{sphinxhint}[1]
+  {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
+\newenvironment{sphinximportant}[1]
+  {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
+\newenvironment{sphinxtip}[1]
+  {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
+% or just use the package options
+% these are needed for common handling by notice environment of lightbox
+% and heavybox but they are  currently not used by lightbox environment
+% and there is consequently no corresponding package option
+\definecolor{sphinxnoteBgColor}{rgb}{1,1,1}
+\definecolor{sphinxhintBgColor}{rgb}{1,1,1}
+\definecolor{sphinximportantBgColor}{rgb}{1,1,1}
+\definecolor{sphinxtipBgColor}{rgb}{1,1,1}
+
+% Others get more distinction
+% Code adapted from framed.sty's "snugshade" environment.
+% Nesting works (inner frames do not allow page breaks).
+\newenvironment{sphinxheavybox}{\par
+   \setlength{\FrameRule}{\spx@notice@border}%
+   \setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax}
+   \advance\spx@image@maxheight
+   -\dimexpr2\FrameRule
+           +2\FrameSep
+           +\baselineskip\relax % will happen again if nested, needed indeed!
+   % configure framed.sty's parameters to obtain same vertical spacing
+   % as for "light" boxes. We need for this to manually insert parskip glue and
+   % revert a skip done by framed before the frame.
+    \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
+    \vspace{\FrameHeightAdjust}
+   % copied/adapted from framed.sty's snugshade
+   \def\FrameCommand##1{\hskip\@totalleftmargin
+       \fboxsep\FrameSep \fboxrule\FrameRule
+       \fcolorbox{spx@notice@bordercolor}{spx@notice@bgcolor}{##1}%
+       \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
+   \savenotes
+   % use a minipage if we are already inside a framed environment
+   \ifspx@inframed
+       \noindent\begin{minipage}{\linewidth}
+   \else
+       % handle case where notice is first thing in a list item (or is quoted)
+       \if@inlabel
+        \noindent\par\vspace{-\baselineskip}
+       \else
+        \vspace{\parskip}
+       \fi
+   \fi
+   \MakeFramed {\spx@inframedtrue
+     \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize
+     % minipage initialization copied from LaTeX source code.
+     \@pboxswfalse
+     \let\@listdepth\@mplistdepth \@mplistdepth\z@
+     \@minipagerestore
+     \@setminipage }%
+   }
+   {%
+   \par\unskip
+   \@minipagefalse
+   \endMakeFramed
+   \ifspx@inframed\end{minipage}\fi
+   % set footnotes at bottom of page
+   \spewnotes
+   % arrange for similar spacing below frame as for "light" boxes.
+   \vskip .4\baselineskip
+   }% end of sphinxheavybox environment definition
+% may be renewenvironment'd by user for complete customization
+\newenvironment{sphinxwarning}[1]
+  {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
+\newenvironment{sphinxcaution}[1]
+  {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
+\newenvironment{sphinxattention}[1]
+  {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
+\newenvironment{sphinxdanger}[1]
+  {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
+\newenvironment{sphinxerror}[1]
+  {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
+% or just use package options
+
+% the \colorlet of xcolor (if at all loaded) is overkill for our use case
+\newcommand{\sphinxcolorlet}[2]
+    {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname
+                     \csname\@backslashchar color@#2\endcsname }
+
+% the main dispatch for all types of notices
+\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading
+  % can't use #1 directly in definition of end part
+  \def\spx@noticetype {#1}%
+  % set parameters of heavybox/lightbox
+  \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}%
+  \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}%
+  \spx@notice@border \dimexpr\csname spx@opt@#1border\endcsname\relax
+  % start specific environment, passing the heading as argument
+  \begin{sphinx#1}{#2}}
+  % workaround some LaTeX "feature" of \end command
+ {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp}
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexcontainers.sty b/sphinx/build/latex/sphinxlatexcontainers.sty
new file mode 100644
index 0000000000000000000000000000000000000000..93b2c8c086a53e63f7e906241a07198b2ff073bb
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexcontainers.sty
@@ -0,0 +1,22 @@
+%% CONTAINER DIRECTIVES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexcontainers.sty}[2021/05/03 containers]
+
+% The purpose of this file is to provide a dummy environment sphinxclass which
+% will be inserted for each class in each container directive. The class name
+% will be passed as the argument to the environment. 
+%
+% For a class foo, the user can define customised handling of that class by
+% defining the sphinxclassfoo LaTeX environment.
+
+\newenvironment{sphinxuseclass}[1]{%
+    \def\sphinxClassFunctionName{sphinxclass#1}%
+    \ltx@ifundefined{\sphinxClassFunctionName}%
+        {}% undefined so do nothing
+        {\expandafter\begin\expandafter{\sphinxClassFunctionName}}%
+}{%
+    \ltx@ifundefined{\sphinxClassFunctionName}%
+        {}% we did nothing so we keep doing nothing
+        {\expandafter\end\expandafter{\sphinxClassFunctionName}}%
+}%
diff --git a/sphinx/build/latex/sphinxlatexgraphics.sty b/sphinx/build/latex/sphinxlatexgraphics.sty
new file mode 100644
index 0000000000000000000000000000000000000000..fd0aae6386addf84721ec0d5fec2e997013ec6bf
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexgraphics.sty
@@ -0,0 +1,122 @@
+%% GRAPHICS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexgraphics.sty}[2021/01/27 graphics]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - macros:
+%
+%   - \sphinxfigcaption
+%   - \sphinxincludegraphics
+%
+% - environments:
+%
+%   - sphinxfigure-in-table
+%
+% May change:
+%
+% - \sphinxcaption (at begin document)
+%
+% Also provides:
+%
+% - \sphinxsafeincludegraphics (default of \sphinxincludegraphics since 2.0)
+% - \spx@image@maxheight dimension (used by sphinxlatexadmonitions.sty)
+% - \spx@image@box scratch box register (also used by sphinxlatexliterals.sty)
+%
+% Requires:
+% \RequirePackage{graphicx}% done in sphinx.sty
+\RequirePackage{amstext}% needed for \firstchoice@true(false)
+
+% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which
+% is adjusted in indented environments), or taller than a certain maximal
+% height (usually \textheight and this is reduced in the environments which use
+% framed.sty to avoid infinite loop if image too tall).
+%
+% In case height or width options are present the rescaling is done
+% (since 2.0), in a way keeping the width:height ratio either native from
+% image or from the width and height options if both were present.
+%
+\newdimen\spx@image@maxheight
+\AtBeginDocument{\spx@image@maxheight\textheight}
+
+% box scratch register
+\newbox\spx@image@box
+\newcommand*{\sphinxsafeincludegraphics}[2][]{%
+    % #1 contains possibly width=, height=, but no scale= since 1.8.4
+    \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}%
+    \in@false % use some handy boolean flag
+    \ifdim \wd\spx@image@box>\linewidth
+      \in@true % flag to remember to adjust options and set box dimensions
+      % compute height which results from rescaling width to \linewidth
+      % and keep current aspect ratio. multiply-divide in \numexpr uses
+      % temporarily doubled precision, hence no overflow. (of course we
+      % assume \ht is not a few sp's below \maxdimen...(about 16384pt).
+      \edef\spx@image@rescaledheight % with sp units
+           {\the\numexpr\ht\spx@image@box
+                        *\linewidth/\wd\spx@image@box sp}%
+      \ifdim\spx@image@rescaledheight>\spx@image@maxheight
+        % the rescaled height will be too big, so it is height which decides
+        % the rescaling factor
+        \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+        \edef\spx@image@requiredwidth % with sp units
+         {\the\numexpr\wd\spx@image@box
+                      *\spx@image@maxheight/\ht\spx@image@box sp}%
+        % TODO: decide if this commented-out block could be needed due to
+        % rounding in numexpr operations going up
+        % \ifdim\spx@image@requiredwidth>\linewidth
+        %     \def\spx@image@requiredwidth{\linewidth}% dimen register
+        % \fi
+      \else
+        \def\spx@image@requiredwidth{\linewidth}% dimen register
+        \let\spx@image@requiredheight\spx@image@rescaledheight% sp units
+      \fi
+    \else
+      % width is ok, let's check height
+      \ifdim\ht\spx@image@box>\spx@image@maxheight
+        \in@true
+        \edef\spx@image@requiredwidth % with sp units
+            {\the\numexpr\wd\spx@image@box
+                         *\spx@image@maxheight/\ht\spx@image@box sp}%
+        \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+      \fi
+    \fi % end of check of width and height
+    \ifin@
+      \setbox\spx@image@box
+      \hbox{\includegraphics
+            [%#1,% contained only width and/or height and overruled anyhow
+            width=\spx@image@requiredwidth,height=\spx@image@requiredheight]%
+            {#2}}%
+      % \includegraphics does not set box dimensions to the exactly
+      % requested ones, see https://github.com/latex3/latex2e/issues/112
+      \wd\spx@image@box\spx@image@requiredwidth
+      \ht\spx@image@box\spx@image@requiredheight
+      \leavevmode\box\spx@image@box
+    \else
+      % here we do not modify the options, no need to adjust width and height
+      % on output, they will be computed exactly as with "draft" option
+      \setbox\spx@image@box\box\voidb@x % clear memory
+      \includegraphics[#1]{#2}%
+    \fi
+}%
+% Use the "safe" one by default (2.0)
+\def\sphinxincludegraphics{\sphinxsafeincludegraphics}
+
+
+%% FIGURE IN TABLE
+%
+\newenvironment{sphinxfigure-in-table}[1][\linewidth]{%
+  \def\@captype{figure}%
+  \sphinxsetvskipsforfigintablecaption
+  \begin{minipage}{#1}%
+}{\end{minipage}}
+% tabulary expands twice contents, we need to prevent double counter stepping
+\newcommand*\sphinxfigcaption
+  {\ifx\equation$%$% this is trick to identify tabulary first pass
+       \firstchoice@false\else\firstchoice@true\fi
+   \spx@originalcaption }
+\newcommand*\sphinxsetvskipsforfigintablecaption
+  {\abovecaptionskip\smallskipamount
+   \belowcaptionskip\smallskipamount}
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexindbibtoc.sty b/sphinx/build/latex/sphinxlatexindbibtoc.sty
new file mode 100644
index 0000000000000000000000000000000000000000..79e30a1f1999c22b29515767c063825cc39c58dd
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexindbibtoc.sty
@@ -0,0 +1,69 @@
+%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexindbibtoc.sty}[2021/01/27 index, bib., toc]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - environments: (backup defaults or get redefined)
+%
+%   - sphinxtheindex (direct mark-up or via python.ist or sphinx.xdy)
+%   - sphinxthebibliography
+%
+% - macros: (defines defaults)
+%
+%   - \sphinxmaketitle
+%   - \sphinxtableofcontents
+%   - \sphinxnonalphabeticalgroupname
+%   - \sphinxsymbolsname
+%   - \sphinxnumbersname
+%   - \sphinxcite
+%
+% Requires:
+\RequirePackage{makeidx}
+
+% fix the double index and bibliography on the table of contents
+% in jsclasses (Japanese standard document classes)
+\ifx\@jsc@uplatextrue\@undefined\else
+  \renewenvironment{sphinxtheindex}
+    {\cleardoublepage\phantomsection
+     \begin{theindex}}
+    {\end{theindex}}
+
+  \renewenvironment{sphinxthebibliography}[1]
+    {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref
+     \begin{thebibliography}{#1}}
+    {\end{thebibliography}}
+\fi
+
+% disable \@chappos in Appendix in pTeX
+\ifx\kanjiskip\@undefined\else
+  \let\py@OldAppendix=\appendix
+  \renewcommand{\appendix}{
+    \py@OldAppendix
+    \gdef\@chappos{}
+  }
+\fi
+
+% make commands known to non-Sphinx document classes
+\providecommand*{\sphinxmaketitle}{\maketitle}
+\providecommand*{\sphinxtableofcontents}{\tableofcontents}
+\ltx@ifundefined{sphinxthebibliography}
+ {\newenvironment
+  {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}%
+ }
+ {}% else clause of \ltx@ifundefined
+\ltx@ifundefined{sphinxtheindex}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}%
+ {}% else clause of \ltx@ifundefined
+
+% for usage with xindy: this string gets internationalized in preamble
+\newcommand*{\sphinxnonalphabeticalgroupname}{}
+% redefined in preamble, headings for makeindex produced index
+\newcommand*{\sphinxsymbolsname}{}
+\newcommand*{\sphinxnumbersname}{}
+
+\protected\def\sphinxcite{\cite}
+
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexlists.sty b/sphinx/build/latex/sphinxlatexlists.sty
new file mode 100644
index 0000000000000000000000000000000000000000..3860090c298387747b26b655923ae0239de7d19a
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexlists.sty
@@ -0,0 +1,97 @@
+%% ALPHANUMERIC LIST ITEMS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexlists.sty}[2021/01/27 lists]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+% - \sphinxsetlistlabels
+
+% Dependencies: the \spx@opt@maxlistdepth from sphinx.sty
+
+\newcommand\sphinxsetlistlabels[5]
+{% #1 = style, #2 = enum, #3 = enumnext, #4 = prefix, #5 = suffix
+ % #2 and #3 are counters used by enumerate environement e.g. enumi, enumii.
+ % #1 is a macro such as \arabic or \alph
+ % prefix and suffix are strings (by default empty and a dot).
+ \@namedef{the#2}{#1{#2}}%
+ \@namedef{label#2}{#4\@nameuse{the#2}#5}%
+ \@namedef{p@#3}{\@nameuse{p@#2}#4\@nameuse{the#2}#5}%
+}%
+
+
+%% MAXLISTDEPTH
+%
+% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used.
+% This is a hack, which works with the standard classes: it assumes \@toodeep
+% is always used in "true" branches: "\if ... \@toodeep \else .. \fi."
+
+% will force use the "false" branch (if there is one)
+\def\spx@toodeep@hack{\fi\iffalse}
+
+% do nothing if 'maxlistdepth' key not used or if package enumitem loaded.
+\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi
+\AtBeginDocument{%
+\@ifpackageloaded{enumitem}{\remove@to@nnil}{}%
+  \let\spx@toodeepORI\@toodeep
+  \def\@toodeep{%
+    \ifnum\@listdepth<\spx@opt@maxlistdepth\relax
+      \expandafter\spx@toodeep@hack
+    \else
+      \expandafter\spx@toodeepORI
+    \fi}%
+% define all missing \@list... macros
+  \count@\@ne
+  \loop
+     \ltx@ifundefined{@list\romannumeral\the\count@}
+       {\iffalse}{\iftrue\advance\count@\@ne}%
+  \repeat
+  \loop
+     \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+       \expandafter\let
+         \csname @list\romannumeral\the\count@\expandafter\endcsname
+         \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname
+       % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed)
+       \ltx@ifundefined{leftmargin\romannumeral\the\count@}
+       {\expandafter\let
+         \csname leftmargin\romannumeral\the\count@\expandafter\endcsname
+         \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}%
+     \advance\count@\@ne
+  \repeat
+% define all missing enum... counters and \labelenum... macros and \p@enum..
+  \count@\@ne
+  \loop
+     \ltx@ifundefined{c@enum\romannumeral\the\count@}
+       {\iffalse}{\iftrue\advance\count@\@ne}%
+  \repeat
+  \loop
+     \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+       \newcounter{enum\romannumeral\the\count@}%
+       \expandafter\def
+         \csname labelenum\romannumeral\the\count@\expandafter\endcsname
+         \expandafter
+         {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}%
+       \expandafter\def
+         \csname p@enum\romannumeral\the\count@\expandafter\endcsname
+         \expandafter
+         {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter
+          \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}%
+     \advance\count@\@ne
+  \repeat
+% define all missing labelitem... macros
+  \count@\@ne
+  \loop
+     \ltx@ifundefined{labelitem\romannumeral\the\count@}
+     {\iffalse}{\iftrue\advance\count@\@ne}%
+  \repeat
+  \loop
+     \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+       \expandafter\let
+         \csname labelitem\romannumeral\the\count@\expandafter\endcsname
+         \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname
+     \advance\count@\@ne
+  \repeat
+  \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}%
+\@gobble\@nnil
+}
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexliterals.sty b/sphinx/build/latex/sphinxlatexliterals.sty
new file mode 100644
index 0000000000000000000000000000000000000000..d2ba89ea73f92343e7939d2edf87f63272567146
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexliterals.sty
@@ -0,0 +1,795 @@
+%% LITERAL BLOCKS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexliterals.sty}[2021/01/27 code-blocks and parsed literals]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - macros:
+%   - \sphinxLiteralBlockLabel
+%   - \sphinxSetupCaptionForVerbatim
+%   - \sphinxSetupCodeBlockInFootnote
+%   - \sphinxhref
+%   - \sphinxnolinkurl
+%   - \sphinxresetverbatimhllines
+%   - \sphinxunactivateextrasandspace
+%   - \sphinxupquote
+%   - \sphinxurl
+%
+% - environments:
+%   - sphinxVerbatim
+%   - sphinxVerbatimintable
+%   - sphinxalltt
+%
+% Dependency:
+%
+% - hyperref (for \phantomsection and \capstart) (loaded later)
+%
+% Executes \RequirePackage for:
+%
+% - framed
+% - fancyvrb
+% - alltt
+% - upquote
+% - needspace
+
+% also in sphinxlatexadmonitions.sty:
+% This is a workaround to a "feature" of French lists, when literal block
+% follows immediately; usable generally (does only \par then), a priori...
+\providecommand*\sphinxvspacefixafterfrenchlists{%
+   \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi
+}
+
+% For framing allowing pagebreaks
+\RequirePackage{framed}
+% For source code
+% MEMO: fancyvrb is used mainly to
+% 1- control horizontal and vertical spacing
+% 2- optional line numbering
+% 3- optional line emphasizing
+% 4- while still allowing expansion of Pygments latex mark-up
+% Other aspects such as framing, caption handling, codeline wrapping are
+% added on top of it. We should stop using fancyvrb and implement
+% 1, 2, 3, 4 by own Sphinx fully native Verbatim. This would allow to solve
+% limitations with wrapped long code line not allowing page break.
+\RequirePackage{fancyvrb}
+% For parsed-literal blocks.
+\RequirePackage{alltt}
+% Display "real" single quotes in literal blocks.
+\RequirePackage{upquote}
+% Skip to next page if not enough space at bottom
+\RequirePackage{needspace}
+
+% Based on use of "fancyvrb.sty"'s Verbatim.
+% - with framing allowing page breaks ("framed.sty")
+% - with breaking of long lines (exploits Pygments mark-up),
+% - with possibly of a top caption, non-separable by pagebreak.
+% - and usable inside tables or footnotes ("sphinxpackagefootnote.sty").
+
+% for emphasizing lines
+\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}}
+% sphinxVerbatim must be usable by third party without requiring hllines set-up
+\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}}
+\sphinxresetverbatimhllines
+
+% Prior to Sphinx 1.5, \Verbatim and \endVerbatim were modified by Sphinx.
+% The aliases defined here are used in sphinxVerbatim environment and can
+% serve as hook-points with no need to modify \Verbatim itself.
+\let\OriginalVerbatim   \Verbatim
+\let\endOriginalVerbatim\endVerbatim
+
+% for captions of literal blocks
+% at start of caption title
+\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock}
+% this will be overwritten in document preamble by Babel translation
+\newcommand*{\literalblockname}{Listing }
+% file extension needed for \caption's good functioning, the file is created
+% only if a \listof{literalblock}{foo} command is encountered, which is
+% analogous to \listoffigures, but for the code listings (foo = chosen title.)
+\newcommand*{\ext@literalblock}{lol}
+
+% if forced use of minipage encapsulation is needed (e.g. table cells)
+\newif\ifsphinxverbatimwithminipage   \sphinxverbatimwithminipagefalse
+
+% Framing macro for use with framed.sty's \FrameCommand
+%  - it obeys current indentation,
+%  - frame is \fboxsep separated from the contents,
+%  - the contents use the full available text width,
+%  - #1 = color of frame, #2 = color of background,
+%  - #3 = above frame, #4 = below frame, #5 = within frame,
+%  - #3 and #4 must be already typeset boxes; they must issue \normalcolor
+%    or similar, else, they are under scope of color #1
+\long\def\spx@fcolorbox #1#2#3#4#5{%
+  \hskip\@totalleftmargin
+  \hskip-\fboxsep\hskip-\fboxrule
+  % use of \color@b@x here is compatible with both xcolor.sty and color.sty
+  \color@b@x {\color{#1}\spx@CustomFBox{#3}{#4}}{\color{#2}}{#5}%
+  \hskip-\fboxsep\hskip-\fboxrule
+  \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth
+}%
+% #1 = for material above frame, such as a caption or a "continued" hint
+% #2 = for material below frame, such as a caption or "continues on next page"
+% #3 = actual contents, which will be typeset with a background color
+\long\def\spx@CustomFBox#1#2#3{%
+  \begingroup
+  \setbox\@tempboxa\hbox{{#3}}% inner braces to avoid color leaks
+  \vbox{#1% above frame
+            % draw frame border _latest_ to avoid pdf viewer issue
+            \kern\fboxrule
+            \hbox{\kern\fboxrule
+                  \copy\@tempboxa
+                  \kern-\wd\@tempboxa\kern-\fboxrule
+                  \vrule\@width\fboxrule
+                  \kern\wd\@tempboxa
+                  \vrule\@width\fboxrule}%
+            \kern-\dimexpr\ht\@tempboxa+\dp\@tempboxa+\fboxrule\relax
+            \hrule\@height\fboxrule
+            \kern\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax
+            \hrule\@height\fboxrule
+        #2% below frame
+       }%
+  \endgroup
+}%
+\def\spx@fcolorbox@put@c#1{% hide width from framed.sty measuring
+    \moveright\dimexpr\fboxrule+.5\wd\@tempboxa\hb@xt@\z@{\hss#1\hss}%
+}%
+\def\spx@fcolorbox@put@r#1{% right align with contents, width hidden
+    \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep\hb@xt@\z@{\hss#1}%
+}%
+\def\spx@fcolorbox@put@l#1{% left align with contents, width hidden
+    \moveright\dimexpr\fboxrule+\fboxsep\hb@xt@\z@{#1\hss}%
+}%
+%
+\def\sphinxVerbatim@Continued
+   {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname
+    {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}%
+\def\sphinxVerbatim@Continues
+   {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname
+    {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}%
+\def\sphinxVerbatim@Title
+   {\spx@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}}%
+\let\sphinxVerbatim@Before\@empty
+\let\sphinxVerbatim@After\@empty
+% Defaults are redefined in document preamble according to language
+\newcommand*\literalblockcontinuedname{continued from previous page}%
+\newcommand*\literalblockcontinuesname{continues on next page}%
+%
+\def\spx@verbatimfcolorbox{\spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}}%
+\def\sphinxVerbatim@FrameCommand
+   {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@After}%
+\def\sphinxVerbatim@FirstFrameCommand
+   {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@Continues}%
+\def\sphinxVerbatim@MidFrameCommand
+   {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@Continues}%
+\def\sphinxVerbatim@LastFrameCommand
+   {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@After}%
+
+% For linebreaks inside Verbatim environment from package fancyvrb.
+\newbox\sphinxcontinuationbox
+\newbox\sphinxvisiblespacebox
+\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox}
+
+% Take advantage of the already applied Pygments mark-up to insert
+% potential linebreaks for TeX processing.
+%        {, <, #, %, $, ' and ": go to next line.
+%        _, }, ^, &, >, -, ~, and \: stay at end of broken line.
+% Use of \textquotesingle for straight quote.
+% FIXME: convert this to package options ?
+\newcommand*\sphinxbreaksbeforelist {%
+    \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %,
+    \do\PYGZdl\$\do\PYGZdq\"% $, "
+    \def\PYGZsq
+     {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% '
+}
+\newcommand*\sphinxbreaksafterlist {%
+    \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &,
+    \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~
+    \do\PYGZbs\\% \
+}
+\newcommand*\sphinxbreaksatspecials {%
+  \def\do##1##2%
+     {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}%
+  \sphinxbreaksbeforelist
+  \def\do##1##2%
+     {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}%
+  \sphinxbreaksafterlist
+}
+
+\def\sphinx@verbatim@nolig@list {\do \`}%
+% Some characters . , ; ? ! / are neither pygmentized nor "tex-escaped".
+% This macro makes them "active" and they will insert potential linebreaks.
+% Not compatible with math mode (cf \sphinxunactivateextras).
+\newcommand*\sphinxbreaksbeforeactivelist {}% none
+\newcommand*\sphinxbreaksafteractivelist  {\do\.\do\,\do\;\do\?\do\!\do\/}
+\newcommand*\sphinxbreaksviaactive {%
+   \def\do##1{\lccode`\~`##1%
+    \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}%
+    \catcode`##1\active}%
+   \sphinxbreaksbeforeactivelist
+   \def\do##1{\lccode`\~`##1%
+    \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}%
+    \catcode`##1\active}%
+   \sphinxbreaksafteractivelist
+   \lccode`\~`\~
+}
+
+% If the linebreak is at a space, the latter will be displayed as visible
+% space at end of first line, and a continuation symbol starts next line.
+\def\spx@verbatim@space {%
+     \nobreak\hskip\z@skip
+     \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak}
+                   {\kern\fontdimen2\font}%
+}%
+
+% if the available space on page is less than \literalblockneedspace, insert pagebreak
+\newcommand{\sphinxliteralblockneedspace}{5\baselineskip}
+\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip}
+% The title (caption) is specified from outside as macro \sphinxVerbatimTitle.
+% \sphinxVerbatimTitle is reset to empty after each use of Verbatim.
+\newcommand*\sphinxVerbatimTitle {}
+% This box to typeset the caption before framed.sty multiple passes for framing.
+\newbox\sphinxVerbatim@TitleBox
+% This box to measure contents if nested as inner \MakeFramed requires then
+% minipage encapsulation but too long contents then break outer \MakeFramed
+\newbox\sphinxVerbatim@ContentsBox
+% Holder macro for labels of literal blocks. Set-up by LaTeX writer.
+\newcommand*\sphinxLiteralBlockLabel {}
+\newcommand*\sphinxSetupCaptionForVerbatim [1]
+{%
+    \sphinxvspacefixafterfrenchlists
+    \needspace{\sphinxliteralblockneedspace}%
+% insert a \label via \sphinxLiteralBlockLabel
+% reset to normal the color for the literal block caption
+    \def\sphinxVerbatimTitle
+       {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}%
+}
+\newcommand*\sphinxSetupCodeBlockInFootnote {%
+  \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption
+  \sphinxverbatimwithminipagetrue % reduces vertical spaces
+  % we counteract (this is in a group) the \@normalsize from \caption
+  \let\normalsize\footnotesize\let\@parboxrestore\relax
+  \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}%
+}
+\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount}
+% serves to implement line highlighting and line wrapping
+\newcommand\sphinxFancyVerbFormatLine[1]{%
+  \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}%
+  \ifin@
+     \sphinxVerbatimHighlightLine{#1}%
+  \else
+     \sphinxVerbatimFormatLine{#1}%
+  \fi
+}%
+\newcommand\sphinxVerbatimHighlightLine[1]{%
+  \edef\sphinxrestorefboxsep{\fboxsep\the\fboxsep\relax}%
+  \fboxsep0pt\relax % cf LaTeX bug graphics/4524
+  \colorbox{sphinxVerbatimHighlightColor}%
+           {\sphinxrestorefboxsep\sphinxVerbatimFormatLine{#1}}%
+  % no need to restore \fboxsep here, as this ends up in a \hbox from fancyvrb
+}%
+% \sphinxVerbatimFormatLine will be set locally to one of those two:
+\newcommand\sphinxVerbatimFormatLineWrap{%
+  \hsize\linewidth
+  \ifspx@opt@verbatimforcewraps
+       \expandafter\spx@verb@FormatLineForceWrap
+  \else\expandafter\spx@verb@FormatLineWrap
+  \fi
+}%
+\newcommand\sphinxVerbatimFormatLineNoWrap[1]{\hb@xt@\linewidth{\strut #1\hss}}%
+\long\def\spx@verb@FormatLineWrap#1{%
+    \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
+          \doublehyphendemerits\z@\finalhyphendemerits\z@
+          \strut #1\strut}%
+}%
+%
+% The normal line wrapping allows breaks at spaces and ascii non
+% letters, non digits. The \raggedright above means there will be
+% an overfilled line only if some non-breakable "word" was
+% encountered, which is longer than a line (it is moved always to
+% be on its own on a new line).
+% 
+% The "forced" line wrapping will parse the tokens to add potential
+% breakpoints at each character. As some strings are highlighted,
+% we have to apply the highlighting character per character, which
+% requires to manipulate the output of the Pygments LaTeXFormatter.
+%
+% Doing this at latex level is complicated. The contents should
+% be as expected: i.e. some active characters from
+% \sphinxbreaksviaactive, some Pygments character escapes such as
+% \PYGZdl{}, and the highlighting \PYG macro with always 2
+% arguments. No other macros should be there, except perhaps
+% zero-parameter macros. In particular:
+% - the texcomments Pygments option must be set to False
+%
+% With pdflatex, Unicode input gives multi-bytes characters
+% where the first byte is active. We support the "utf8" macros
+% only. "utf8x" is not supported.
+%
+% The highlighting macro \PYG will be applied character per
+% character. Highlighting via a colored background gives thus a
+% chain of small colored boxes which may cause some artefact in
+% some pdf viewers. Can't do anything here if we do want the line
+% break to be possible.
+%
+% First a measurement step is done of what would the standard line
+% wrapping give (i.e line breaks only at spaces and non-letter,
+% non-digit ascii characters), cf TeX by Topic for the basic
+% dissecting technique: TeX unfortunately when building a vertical
+% box does not store in an accessible way what was the maximal
+% line-width during paragraph building.
+%
+% Avoid LaTeX 2021 alteration of \@@par which potentially could break our
+% measurement step (typically if the para/after hook is configured to use
+% \vspace).  Of course, breakage could happen only from user or package
+% adding things to basic Sphinx latex.  And perhaps spring LaTeX 2021 will
+% provide a non-hooked \@@par, but this should work anyway and can't be
+% beaten for speed.
+\ltx@ifundefined{tex_par:D}
+% We could use \@ifl@t@r\fmtversion{2020/02/02}{use \tex_par:D}{use \@@par}.
+  {\let\spx@par\@@par}% \@@par is then expected to be TeX's original \par
+  {\expandafter\let\expandafter\spx@par\csname tex_par:D\endcsname}
+% More hesitation for avoiding the at-start-of-par hooks for our
+% measurement : 1. with old LaTeX, we can not avoid hooks from everyhook
+% or similar packages, 2. and perhaps the hooks add stuff which we should
+% actually measure.  Ideally, hooks are for inserting things in margin
+% which do not change spacing.  Most everything else in fact should not be
+% executed in our scratch box for measurement, such as counter stepping.
+\ltx@ifundefined{tex_everypar:D}
+  {\let\spx@everypar\everypar}
+  {\expandafter\let\expandafter\spx@everypar\csname tex_everypar:D\endcsname}
+%
+% If the max width exceeds the linewidth by more than verbatimmaxoverfull
+% character widths, or if the min width plus verbatimmaxunderfull character
+% widths is inferior to linewidth, then we apply the "force wrapping" with
+% potential line break at each character, else we don't.
+\long\def\spx@verb@FormatLineForceWrap#1{%
+    % \spx@image@box is a scratch box register that we can use here
+    \global\let\spx@verb@maxwidth\z@
+    \global\let\spx@verb@minwidth\linewidth
+    \setbox\spx@image@box
+    \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
+          \doublehyphendemerits\z@\finalhyphendemerits\z@
+          \spx@everypar{}\noindent\strut #1\strut\spx@par
+          \spx@verb@getwidths}%
+    \ifdim\spx@verb@maxwidth>
+          \dimexpr\linewidth+\spx@opt@verbatimmaxoverfull\fontcharwd\font`X \relax
+      \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}%
+    \else
+      \ifdim\spx@verb@minwidth<
+            \dimexpr\linewidth-\spx@opt@verbatimmaxunderfull\fontcharwd\font`X \relax
+        \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}%
+      \else
+        \spx@verb@FormatLineWrap{#1}%
+    \fi\fi
+}%
+% auxiliary paragraph dissector to get max and min widths
+% but minwidth must not take into account the last line
+\newbox\spx@scratchbox
+\def\spx@verb@getwidths {%
+    \unskip\unpenalty
+    \setbox\spx@scratchbox\lastbox
+    \ifvoid\spx@scratchbox
+    \else
+       \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}%
+       \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox
+          \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}%
+       \fi
+       \expandafter\spx@verb@getwidths@loop
+    \fi
+}%
+\def\spx@verb@getwidths@loop {%
+    \unskip\unpenalty
+    \setbox\spx@scratchbox\lastbox
+    \ifvoid\spx@scratchbox
+    \else
+       \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}%
+       \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox
+          \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}%
+       \fi
+       \ifdim\spx@verb@minwidth>\wd\spx@scratchbox
+          \xdef\spx@verb@minwidth{\number\wd\spx@scratchbox sp}%
+       \fi
+       \expandafter\spx@verb@getwidths@loop
+    \fi
+}%
+% auxiliary macros to implement "cut long line even in middle of word"
+\catcode`Z=3 % safe delimiter
+\def\spx@verb@wrapPYG{%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@i
+}%
+\def\spx@verb@wrapPYG@i{%
+    \ifx\spx@nexttoken\spx@verb@wrapPYG\let\next=\@gobble\else
+    \ifx\spx@nexttoken\PYG\let\next=\spx@verb@wrapPYG@PYG@onebyone\else
+      \discretionary{}{\sphinxafterbreak}{}%
+      \let\next\spx@verb@wrapPYG@ii
+    \fi\fi
+    \next
+}%
+% Let's recognize active characters. We don't support utf8x only utf8.
+% And here #1 should not have picked up (non empty) braced contents
+\long\def\spx@verb@wrapPYG@ii#1{%
+    \ifcat\noexpand~\noexpand#1\relax% active character
+      \expandafter\spx@verb@wrapPYG@active
+    \else % non-active character, control sequence such as \PYGZdl, or empty
+      \expandafter\spx@verb@wrapPYG@one
+    \fi {#1}%
+}%
+\long\def\spx@verb@wrapPYG@active#1{%
+% Let's hope expansion of active character does not really require arguments,
+% as we certainly don't want to go into expanding upfront token stream anyway.
+    \expandafter\spx@verb@wrapPYG@iii#1{}{}{}{}{}{}{}{}{}Z#1%
+}%
+\long\def\spx@verb@wrapPYG@iii#1#2Z{%
+    \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@four\else
+    \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@three\else
+    \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@two\else
+    \let\next=\spx@verb@wrapPYG@one
+    \fi\fi\fi
+    \next
+}%
+\long\def\spx@verb@wrapPYG@one   #1{#1\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@two   #1#2{#1#2\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@three #1#2#3{#1#2#3\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@four  #1#2#3#4{#1#2#3#4\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+% Replace \PYG by itself applied one character at a time! This way breakpoints
+% can be inserted.
+\def\spx@verb@wrapPYG@PYG@onebyone#1#2#3{% #1 = \PYG, #2 = highlight spec, #3 = tokens
+    \def\spx@verb@wrapPYG@PYG@spec{{#2}}%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i#3Z%
+}%
+\def\spx@verb@wrapPYG@PYG@i{%
+    \ifx\spx@nexttokenZ\let\next=\spx@verb@wrapPYG@PYG@done\else
+      \discretionary{}{\sphinxafterbreak}{}%
+      \let\next\spx@verb@wrapPYG@PYG@ii
+    \fi
+    \next
+}%
+\def\spx@verb@wrapPYG@PYG@doneZ{\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@PYG@ii#1{%
+    \ifcat\noexpand~\noexpand#1\relax% active character
+      \expandafter\spx@verb@wrapPYG@PYG@active
+    \else % non-active character, control sequence such as \PYGZdl, or empty
+      \expandafter\spx@verb@wrapPYG@PYG@one
+    \fi {#1}%
+}%
+\long\def\spx@verb@wrapPYG@PYG@active#1{%
+% Let's hope expansion of active character does not really require arguments,
+% as we certainly don't want to go into expanding upfront token stream anyway.
+    \expandafter\spx@verb@wrapPYG@PYG@iii#1{}{}{}{}{}{}{}{}{}Z#1%
+}%
+\long\def\spx@verb@wrapPYG@PYG@iii#1#2Z{%
+    \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@PYG@four\else
+    \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@PYG@three\else
+    \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@PYG@two\else
+    \let\next=\spx@verb@wrapPYG@PYG@one
+    \fi\fi\fi
+    \next
+}%
+\long\def\spx@verb@wrapPYG@PYG@one#1{%
+    \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1}%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@two#1#2{%
+    \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2}%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@three#1#2#3{%
+    \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3}%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@four#1#2#3#4{%
+    \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3#4}%
+    \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\catcode`Z 11 %
+%
+\g@addto@macro\FV@SetupFont{%
+    \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}%
+    \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}%
+}%
+\newenvironment{sphinxVerbatim}{%
+  % first, let's check if there is a caption
+  \ifx\sphinxVerbatimTitle\empty
+      \sphinxvspacefixafterfrenchlists
+      \parskip\z@skip
+      \vskip\sphinxverbatimsmallskipamount
+      % there was no caption. Check if nevertheless a label was set.
+      \ifx\sphinxLiteralBlockLabel\empty\else
+      % we require some space to be sure hyperlink target from \phantomsection
+      % will not be separated from upcoming verbatim by a page break
+          \needspace{\sphinxliteralblockwithoutcaptionneedspace}%
+          \phantomsection\sphinxLiteralBlockLabel
+      \fi
+  \else
+     \parskip\z@skip
+     \if t\spx@opt@literalblockcappos
+       \vskip\spx@abovecaptionskip
+       \def\sphinxVerbatim@Before
+           {\sphinxVerbatim@Title\nointerlineskip
+            \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace
+                 % if no frame (code-blocks inside table cells), remove
+                 % the "verbatimsep" whitespace from the top (better visually)
+                 \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi
+                 % caption package adds \abovecaptionskip vspace, remove it
+                 \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}%
+     \else
+       \vskip\sphinxverbatimsmallskipamount
+       \def\sphinxVerbatim@After
+          {\nointerlineskip\kern\dimexpr\dp\strutbox
+            \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi
+            \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax
+           \sphinxVerbatim@Title}%
+     \fi
+     \def\@captype{literalblock}%
+     \capstart
+     % \sphinxVerbatimTitle must reset color
+     \setbox\sphinxVerbatim@TitleBox
+            \hbox{\begin{minipage}{\linewidth}%
+     % caption package may detect wrongly if top or bottom, so we help it
+                    \spx@ifcaptionpackage
+                      {\caption@setposition{\spx@opt@literalblockcappos}}{}%
+                    \sphinxVerbatimTitle
+                  \end{minipage}}%
+  \fi
+  \global\let\sphinxLiteralBlockLabel\empty
+  \global\let\sphinxVerbatimTitle\empty
+  \fboxsep\sphinxverbatimsep \fboxrule\sphinxverbatimborder
+  \ifspx@opt@verbatimwithframe\else\fboxrule\z@\fi
+  \let\FrameCommand     \sphinxVerbatim@FrameCommand
+  \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand
+  \let\MidFrameCommand  \sphinxVerbatim@MidFrameCommand
+  \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand
+  \ifspx@opt@verbatimhintsturnover\else
+      \let\sphinxVerbatim@Continued\@empty
+      \let\sphinxVerbatim@Continues\@empty
+  \fi
+  \ifspx@opt@verbatimwrapslines
+  % fancyvrb's Verbatim puts each input line in (unbreakable) horizontal boxes.
+  % This customization wraps each line from the input in a \vtop, thus
+  % allowing it to wrap and display on two or more lines in the latex output.
+  %     - The codeline counter will be increased only once.
+  %     - The wrapped material will not break across pages, it is impossible
+  %       to achieve this without extensive rewrite of fancyvrb.
+  %     - The (not used in sphinx) obeytabs option to Verbatim is
+  %       broken by this change (showtabs and tabspace work).
+    \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineWrap
+    \let\FV@Space\spx@verbatim@space
+  % Allow breaks at special characters using \PYG... macros.
+    \sphinxbreaksatspecials
+  % Breaks at punctuation characters . , ; ? ! and / (needs catcode activation)
+    \fvset{codes*=\sphinxbreaksviaactive}%
+  \else % end of conditional code for wrapping long code lines
+    \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineNoWrap
+  \fi
+  \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine
+  \VerbatimEnvironment
+  % workaround to fancyvrb's check of current list depth
+  \def\@toodeep {\advance\@listdepth\@ne}%
+  % The list environment is needed to control perfectly the vertical space.
+  % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt.
+  % - if caption: distance from last text baseline to caption baseline is
+  %   A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B =
+  %   \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt.
+  %   Formula valid for F < 10pt.
+  % - distance of baseline of caption to top of frame is like for tables:
+  %   \sphinxbelowcaptionspace (=0.5\baselineskip)
+  % - if no caption: distance of last text baseline to code frame is S+(B-F),
+  %   with S = \sphinxverbatimtopskip (=\smallskip)
+  % - and distance from bottom of frame to next text baseline is
+  %   \baselineskip+\parskip.
+  % The \trivlist is used to avoid possible "too deeply nested" error.
+  \itemsep   \z@skip
+  \topsep    \z@skip
+  \partopsep \z@skip
+  % trivlist will set \parsep to \parskip (which itself is set to zero above)
+  % \leftmargin will be set to zero by trivlist
+  \rightmargin\z@
+  \parindent  \z@% becomes \itemindent. Default zero, but perhaps overwritten.
+  \trivlist\item\relax
+     \ifspx@inframed\setbox\sphinxVerbatim@ContentsBox\vbox\bgroup
+        \@setminipage\hsize\linewidth
+        % use bulk of minipage paragraph shape restores (this is needed
+        % in indented contexts, at least for some)
+        \textwidth\hsize \columnwidth\hsize \@totalleftmargin\z@
+        \leftskip\z@skip \rightskip\z@skip  \@rightskip\z@skip
+     \else
+       \ifsphinxverbatimwithminipage\noindent\begin{minipage}{\linewidth}\fi
+       \MakeFramed {% adapted over from framed.sty's snugshade environment
+        \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage
+        }%
+     \fi
+     % For grid placement from \strut's in \FancyVerbFormatLine
+     \lineskip\z@skip
+     % active comma should not be overwritten by \@noligs
+     \ifspx@opt@verbatimwrapslines
+       \let\verbatim@nolig@list \sphinx@verbatim@nolig@list
+     \fi
+     % will fetch its optional arguments if any
+     \OriginalVerbatim
+}
+{%
+  \endOriginalVerbatim
+  \ifspx@inframed
+   \egroup % finish \sphinxVerbatim@ContentsBox vbox
+   \nobreak % update page totals
+   \ifdim\dimexpr\ht\sphinxVerbatim@ContentsBox+
+         \dp\sphinxVerbatim@ContentsBox+
+         \ht\sphinxVerbatim@TitleBox+
+         \dp\sphinxVerbatim@TitleBox+
+         2\fboxsep+2\fboxrule+
+         % try to account for external frame parameters
+         \FrameSep+\FrameRule+
+         % Usage here of 2 baseline distances is empirical.
+         % In border case where code-block fits barely in remaining space,
+         % it gets framed and looks good but the outer frame may continue
+         % on top of next page and give (if no contents after code-block)
+         % an empty framed line, as testing showed.
+         2\baselineskip+
+         % now add all to accumulated page totals and compare to \pagegoal
+         \pagetotal+\pagedepth>\pagegoal
+    % long contents: do not \MakeFramed. Do make a caption (either before or
+    % after) if title exists. Continuation hints across pagebreaks dropped.
+    % FIXME? a bottom caption may end up isolated at top of next page
+    %        (no problem with a top caption, which is default)
+    \spx@opt@verbatimwithframefalse
+    \def\sphinxVerbatim@Title{\noindent\box\sphinxVerbatim@TitleBox\par}%
+    \sphinxVerbatim@Before
+    \noindent\unvbox\sphinxVerbatim@ContentsBox\par
+    \sphinxVerbatim@After
+   \else
+    % short enough contents: use \MakeFramed. As it is nested, this requires
+    % minipage encapsulation.
+    \noindent\begin{minipage}{\linewidth}%
+     \MakeFramed {% Use it now with the fetched contents
+      \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage
+      }%
+     \unvbox\sphinxVerbatim@ContentsBox
+     % some of this may be superfluous:
+     \par\unskip\@minipagefalse\endMakeFramed
+    \end{minipage}%
+   \fi
+  \else % non-nested \MakeFramed
+    \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade
+    \ifsphinxverbatimwithminipage\end{minipage}\fi
+  \fi
+  \endtrivlist
+}
+\newenvironment {sphinxVerbatimNoFrame}
+  {\spx@opt@verbatimwithframefalse
+   \VerbatimEnvironment
+   \begin{sphinxVerbatim}}
+  {\end{sphinxVerbatim}}
+\newenvironment {sphinxVerbatimintable}
+  {% don't use a frame if in a table cell
+   \spx@opt@verbatimwithframefalse
+   \sphinxverbatimwithminipagetrue
+   % the literal block caption uses \sphinxcaption which is wrapper of \caption,
+   % but \caption must be modified because longtable redefines it to work only
+   % for the own table caption, and tabulary has multiple passes
+   \let\caption\sphinxfigcaption
+   % reduce above caption skip
+   \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}%
+   \VerbatimEnvironment
+   \begin{sphinxVerbatim}}
+  {\end{sphinxVerbatim}}
+
+
+%% PARSED LITERALS
+% allow long lines to wrap like they do in code-blocks
+
+% this should be kept in sync with definitions in sphinx.util.texescape
+\newcommand*\sphinxbreaksattexescapedchars{%
+  \def\do##1##2% put potential break point before character
+     {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}%
+  \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $
+  \def\do##1##2% put potential break point after character
+     {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}%
+  \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &,
+  \do\textgreater\>\do\textasciitilde\~% >, ~
+  \do\textbackslash\\% \
+}
+\newcommand*\sphinxbreaksviaactiveinparsedliteral{%
+  \sphinxbreaksviaactive % by default handles . , ; ? ! /
+  \lccode`\~`\~ %
+  % update \dospecials as it is used by \url
+  % but deactivation will already have been done hence this is unneeded:
+  %  \expandafter\def\expandafter\dospecials\expandafter{\dospecials
+  %   \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}%
+}
+\newcommand*\sphinxbreaksatspaceinparsedliteral{%
+  \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~
+}
+\newcommand*{\sphinxunactivateextras}{\let\do\@makeother
+      \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist}%
+% the \catcode13=5\relax (deactivate end of input lines) is left to callers
+\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax
+      \sphinxunactivateextras}%
+% now for the modified alltt environment
+\newenvironment{sphinxalltt}
+{% at start of next line to workaround Emacs/AUCTeX issue with this file
+\begin{alltt}%
+ \ifspx@opt@parsedliteralwraps
+   \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}%
+   \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}%
+   \sphinxbreaksattexescapedchars
+   \sphinxbreaksviaactiveinparsedliteral
+   \sphinxbreaksatspaceinparsedliteral
+% alltt takes care of the ' as derivative ("prime") in math mode
+   \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace
+             \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }%
+% not sure if displayed math (align,...) can end up in parsed-literal, anyway
+   \everydisplay\expandafter{\the\everydisplay
+             \catcode13=5 \sphinxunactivateextrasandspace
+             \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }%
+ \fi }
+{\end{alltt}}
+
+
+%% INLINE MARK-UP
+%
+
+% Protect \href's first argument in contexts such as sphinxalltt (or
+% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref.
+\protected\def\sphinxhref#1#2{{%
+    \sphinxunactivateextrasandspace % never do \scantokens with active space!
+% for the \endlinechar business, https://github.com/latex3/latex2e/issues/286
+    \endlinechar\m@ne\everyeof{{\endlinechar13 #2}}% keep catcode regime for #2
+    \scantokens{\href{#1}}% normalise it for #1 during \href expansion
+}}
+% Same for \url. And also \nolinkurl for coherence.
+\protected\def\sphinxurl#1{{%
+    \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens)
+    \endlinechar\m@ne\scantokens{\url{#1}}%
+}}
+\protected\def\sphinxnolinkurl#1{{%
+    \sphinxunactivateextrasandspace\everyeof{}%
+    \endlinechar\m@ne\scantokens{\nolinkurl{#1}}%
+}}
+
+% \sphinxupquote
+% to obtain straight quotes we execute \@noligs as patched by upquote, and
+% \scantokens is needed in cases where it would be too late for the macro to
+% first set catcodes and then fetch its argument. We also make the contents
+% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive,
+% and also at \ character (which is escaped to \textbackslash{}).
+\protected\def\sphinxtextbackslashbreakbefore
+ {\discretionary{}{\sphinxafterbreak\sphinx@textbackslash}{\sphinx@textbackslash}}
+\protected\def\sphinxtextbackslashbreakafter
+ {\discretionary{\sphinx@textbackslash}{\sphinxafterbreak}{\sphinx@textbackslash}}
+\let\sphinxtextbackslash\sphinxtextbackslashbreakafter
+% the macro must be protected if it ends up used in moving arguments,
+% in 'alltt' \@noligs is done already, and the \scantokens must be avoided.
+\protected\def\sphinxupquote#1{{\def\@tempa{alltt}%
+  \ifx\@tempa\@currenvir\else
+   \ifspx@opt@inlineliteralwraps
+      % break at . , ; ? ! /
+      \sphinxbreaksviaactive
+      % break also at \
+      \setbox8=\hbox{\textbackslash}%
+      \def\sphinx@textbackslash{\copy8}%
+      \let\textbackslash\sphinxtextbackslash
+      % by default, no continuation symbol on next line but may be added
+      \let\sphinxafterbreak\sphinxafterbreakofinlineliteral
+      % do not overwrite the comma set-up
+      \let\verbatim@nolig@list\sphinx@literal@nolig@list
+   \fi
+   % fix a space-gobbling issue due to LaTeX's original \do@noligs
+% TODO: using \@noligs as patched by upquote.sty is now unneeded because
+% either ` and ' are escaped (non-unicode engines) or they don't build
+% ligatures (unicode engines). Thus remove this and unify handling of `, <, >,
+% ' and - with the characters . , ; ? ! / as handled via
+% \sphinxbreaksviaactive.
+% Hence \sphinx@do@noligs will be removed, or rather replaced  with code
+% inserting discretionaries, as they allow a continuation symbol on start of
+% next line to achieve common design with code-blocks.
+   \let\do@noligs\sphinx@do@noligs
+   \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref)
+   \expandafter\scantokens
+  \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue...
+\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax
+    \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}}
+\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}%
+\let\sphinxafterbreakofinlineliteral\empty
+
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexnumfig.sty b/sphinx/build/latex/sphinxlatexnumfig.sty
new file mode 100644
index 0000000000000000000000000000000000000000..6d72961051eba439a573224713613f34beebe7d5
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexnumfig.sty
@@ -0,0 +1,122 @@
+%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexnumfig.sty}[2021/01/27 numbering]
+
+% Requires: remreset (old LaTeX only)
+% relates to numfig and numfig_secnum_depth configuration variables
+
+% LaTeX 2018-04-01 and later provides \@removefromreset
+\ltx@ifundefined{@removefromreset}
+    {\RequirePackage{remreset}}
+    {}% avoid warning
+% Everything is delayed to \begin{document} to allow hyperref patches into
+%   \newcounter to solve duplicate label problems for internal hyperlinks to
+%   code listings (literalblock counter).  User or extension re-definitions of
+%   \theliteralblock, et al., thus have also to be delayed. (changed at 3.5.0)
+\AtBeginDocument{%
+\ltx@ifundefined{c@chapter}
+   {\newcounter{literalblock}}%
+   {\newcounter{literalblock}[chapter]%
+    \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi
+                         \arabic{literalblock}}%
+    }%
+\ifspx@opt@nonumfigreset
+    \ltx@ifundefined{c@chapter}{}{%
+      \@removefromreset{figure}{chapter}%
+      \@removefromreset{table}{chapter}%
+      \@removefromreset{literalblock}{chapter}%
+      \ifspx@opt@mathnumfig
+        \@removefromreset{equation}{chapter}%
+      \fi
+    }%
+    \def\thefigure{\arabic{figure}}%
+    \def\thetable {\arabic{table}}%
+    \def\theliteralblock{\arabic{literalblock}}%
+    \ifspx@opt@mathnumfig
+      \def\theequation{\arabic{equation}}%
+    \fi
+\else
+\let\spx@preAthefigure\@empty
+\let\spx@preBthefigure\@empty
+% \ifspx@opt@usespart  % <-- LaTeX writer could pass such a 'usespart' boolean
+%                      %     as sphinx.sty package option
+% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning)
+% LaTeX core per default does not reset chapter or section
+% counters at each part.
+% But if we modify this, we need to redefine \thechapter, \thesection to
+% include the part number and this will cause problems in table of contents
+% because of too wide numbering. Simplest is to do nothing.
+% \fi
+\ifnum\spx@opt@numfigreset>0
+    \ltx@ifundefined{c@chapter}
+      {}
+      {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}%
+       \g@addto@macro\spx@preBthefigure{\fi}}%
+\fi
+\ifnum\spx@opt@numfigreset>1
+    \@addtoreset{figure}{section}%
+    \@addtoreset{table}{section}%
+    \@addtoreset{literalblock}{section}%
+    \ifspx@opt@mathnumfig
+      \@addtoreset{equation}{section}%
+    \fi%
+    \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}%
+    \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>2
+    \@addtoreset{figure}{subsection}%
+    \@addtoreset{table}{subsection}%
+    \@addtoreset{literalblock}{subsection}%
+    \ifspx@opt@mathnumfig
+      \@addtoreset{equation}{subsection}%
+    \fi%
+    \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}%
+    \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>3
+    \@addtoreset{figure}{subsubsection}%
+    \@addtoreset{table}{subsubsection}%
+    \@addtoreset{literalblock}{subsubsection}%
+    \ifspx@opt@mathnumfig
+      \@addtoreset{equation}{subsubsection}%
+    \fi%
+    \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}%
+    \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>4
+    \@addtoreset{figure}{paragraph}%
+    \@addtoreset{table}{paragraph}%
+    \@addtoreset{literalblock}{paragraph}%
+    \ifspx@opt@mathnumfig
+      \@addtoreset{equation}{paragraph}%
+    \fi%
+    \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}%
+    \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>5
+    \@addtoreset{figure}{subparagraph}%
+    \@addtoreset{table}{subparagraph}%
+    \@addtoreset{literalblock}{subparagraph}%
+    \ifspx@opt@mathnumfig
+      \@addtoreset{equation}{subparagraph}%
+    \fi%
+    \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}%
+    \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\expandafter\g@addto@macro
+\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}%
+\let\thefigure\spx@preAthefigure
+\let\thetable\spx@preAthefigure
+\let\theliteralblock\spx@preAthefigure
+\g@addto@macro\thefigure{\arabic{figure}}%
+\g@addto@macro\thetable{\arabic{table}}%
+\g@addto@macro\theliteralblock{\arabic{literalblock}}%
+  \ifspx@opt@mathnumfig
+    \let\theequation\spx@preAthefigure
+    \g@addto@macro\theequation{\arabic{equation}}%
+  \fi
+\fi
+}% end of big \AtBeginDocument
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexobjects.sty b/sphinx/build/latex/sphinxlatexobjects.sty
new file mode 100644
index 0000000000000000000000000000000000000000..e00881e53af3f94a333c22a09828a27668e12380
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexobjects.sty
@@ -0,0 +1,200 @@
+%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexobjects.sty}[2021/01/27 documentation environments]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - environments
+%
+%   - fulllineitems
+%   - productionlist
+%   - optionlist
+%   - DUlineblock (also "lineblock")
+%
+% - macros
+%
+%   - \DUrole
+%   - various legacy support macros related to author and release
+%     data of documented objects and modules.
+
+% \moduleauthor{name}{email}
+\newcommand{\moduleauthor}[2]{}
+
+% \sectionauthor{name}{email}
+\newcommand{\sectionauthor}[2]{}
+
+% Allow the release number to be specified independently of the
+% \date{}.  This allows the date to reflect the document's date and
+% release to specify the release that is documented.
+%
+\newcommand{\py@release}{\releasename\space\version}
+\newcommand{\version}{}% part of \py@release, used by title page and headers
+% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls)
+\newcommand{\releaseinfo}{}
+\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}}
+% this is inserted via template and #1=release config variable
+\newcommand{\release}[1]{\renewcommand{\version}{#1}}
+% this is defined by template to 'releasename' latex_elements key
+\newcommand{\releasename}{}
+% Fix issue in case release and releasename deliberately left blank
+\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition
+\newcommand{\sphinxifemptyorblank}[1]{%
+% test after one expansion of macro #1 if contents is empty or spaces
+     \if&\expandafter\@firstofone\detokenize\expandafter{#1}&%
+     \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}%
+\AtBeginDocument {%
+   \sphinxifemptyorblank{\releasename}
+     {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}}
+     {}%
+}%
+
+% Allow specification of the author's address separately from the
+% author's name.  This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\py@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
+
+% {fulllineitems} is the main environment for object descriptions.
+%
+% With 4.0.0 \pysigline (and \pysiglinewithargsret), used in a fulllineitems
+% environment the #1 will already be of the width which is computed here, i.e.
+% the available width on line, so the \makebox becomes a bit superfluous
+\newcommand{\py@itemnewline}[1]{% macro used as \makelabel in fulllineitems
+% Memo: this presupposes \itemindent is 0pt
+  \kern\labelsep  % because \@labels core latex box does \hskip-\labelsep
+  \makebox[\dimexpr\linewidth+\labelwidth\relax][l]{#1}%
+  \kern-\labelsep % because at end of \@labels box there is \hskip\labelsep
+}
+
+\newenvironment{fulllineitems}{%
+  \begin{list}{}{\labelwidth \leftmargin
+                 \rightmargin \z@ \topsep -\parskip \partopsep \parskip
+                 \itemsep -\parsep
+                 \let\makelabel=\py@itemnewline}%
+}{\end{list}}
+
+% Signatures, possibly multi-line
+%
+\newlength{\py@argswidth}
+\newcommand{\py@sigparams}[2]{%
+  % The \py@argswidth has been computed in \pysiglinewithargsret to make this
+  % occupy full available width on line.
+  \parbox[t]{\py@argswidth}{\raggedright #1\sphinxcode{)}#2\strut}%
+  % final strut is to help get correct vertical separation in case of multi-line
+  % box with the item contents. 
+}
+\newcommand{\pysigline}[1]{%
+% the \py@argswidth is available we use it despite its name (no "args" here)
+% the \relax\relax is because \py@argswidth is a "skip" variable and the first
+% \relax only ends its "dimen" part
+  \py@argswidth=\dimexpr\linewidth+\labelwidth\relax\relax
+  \item[{\parbox[t]{\py@argswidth}{\raggedright #1\strut}}]
+% contrarily to \pysiglinewithargsret, we do not do this:
+%  \leavevmode\par\nobreak\vskip-\parskip\prevdepth\dp\strutbox
+% which would give exact vertical spacing if item parbox is multi-line,
+% as it affects negatively more common situation of \pysigline
+% used twice or more in a row for labels sharing common description,
+% due to bad interaction with the \phantomsection in the mark-up
+}
+\newcommand{\pysiglinewithargsret}[3]{%
+  \settowidth{\py@argswidth}{#1\sphinxcode{(}}%
+  \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
+  \item[{#1\sphinxcode{(}\py@sigparams{#2}{#3}}]
+% this strange incantation is because at its root LaTeX in fact did not
+% imagine a multi-line label, it is always wrapped in a horizontal box at core
+% LaTeX level and we have to find tricks to get correct interline distances.
+  \leavevmode\par\nobreak\vskip-\parskip\prevdepth\dp\strutbox}
+\newcommand{\pysigstartmultiline}{%
+ \def\pysigstartmultiline{\vskip\smallskipamount\parskip\z@skip\itemsep\z@skip}%
+ \edef\pysigstopmultiline
+     {\noexpand\leavevmode\parskip\the\parskip\relax\itemsep\the\itemsep\relax}%
+ \parskip\z@skip\itemsep\z@skip
+}
+
+% Production lists
+%
+\newenvironment{productionlist}{%
+%  \def\sphinxoptional##1{{\Large[}##1{\Large]}}
+  \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}%
+  \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}%
+  \parindent=2em
+  \indent
+  \setlength{\LTpre}{0pt}%
+  \setlength{\LTpost}{0pt}%
+  \begin{longtable}[l]{lcl}
+}{%
+  \end{longtable}
+}
+
+% Definition lists; requested by AMK for HOWTO documents.  Probably useful
+% elsewhere as well, so keep in in the general style support.
+%
+\newenvironment{definitions}{%
+  \begin{description}%
+  \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}%
+}{%
+  \end{description}%
+}
+
+%% FROM DOCTUTILS LATEX WRITER
+%
+% The following is stuff copied from docutils' latex writer.
+%
+\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+  {\setlength{\labelwidth}{#1}
+   \setlength{\rightmargin}{1cm}
+   \setlength{\leftmargin}{\rightmargin}
+   \addtolength{\leftmargin}{\labelwidth}
+   \addtolength{\leftmargin}{\labelsep}
+   \renewcommand{\makelabel}{\optionlistlabel}}
+}{\end{list}}
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+  {\setlength{\partopsep}{\parskip}
+   \addtolength{\partopsep}{\baselineskip}
+   \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+   \leftmargin#1\relax}
+ \raggedright}
+{\end{list}}
+
+% From docutils.writers.latex2e
+% inline markup (custom roles)
+% \DUrole{#1}{#2} tries \DUrole#1{#2}
+\providecommand*{\DUrole}[2]{%
+  \ifcsname DUrole\detokenize{#1}\endcsname
+    \csname DUrole\detokenize{#1}\endcsname{#2}%
+  \else% backwards compatibility: try \docutilsrole#1{#2}
+    \ifcsname docutilsrole\detokenize{#1}\endcsname
+      \csname docutilsrole\detokenize{#1}\endcsname{#2}%
+    \else
+      #2%
+    \fi
+  \fi
+}
+
+\providecommand*{\DUprovidelength}[2]{%
+  \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi
+}
+
+\DUprovidelength{\DUlineblockindent}{2.5em}
+\ifdefined\DUlineblock\else
+  \newenvironment{DUlineblock}[1]{%
+    \list{}{\setlength{\partopsep}{\parskip}
+            \addtolength{\partopsep}{\baselineskip}
+            \setlength{\topsep}{0pt}
+            \setlength{\itemsep}{0.15\baselineskip}
+            \setlength{\parsep}{0pt}
+            \setlength{\leftmargin}{#1}}
+    \raggedright
+  }
+  {\endlist}
+\fi
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexshadowbox.sty b/sphinx/build/latex/sphinxlatexshadowbox.sty
new file mode 100644
index 0000000000000000000000000000000000000000..8d6c78666cf9fb53cb7cbda107057f7e1f74ecfe
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexshadowbox.sty
@@ -0,0 +1,100 @@
+%% TOPIC AND CONTENTS BOXES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexshadowbox.sty}[2021/01/27 sphinxShadowBox]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - sphinxShadowBox (environment)
+%
+% Dependencies (they do not need to be defined at time of loading):
+%
+% - of course the various colour and dimension options handled via sphinx.sty
+% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
+% - \savenotes/\spewnotes from sphinxpackagefootnote
+% - \ifspx@inframed defined in sphinx.sty
+%
+% Requires:
+\RequirePackage{framed}
+
+% Again based on use of "framed.sty", this allows breakable framed boxes.
+\long\def\spx@ShadowFBox#1{%
+  \leavevmode\begingroup
+  % first we frame the box #1
+  \setbox\@tempboxa
+   \hbox{\vrule\@width\sphinxshadowrule
+         \vbox{\hrule\@height\sphinxshadowrule
+               \kern\sphinxshadowsep
+               \hbox{\kern\sphinxshadowsep #1\kern\sphinxshadowsep}%
+               \kern\sphinxshadowsep
+               \hrule\@height\sphinxshadowrule}%
+         \vrule\@width\sphinxshadowrule}%
+  % Now we add the shadow, like \shadowbox from fancybox.sty would do
+  \dimen@\dimexpr.5\sphinxshadowrule+\sphinxshadowsize\relax
+  \hbox{\vbox{\offinterlineskip
+              \hbox{\copy\@tempboxa\kern-.5\sphinxshadowrule
+                    % add shadow on right side
+                    \lower\sphinxshadowsize
+                          \hbox{\vrule\@height\ht\@tempboxa \@width\dimen@}%
+                    }%
+              \kern-\dimen@ % shift back vertically to bottom of frame
+              % and add shadow at bottom
+              \moveright\sphinxshadowsize
+                    \vbox{\hrule\@width\wd\@tempboxa \@height\dimen@}%
+              }%
+        % move left by the size of right shadow so shadow adds no width
+        \kern-\sphinxshadowsize
+       }%
+  \endgroup
+}
+
+% use framed.sty to allow page breaks in frame+shadow
+% works well inside Lists and Quote-like environments
+% produced by ``topic'' directive (or local contents)
+% could nest if LaTeX writer authorized it
+\newenvironment{sphinxShadowBox}
+  {\def\FrameCommand {\spx@ShadowFBox }%
+   \advance\spx@image@maxheight
+   -\dimexpr2\sphinxshadowrule
+           +2\sphinxshadowsep
+           +\sphinxshadowsize
+           +\baselineskip\relax
+   % configure framed.sty not to add extra vertical spacing
+   \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
+   % the \trivlist will add the vertical spacing on top and bottom which is
+   % typical of center environment as used in Sphinx <= 1.4.1
+   % the \noindent has the effet of an extra blank line on top, to
+   % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust
+   % will put top part of frame on this baseline.
+   \def\FrameHeightAdjust {\baselineskip}%
+   % use package footnote to handle footnotes
+   \savenotes
+   \trivlist\item\noindent
+    % use a minipage if we are already inside a framed environment
+    \ifspx@inframed\begin{minipage}{\linewidth}\fi
+    \MakeFramed {\spx@inframedtrue
+    % framed.sty puts into "\width" the added width (=2shadowsep+2shadowrule)
+    % adjust \hsize to what the contents must use
+    \advance\hsize-\width
+    % adjust LaTeX parameters to behave properly in indented/quoted contexts
+    \FrameRestore
+    % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and
+    % itemize/enumerate are therein typeset more tightly, we want to keep
+    % that). We copy-paste from LaTeX source code but don't do a real minipage.
+    \@pboxswfalse
+    \let\@listdepth\@mplistdepth \@mplistdepth\z@
+    \@minipagerestore
+    \@setminipage
+    }%
+  }%
+  {% insert the "endminipage" code
+    \par\unskip
+    \@minipagefalse
+   \endMakeFramed
+     \ifspx@inframed\end{minipage}\fi
+   \endtrivlist
+   % output the stored footnotes
+   \spewnotes
+  }
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexstyleheadings.sty b/sphinx/build/latex/sphinxlatexstyleheadings.sty
new file mode 100644
index 0000000000000000000000000000000000000000..fa9be82b44d16a0cdf1d7fe7931ee91071ea9640
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexstyleheadings.sty
@@ -0,0 +1,83 @@
+%% TITLES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstyleheadings.sty}[2021/01/27 headings]
+
+\RequirePackage[nobottomtitles*]{titlesec}
+\@ifpackagelater{titlesec}{2016/03/15}%
+ {\@ifpackagelater{titlesec}{2016/03/21}%
+  {}%
+  {\newif\ifsphinx@ttlpatch@ok
+   \IfFileExists{etoolbox.sty}{%
+     \RequirePackage{etoolbox}%
+     \patchcmd{\ttlh@hang}{\parindent\z@}{\parindent\z@\leavevmode}%
+                                {\sphinx@ttlpatch@oktrue}{}%
+     \ifsphinx@ttlpatch@ok
+     \patchcmd{\ttlh@hang}{\noindent}{}{}{\sphinx@ttlpatch@okfalse}%
+     \fi
+   }{}%
+   \ifsphinx@ttlpatch@ok
+     \typeout{^^J Package Sphinx Info: ^^J
+              **** titlesec 2.10.1 successfully patched for bugfix ****^^J}%
+   \else
+     \AtEndDocument{\PackageWarningNoLine{sphinx}{^^J%
+******** titlesec 2.10.1 has a bug, (section numbers disappear) ......|^^J%
+******** and Sphinx could not patch it, perhaps because your local ...|^^J%
+******** copy is already fixed without a changed release date. .......|^^J%
+******** If not, you must update titlesec! ...........................|}}%
+   \fi
+  }%
+ }{}
+
+% Augment the sectioning commands used to get our own font family in place,
+% and reset some internal data items (\titleformat from titlesec package)
+\titleformat{\section}{\Large\py@HeaderFamily}%
+            {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}
+\titleformat{\subsection}{\large\py@HeaderFamily}%
+            {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}
+\titleformat{\subsubsection}{\py@HeaderFamily}%
+            {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}
+% By default paragraphs (and subsubsections) will not be numbered because
+% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2
+\titleformat{\paragraph}{\py@HeaderFamily}%
+            {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor}
+\titleformat{\subparagraph}{\py@HeaderFamily}%
+            {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor}
+
+
+% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather
+% than defining their own \py@HeaderFamily command (which is still possible).
+% Memo: \py@HeaderFamily is also used by \maketitle as defined in
+% sphinxmanual.cls/sphinxhowto.cls
+\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+\@ifpackagewith{fncychap}{Bjarne}{
+  \ChNameVar {\raggedleft\normalsize \py@HeaderFamily}
+  \ChNumVar  {\raggedleft\Large      \py@HeaderFamily}
+  \ChTitleVar{\raggedleft\Large      \py@HeaderFamily}
+  % This creates (numbered) chapter heads without the leading \vspace*{}:
+  \def\@makechapterhead#1{%
+    {\parindent \z@ \raggedright \normalfont
+      \ifnum \c@secnumdepth >\m@ne
+        \if@mainmatter
+          \DOCH
+        \fi
+      \fi
+      \interlinepenalty\@M
+      \if@mainmatter
+        \DOTI{#1}%
+      \else%
+        \DOTIS{#1}%
+      \fi
+    }}
+}{}% <-- "false" clause of \@ifpackagewith
+
+% fix fncychap's bug which uses prematurely the \textwidth value
+\@ifpackagewith{fncychap}{Bjornstrup}
+ {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}%
+ {}% <-- "false" clause of \@ifpackagewith
+
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexstylepage.sty b/sphinx/build/latex/sphinxlatexstylepage.sty
new file mode 100644
index 0000000000000000000000000000000000000000..4066129bf24ca86c1eb0cb8cf55f8730b92ca4d8
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexstylepage.sty
@@ -0,0 +1,79 @@
+%% PAGE STYLING
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstylepage.sty}[2021/01/27 page styling]
+
+% Separate paragraphs by space by default.
+\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update
+% new parskip.sty, but let it rollback to old one.
+% hopefully TeX installation not broken and LaTeX kernel not too old
+   {\RequirePackage{parskip}[=v1]}
+% standard one from 1989. Admittedly \section of article/book gives possibly
+% anomalous spacing, but we can't require September 2018 release for some time.
+   {\RequirePackage{parskip}}
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\hbadness = 5000                % don't print trivial gripes
+
+% Require package fancyhdr except under memoir class
+\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}}
+% Use \pagestyle{normal} as the primary pagestyle for text.
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifpackageloaded{fancyhdr}{%
+  \ltx@ifundefined{c@chapter}
+  {% no \chapter, "howto" (non-Japanese) docclass
+   \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[C]{{\py@HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0pt}
+   }
+   % Same as 'plain', this way we can use it in template
+   % FIXME: shouldn't this have a running header with Name and Release like 'manual'?
+   \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[C]{{\py@HeaderFamily\thepage}}
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0pt}
+   }
+  }%
+  {% classes with \chapter command
+   \fancypagestyle{normal}{
+    \fancyhf{}
+    \fancyfoot[RO]{{\py@HeaderFamily\thepage}}
+    \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
+    \fancyhead[RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}}
+    \if@twoside
+     \fancyfoot[LE]{{\py@HeaderFamily\thepage}}
+     \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
+     \fancyhead[LE]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}}
+    \fi
+    \renewcommand{\headrulewidth}{0.4pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+    % define chaptermark with \@chappos when \@chappos is available for Japanese
+    \ltx@ifundefined{@chappos}{}
+      {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}}
+    }
+  % Update the plain style so we get the page number & footer line,
+  % but not a chapter or section title.  This is to keep the first
+  % page of a chapter `clean.'
+   \fancypagestyle{plain}{
+    \fancyhf{}
+    \fancyfoot[RO]{{\py@HeaderFamily\thepage}}
+    \if@twoside\fancyfoot[LE]{{\py@HeaderFamily\thepage}}\fi
+    \renewcommand{\headrulewidth}{0pt}
+    \renewcommand{\footrulewidth}{0.4pt}
+    }
+   }
+  }
+  {% no fancyhdr: memoir class
+   % Provide default for 'normal' style simply as an alias of 'plain' style
+   % This way we can use \pagestyle{normal} in LaTeX template
+   \def\ps@normal{\ps@plain}
+   % Users of memoir class are invited to redefine 'normal' style in preamble
+  }
+
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatexstyletext.sty b/sphinx/build/latex/sphinxlatexstyletext.sty
new file mode 100644
index 0000000000000000000000000000000000000000..ab50aed569b864b6accf34abc48e3f0119072ec1
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatexstyletext.sty
@@ -0,0 +1,126 @@
+%% TEXT STYLING
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstyletext.sty}[2021/01/27 text styling]
+
+% Basically everything here consists of macros which are part of the latex
+% markup produced by the Sphinx latex writer
+
+% Some custom font markup commands.
+\protected\def\sphinxstrong#1{\textbf{#1}}
+\protected\def\sphinxcode#1{\texttt{#1}}
+\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}}
+\protected\def\sphinxemail#1{\textsf{#1}}
+\protected\def\sphinxtablecontinued#1{\textsf{#1}}
+\protected\def\sphinxtitleref#1{\emph{#1}}
+\protected\def\sphinxmenuselection#1{\emph{#1}}
+\protected\def\sphinxguilabel#1{\emph{#1}}
+\protected\def\sphinxkeyboard#1{\sphinxcode{#1}}
+\protected\def\sphinxaccelerator#1{\underline{#1}}
+\protected\def\sphinxcrossref#1{\emph{#1}}
+\protected\def\sphinxtermref#1{\emph{#1}}
+% \optional is used for ``[, arg]``, i.e. desc_optional nodes.
+\long\protected\def\sphinxoptional#1{%
+  {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+
+% additional customizable styling
+\def\sphinxstyleindexentry   #1{\texttt{#1}}
+\def\sphinxstyleindexextra   #1{ (\emph{#1})}
+\def\sphinxstyleindexpageref #1{, \pageref{#1}}
+\def\sphinxstyleindexpagemain#1{\textbf{#1}}
+\def\spxentry{\@backslashchar spxentry}% let to \sphinxstyleindexentry in index
+\def\spxextra{\@backslashchar spxextra}% let to \sphinxstyleindexextra in index
+\def\sphinxstyleindexlettergroup #1%
+    {{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
+\def\sphinxstyleindexlettergroupDefault #1%
+    {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}}
+\protected\def\sphinxstyletopictitle   #1{\textbf{#1}\par\medskip}
+\let\sphinxstylesidebartitle\sphinxstyletopictitle
+\protected\def\sphinxstyleothertitle   #1{\textbf{#1}}
+\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip}
+% \text.. commands do not allow multiple paragraphs
+\protected\def\sphinxstyletheadfamily    {\sffamily}
+\protected\def\sphinxstyleemphasis     #1{\emph{#1}}
+\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}}
+\protected\def\sphinxstylestrong       #1{\textbf{#1}}
+\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}}
+\protected\def\sphinxstyleabbreviation #1{\textsc{#1}}
+\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}}
+\newcommand*\sphinxstylecodecontinued[1]{\footnotesize(#1)}%
+\newcommand*\sphinxstylecodecontinues[1]{\footnotesize(#1)}%
+% figure legend comes after caption and may contain arbitrary body elements
+\newenvironment{sphinxlegend}{\par\small}{\par}
+% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds
+\AtBeginDocument{\pdfstringdefDisableCommands{%
+% all "protected" macros possibly ending up in section titles should be here
+% TODO: examine if \sphinxhref, \sphinxurl, \sphinnolinkurl should be handled
+    \let\sphinxstyleemphasis        \@firstofone
+    \let\sphinxstyleliteralemphasis \@firstofone
+    \let\sphinxstylestrong          \@firstofone
+    \let\sphinxstyleliteralstrong   \@firstofone
+    \let\sphinxstyleabbreviation    \@firstofone
+    \let\sphinxstyleliteralintitle  \@firstofone
+    \let\sphinxupquote  \@firstofone
+    \let\sphinxstrong   \@firstofone
+    \let\sphinxcode     \@firstofone
+    \let\sphinxbfcode   \@firstofone
+    \let\sphinxemail    \@firstofone
+    \let\sphinxcrossref \@firstofone
+    \let\sphinxtermref  \@firstofone
+    \let\sphinxhyphen\sphinxhyphenforbookmarks
+}}
+
+% Special characters
+%
+% This definition prevents en-dash and em-dash TeX ligatures.
+%
+% It inserts a potential breakpoint after the hyphen. This is to keep in sync
+% with behavior in code-blocks, parsed and inline literals. For a breakpoint
+% before the hyphen use \leavevmode\kern\z@- (within \makeatletter/\makeatother)
+\protected\def\sphinxhyphen#1{-\kern\z@}
+% The {} from texescape mark-up is kept, else -- gives en-dash in PDF bookmark
+\def\sphinxhyphenforbookmarks{-}
+
+% For curly braces inside \index macro
+\def\sphinxleftcurlybrace{\{}
+\def\sphinxrightcurlybrace{\}}
+
+% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x
+\def\spx@bd#1#2{%
+  \leavevmode
+  \begingroup
+  \ifx\spx@bd@height   \@undefined\def\spx@bd@height{\baselineskip}\fi
+  \ifx\spx@bd@width    \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi
+  \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi
+  \ifx\spx@bd@lower    \@undefined\def\spx@bd@lower{\dp\strutbox}\fi
+  \lower\spx@bd@lower#1{#2}%
+  \endgroup
+}%
+\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL
+  {\spx@bd{\vbox to\spx@bd@height}
+          {\vss\hrule\@height\spx@bd@thickness
+                     \@width\spx@bd@width\vss}}%
+\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL
+  {\spx@bd{\hb@xt@\spx@bd@width}
+          {\hss\vrule\@height\spx@bd@height
+                     \@width \spx@bd@thickness\hss}}%
+\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT
+  {\spx@bd{\hb@xt@\spx@bd@width}
+          {\hss\raise.5\spx@bd@height
+           \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height
+                                \@width \spx@bd@thickness\hss}%
+           \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness
+                                            \@width.5\spx@bd@width\vss}}}%
+\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+  {\spx@bd{\hb@xt@\spx@bd@width}
+          {\hss
+           \hb@xt@\z@{\hss\vrule\@height\spx@bd@height
+                                \@width \spx@bd@thickness\hss}%
+           \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness
+                                            \@width.5\spx@bd@width\vss}}}%
+\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}%
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
+
+\endinput
diff --git a/sphinx/build/latex/sphinxlatextables.sty b/sphinx/build/latex/sphinxlatextables.sty
new file mode 100644
index 0000000000000000000000000000000000000000..c3c1d6ad1ff6773f3af11f82b00d3aa80f3c2c74
--- /dev/null
+++ b/sphinx/build/latex/sphinxlatextables.sty
@@ -0,0 +1,481 @@
+%% TABLES (WITH SUPPORT FOR MERGED CELLS OF GENERAL CONTENTS)
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatextables.sty}[2021/01/27 tables]%
+
+% Provides support for this output mark-up from Sphinx latex writer
+% and table templates:
+%
+% - the tabulary and longtable environments from the eponymous packages
+% - the varwidth environment
+% - the >{} etc mark-up possible in tabularcolumns is from array package
+%     which is loaded by longtable and tabulary
+% - \X, \Y, T column types; others (L, C, R, J) are from tabulary package
+% - \sphinxaftertopcaption
+% - \sphinxatlongtableend
+% - \sphinxatlongtablestart
+% - \sphinxattableend
+% - \sphinxattablestart
+% - \sphinxcapstartof
+% - \sphinxcolwidth
+% - \sphinxlongtablecapskipadjust
+% - \sphinxmultirow
+% - \sphinxstartmulticolumn
+% - \sphinxstopmulticolumn
+% - \sphinxtablestrut
+% - \sphinxthecaptionisattop
+% - \sphinxthelongtablecaptionisattop
+%
+% Executes \RequirePackage for:
+%
+% - tabulary
+% - longtable
+% - varwidth
+%
+% Extends tabulary and longtable via patches and custom macros to support
+% merged cells possibly containing code-blocks in complex tables
+
+\RequirePackage{tabulary}
+% tabulary has a bug with its re-definition of \multicolumn in its first pass
+% which is not \long. But now Sphinx does not use LaTeX's \multicolumn but its
+% own macro. Hence we don't even need to patch tabulary. See
+% sphinxpackagemulticell.sty
+% X or S (Sphinx) may have meanings if some table package is loaded hence
+% \X was chosen to avoid possibility of conflict
+\newcolumntype{\X}[2]{p{\dimexpr
+      (\linewidth-\arrayrulewidth)*#1/#2-\tw@\tabcolsep-\arrayrulewidth\relax}}
+\newcolumntype{\Y}[1]{p{\dimexpr
+      #1\dimexpr\linewidth-\arrayrulewidth\relax-\tw@\tabcolsep-\arrayrulewidth\relax}}
+% using here T (for Tabulary) feels less of a problem than the X could be
+\newcolumntype{T}{J}%
+% For tables allowing pagebreaks
+\RequirePackage{longtable}
+% User interface to set-up whitespace before and after tables:
+\newcommand*\sphinxtablepre {0pt}%
+\newcommand*\sphinxtablepost{\medskipamount}%
+% Space from caption baseline to top of table or frame of literal-block
+\newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}%
+% as one can not use \baselineskip from inside longtable (it is zero there)
+% we need \sphinxbaselineskip, which defaults to \baselineskip
+\def\sphinxbaselineskip{\baselineskip}%
+% The following is to ensure that, whether tabular(y) or longtable:
+% - if a caption is on top of table:
+%   a) the space between its last baseline and the top rule of table is
+%      exactly \sphinxbelowcaptionspace
+%   b) the space from last baseline of previous text to first baseline of
+%      caption is exactly \parskip+\baselineskip+ height of a strut.
+%   c) the caption text will wrap at width \LTcapwidth (4in)
+% - make sure this works also if "caption" package is loaded by user
+%   (with its width or margin option taking place of \LTcapwidth role)
+% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE
+%
+% To modify space below such top caption, adjust \sphinxbelowcaptionspace
+% To add or remove space above such top caption, adjust \sphinxtablepre:
+%   notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored**
+% A. Table with longtable
+\def\sphinxatlongtablestart
+   {\par
+    \vskip\parskip
+    \vskip\dimexpr\sphinxtablepre\relax % adjust vertical position
+    \vbox{}% get correct baseline from above
+    \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips
+    \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}%
+   }%
+% Compatibility with caption package
+\def\sphinxthelongtablecaptionisattop{%
+    \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}%
+}%
+% Achieves exactly \sphinxbelowcaptionspace below longtable caption
+\def\sphinxlongtablecapskipadjust
+   {\dimexpr-\dp\strutbox
+            -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}%
+            +\sphinxbelowcaptionspace\relax}%
+\def\sphinxatlongtableend{\@nobreakfalse % latex3/latex2e#173
+    \prevdepth\z@\vskip\sphinxtablepost\relax}%
+% B. Table with tabular or tabulary
+\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax}%
+\let\sphinxattableend\sphinxatlongtableend
+% This is used by tabular and tabulary templates
+\newcommand*\sphinxcapstartof[1]{%
+   \vskip\parskip
+   \vbox{}% force baselineskip for good positioning by capstart of hyperanchor
+   % hyperref puts the anchor 6pt above this baseline; in case of caption
+   % this baseline will be \ht\strutbox above first baseline of caption
+   \def\@captype{#1}%
+   \capstart
+% move back vertically, as tabular (or its caption) will compensate
+   \vskip-\baselineskip\vskip-\parskip
+}%
+\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof
+    \spx@ifcaptionpackage
+      {\caption@setposition{t}%
+       \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof
+       \vskip-\belowcaptionskip          % anticipate caption package skip
+       % caption package uses a \vbox, not a \vtop, so "single line" case
+       % gives different result from "multi-line" without this:
+       \nointerlineskip
+      }%
+      {}%
+}%
+\def\sphinxthecaptionisatbottom{% (not finalized; for template usage)
+    \spx@ifcaptionpackage{\caption@setposition{b}}{}%
+}%
+% The aim of \sphinxcaption is to apply to tabular(y) the maximal width
+% of caption as done by longtable
+\def\sphinxtablecapwidth{\LTcapwidth}%
+\newcommand\sphinxcaption{\@dblarg\spx@caption}%
+\long\def\spx@caption[#1]#2{%
+   \noindent\hb@xt@\linewidth{\hss
+      \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax
+% don't exceed linewidth for the caption width
+            \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi
+% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here
+            \abovecaptionskip\sphinxabovecaptionskip % \z@skip
+            \belowcaptionskip\sphinxbelowcaptionskip % \z@skip
+            \caption[{#1}]%
+               {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}%
+           }\hss}%
+   \par\prevdepth\dp\strutbox
+}%
+\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal
+\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal
+% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top
+% caption, and with another value in sphinxVerbatimintable
+% TODO: To unify space above caption of a code-block with the one above
+%       caption of a table/longtable, \abovecaptionskip must not be used
+%       This auxiliary will get renamed and receive a different meaning
+%       in future.
+\def\spx@abovecaptionskip{\abovecaptionskip}%
+% Achieve \sphinxbelowcaptionspace below a caption located above a tabular
+% or a tabulary
+\newcommand\sphinxaftertopcaption
+{%
+   \spx@ifcaptionpackage
+     {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}%
+   \vskip\dimexpr\sphinxbelowcaptionspace\relax
+   \vskip-\baselineskip\vskip-\parskip
+}%
+% varwidth is crucial for our handling of general contents in merged cells
+\RequirePackage{varwidth}
+% but addition of a compatibility patch with hyperref is needed
+% (tested with varwidth v 0.92  Mar 2009)
+\AtBeginDocument {%
+    \let\@@vwid@Hy@raisedlink\Hy@raisedlink
+    \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}%
+    \edef\@vwid@setup{%
+      \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF !
+      \unexpanded\expandafter{\@vwid@setup}}%
+}%
+
+%%%%%%%%%%%%%%%%%%%%%
+% --- MULTICOLUMN ---
+% standard LaTeX's \multicolumn
+% 1. does not allow verbatim contents,
+% 2. interacts very poorly with tabulary.
+%
+% It is needed to write own macros for Sphinx: to allow code-blocks in merged
+% cells rendered by tabular/longtable, and to allow multi-column cells with
+% paragraphs to be taken into account sanely by tabulary algorithm for column
+% widths.
+%
+% This requires quite a bit of hacking. First, in Sphinx, the multi-column
+% contents will *always* be wrapped in a varwidth environment. The issue
+% becomes to pass it the correct target width. We must trick tabulary into
+% believing the multicolumn is simply separate columns, else tabulary does not
+% incorporate the contents in its algorithm. But then we must clear the
+% vertical rules...
+%
+% configuration of tabulary
+\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns
+\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete"
+% we need access to tabulary's final computed width. \@tempdima is too volatile
+% to hope it has kept tabulary's value when \sphinxcolwidth needs it.
+\newdimen\sphinx@TY@tablewidth
+\def\tabulary{%
+  \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}%
+  \let\endTY@final\endtabular
+  \TY@tabular}%
+% next hack is needed only if user has set latex_use_latex_multicolumn to True:
+% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if
+% upstream tabulary adds a \long, our extra one causes no harm)
+\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa
+   {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}%
+\expandafter\sphinx@tempa\TY@tab\sphinx@tempa
+%
+% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry
+% like standard multicolumn about |l| vs l|. On the other hand it assumes
+% columns are separated by a | ... (if not it will add extraneous
+% \arrayrulewidth space for each column separation in its estimate of available
+% width).
+%
+% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not
+% (easily) get rid of extra macros from >{...} or <{...} between columns. At
+% least, it has been made compatible with colortbl's \columncolor.
+%
+% TN. 2: tabulary's second pass is handled like tabular/longtable's single
+% pass, with the difference that we hacked \TY@final to set in
+% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is
+% needed only to handle columns with a "horizontal" specifier: "p" type columns
+% (inclusive of tabulary's LJRC) holds the target column width in the
+% \linewidth dimension.
+%
+% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up
+% would need some hacking around the fact that groups can not span across table
+% cells (the code does inserts & tokens, see TN1b). It was decided to keep it
+% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn.
+%
+% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular
+% inside a tabulary it will think to be at top level in the tabulary. But
+% Sphinx generates no nested tables, and if some LaTeX macro uses internally a
+% tabular this will not have a \sphinxstartmulticolumn within it!
+%
+\def\sphinxstartmulticolumn{%
+    \ifx\equation$% $ tabulary's first pass
+        \expandafter\sphinx@TYI@start@multicolumn
+    \else % either not tabulary or tabulary's second pass
+        \expandafter\sphinx@start@multicolumn
+    \fi
+}%
+\def\sphinxstopmulticolumn{%
+    \ifx\equation$% $ tabulary's first pass
+        \expandafter\sphinx@TYI@stop@multicolumn
+    \else % either not tabulary or tabulary's second pass
+        \ignorespaces
+    \fi
+}%
+\def\sphinx@TYI@start@multicolumn#1{%
+    % use \gdef always to avoid stack space build up
+    \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup
+}%
+\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax
+    \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width
+    \endgroup
+    \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}%
+}%
+\def\sphinx@TYI@multispan #1{%
+    \kern\sphinx@tempb\ignorespaces % the per column occupied width
+    \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ...
+      \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}%
+    \fi
+}%
+\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}%
+%
+% Now the branch handling either the second pass of tabulary or the single pass
+% of tabular/longtable. This is the delicate part where we gather the
+% dimensions from the p columns either set-up by tabulary or by user p column
+% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the
+% template must be inserted (other hacks would be horribly complicated except
+% if we rewrote crucial parts of LaTeX's \@array !) and we can not do
+% \omit\span like standard \multicolumn's easy approach. Thus we must cancel
+% the \vrule separators. Also, perhaps the column specifier is of the l, c, r
+% type, then we attempt an ad hoc rescue to give varwidth a reasonable target
+% width.
+\def\sphinx@start@multicolumn#1{%
+    \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}%
+}%
+\def\sphinx@multispan #1{%
+    \ifnum#1=\@ne\expandafter\sphinx@multispan@end
+            \else\expandafter\sphinx@multispan@next
+    \fi {#1}%
+}%
+\def\sphinx@multispan@next #1{%
+    % trick to recognize L, C, R, J or p, m, b type columns
+    \ifdim\baselineskip>\z@
+       \gdef\sphinx@tempb{\linewidth}%
+    \else
+    % if in an l, r, c type column, try and hope for the best
+       \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else
+            \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa
+            -\tw@\tabcolsep-\arrayrulewidth\relax}%
+    \fi
+    \noindent\kern\sphinx@tempb\relax
+    \xdef\sphinx@multiwidth
+           {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\arrayrulewidth}%
+    % hack the \vline and the colortbl macros
+    \sphinx@hack@vline\sphinx@hack@CT&\relax
+    % repeat
+    \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}%
+}%
+% packages like colortbl add group levels, we need to "climb back up" to be
+% able to hack the \vline and also the colortbl inserted tokens. This creates
+% empty space whether or not the columns were | separated:
+\def\sphinx@hack@vline{\ifnum\currentgrouptype=6\relax
+    \kern\arrayrulewidth\arrayrulewidth\z@\else\aftergroup\sphinx@hack@vline\fi}%
+\def\sphinx@hack@CT{\ifnum\currentgrouptype=6\relax
+    \let\CT@setup\sphinx@CT@setup\else\aftergroup\sphinx@hack@CT\fi}%
+% It turns out \CT@row@color is not expanded contrarily to \CT@column@color
+% during LaTeX+colortbl preamble preparation, hence it would be possible for
+% \sphinx@CT@setup to discard only the column color and choose to obey or not
+% row color and cell color. It would even be possible to propagate cell color
+% to row color for the duration of the Sphinx multicolumn... the (provisional?)
+% choice has been made to cancel the colortbl colours for the multicolumn
+% duration.
+\def\sphinx@CT@setup #1\endgroup{\endgroup}% hack to remove colour commands
+\def\sphinx@multispan@end#1{%
+    % first, trace back our steps horizontally
+    \noindent\kern-\dimexpr\sphinx@multiwidth\relax
+    % and now we set the final computed width for the varwidth environment
+    \ifdim\baselineskip>\z@
+       \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}%
+    \else
+       \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+
+         (\ifx\TY@final\@undefined\linewidth\else
+          \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa
+          -\tw@\tabcolsep-\arrayrulewidth\relax}%
+    \fi
+    % we need to remove colour set-up also for last cell of the multi-column
+    \aftergroup\sphinx@hack@CT
+}%
+\newcommand*\sphinxcolwidth[2]{%
+  % this dimension will always be used for varwidth, and serves as maximum
+  % width when cells are merged either via multirow or multicolumn or both,
+  % as always their contents is wrapped in varwidth environment.
+  \ifnum#1>\@ne % multi-column (and possibly also multi-row)
+  % we wrote our own multicolumn code especially to handle that (and allow
+  % verbatim contents)
+   \ifx\equation$%$
+       \tymax % first pass of tabulary (cf MEMO above regarding nesting)
+   \else % the \@gobble thing is for compatibility with standard \multicolumn
+       \sphinx@multiwidth\@gobble{#1/#2}%
+   \fi
+  \else % single column multirow
+   \ifx\TY@final\@undefined % not a tabulary.
+    \ifdim\baselineskip>\z@
+        % in a p{..} type column, \linewidth is the target box width
+        \linewidth
+    \else
+        % l, c, r columns. Do our best.
+        \dimexpr(\linewidth-\arrayrulewidth)/#2-
+                \tw@\tabcolsep-\arrayrulewidth\relax
+    \fi
+   \else % in tabulary
+    \ifx\equation$%$% first pass
+        \tymax % it is set to a big value so that paragraphs can express themselves
+    \else
+     % second pass.
+     \ifdim\baselineskip>\z@
+         \linewidth % in a L, R, C, J column or a p, \X, \Y ...
+     \else
+         % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width
+         \dimexpr(\sphinx@TY@tablewidth-\arrayrulewidth)/#2-
+                 \tw@\tabcolsep-\arrayrulewidth\relax
+     \fi
+    \fi
+   \fi
+  \fi
+}%
+% fallback default in case user has set latex_use_latex_multicolumn to True:
+% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn
+\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!)
+    (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi
+     -\arrayrulewidth)*#2-\tw@\tabcolsep-\arrayrulewidth\relax}%
+
+%%%%%%%%%%%%%%%%%%
+% --- MULTIROW ---
+% standard \multirow
+% 1. does not allow verbatim contents,
+% 2. does not allow blank lines in its argument,
+% 3. its * specifier means to typeset "horizontally" which is very
+%    bad for paragraph content. 2016 version has = specifier but it
+%    must be used with p type columns only, else results are bad,
+% 4. it requires manual intervention if the contents is too long to fit
+%    in the asked-for number of rows.
+% 5. colour panels (either from \rowcolor or \columncolor) will hide
+%    the bottom part of multirow text, hence manual tuning is needed
+%    to put the multirow insertion at the _bottom_.
+%
+% The Sphinx solution consists in always having contents wrapped
+% in a varwidth environment so that it makes sense to estimate how many
+% lines it will occupy, and then ensure by insertion of suitable struts
+% that the table rows have the needed height. The needed mark-up is done
+% by LaTeX writer, which has its own id for the merged cells.
+%
+% The colour issue is solved by clearing colour panels in all cells,
+% whether or not the multirow is single-column or multi-column.
+%
+% In passing we obtain baseline alignements across rows (only if
+% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p"
+% multi-line contents, only first and last line...)
+%
+% TODO: examine the situation with \arraystretch > 1. The \extrarowheight
+% is hopeless for multirow anyhow, it makes baseline alignment strictly
+% impossible.
+\newcommand\sphinxmultirow[2]{\begingroup
+  % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents
+  % but let's fetch #3 in a way allowing verbatim contents !
+  \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}%
+  \afterassignment\sphinx@multirow\let\next=
+}%
+\def\sphinx@multirow {%
+  \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut
+}%
+\def\sphinx@@multirow {%
+  % The contents, which is a varwidth environment, has been captured in
+  % \box0 (a \hbox).
+  % We have with \sphinx@cellid an assigned unique id. The goal is to give
+  % about the same height to all the involved rows.
+  % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up
+  % in LaTeX file and the expansion of the latter will do the suitable thing.
+  \dimen@\dp\z@
+  \dimen\tw@\ht\@arstrutbox
+  \advance\dimen@\dimen\tw@
+  \advance\dimen\tw@\dp\@arstrutbox
+  \count@=\dimen@       % type conversion dim -> int
+  \count\tw@=\dimen\tw@
+  \divide\count@\count\tw@ % TeX division truncates
+  \advance\dimen@-\count@\dimen\tw@
+  % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt.
+  % (note that if \count@ holds 0, surely \dimen@>1300sp)
+  \ifdim\dimen@>1300sp \advance\count@\@ne \fi
+  % now \count@ holds the count L of needed "lines"
+  % and \sphinx@nbofrows holds the number N of rows
+  % we have L >= 1 and N >= 1
+  % if L is a multiple of N, ... clear what to do !
+  % else write L = qN + r, 1 <= r < N and we will
+  % arrange for each row to have enough space for:
+  %     q+1 "lines" in each of the first r rows
+  %       q "lines" in each of the (N-r) bottom rows
+  % for a total of (q+1) * r + q * (N-r) = q * N + r = L
+  % It is possible that q == 0.
+  \count\tw@\count@
+  % the TeX division truncates
+  \divide\count\tw@\sphinx@nbofrows\relax
+  \count4\count\tw@ % q
+  \multiply\count\tw@\sphinx@nbofrows\relax
+  \advance\count@-\count\tw@ % r
+  \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname
+     {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}%
+  \dp\z@\z@
+  % this will use the real height if it is >\ht\@arstrutbox
+  \sphinxtablestrut{\sphinx@cellid}\box\z@
+  \endgroup % group was opened in \sphinxmultirow
+}%
+\newcommand*\sphinxtablestrut[1]{%
+  % #1 is a "cell_id", i.e. the id of a merged group of table cells
+  \csname sphinx@tablestrut_#1\endcsname
+}%
+% LaTeX typesets the table row by row, hence each execution can do
+% an update for the next row.
+\newcommand*\sphinx@tablestrut[3]{\begingroup
+  % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows
+  % if #2 = 0, create space for max(q,1) table lines
+  % if #2 > 0, create space for q+1 lines and decrement #2
+  \leavevmode
+  \count@#1\relax
+  \ifnum#2=\z@
+    \ifnum\count@=\z@\count@\@ne\fi
+  \else
+    % next row will be with a #2 decremented by one
+    \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname
+      {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}%
+   \advance\count@\@ne
+  \fi
+  \vrule\@height\ht\@arstrutbox
+        \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax
+        \@width\z@
+  \endgroup
+  % we need this to avoid colour panels hiding bottom parts of multirow text
+  \sphinx@hack@CT
+}%
+
+\endinput
diff --git a/sphinx/build/latex/sphinxmanual.cls b/sphinx/build/latex/sphinxmanual.cls
new file mode 100644
index 0000000000000000000000000000000000000000..718189d571264af934ec110b24c1826c10d1b675
--- /dev/null
+++ b/sphinx/build/latex/sphinxmanual.cls
@@ -0,0 +1,128 @@
+%
+% sphinxmanual.cls for Sphinx (http://sphinx-doc.org/)
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)]
+
+% chapters starting at odd pages (overridden by 'openany' document option)
+\PassOptionsToClass{openright}{\sphinxdocclass}
+
+% 'oneside' option overriding the 'twoside' default
+\newif\if@oneside
+\DeclareOption{oneside}{\@onesidetrue}
+% Pass remaining document options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}}
+\ProcessOptions\relax
+
+% Defaults two-side document
+\if@oneside
+% nothing to do (oneside is the default)
+\else
+\PassOptionsToClass{twoside}{\sphinxdocclass}
+\fi
+
+\LoadClass{\sphinxdocclass}
+
+% Set some sane defaults for section numbering depth and TOC depth.  You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{1}
+
+% Adapt \and command to the flushright context of \sphinxmaketitle, to
+% avoid ragged line endings if author names do not fit all on one single line
+\DeclareRobustCommand{\and}{%
+    \end{tabular}\kern-\tabcolsep
+    \allowbreak
+    \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}%
+}%
+% If it is desired that each author name be on its own line, use in preamble:
+%\DeclareRobustCommand{\and}{%
+%   \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}%
+%}%
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\newcommand{\sphinxmaketitle}{%
+  \let\sphinxrestorepageanchorsetting\relax
+  \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi
+  \hypersetup{pageanchor=false}% avoid duplicate destination warnings
+  \begin{titlepage}%
+    \let\footnotesize\small
+    \let\footnoterule\relax
+    \noindent\rule{\textwidth}{1pt}\par
+      \begingroup % for PDF information dictionary
+       \def\endgraf{ }\def\and{\& }%
+       \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup
+       \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}%
+      \endgroup
+    \begin{flushright}%
+      \sphinxlogo
+      \py@HeaderFamily
+      {\Huge \@title \par}
+      {\itshape\LARGE \py@release\releaseinfo \par}
+      \vfill
+      {\LARGE
+        \begin{tabular}[t]{c}
+          \@author
+        \end{tabular}\kern-\tabcolsep
+        \par}
+      \vfill\vfill
+      {\large
+       \@date \par
+       \vfill
+       \py@authoraddress \par
+      }%
+    \end{flushright}%\par
+    \@thanks
+  \end{titlepage}%
+  \setcounter{footnote}{0}%
+  \let\thanks\relax\let\maketitle\relax
+  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+  \clearpage
+  \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi
+  \if@openright\cleardoublepage\else\clearpage\fi
+  \sphinxrestorepageanchorsetting
+}
+
+\newcommand{\sphinxtableofcontents}{%
+  \pagenumbering{roman}%
+  \begingroup
+    \parskip \z@skip
+    \sphinxtableofcontentshook
+    \tableofcontents
+  \endgroup
+  % before resetting page counter, let's do the right thing.
+  \if@openright\cleardoublepage\else\clearpage\fi
+  \pagenumbering{arabic}%
+}
+
+% This is needed to get the width of the section # area wide enough in the
+% library reference.  Doing it here keeps it the same for all the manuals.
+%
+\newcommand{\sphinxtableofcontentshook}{%
+  \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}%
+  \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}%
+}
+
+% Fix the bibliography environment to add an entry to the Table of
+% Contents.
+% For a report document class this environment is a chapter.
+%
+\newenvironment{sphinxthebibliography}[1]{%
+  \if@openright\cleardoublepage\else\clearpage\fi
+  % \phantomsection % not needed here since TeXLive 2010's hyperref
+  \begin{thebibliography}{#1}%
+  \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}}
+
+% Same for the indices.
+% The memoir class already does this, so we don't duplicate it in that case.
+%
+\@ifclassloaded{memoir}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}
+ {\newenvironment{sphinxtheindex}{%
+    \if@openright\cleardoublepage\else\clearpage\fi
+    \phantomsection % needed as no chapter, section, ... created
+    \begin{theindex}%
+    \addcontentsline{toc}{chapter}{\indexname}}{\end{theindex}}}
diff --git a/sphinx/build/latex/sphinxmessages.sty b/sphinx/build/latex/sphinxmessages.sty
new file mode 100644
index 0000000000000000000000000000000000000000..68ebffa887dfb5a0ee10257bd15e1d73f54ff3c1
--- /dev/null
+++ b/sphinx/build/latex/sphinxmessages.sty
@@ -0,0 +1,21 @@
+%
+% sphinxmessages.sty
+%
+% message resources for Sphinx
+%
+\ProvidesPackage{sphinxmessages}[2019/01/04 v2.0 Localized LaTeX macros (Sphinx team)]
+
+\renewcommand{\literalblockcontinuedname}{continued from previous page}
+\renewcommand{\literalblockcontinuesname}{continues on next page}
+\renewcommand{\sphinxnonalphabeticalgroupname}{Non\sphinxhyphen{}alphabetical}
+\renewcommand{\sphinxsymbolsname}{Symbols}
+\renewcommand{\sphinxnumbersname}{Numbers}
+\def\pageautorefname{page}
+
+\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }}
+\def\fnum@figure{\figurename\thefigure{}}
+
+\addto\captionsenglish{\renewcommand{\tablename}{Table }}
+\def\fnum@table{\tablename\thetable{}}
+
+\addto\captionsenglish{\renewcommand{\literalblockname}{Listing}}
\ No newline at end of file
diff --git a/sphinx/build/latex/sphinxmulticell.sty b/sphinx/build/latex/sphinxmulticell.sty
new file mode 100644
index 0000000000000000000000000000000000000000..a6454918f3f926755a2a1c9290b7e2f871925b90
--- /dev/null
+++ b/sphinx/build/latex/sphinxmulticell.sty
@@ -0,0 +1,317 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{sphinxmulticell}%
+    [2017/02/23 v1.6 better span rows and columns of a table (Sphinx team)]%
+\DeclareOption*{\PackageWarning{sphinxmulticell}{Option `\CurrentOption' is unknown}}%
+\ProcessOptions\relax
+%
+% --- MULTICOLUMN ---
+% standard LaTeX's \multicolumn
+% 1. does not allow verbatim contents,
+% 2. interacts very poorly with tabulary.
+%
+% It is needed to write own macros for Sphinx: to allow code-blocks in merged
+% cells rendered by tabular/longtable, and to allow multi-column cells with
+% paragraphs to be taken into account sanely by tabulary algorithm for column
+% widths.
+%
+% This requires quite a bit of hacking. First, in Sphinx, the multi-column
+% contents will *always* be wrapped in a varwidth environment. The issue
+% becomes to pass it the correct target width. We must trick tabulary into
+% believing the multicolumn is simply separate columns, else tabulary does not
+% incorporate the contents in its algorithm. But then we must clear the
+% vertical rules...
+%
+% configuration of tabulary
+\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns
+\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete"
+% we need access to tabulary's final computed width. \@tempdima is too volatile
+% to hope it has kept tabulary's value when \sphinxcolwidth needs it.
+\newdimen\sphinx@TY@tablewidth
+\def\tabulary{%
+  \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}%
+  \let\endTY@final\endtabular
+  \TY@tabular}%
+% next hack is needed only if user has set latex_use_latex_multicolumn to True:
+% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if
+% upstream tabulary adds a \long, our extra one causes no harm)
+\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa
+   {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}%
+\expandafter\sphinx@tempa\TY@tab\sphinx@tempa
+%
+% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry
+% like standard multicolumn about |l| vs l|. On the other hand it assumes
+% columns are separated by a | ... (if not it will add extraneous
+% \arrayrulewidth space for each column separation in its estimate of available
+% width).
+%
+% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not
+% (easily) get rid of extra macros from >{...} or <{...} between columns. At
+% least, it has been made compatible with colortbl's \columncolor.
+%
+% TN. 2: tabulary's second pass is handled like tabular/longtable's single
+% pass, with the difference that we hacked \TY@final to set in
+% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is
+% needed only to handle columns with a "horizontal" specifier: "p" type columns
+% (inclusive of tabulary's LJRC) holds the target column width in the
+% \linewidth dimension.
+%
+% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up
+% would need some hacking around the fact that groups can not span across table
+% cells (the code does inserts & tokens, see TN1b). It was decided to keep it
+% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn.
+%
+% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular
+% inside a tabulary it will think to be at top level in the tabulary. But
+% Sphinx generates no nested tables, and if some LaTeX macro uses internally a
+% tabular this will not have a \sphinxstartmulticolumn within it!
+%
+\def\sphinxstartmulticolumn{%
+    \ifx\equation$% $ tabulary's first pass
+        \expandafter\sphinx@TYI@start@multicolumn
+    \else % either not tabulary or tabulary's second pass
+        \expandafter\sphinx@start@multicolumn
+    \fi
+}%
+\def\sphinxstopmulticolumn{%
+    \ifx\equation$% $ tabulary's first pass
+        \expandafter\sphinx@TYI@stop@multicolumn
+    \else % either not tabulary or tabulary's second pass
+        \ignorespaces
+    \fi
+}%
+\def\sphinx@TYI@start@multicolumn#1{%
+    % use \gdef always to avoid stack space build up
+    \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup
+}%
+\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax
+    \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width
+    \endgroup
+    \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}%
+}%
+\def\sphinx@TYI@multispan #1{%
+    \kern\sphinx@tempb\ignorespaces % the per column occupied width
+    \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ...
+      \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}%
+    \fi
+}%
+\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}%
+%
+% Now the branch handling either the second pass of tabulary or the single pass
+% of tabular/longtable. This is the delicate part where we gather the
+% dimensions from the p columns either set-up by tabulary or by user p column
+% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the
+% template must be inserted (other hacks would be horribly complicated except
+% if we rewrote crucial parts of LaTeX's \@array !) and we can not do
+% \omit\span like standard \multicolumn's easy approach. Thus we must cancel
+% the \vrule separators. Also, perhaps the column specifier is of the l, c, r
+% type, then we attempt an ad hoc rescue to give varwidth a reasonable target
+% width.
+\def\sphinx@start@multicolumn#1{%
+    \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}%
+}%
+\def\sphinx@multispan #1{%
+    \ifnum#1=\@ne\expandafter\sphinx@multispan@end
+            \else\expandafter\sphinx@multispan@next
+    \fi {#1}%
+}%
+\def\sphinx@multispan@next #1{%
+    % trick to recognize L, C, R, J or p, m, b type columns
+    \ifdim\baselineskip>\z@
+       \gdef\sphinx@tempb{\linewidth}%
+    \else
+    % if in an l, r, c type column, try and hope for the best
+       \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else
+            \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa
+            -\tw@\tabcolsep-\arrayrulewidth\relax}%
+    \fi
+    \noindent\kern\sphinx@tempb\relax
+    \xdef\sphinx@multiwidth
+           {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\arrayrulewidth}%
+    % hack the \vline and the colortbl macros
+    \sphinx@hack@vline\sphinx@hack@CT&\relax
+    % repeat
+    \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}%
+}%
+% packages like colortbl add group levels, we need to "climb back up" to be
+% able to hack the \vline and also the colortbl inserted tokens. This creates
+% empty space whether or not the columns were | separated:
+\def\sphinx@hack@vline{\ifnum\currentgrouptype=6\relax
+    \kern\arrayrulewidth\arrayrulewidth\z@\else\aftergroup\sphinx@hack@vline\fi}%
+\def\sphinx@hack@CT{\ifnum\currentgrouptype=6\relax
+    \let\CT@setup\sphinx@CT@setup\else\aftergroup\sphinx@hack@CT\fi}%
+% It turns out \CT@row@color is not expanded contrarily to \CT@column@color
+% during LaTeX+colortbl preamble preparation, hence it would be possible for
+% \sphinx@CT@setup to discard only the column color and choose to obey or not
+% row color and cell color. It would even be possible to propagate cell color
+% to row color for the duration of the Sphinx multicolumn... the (provisional?)
+% choice has been made to cancel the colortbl colours for the multicolumn
+% duration.
+\def\sphinx@CT@setup #1\endgroup{\endgroup}% hack to remove colour commands
+\def\sphinx@multispan@end#1{%
+    % first, trace back our steps horizontally
+    \noindent\kern-\dimexpr\sphinx@multiwidth\relax
+    % and now we set the final computed width for the varwidth environment
+    \ifdim\baselineskip>\z@
+       \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}%
+    \else
+       \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+
+         (\ifx\TY@final\@undefined\linewidth\else
+          \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa
+          -\tw@\tabcolsep-\arrayrulewidth\relax}%
+    \fi
+    % we need to remove colour set-up also for last cell of the multi-column
+    \aftergroup\sphinx@hack@CT
+}%
+\newcommand*\sphinxcolwidth[2]{%
+  % this dimension will always be used for varwidth, and serves as maximum
+  % width when cells are merged either via multirow or multicolumn or both,
+  % as always their contents is wrapped in varwidth environment.
+  \ifnum#1>\@ne % multi-column (and possibly also multi-row)
+  % we wrote our own multicolumn code especially to handle that (and allow
+  % verbatim contents)
+   \ifx\equation$%$
+       \tymax % first pass of tabulary (cf MEMO above regarding nesting)
+   \else % the \@gobble thing is for compatibility with standard \multicolumn
+       \sphinx@multiwidth\@gobble{#1/#2}%
+   \fi
+  \else % single column multirow
+   \ifx\TY@final\@undefined % not a tabulary.
+    \ifdim\baselineskip>\z@
+        % in a p{..} type column, \linewidth is the target box width
+        \linewidth
+    \else
+        % l, c, r columns. Do our best.
+        \dimexpr(\linewidth-\arrayrulewidth)/#2-
+                \tw@\tabcolsep-\arrayrulewidth\relax
+    \fi
+   \else % in tabulary
+    \ifx\equation$%$% first pass
+        \tymax % it is set to a big value so that paragraphs can express themselves
+    \else
+     % second pass.
+     \ifdim\baselineskip>\z@
+         \linewidth % in a L, R, C, J column or a p, \X, \Y ...
+     \else
+         % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width
+         \dimexpr(\sphinx@TY@tablewidth-\arrayrulewidth)/#2-
+                 \tw@\tabcolsep-\arrayrulewidth\relax
+     \fi
+    \fi
+   \fi
+  \fi
+}%
+% fallback default in case user has set latex_use_latex_multicolumn to True:
+% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn
+\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!)
+    (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi
+     -\arrayrulewidth)*#2-\tw@\tabcolsep-\arrayrulewidth\relax}%
+%
+% --- MULTIROW ---
+% standard \multirow
+% 1. does not allow verbatim contents,
+% 2. does not allow blank lines in its argument,
+% 3. its * specifier means to typeset "horizontally" which is very
+%    bad for paragraph content. 2016 version has = specifier but it
+%    must be used with p type columns only, else results are bad,
+% 4. it requires manual intervention if the contents is too long to fit
+%    in the asked-for number of rows.
+% 5. colour panels (either from \rowcolor or \columncolor) will hide
+%    the bottom part of multirow text, hence manual tuning is needed
+%    to put the multirow insertion at the _bottom_.
+%
+% The Sphinx solution consists in always having contents wrapped
+% in a varwidth environment so that it makes sense to estimate how many
+% lines it will occupy, and then ensure by insertion of suitable struts
+% that the table rows have the needed height. The needed mark-up is done
+% by LaTeX writer, which has its own id for the merged cells.
+%
+% The colour issue is solved by clearing colour panels in all cells,
+% whether or not the multirow is single-column or multi-column.
+%
+% In passing we obtain baseline alignements across rows (only if
+% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p"
+% multi-line contents, only first and last line...)
+%
+% TODO: examine the situation with \arraystretch > 1. The \extrarowheight
+% is hopeless for multirow anyhow, it makes baseline alignment strictly
+% impossible.
+\newcommand\sphinxmultirow[2]{\begingroup
+  % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents
+  % but let's fetch #3 in a way allowing verbatim contents !
+  \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}%
+  \afterassignment\sphinx@multirow\let\next=
+}%
+\def\sphinx@multirow {%
+  \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut
+}%
+\def\sphinx@@multirow {%
+  % The contents, which is a varwidth environment, has been captured in
+  % \box0 (a \hbox).
+  % We have with \sphinx@cellid an assigned unique id. The goal is to give
+  % about the same height to all the involved rows.
+  % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up
+  % in LaTeX file and the expansion of the latter will do the suitable thing.
+  \dimen@\dp\z@
+  \dimen\tw@\ht\@arstrutbox
+  \advance\dimen@\dimen\tw@
+  \advance\dimen\tw@\dp\@arstrutbox
+  \count@=\dimen@       % type conversion dim -> int
+  \count\tw@=\dimen\tw@
+  \divide\count@\count\tw@ % TeX division truncates
+  \advance\dimen@-\count@\dimen\tw@
+  % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt.
+  % (note that if \count@ holds 0, surely \dimen@>1300sp)
+  \ifdim\dimen@>1300sp \advance\count@\@ne \fi
+  % now \count@ holds the count L of needed "lines"
+  % and \sphinx@nbofrows holds the number N of rows
+  % we have L >= 1 and N >= 1
+  % if L is a multiple of N, ... clear what to do !
+  % else write L = qN + r, 1 <= r < N and we will
+  % arrange for each row to have enough space for:
+  %     q+1 "lines" in each of the first r rows
+  %       q "lines" in each of the (N-r) bottom rows
+  % for a total of (q+1) * r + q * (N-r) = q * N + r = L
+  % It is possible that q == 0.
+  \count\tw@\count@
+  % the TeX division truncates
+  \divide\count\tw@\sphinx@nbofrows\relax
+  \count4\count\tw@ % q
+  \multiply\count\tw@\sphinx@nbofrows\relax
+  \advance\count@-\count\tw@ % r
+  \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname
+     {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}%
+  \dp\z@\z@
+  % this will use the real height if it is >\ht\@arstrutbox
+  \sphinxtablestrut{\sphinx@cellid}\box\z@
+  \endgroup % group was opened in \sphinxmultirow
+}%
+\newcommand*\sphinxtablestrut[1]{%
+  % #1 is a "cell_id", i.e. the id of a merged group of table cells
+  \csname sphinx@tablestrut_#1\endcsname
+}%
+% LaTeX typesets the table row by row, hence each execution can do
+% an update for the next row.
+\newcommand*\sphinx@tablestrut[3]{\begingroup
+  % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows
+  % if #2 = 0, create space for max(q,1) table lines
+  % if #2 > 0, create space for q+1 lines and decrement #2
+  \leavevmode
+  \count@#1\relax
+  \ifnum#2=\z@
+    \ifnum\count@=\z@\count@\@ne\fi
+  \else
+    % next row will be with a #2 decremented by one
+    \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname
+      {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}%
+   \advance\count@\@ne
+  \fi
+  \vrule\@height\ht\@arstrutbox
+        \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax
+        \@width\z@
+  \endgroup
+  % we need this to avoid colour panels hiding bottom parts of multirow text
+  \sphinx@hack@CT
+}%
+\endinput
+%%
+%% End of file `sphinxmulticell.sty'.
diff --git a/sphinx/build/latex/sphinxoptionsgeometry.sty b/sphinx/build/latex/sphinxoptionsgeometry.sty
new file mode 100644
index 0000000000000000000000000000000000000000..af5a804d593607e51ca637bebcbc9633f261691d
--- /dev/null
+++ b/sphinx/build/latex/sphinxoptionsgeometry.sty
@@ -0,0 +1,54 @@
+%% OPTIONS FOR GEOMETRY
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxoptionsgeometry.sty}[2021/01/27 geometry]
+
+% geometry
+\ifx\kanjiskip\@undefined
+  \PassOptionsToPackage{%
+     hmargin={\unexpanded{\spx@opt@hmargin}},%
+     vmargin={\unexpanded{\spx@opt@vmargin}},%
+     marginpar=\unexpanded{\spx@opt@marginpar}}
+  {geometry}
+\else
+ % set text width for Japanese documents to be integer multiple of 1zw
+ % and text height to be integer multiple of \baselineskip
+ % the execution is delayed to \sphinxsetup then geometry.sty
+ \normalsize\normalfont
+ \newcommand*\sphinxtextwidthja[1]{%
+    \if@twocolumn\tw@\fi
+    \dimexpr
+       \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/
+               \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax
+    zw\relax}%
+ \newcommand*\sphinxmarginparwidthja[1]{%
+    \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}%
+ \newcommand*\sphinxtextlinesja[1]{%
+    \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/
+                 \baselineskip\relax}%
+ \ifx\@jsc@uplatextrue\@undefined\else
+ % the way we found in order for the papersize special written by
+ % geometry in the dvi file to be correct in case of jsbook class
+   \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt
+     \PassOptionsToPackage{truedimen}{geometry}%
+   \fi
+ \fi
+ \PassOptionsToPackage{%
+    hmarginratio={1:1},%
+    textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},%
+    vmarginratio={1:1},%
+    lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},%
+    marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},%
+    footskip=2\baselineskip,%
+  }{geometry}%
+ \AtBeginDocument
+ {% update a dimension used by the jsclasses
+  \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi
+  % for some reason, jreport normalizes all dimensions with \@settopoint
+  \@ifclassloaded{jreport}
+    {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth}
+    {}% <-- "false" clause of \@ifclassloaded
+  }%
+\fi
+
+\endinput
diff --git a/sphinx/build/latex/sphinxoptionshyperref.sty b/sphinx/build/latex/sphinxoptionshyperref.sty
new file mode 100644
index 0000000000000000000000000000000000000000..b88f108df9a4d81e94bb8d0a3ecded420c9999f7
--- /dev/null
+++ b/sphinx/build/latex/sphinxoptionshyperref.sty
@@ -0,0 +1,35 @@
+%% Bookmarks and hyperlinks
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxoptionshyperref.sty}[2021/01/27 hyperref]
+
+% to make pdf with correct encoded bookmarks in Japanese
+% this should precede the hyperref package
+\ifx\kanjiskip\@undefined
+% for non-Japanese: make sure bookmarks are ok also with lualatex
+  \PassOptionsToPackage{pdfencoding=unicode}{hyperref}
+\else
+  \RequirePackage{atbegshi}
+  \ifx\ucs\@undefined
+    \ifnum 42146=\euc"A4A2
+      \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}}
+    \else
+      \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}}
+    \fi
+  \else
+    \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}}
+  \fi
+\fi
+
+\ifx\@jsc@uplatextrue\@undefined\else
+  \PassOptionsToPackage{setpagesize=false}{hyperref}
+\fi
+
+% These options can be overridden inside  'hyperref' key
+% or by later use of \hypersetup.
+\PassOptionsToPackage{colorlinks,breaklinks,%
+ linkcolor=InnerLinkColor,filecolor=OuterLinkColor,%
+ menucolor=OuterLinkColor,urlcolor=OuterLinkColor,%
+ citecolor=InnerLinkColor}{hyperref}
+
+\endinput
diff --git a/sphinx/build/latex/sphinxpackagecyrillic.sty b/sphinx/build/latex/sphinxpackagecyrillic.sty
new file mode 100644
index 0000000000000000000000000000000000000000..9aa62fc22baa68906867164da4d6819dfaf72907
--- /dev/null
+++ b/sphinx/build/latex/sphinxpackagecyrillic.sty
@@ -0,0 +1,55 @@
+%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only)
+%
+% refs: https://tex.stackexchange.com/q/460271/
+\ProvidesPackage{sphinxpackagecyrillic}%
+  [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents]
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix
+\DeclareBoolOption[false]{Xtwo}
+\DeclareBoolOption[false]{TtwoA}
+\DeclareDefaultOption{\@unknownoptionerror}
+\ProcessLocalKeyvalOptions* % ignore class options
+
+\ifspx@cyropt@Xtwo
+% original code by tex.sx user egreg (updated 2019/10/28):
+%   https://tex.stackexchange.com/a/460325/
+% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding
+% This assumes inputenc loaded with utf8 option, or LaTeX release
+% as recent as 2018/04/01 which does it automatically.
+  \@tfor\next:=%
+    {Ё}{Ђ}{Є}{Ѕ}{І}{Ј}{Љ}{Њ}{Ћ}{Ў}{Џ}{А}{Б}{В}{Г}{Д}{Е}{Ж}{З}{И}{Й}%
+    {К}{Л}{М}{Н}{О}{П}{Р}{С}{Т}{У}{Ф}{Х}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}%
+    {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{р}{с}{т}{у}%
+    {ф}{х}{ц}{ч}{ш}{щ}{ъ}{ы}{ь}{э}{ю}{я}{ё}{ђ}{є}{ѕ}{і}{ј}{љ}{њ}{ћ}%
+    {ў}{џ}{Ѣ}{ѣ}{Ѫ}{ѫ}{Ѵ}{ѵ}{Ґ}{ґ}{Ғ}{ғ}{Ҕ}{ҕ}{Җ}{җ}{Ҙ}{ҙ}{Қ}{қ}{Ҝ}{ҝ}%
+    {Òž}{ÒŸ}{Ò }{Ò¡}{Ò¢}{Ò£}{Ò¤}{Ò¥}{Ò¦}{Ò§}{Ò¨}{Ò©}{Òª}{Ò«}{Ò¬}{Ò­}{Ò®}{Ò¯}{Ò°}{Ò±}{Ò²}{Ò³}%
+    {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}%
+    {Ӎ}{ӎ}{Ӕ}{ӕ}{Ә}{ә}{Ӡ}{ӡ}{Ө}{ө}\do
+  {%
+    \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}%
+    \protected@edef\@temp{\endgroup
+    \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}%
+    \@temp{X2}%
+  }%
+\else
+\ifspx@cyropt@TtwoA
+% original code by tex.sx user jfbu:
+%   https://tex.stackexchange.com/a/460305/
+% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding
+  \@tfor\@tempa:=%
+    {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}%
+    {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}%
+    {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}%
+    {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}%
+    {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do
+  {%
+    \expandafter\DeclareTextSymbolDefault\expandafter
+               {\csname cyr\@tempa\endcsname}{T2A}%
+    \expandafter\uppercase\expandafter{\expandafter
+                 \def\expandafter\@tempa\expandafter{\@tempa}}%
+    \expandafter\DeclareTextSymbolDefault\expandafter
+      {\csname CYR\@tempa\endcsname}{T2A}%
+  }%
+  \DeclareTextSymbolDefault{\CYRpalochka}{T2A}%
+\fi\fi
+\endinput
diff --git a/sphinx/build/latex/sphinxpackagefootnote.sty b/sphinx/build/latex/sphinxpackagefootnote.sty
new file mode 100644
index 0000000000000000000000000000000000000000..a6071cf103f9f5579b5380f432d7a71547fe430d
--- /dev/null
+++ b/sphinx/build/latex/sphinxpackagefootnote.sty
@@ -0,0 +1,396 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{sphinxpackagefootnote}%
+ [2021/02/04 v1.1d footnotehyper adapted to sphinx (Sphinx team)]
+% Provides support for this output mark-up from Sphinx latex writer:
+% - footnote environment
+% - savenotes environment (table templates)
+% - \sphinxfootnotemark
+%
+%%
+%% Package: sphinxpackagefootnote
+%% Version: based on footnotehyper.sty 2021/02/04 v1.1d
+%% as available at https://www.ctan.org/pkg/footnotehyper
+%% License: the one applying to Sphinx
+%%
+%% Refer to the PDF documentation  at https://www.ctan.org/pkg/footnotehyper for
+%% the code comments.
+%%
+%% Differences:
+%% 1. a partial tabulary compatibility layer added (enough for Sphinx mark-up),
+%% 2. use of \spx@opt@BeforeFootnote from sphinx.sty,
+%% 3. use of \sphinxunactivateextrasandspace from sphinx.sty,
+%% 4. macro definition \sphinxfootnotemark,
+%% 5. macro definition \sphinxlongtablepatch
+%% 6. replaced some \undefined by \@undefined
+\newif\iffootnotehyperparse\footnotehyperparsetrue
+\DeclareOption*{\PackageWarning{sphinxpackagefootnote}{Option `\CurrentOption' is unknown}}%
+\ProcessOptions\relax
+\newbox\FNH@notes
+\newtoks\FNH@toks % 1.1c
+\newdimen\FNH@width
+\let\FNH@colwidth\columnwidth
+\newif\ifFNH@savingnotes
+\AtBeginDocument {%
+    \let\FNH@latex@footnote    \footnote
+    \let\FNH@latex@footnotetext\footnotetext
+    \let\FNH@H@@footnotetext   \@footnotetext
+    \let\FNH@H@@mpfootnotetext \@mpfootnotetext
+    \newenvironment{savenotes}
+        {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}%
+    \let\spewnotes      \FNH@spewnotes
+    \let\footnote       \FNH@footnote
+    \let\footnotetext   \FNH@footnotetext
+    \let\endfootnote    \FNH@endfntext
+    \let\endfootnotetext\FNH@endfntext
+    \@ifpackageloaded{hyperref}
+     {\ifHy@hyperfootnotes
+         \let\FNH@H@@footnotetext\H@@footnotetext
+         \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext
+      \else
+         \let\FNH@hyper@fntext\FNH@nohyp@fntext
+      \fi}%
+     {\let\FNH@hyper@fntext\FNH@nohyp@fntext}%
+}%
+\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}%
+\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}%
+\def\FNH@fntext #1{%
+  \ifx\ifmeasuring@\@undefined
+    \expandafter\@secondoftwo\else\expandafter\@firstofone\fi
+% these two lines modified for Sphinx (tabulary compatibility):
+    {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}%
+    {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$
+}%
+\long\def\FNH@hyper@fntext@i#1{%
+  \global\setbox\FNH@notes\vbox
+  {\unvbox\FNH@notes
+   \FNH@startnote
+   \@makefntext
+    {\rule\z@\footnotesep\ignorespaces
+     \ifHy@nesting\expandafter\ltx@firstoftwo
+             \else\expandafter\ltx@secondoftwo
+     \fi
+     {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}%
+     {\Hy@raisedlink
+       {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}%
+       {\relax}}%
+      \let\@currentHref\Hy@footnote@currentHref
+      \let\@currentlabelname\@empty
+      #1}%
+     \@finalstrut\strutbox
+    }%
+   \FNH@endnote
+  }%
+}%
+\long\def\FNH@nohyp@fntext@i#1{%
+  \global\setbox\FNH@notes\vbox
+  {\unvbox\FNH@notes
+   \FNH@startnote
+   \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+   \FNH@endnote
+  }%
+}%
+\def\FNH@startnote{%
+  \hsize\FNH@colwidth
+  \interlinepenalty\interfootnotelinepenalty
+  \reset@font\footnotesize
+  \floatingpenalty\@MM
+  \@parboxrestore
+  \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}%
+  \color@begingroup
+}%
+\def\FNH@endnote{\color@endgroup}%
+\def\FNH@savenotes{%
+  \begingroup
+  \ifFNH@savingnotes\else
+    \FNH@savingnotestrue
+    \let\@footnotetext    \FNH@hyper@fntext
+    \let\@mpfootnotetext  \FNH@hyper@fntext
+    \let\H@@mpfootnotetext\FNH@nohyp@fntext
+    \FNH@width\columnwidth
+    \let\FNH@colwidth\FNH@width
+    \global\setbox\FNH@notes\box\voidb@x
+    \let\FNH@thempfn\thempfn
+    \let\FNH@mpfn\@mpfn
+    \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi
+    \expandafter\def\expandafter\@minipagerestore\expandafter{%
+      \@minipagerestore
+      \let\thempfn\FNH@thempfn
+      \let\@mpfn\FNH@mpfn
+    }%
+  \fi
+}%
+\def\FNH@spewnotes {%
+  \if@endpe\ifx\par\@@par\FNH@toks{}\else
+     \FNH@toks\expandafter{\expandafter
+              \def\expandafter\par\expandafter{\par}\@endpetrue}%
+     \expandafter\expandafter\expandafter
+     \FNH@toks
+     \expandafter\expandafter\expandafter
+     {\expandafter\the\expandafter\FNH@toks
+      \expandafter\def\expandafter\@par\expandafter{\@par}}%
+     \expandafter\expandafter\expandafter
+     \FNH@toks
+     \expandafter\expandafter\expandafter
+     {\expandafter\the\expandafter\FNH@toks
+      \expandafter\everypar\expandafter{\the\everypar}}\fi
+  \else\FNH@toks{}\fi
+  \expandafter
+  \endgroup\the\FNH@toks
+  \ifFNH@savingnotes\else
+   \ifvoid\FNH@notes\else
+    \begingroup
+     \let\@makefntext\@empty
+     \let\@finalstrut\@gobble
+     \let\rule\@gobbletwo
+     \ifx\@footnotetext\@mpfootnotetext
+        \expandafter\FNH@H@@mpfootnotetext
+     \else
+        \expandafter\FNH@H@@footnotetext
+     \fi{\unvbox\FNH@notes}%
+    \endgroup
+   \fi
+  \fi
+}%
+\def\FNH@footnote@envname    {footnote}%
+\def\FNH@footnotetext@envname{footnotetext}%
+\def\FNH@footnote{%
+% this line added for Sphinx:
+    \spx@opt@BeforeFootnote
+    \ifx\@currenvir\FNH@footnote@envname
+        \expandafter\FNH@footnoteenv
+    \else
+        \expandafter\FNH@latex@footnote
+    \fi
+}%
+\def\FNH@footnoteenv{%
+% this line added for Sphinx (footnotes in parsed literal blocks):
+    \catcode13=5 \sphinxunactivateextrasandspace
+    \@ifnextchar[%
+      \FNH@footnoteenv@i %]
+      {\stepcounter\@mpfn
+       \protected@xdef\@thefnmark{\thempfn}%
+       \@footnotemark
+       \def\FNH@endfntext@fntext{\@footnotetext}%
+       \FNH@startfntext}%
+}%
+\def\FNH@footnoteenv@i[#1]{%
+    \begingroup
+     \csname c@\@mpfn\endcsname #1\relax
+     \unrestored@protected@xdef\@thefnmark{\thempfn}%
+    \endgroup
+    \@footnotemark
+    \def\FNH@endfntext@fntext{\@footnotetext}%
+    \FNH@startfntext
+}%
+\def\FNH@footnotetext{%
+    \ifx\@currenvir\FNH@footnotetext@envname
+        \expandafter\FNH@footnotetextenv
+    \else
+        \expandafter\FNH@latex@footnotetext
+    \fi
+}%
+\def\FNH@footnotetextenv{%
+    \@ifnextchar[%
+      \FNH@footnotetextenv@i %]
+      {\protected@xdef\@thefnmark{\thempfn}%
+       \def\FNH@endfntext@fntext{\@footnotetext}%
+       \FNH@startfntext}%
+}%
+\def\FNH@footnotetextenv@i[#1]{%
+    \begingroup
+     \csname c@\@mpfn\endcsname #1\relax
+     \unrestored@protected@xdef\@thefnmark{\thempfn}%
+    \endgroup
+    \ifFNH@savingnotes
+      \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}%
+    \else
+      \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}%
+    \fi
+    \FNH@startfntext
+}%
+\def\FNH@startfntext{%
+  \setbox\z@\vbox\bgroup
+    \FNH@startnote
+    \FNH@prefntext
+    \rule\z@\footnotesep\ignorespaces
+}%
+\def\FNH@endfntext {%
+    \@finalstrut\strutbox
+    \FNH@postfntext
+    \FNH@endnote
+    \egroup
+  \begingroup
+    \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo
+    \FNH@endfntext@fntext {\unvbox\z@}%
+  \endgroup
+}%
+\let\FNH@prefntext\@empty
+\let\FNH@postfntext\@empty
+\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}%
+\def\FNH@safeif#1{%
+   \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo
+   \else\csname fi\endcsname\expandafter\@secondoftwo
+   \fi
+}%
+\def\FNH@check{%
+   \ifx\@makefntextFB\@undefined\expandafter\FNH@check@
+                           \else\expandafter\FNH@frenchb@
+   \fi
+}%
+\def\FNH@frenchb@{%
+   \def\FNH@prefntext{%
+     \localleftbox{}%
+     \let\FBeverypar@save\FBeverypar@quote
+     \let\FBeverypar@quote\relax
+     \FNH@safeif{FB@koma}%
+       {\FNH@safeif{FBFrenchFootnotes}%
+          {\ifx\footnote\thanks
+             \let\@@makefnmark\@@makefnmarkTH
+             \@makefntextTH{} % space as in french.ldf
+           \else
+             \let\@@makefnmark\@@makefnmarkFB
+             \@makefntextFB{} % space as in french.ldf
+             \fi
+          }{\let\@@makefnmark\@@makefnmarkORI
+             \@makefntextORI{}% no space as in french.ldf
+          }%
+       }%
+       {\FNH@safeif{FBFrenchFootnotes}%
+          {\@makefntextFB{}}%
+          {\@makefntextORI{}}%
+       }%
+   }%
+   \def\FNH@postfntext{%
+     \let\FBeverypar@quote\FBeverypar@save
+     \localleftbox{\FBeveryline@quote}%
+   }%
+}%
+\def\FNH@check@{%
+    \expandafter\FNH@check@a\@makefntext{1.2!3?4,}%
+                \FNH@@@1.2!3?4,\FNH@@@\relax
+}%
+\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{%
+    \ifx\relax#3\expandafter\FNH@checkagain@
+    \else
+      \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}%
+      \expandafter\FNH@check@b
+    \fi
+}%
+\def\FNH@checkagain@{%
+    \expandafter\FNH@checkagain@a
+    \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@
+}%
+\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}%
+\expandafter\def\FNH@temp#2#3\FNH@@@{%
+    \ifx\relax#2%
+      \def\FNH@prefntext{\@makefntext{}}%
+    \else\FNH@bad@makefntext@alert
+    \fi
+}%
+\def\FNH@check@b #1\relax{%
+    \expandafter\expandafter\expandafter\FNH@check@c
+    \expandafter\meaning\expandafter\FNH@prefntext
+    \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax
+}%
+\def\FNH@check@c #11.2!3?4,#2#3\relax{%
+    \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi
+}%
+% slight reformulation for Sphinx
+\def\FNH@bad@makefntext@alert{%
+  \PackageWarningNoLine{sphinxpackagefootnote}%
+    {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J
+  some package modifying macro \string\@makefntext.^^J
+  You can try to report this incompatibility at^^J
+  https://github.com/sphinx-doc/sphinx with this info:}%
+    \typeout{\meaning\@makefntext}%
+    \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty
+}%
+% this macro from original footnote.sty is not used anymore by Sphinx
+% but for simplicity sake let's just keep it as is
+\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%]
+\def\FNH@msne@i #1{%
+  \expandafter\let\csname FNH$#1\expandafter\endcsname %$
+                  \csname #1\endcsname
+  \expandafter\let\csname endFNH$#1\expandafter\endcsname %$
+                  \csname end#1\endcsname
+  \FNH@msne@ii[#1]{FNH$#1}%$
+}%
+\def\FNH@msne@ii[#1]#2{%
+  \expandafter\edef\csname#1\endcsname{%
+    \noexpand\savenotes
+    \expandafter\noexpand\csname#2\endcsname
+  }%
+  \expandafter\edef\csname end#1\endcsname{%
+    \expandafter\noexpand\csname end#2\endcsname
+    \noexpand\expandafter
+    \noexpand\spewnotes
+    \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi
+  }%
+}%
+%
+% some extras for Sphinx :
+% \sphinxfootnotemark: usable in section titles and silently removed from TOCs.
+\def\sphinxfootnotemark [#1]%
+   {\ifx\thepage\relax\else\sphinxfootref{#1}\fi}%
+% \sphinxfootref:
+% - \spx@opt@BeforeFootnote is from BeforeFootnote sphinxsetup option
+% - \ref:
+%     the latex.py writer inserts a \phantomsection\label{<scope>.<num>}
+%     whenever
+%     - the footnote was explicitly numbered in sources,
+%     - or it was in restrained context and is rendered using footnotetext
+%
+%     These are the two types of footnotes that \sphinxfootnotemark must
+%     handle. But for explicitly numbered footnotes the same number
+%     can be found in document. So a secondary part in  <scope> is updated
+%     at each novel such footnote to know what is the target from then on
+%     for \sphinxfootnotemark and already encountered [1], or [2],...
+%
+% LaTeX package varioref is not supported by hyperref (from its doc: "There
+% are too many problems with varioref. Nobody has time to sort them out.
+% Therefore this package is now unsupported.") So we will simply use our own
+% macros to access the page number of footnote text and decide whether to print
+% it. \pagename is internationalized by latex-babel.
+\def\spx@thefnmark#1#2{%
+  % #1=label for reference, #2=page where footnote was printed
+  \ifx\spx@tempa\spx@tempb
+     % same page
+     #1%
+  \else
+    \sphinxthefootnotemark{#1}{#2}%
+  \fi
+}%
+\def\sphinxfootref@get #1#2#3#4#5\relax{%
+    \def\sphinxfootref@label{#1}%
+    \def\sphinxfootref@page {#2}%
+    \def\sphinxfootref@Href {#4}%
+}%
+\protected\def\sphinxfootref#1{% #1 always explicit number in Sphinx usage
+  \spx@opt@BeforeFootnote
+  \ltx@ifundefined{r@\thesphinxscope.#1}%
+    {\gdef\@thefnmark{?}\H@@footnotemark}%
+    {\expandafter\expandafter\expandafter\sphinxfootref@get
+                 \csname r@\thesphinxscope.#1\endcsname\relax
+     \edef\spx@tempa{\thepage}\edef\spx@tempb{\sphinxfootref@page}%
+     \protected@xdef\@thefnmark{\spx@thefnmark{\sphinxfootref@label}{\sphinxfootref@page}}%
+     \let\spx@@makefnmark\@makefnmark
+     \def\@makefnmark{%
+       \hyper@linkstart{link}{\sphinxfootref@Href}%
+       \spx@@makefnmark
+       \hyper@linkend
+     }%
+     \H@@footnotemark
+     \let\@makefnmark\spx@@makefnmark
+    }%
+}%
+\AtBeginDocument{%
+   % let hyperref less complain
+   \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}%
+   % to obtain hyperlinked footnotes in longtable environment we must replace
+   % hyperref's patch of longtable's patch of \@footnotetext by our own
+   \let\LT@p@ftntext\FNH@hyper@fntext
+   % this *requires* longtable to be used always wrapped in savenotes environment
+}%
+\endinput
+%%
+%% End of file `sphinxpackagefootnote.sty'.
diff --git a/sphinx/build/latex/thonny_first_interface.jpg b/sphinx/build/latex/thonny_first_interface.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1456c9172429ec3676a9485707b557df4315b26f
Binary files /dev/null and b/sphinx/build/latex/thonny_first_interface.jpg differ
diff --git a/sphinx/build/latex/thonny_interpreter.jpg b/sphinx/build/latex/thonny_interpreter.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5f26cae69409d11217ad8fcb1b963e35983e2e2c
Binary files /dev/null and b/sphinx/build/latex/thonny_interpreter.jpg differ
diff --git a/sphinx/build/latex/thonny_interpreter_folder.jpg b/sphinx/build/latex/thonny_interpreter_folder.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..bf330b00f2fef20510550cbb71390b39c81ad516
Binary files /dev/null and b/sphinx/build/latex/thonny_interpreter_folder.jpg differ
diff --git a/sphinx/build/latex/thonny_option.jpg b/sphinx/build/latex/thonny_option.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..086f1f77e675b97dabcc02d1607bd478837ceb0f
Binary files /dev/null and b/sphinx/build/latex/thonny_option.jpg differ
diff --git a/sphinx/source/Under-Construction.png b/sphinx/source/Under-Construction.png
new file mode 100644
index 0000000000000000000000000000000000000000..52b5e449c814895d1cf90a37e92152e96cf3548a
Binary files /dev/null and b/sphinx/source/Under-Construction.png differ
diff --git a/sphinx/source/V1_01.rst b/sphinx/source/V1_01.rst
index 877b4bd6f13852db79f164e4cba063fe43c59165..d40b2a5e04e40cb7b9b234b654c0c4ba90c67eeb 100644
--- a/sphinx/source/V1_01.rst
+++ b/sphinx/source/V1_01.rst
@@ -521,7 +521,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/source/V1_02.rst b/sphinx/source/V1_02.rst
index 8bc01da4892f617a14194c87ecf17301d9b720c8..8de1fa10f904aff510a9a3217225d6589169367b 100644
--- a/sphinx/source/V1_02.rst
+++ b/sphinx/source/V1_02.rst
@@ -533,7 +533,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list - 1_02.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/source/V2_00.rst b/sphinx/source/V2_00.rst
index 504003422002a50608a2a0e67b81a7c3497b2db9..5cffe76fe42144dafa816bb388dd2314b5826890 100644
--- a/sphinx/source/V2_00.rst
+++ b/sphinx/source/V2_00.rst
@@ -2,60 +2,95 @@
 OhmPi V 2.00 (64 or 128 électrodes)
 ***************************************** 
 
+.. figure:: Under-Construction.png
+	   :width: 500px
+	   :align: center
+	   :height: 250px
+	   :alt: Ohmpi 2
+	   :figclass: align-center
 
-
-
+.. figure:: image_ohmpi_2.jpg
+	   :width: 800px
+	   :align: center
+	   :height: 600px
+	   :alt: Ohmpi 2
+	   :figclass: align-center
 
 .. note::
+	 In this version, we have developed two new board types that allow the assembly of Ohmpi v2.00, a measurement board and a multiplexer board.
+	 This new version is made up of: 
+	 
+	 1. A measurement board for four-point measurement
 	 
-	 In this version, we have improved the electronic measurement board. To upgrade from version 1.01 to 1.02, 
-	 you just have to replace the measurement board by the new one proposed here.
+	 2. 4 multiplexer cards
+	 
+	 3. A box 
 
 The philosophy of Ohmpi 
 **************************
-The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available 
-electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection, 
-but suitable for small laboratory experiments and small field time monitoring
-
+The philosophy of Ohmpi V2.00 is to offer a new DIY multielectrode resistivity meter. It is a resistivity meter with 64 electrodes , which can be upgraded to 128 electrodes. 
+It is limited to low-current injection,but suitable for small laboratory experiments and small field time-lapse monitoring.
+Ohmpi, is developed by a team that seeks to share all its experience and wishes to improve and offer a more and more robust tool to the community.Ohmpi V2.00 is a completely different version from the previous one. 
+We will stop the development on the previous version, to dedicate our efforts on this new version. 
 
 Technical data
 ***************
-+-------------------------------+--------------------+-----------+
-| **Parameter**                 | **Specifications** | Units     |
-+-------------------------------+--------------------+-----------+
-|Electrodes                     |32                  |           |
-+-------------------------------+--------------------+-----------+
-|Operating temperature          |0 to 50             |°c         |
-+-------------------------------+--------------------+-----------+
-|Power consumption of CPU and   |18.5                |W          |             
-|control system                 |                    |           |
-+-------------------------------+--------------------+-----------+
-|Voltage injection              |9                   |V          |
-+-------------------------------+--------------------+-----------+
-|Battery                        |12                  |V          |
-+-------------------------------+--------------------+-----------+
-|Current                        |0 to 50             |mA         |
-+-------------------------------+--------------------+-----------+
-|Min pulse duration             |150                 |mS         |
-+-------------------------------+--------------------+-----------+
-|Input impedance                |36                  |Mohm       |
-+-------------------------------+--------------------+-----------+
-|Data storage                   |micro SD card       |           |
-+-------------------------------+--------------------+-----------+
-|Resolution                     |O.O1                |ohm        |
-+-------------------------------+--------------------+-----------+
-
-Raspberry Pi  configuration
-****************************************** 
+
++-------------------------------+--------------------+-----------+--------------------+-----------+
+| **Parameter**                 | **Specifications** | Units     | **Specifications** | Units     |
+|                               |       **V1**       |           |       **V2**       |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Electrodes                     |32                  |           |64 to 128           |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Operating temperature          |-0 to 50            |°c         |-25 to 50           |°c         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Power consumption of CPU and   |18.5                |W          |18.5                |W          |              
+|control system                 |                    |           |                    |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Voltage injection              |12                  |V          |12                  |V          |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Battery                        |9                   |V          |12                  |V          |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Current                        |0 to 40             |mA         |0 to 40             |mA         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Min pulse duration             |150                 |mS         |150                 |mS         |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Input impedance                |80                  |Mohm       |80                  |Mohm       |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Data storage                   |micro SD card       |           |micro SD card       |           |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+|Resolution                     |O.O1                |ohm        |O.O1                |ohm        |
++-------------------------------+--------------------+-----------+--------------------+-----------+
+
+**STEP n°1** : Raspberry Pi  configuration
+*******************************************
+
+
 OS installation  
 ================
 
++----------------------------------------------------+---------------+
+| **Required components**                            | **Quantity**  | 
++----------------------------------------------------+---------------+
+|Raspberry Pi 4 Model B                              |              1|
++----------------------------------------------------+---------------+
+|Micro SD 32 Go                                      |              1|
++----------------------------------------------------+---------------+
+|HDMI Cable                                          |              1|
++----------------------------------------------------+---------------+
+|Computer mouse                                      |              1|
++----------------------------------------------------+---------------+
+|Computer Keyboard                                   |              1|
++----------------------------------------------------+---------------+
+
 The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). 
 For this step, the installation instructions are well described on the Raspberry website 
 
 1. Watch the vidéo "how to set up your raspberry Pi" (https://www.youtube.com/watch?v=wjWZhV1v3Pk)
 
-2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer). 
+2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
+
+3. or you can visit this website : (https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)  
 
 .. note:: 
 	 All the development tests were performed on Raspberry Pi 3 Model B, we used the following version of Raspbian:
@@ -72,9 +107,6 @@ For this step, the installation instructions are well described on the Raspberry
 .. warning::
 	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
 
-
-
-
 3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly. 
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
 
@@ -102,10 +134,12 @@ To ensure that the GPIOs are in Low position, you will need to modify the /boot/
 8. Close the terminal
 
 
-
 Virtual Environnement and packages
 ==================================
 
+A virtual environment is a way to have multiple, parallel instances of the Python interpreter, each with different package sets and different configurations. 
+Each virtual environment contains a discrete copy of the Python interpreter, including copies of its support utilities. It also protects your system in case of problems with the packages.
+
 All dependencies are specified in requirements.txt
 
 .. note:: 
@@ -535,7 +569,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\sphinx\source\list - 1_02.csv
+   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master\sphinx\source\list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/source/image_ohmpi_2.jpg b/sphinx/source/image_ohmpi_2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d496aff74e226f6b0c683b983230273f7dd078ec
Binary files /dev/null and b/sphinx/source/image_ohmpi_2.jpg differ
diff --git a/sphinx/source/output.pdf b/sphinx/source/output.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7f741b574d83f318192db39ec62ae7b2e5e9839f
--- /dev/null
+++ b/sphinx/source/output.pdf
@@ -0,0 +1,384 @@
+%PDF-1.4
+%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
+1 0 obj
+<<
+/F1 2 0 R /F2 3 0 R /F3 10 0 R /F4 11 0 R
+>>
+endobj
+2 0 obj
+<<
+/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
+>>
+endobj
+3 0 obj
+<<
+/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
+>>
+endobj
+4 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 366 /Length 14835 /Subtype /Image 
+  /Type /XObject /Width 521
+>>
+stream
+s4IA1!/<peBk@>F9hbU;!!!!)!!iT*!!E9%!!*'"!XSl.!!E9%!!*'"!H%o>!!<3$!!*'*!!!$<!!N?&!!*'"!,_fV!!N?&!!*'"!-SAk!!<3$!!*'$!!!'5!!<3$!!3-%!!338!!<3$!!*'#zz!+5d,!!*'"!+5d,!!3,S!(-_k"U,)6":#,7"pbG=#RV.O$4."G'b:ia&Ju6$)&O)*(E4DC+WDFJ*>]P:/g;Si.4Zr")B^[h0.J_).P!"KgAjSA#7(SB#mq@S$PY'1(`Y"T.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnt.Olnts1eUH#Q\fE#m12P!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!;]0B.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!MWX?`c7pX$`)%U=6V?<'5++W-b+HZl%D9q"RYhkeVDMpmbs;Q?SQ^"-jHlo)Kc64?#e0#WW[j<ti[0\K19=Q?"XF=Tf+%.'_#AH[cbt_VN#PD/M-iB%8ta5SDZ3Y[nb?\hdF,>u;q_ZHW3-[1(2*S4J+@7P!3i6t(2*S4J+@7P!3iF$d_^Jui;Weue,(d7r1AlH!&M9^\EH+%C!@!SRldS1r[!V@W;K4)r2OH0,&$EhX$q:N@KCY3E5(KD:ZYb2FrC7cB(Gjtq[DcRX>p,jTLg?%l3[n1!GJ#oi^gl]Ra\^pXD]@=g0WOZi,1%ZWl,EQ"7KI6[42#/:Zc`DKii_BCZJWmMCVU:U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5C?!U5GqKC:60&,$dOs+B/#%*4'bN#:HJ7;^j,qak7CGb"n<Qm'fs%%:`/]e=6?VTcaQl>:r3$aAL(BcrU=Nq"jj]Hoba8NY@PiXGf.[H7oDCj:TtR8L/RlBdIA8E`nfj9,#g=?7mH]KQNrlkKrrWq)%38B5]*,hJ+,F&1Lm;`JG^H99Y;SoCB(k4iMJD^+@j=Utk_8_uV/^"6G**gi@laehn3&<Q=#Jr)3F!4j#`(4WfDCI\W^$jcQ@(RGGtsAiVD<;GB',.u`j&.&)5!.&)5!.&)5!.&)5Ffk[%JSZl8S:Du`oZ1#gDp%_B(r@=PirZZ)8l5'BU/&22]Jb%TdpE1'sNW?4KMWgsqY=mf;7l=Nt$Juh%rk"c0VYJJ,e9;G1I?iDK/_1R[N^:rPoZh\D<qU]#C?^0meT?LEZat'#&:BlMjQi<9H=nTb`Hq/4LUC^b?fZI^nl5:W09cD91YCoo@mok4SZ##?hn%LsA*2[eCjF;F[nc_aNbbPrG*QfbUWlNgn1.>77U3>9Jr1tY9L=UbTE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!!TE:!$cb*E@2jQg@U/&fK+5U8BfIf[*,IbF;Vd=17-5^uK:];@!_dR:hB?:\!Z*E:Q)VaL\XgIJ^2lca[0KUN">`ju:fE[FXdg+/O0<V\jK0ASi4K%tEk6!`[oGjG-'jcdn4AIZ7-<HMhO0HLZWF9:Mn(]=cMW6cbMC>,!MC>,!MC>,!MC>,!MC>,!MC>,!MC>,!MC>,!\k`k3b4eD:K&j>iSj4dDQ]48NaE."3n],J.\[j:p<Mr;kcus#$B[a()8rDj+rBF/deLa57KZc2?Q.uBW,I%K9pski'N>l-9d&rgQ(0ii:`o*)29TO+!nMTU#(;"@c=:+ATfbX]l8bo,Ge9W29!*k*J=?Lsc/!]?PlXT!1fmN;8RQAL(q3lD&7=%Ik'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!'N&+jNP&$_Ch$8iV,;@XrTgHYTjHCD-h@H*%:`_O-rY2T^)hst'br]GB)']kO"?K/3cd&GKVcW#$^&7kmHT&s3q3n]?PeO%3qIE\pDA9?0_Ej<rr<NC;+4l7"Vag!"Vag!"VlMYd;QFnK+3K<p>^M)_Or7o-i+<t4BH[%Hp+^CO*7PjGps`-P)-e4A!>2`j0))A_r.S)21j;hf]'hZW+#=ff<X3'LuWbk=Q2eoEYVSD9,#YQ>5$ecf5@?:(7cq*EJ[5Fr_,WUCY#Vi/aVLPg0;Mt'=b,7'GKe`oVlWXVisLI?;'_cRGu`Ak5PF:&&7s2QeQmPeu+J6U>FOTNKVJJIK!&3/H5\\FdSk8NNHi%dQ$;2O8\\NrG0mGY)hq>26F(=F8l5V@W-ZYj2g<NB"o=%mAI2r#pEkL5C`tdkUS:N_X>TcgF['IhjqJtATqXe1\IqjU9U:a:&GW>f3e),L3HW^IOY,-rb$l2?EpGR-UkdZ_VM>!O@re9gu)Z]Gu=>Diq:%hl8hUWE=#j]<#_8o(hF[tQ2FEOn1nui?$s5s(!UNt,M0iqG^AhEp3pX572/gnH9jt6:]X!!:]XX>NDb0H;i:/%Rj``-#9I@;Ps8X)YA0n&<+P#8..2qV@lV!?B[:PE2*5)M_(P)HFD\i!mih+pG!G/d>H]:@YD=8eeGalnf&3RR#lCAZ0ZQ:dn_`m^et\?RNF[m2dD0=)3=HEb%=O6E(9o^ar[#,F3:%U$e?\jU_l0;emPk9*.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gX!.%gnceu]F?V+Z.phmWV2$itN7!70j#"P8Z>>u,lk--b5)/CGNE[t"#6>o/ND\(!:%Z\h6L/YUk,4>_]Z2DNtSpZP06>ePNNAW$33GpDh!o012F_KuVpnm:t'+JO`Db<97-MC8J!MC8J-YJVCiT2Lh6]hKCq&d,/s%6'sQ"5gW.3oj#nY7!k!rrC!\;-hc:pkfhn,U9km;:?Q,3U)1[p$Ur;Ei>7,]6%?W:BN>qSMo]ZhlH/.7;HZBNN@<SOfVC!0W;\"c`Ki/(%c2cXH/`c[rrH_754r[;*Y:!;*Y:!;*Z,1M#8!+Wp[FH[Td(EmW-84P<EpjE-pXUH-]`V2S-;f`p-34\CrC,3+QpakLR>hYl%/QW&=HWY1Tp&+1dp^J(\aYjk&!()]b87Wc]a@9Cr/`JpV_Nc;^71=l)==J&"1,MNW30[^_J,f5.]P7pP3[*"g.[?S9f&bke]q=$]7h:b\W$-igG;n.1<`nc&T"?+VqUK%BA63Dkj$f8cW0)<_6Lm9$X+RnpeRmb$N$>VbkhI?$B1LY13Z(D-*/<7]lR%SU1M31<SQI\*II;,oHT69SCB\%RH'Ak\Khl0(W'S.J/<Wni*)A>GHUbkP=0`_J;F"Vag585Vei!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!)Z0!!*3`gFZ%T(/"<[<-.l*8@$9],^cc\hkRD7XSpX#WI*;D(4uW4F6R74i,BIr0Fs%4l)tW+0f(Ke(-,2gV"%1i&,6t[Dii&T/pnR8/MC>,!MC>,![_+2c2S#liDD>u<,b0s87Xjbq6@QU'HWD_F(P[$mls0r;B,I&OGrPW`[o,1&*-K8Jf;"\kI^)u2fl-j[S!da"Y=IFDT&8[F7iFf7`tBjG!33%Q'FoX#FVIp0*u#Dd70"$!70"$!70"$!70"$!70"$!70%?L3Ul$7ffl<J)N1Nul&Kbt0KD>XIk6V)($='8($"-tdQb!Zfr^?F(B*;YmN11Ui8et2)=LokRpf9"XWG*H:Qse.PG'A4hOTU_.&+@!kQ6ViTE:!!TFU#@cDIQucC6?Ebf$`b^]]Z:gmi4@oM](I?6c?(^7D7XhFG)CA.Cr7h8;@XIE"e;?J-<T/8HM)Y)WT7.EGnC&8UQORb[O@2nXVeI$Sb>g"'.=deqJW.&+D-`<n#fJ-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-m^!J-tg`EqfH$?+d`]H&3fEbAFc3%Mt3#5d+AC07U=8/'FV6QLVn@[bI<4iHYA&G`)$+q<[7A_b]Ip?`E[C,qk:Ro`"nUcmYWGq=EhPMC>,!MC>,-PJGmSe3$-^b,f'Z*cX/!/YA8<FQ]9EVS,m<:PZ@[gH]P[(Ob(lJdM=Tnpj5*]>$Dllg-C\50FG.=0MFK#K>hj]riZaMbisB6Ad1p7.UJ;.%gX!.%gX!.%gX!.%gX!.%gX!.%gXPD]`\QH_E%@8\/+bhJo(P4>m3>!.^Ye!,JR4kCPdbGp&Z%74K!oc8#[A**+r].b(:hof'e=FDAgik]gAJ,k+BBE?l4#fj\u^\]tI?,DqMq&Z2+epZ\QXJr1tL@7:l,!FE%hSNu*-?3')FgCjZ%!7!T0A,VRcn?44Bj5IE./h_%.\_N)u%/ck*%JZL;q0Q2@Q.4m5-/V)4c)GdCS*d3='N%;IEUf_k'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mo#lj6Nln_QP$*he89"c>g;uG('AX58s+8oIl&&0"+dr^b3_SGmWr)!"]#:rfuZSnl`')Yq:,lr;QaqluIo&iD]1%q0ml`'N^TH_*o&7!C[`=9t!^>>12,&_'Y]t@_G#X!QX@u.ESBBPa#*_p,snOq`dWYZloN='!(h<jXlO\r[0)`X)q3GI2JoZ(!umL;K@tbl4d)a;'A@B:]X!!:]X!!:]X!!:]X!!:]X!!:]X!!:^<-Xb1'U>Y4*]R)G!8sSG_,l/4P-Ch>F;`]0D,fcFUESaXaYf$t+;%Yp]PO6Q`FMQ16iTEagC<5L39rn2'd*BM6P>cmYWGj?!F#.%gXQ0*9HF?7iWWgC#bt36+n'[QcVkQ#j?_6N7%JMbX3OYIM@>0jEVtiEA#.7MqMld@=QCcY9,2/+/JE_MTb7!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!%M.Q3r51bdYPuXK*I"+h5NWj`!,[5Z9&T$qZS2'`r4aM*Y#kVc&"i"$MC>YjoR_rKTE;P!/T(3r'l!4,fsXa)EM'a"A+A<2aK=n6rrC.!A,cOG5P//\pgfq?-f'5a4sd_cRpDZIHIW^,?Z^Yq;+20!;+20!;+20!;+20!;+20!;+20!;+20!;+20"_Yd&db^+)V(o!E4[Q"EW^sCqg,?t\(?c6mY(L[7CYI4B1clTjJ^-a`:Ytau%jF*Uu/)_\a?h4UQU:et)$7MX!$7MX!4lV>IYL$(j!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!%M.Q3r51bdYPuXK*I"+h5NWj`!,[5Z9&T$qZS2'`r4aM*Y#kVc&"i"$MC>YjoR_rKTE;U8'E8%WKoc2>rrCG`=>deMTD9HXJ*j05Me_Imrr=)]X7J?VJ*utm+67au'N&4XHjES<'ED!!'ED!!'ED!!'ED!!'ED!!'ED!!'ED!!'EQ='7fNINFq=HH?i:#kbq%3@,Yo?B[]gPGleHDYa&&d%5PXaGlcq$AZWI.Sr=S``8q0iIX=0g#o$:DdU5Aq!U9/.<aa'pj>=r!Ce"ge]W!.]2r9;0\1m'PVMJ\s@72/he#NnBA'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mo#`nIdd1%E->H_(J`TJXrQO%%g9c+,tQ2HP_QV^=V=L69Y3(`+7.LpC?P=4)nRg?S.bae^V4+lZ-^s%cc5r'N&0sm0+2$5QtNA^Z8kQJ*ZMUr<u[5.\eV!.<[%Xk)5:AhC,>\Si`EdkCL*2.L/G_1'kr`e<TdMVQQ!*g1f5o'N%Oi72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q'"7\!3124"J;X,N:\`<k%#9SNpNGu;THpG56r))RK?u=gmgHEk7a5FhFHMG.#\a_J*es[\#Qc#!p"m,RF'N%;=*T9F$:]Xca'"1H:("c#"?ku*PgZj<nrDZfTFh\FQ]`!"XVN5b%7!?$*D0FiWhrWbpEEtOpF5e>b1RAtDB8<"iRH\fj7=E#A5t)Ja!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!!C[]!"([B;NMDaRdD8ja)%7$P7<j7:Ze=3]D(/BPaO.8!KS+o<b.Ys1_r:lm-+A\ZfM5ng5ZIRp!D)PK3VW6N(HA898Q8t[;r,Q2En-F6eUC"?72/hI+&iqO70"$!70%Z.KJ,ODiEJ2d$cJW0"@%*E^sBaA&*$ko_#-.@#a4dS@`/g*6%OU7>FrLhIj87lIBEp\[DU!k0=^d^I4o/gP^\+,;+25PE<R%R5Qqj!5Qqj!5Qqj!5Qqj!5Qqj!5Qqj&G/'sr00m1^6G_)4+]&Xcr2O^\l:"D-Tbf)^/eE)eMVXk&iX;N.i[a9;M^W;l,H`_"*%ittJ2s^r.'J5mSE/c-T:j%N&Q)g8MC>GT.&)S!/(4D;fm+JM[nRpq\WlJug"_M$j1!:Jr8PBC38RdR30BceKiM!5`:O%2[ct4lVeMIjEU=qe_@ioYEQ9YlF-HCNZ]nAMWp4b7RGm<d\S/!YX8Ee+M_n:"I6mFT72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!>j%,hZ`&+kjbZs[BRJ`W105POam$i0qaGUK<`Q-![,!`b25=2OC+>A0GWceFib]q;(L<K_"sIpA6iQ'3e=I.?4`R(dO^APq&uRYpDNDQ1;DfSp*LK\m'a9:*;*Yri9hY@.>IM3q\RL&Y@jJ#jCiVPP3;9UhN^T0jOsX7#!L8o10Kf\!iAKnL#1`_RZudI0+jAM>N:GF_JFplI8,NT>Xa@TIHV)V5F^NbnZ1Ie:+.=[bl(dnM^GD^\MC[p%QjP79J-m^!J-m^!J-m^!J-m^!J-m^!J-t97,AM%VgM*oV4Ntu(N.O=RI>H2/O&ZqL8KpSB8Ll87!mJl-'Fpq-nVqHbrn#`hDaNho?fW'?$3h;/So=m^lcICeq`6itH%&8gPYh(=q;0Nsq@k?PMYTX*_MTb7!fAD!%\pgc=h`M,e#JdO`q-\BQ8o::REtafl4oNASKn"J6AF15-?%a8rqYs2NWo_/ELuj*?Y=r-q[*Z`GH3nL0Z8BK]9:i\Jr1tZj+&PPM?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?(K_DLqbsV1.BEH#K"$/V%o%b'S.6jp*#@]U$7j]_f`U)DK8cZY?nkE^%kl!8>HqE:q?=h^:PLNsde]F"_G8Wo*a#TZV83&(jV?p@[hErjOkE.&+FlqJ`0d-igA6&*jjAHG"Gnb\-")G3#qA1'bQ3*ok\T.&qs^#q8Ad7,]&HE0e`BB]M`p=X%F!E#DeR6Nb\f:9QnO+,Kj'>or[d@Q??lGWUc-c[=f9T)<Yk#G>/Q@BgE_;cAb'eG*9L)H^aW')?gGU5CIsjU*E1J-m^!J-m^!J-m^!J-m^))V2##Mks'n38_1G,7FTr4TNgkoE<[d8eH*0aJ_R,P)OTt3TJEs$Yr\:g,bY!+29;G0s:]i5J@!,E\#FMCTFH'Y,&V?OenL6Q?M`rI4?01XB$NIMQUl8Sql-0nBo-O:g<Vc$7MXZ:9^IM-igEj^cE+b?8ed%1DQtXM+@b*j/N%YG9HiTkDI+&Zn&8)r'>-W`jdeJ8';bKVpKYaA<1-+[=ZEL4)7C<-t=)n?Jjqs]puD7l;--YBYPA`!!)OF>[jN?@gDHcr0R<o=t$,ZT_U:9MC8J!MC8J!MC8J.,l"G1e,C)KMQO7(pd]h@r;.ePo=j&AmG.-!G56"Rbi_.Tf'DChg9:KJSt#`[?s(29I.RHfJ&>Ok!7[54!0qL%dms<nci$F"q,[Lqm5<ss%_`ZnT+c^]J$<gtqg[u$/'[s-Ngm]+ptN1qqhI2PC@2$$iKZNDrr>>l&,uXf7/m8bAq2r05PDLiQMr_kHm<WJBQN</D1&Z\]Gt>t&0>dSnA+4YLU-FL!::ltrr??9q`VpKk)AZjOe#)EW?G_@ha6V$EK]EKc?%SY5Q:]lWT/L)$M],N!!4PJ!95ru^*iDgLjU(h[[nkpDD_/rrEDep7kOchA;c_#DHuQV"Q84b#O"Sknk\WFnQPh-rZnf=I]GDuU2!VP<o.HJes!l)$%RJ+EWKKs[d9'EGLk7Ec29ltGPiST"OoP(p+NoRMou&"8+V,1qrLrZp=@5BkFq-H,Q@`QF8l5<:]=A/qb;B4m0EXk,U^Mpp?hk[V(l&iZiU"n72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!72/Q!9p.?!2NCa<7g3$tA2$/4'^@(KbPYN%2pnE[Ft1gGkE492:LieUIfmt&jm1`uN?sRZPnh]_<`U(H%o>]?[u%a42Oil9l(>Yp?^[\20+dUF;<uicTf)F$r40Z@8h3Z;\,6?nEr=$Y8sO%m8)O:Pa\bJAiZ@Sd72,`'V>)RZhqD-2!+=;(h0U7?[ViCD*kg3IT5Jr8f:#X5OlDL6M4#@iAS!hN7m[Z-@<"'?<9@D-7j]ks$roJ_Dpb0D7<#sXn]H,sf^!G0neEd<69j3hVXJt[&ppYTr&u<r+rnsZn.1Jr@B*c!b;K;""=U"%kW+6P.%gX!.%gX!.kb/t"dXjWcZ&1@j"];h%I]hIkVt^%HLXim`gg;0m#-QX<0E1TgFVW9SZ\)_pNNgL2;eN0SG#c@TC^LDQX/3\[HmEIakI`p70l+/A,;frhs#Y#G?qf3YKZ_gCho.I+T/L*l?uHXV?"iDQ,dC++nA"Zr6MOho(@`Bo@?_,$7MX]ZdoI3U4<T[VJ2B#^%to8-KuJ4:Ye=mM<mIQ>.L>OEr011I@W9#X+c^[ql/J(h"qUZS7a_ERU2+fUY;db0WGN]c[if(G@TO0qIb]Xn6(//&"6ZloCP/HG%1q9jc6YE]mn+a6d_RR[)KD]AojO68DhG*%%MM)3;38c7Z&_^+UGq70j5g^k;c:4;Klq*U5G[3MC>,!MC>,!MC>,!^.J:'rrD,Zl+coqMuNcIcX0mXaZm1?r09E(rkPdgkkXEEV#?Fjk&12![kI]`?V+>D^Tofrc/86VrrBImkpcZ`NVKj=Lcei0[p-)&ek;KgX^:;;@>m=_Htldc$knpO@E0["JEpL+'ES$??_O&)eS!LH(SY[=M&KW6)LN?!X?_G>Gh%UH8N=iP,hM4MIK'<:j8MV_Kg4o3BE%t+&qE!Gg(40R:PaMfg]%7G@]tW(mB>4Sr^]h@J*l"j!(p_(M.d"`Nf#6X!fAD!!fAD!!fAD!!fAD!!fAD!!fAD!!fAJ9V/l9U:#4#Z9>^kQTt1jNOe9d\RYn]s;j0cgBWj8m!/6E5rrCBYQi6FR!;oh=n?KBNq=h2p!59QT!/ds9qc=6_rPtu;Oc&M>o?uj+2#dQ0NN<'Zcb5\DnG`Ld<F([F>DUd%V5lcaij7PVhZIT5k%Vjm_S+d>9UTHO[BslD7t!gFn9dl_VGVE34E5ia7kf*.JHJ-->Q4\WNMM'M^$kphTDV])*5`.1Us,[%@\W5Jq%@q)_"P@@dTtNtp04HVL,0d?GpB75j!9(ARe*XK::nsBNOA[9%%mg@+QOU%NXt)TQYkd-$@'`e4LW0JCmH8:p\AhY\"5#;Y+]`@]t$_o5Jm-b*#rH5jl#]T*7pa<_r0kXo]DnH:J2(P`o6m=Ph`%to_G(]7<Q2fL3/KJD%g*YmXEJ>b'TX/BBT=[M6:$,>2EkK6A:c*N^\*ge<"I`X[7,8UjM`R&?N&Wa$rQf'NQR>>?Vi#DtGpq)gV/4!sFR+JXi:Gh)q<IGm:NeX/Aj;jin$BB2Y6La-LK(p!"#dRWc3a$uF9r&X*?gn,YUH6f68[:+L@t*kgRIX"MCf',`7$<KE<eY].J%/e:I%^aPq7oa`;t$d7jA52=J23^F>V-TK5fE'6u%J^$tq+2lM$L4@rbrK=^r<LjIPW0Q^l@43ZqGg^K]rr=R/f01>n<eE_.6_F/LO:K5-eNUWdI8:mLM4T!qAneDZH)5GlnhF`>\seY:q"jcS\;,Bkr/\5&iFu`\C2<aaMC>WKUaVtFoSj;;*(b:PfiUW-/Bb^!kaBaoh]6_n<sVEo\RJ!"Of'77Ch6*Ub9Ft>1V8aKW\R\JJ-t[k5N!?K;Wh<@*,G^/\steDU[cAFLHP8SYNX]4K<uq7ATl'o)d6r"OLkqa+*RhV"/*nP:ZJP]-s>TAH.[5!3*7p8!5<t*Xa=/d-5I[$C5K[V<rW/OG^-<%/uQ6HS<E>RJ+s6?&4::A_eg#R')g=>6E'A"<0bRT_T("gkMGt4peUl=TXso^BUaIk@6D*Gmkr%.oYrh&oWMKbfN>>:*\tq/Edn0Q8h5Po!/6j@!)T<cRK!9R.]!(E&iCGmNO>=YEIS>;\_)?RN;chIZTK^@9)el<BcO/hhQaQ7*fia8Vu/)_?iGK?^[HsX!90sW!/6E5rrCBYQi6FR!;ohmp9#@HqhtHp`HGU6l#]uai;Wchh=uWiT59N%nht@UP`5%dSE-;7l"e"m=Or)'%@QD1UH0,13UVKV.'600MC>,!^.J:'rrD,Zl+coqMuNcIcX0mXaZm1?r09E(rkPdgkkXEEV#?Fjk&12![kI]`?V+>;^BjfkJ&88cfDbi--hab;Q]qFL07HEXjnYP82KS#-@ik=-+7RlHod'P;j]h`b[*T'+<Jfa1Hi=V,"7'.Ea_m9ofh4.dBl$8eKg&Z]7X%&H^`\eZ3Aob;nCKnt,l[l+>Q4]1f9Z>4pq*VT:;;HX(\W$9D2*[<Na:ol(c"0\Df/)c!2/6YQ7N'P=6N/+[/6sM^cijhFU5XL]0.q'$00e[A#)_u1'n0g*^RbmD=DK&bb#JpE>>muj%6K0F/V/Nm;rak#\D!nq#c^D%`9T3IcR.42Z9<K!9Ah.L]6,EoVO,5QG2)OT`5#QK_U?%h7rTZ.eo<[5=k"4M?#'!M?#'!M?#'!M?#'!M?#'!M?#'!M?#,\]DhjTm\Tp`?BY<gkQ\6@%<qe?h+Ra\-3!tl%;/c;EqEt.^PO%3GdS5_?Nbh4'N%:!'N%:!'N%:!'N%:!'N%:!'N%:!(%2mqp$WXf))(p#q0o6dkF_>6kP>>r;-uY;i)^0R1]CgTp=K<EA?PL55Dc$(%0$=9^\]=&q3UuSra2*W/?f$C+$[l;*>D@X*.=b_72,`!72,`!72,`!72,`!72,`!72,dZHo(d&R%O>_rrCa<]WMe(TDZY-!:?-PcX#X\Na)MI&"i"1MTnBC-h@1s;+25`*b\D>'ED4V5IFkrPs%)*^p/CQq<R?]q'Ym:rrA4[VZ-YK(,,V.4TKID%_`ZnT+c^]J$<gtqg[u$/'[s-Ngm]+ptN1qqhI2PC@2$$iKZNDrr>>l&,uXf7/m8bB"Cdk)uaI<qf;]:g@b*'!.:"1!">jeJ,0NIJ,]KM-iX2,2:-S\p.q4"ZM;JY0qp2&CMbL.(L=d)'$(:+];XA,*I6]0C+'0C61F<'iI*.3h[aGPqL,)Gq/@Z>&>=;&lHDSRZP$"n-FB_GJ3;T[KDtq7'B1,2G5hQjR&f4MqePnXrrA2qiZJ&@rrCK7X5[:_r?J%o-ig!!-ig!!-ig!!-ig!!-ig!!-ig!!-ig7cn,/*TQi25'rrA]1^Jm)Jq%n0,qXg-S!'iE4?fB2URSs,1I8T"R;+5jEqA<'u'ED!!'ED!!'ED!!'ED!!'ED!!'ED4I=+f,;=3tKmo(1u>T/W?kbJ0\5'N%;I$1i^Q+2lM$L4@rbrK=e8i;P'QbVT7PrrDDNkN6.>PPKZ@oWl7+aF+!f-?+'(7=9+KTg]Yl!C[]!!C[]!!C[]!!C[]!!C[]!#C5gbraLBNbPqQTY4B(eL4Ae.rrBK7q`T.gp,R'gUcs9t4tAJi!.:E^nj,\Y=.ji472/Q!?R5X$J+?S2htmJorrAhWYH=kdTA$LJ8tMOP!+8pDoR-93dXK9po/D0RQi>U?UoWY8fc0p&n,%/*!8@,<PlMLq70"$!70%VBm0EXk,U^Mpp?hk[V(l&i[J&5>#QFcL-cA7CmJd0_0iu<#!W#;T'Mng!'Mng!'Mng!'Mng!'Mng!'Mng!'Mng12/"8Gd;NEDG=sO#Ll7d6PopQOh%Z\,ACE"`EKZLKGq](=4s9k*TRZr1O8f3;U](gs&:`%krr=96rrC#>X\iCpp,roSnG`J5g&B^DG$g=+SkK(`#Z$7@kTBg)Oe_pVii)kWKI=\[oFLs%aO1"fnQ"mS;>lPC]DOn75IRg;QfJ'XP5bO!'B0Q!#QFebB`A)-W^#GKnH]!prrDUHJ,E;meJ*LCd-go6&+U7uX@HjsrrAJJ^[QpOKDpH%!;RNtr[O!(6@;*!!'pPar/Dfu!#8hJ73C1S428]2KDTErfmZ0JGq](=4s9k*TRZr1O8f3;U](gs&:`%krr=96rrC#>X\hU^4V$rMrr=2@g;J/AO85A?rr<=#Ld1)FrrA1VrrD&Wrr@^"`#nU^rrC-frrDRhlVpa[O$gPW5KH'tYoT1krb%Do!5]E/&,HP2!9@hn!;NQYi<f#Zr<*'"nhbjo<I310Iq-jnrr<T#&+-GgAbc9*RH2-PK_U3!Jc>`G)F+3N]kWETZO;D`KtejYpGd.pg6ep^V5J5cU5CJ*iX4bZF/!Cfa4PmJD>`iQbhr#lj#_81O$d2i'odMoY>*K3bhiq7<%9A[h&]5h!!lAV5Nj3h!0O&V!90sW!/)`<+7p*D!6ERf!:a(T<*,RfO$gPW5KNL^[]pj>j8N\SrrBnLiXbkjrrD+nrrDho5N)q=#Q4c)!:hsrr)J'n'RsW>mf*7tndk,h7qMJq!1Do_n:^Rhrdk(Lq&2Ks.Za?kHpRc45lUi^N?A0#'je::+5$3I^Vfu%qeHesIQut?0DltW+TDG7J,Vourr@qOrXb\5J'^F[!$b#6!6&$A;+L=C%e&oe!$M9p`-,LKq4:7Z!!lAV5Nj3h!0O&V!90sW!/)`<+7p*D!6ERf!:a(T<)NUT6bE7\a?R,<*LGgcB9N8p_@to>q?R$#jCnPnpo6R;$1S9!"9/Al1k5F'HIW^ZA'jZD!"\W2mArfhq#:>^jM12;pk/QsrrDj55Q3-npd0?orr>=a!;qfurr<d?[7)1ioK0h*r.Fl^&_VUtk&Oc4d5;@TmGHVur_K$Fm.o2<NS3MkW33Rd/(1+\1b#GEfcFHD[&_]!-+aL4U:)`_.&)5!nkY.X!ri8ZB)&C\=oSJTMu,<OZ<L*PlooU[Y4&uHR(qOu1"s<YM?*6dKRX:-!9$rX!,MT7`:*S)qb,'2!1-J+bOYSWp=hV!4gC&ooU72$!fAD!!fAD!%WC>;KR_rBn0Xjf^UF)nmClZu8!W6'fdb,<G:msC*Cj<'+8BAbqOPClPQ(X;X6D)^!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!!2>?!"97$~>endstream
+endobj
+5 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 151 /Length 28608 /Subtype /Image 
+  /Type /XObject /Width 250
+>>
+stream
+s4IA0!"_al8O`[\!<E1.!+5d,s8E!T7VQ[M+Eqj?FED)3+E_a>DJ((^Ea`p#ATAo&Gp#UqCh.*p+B*2jFE_/6AKXZ?6SADn!(-_e!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E6$gAjSA!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%s1eUH#QU1kq?$aB!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!<2p-3:6C\3QE@)5.kmO(rgll%$4$GhZGuNO%t*o"0Yl_NhE#^4Z[nL7XOh#"#QD2gXj2J_ich@H3+U)-Q)n=l]+c<:\$U\48%chRS<Dln&>AG`rgiJcWgMD4:o1[5j,?5%m;_"aQqSDnlKa9K_f_.F8W;unkW$1!!/;/g]?.h4QEWJ3cj'ges[,u3U?"VGrZmna)3o^0-C@W8)^&17QLX3rj^![`^_-a:,qT$B;]Qhj,Q0jJ0uK>!"OLr*-'HAH4IWD!T4FlHfQ50qr]sA4hK`!$h)\ue-";em.J[bn"8Ut'upQ1an@mDq^87ep%?<Q!PL5')=DR)%!<Q_4oU59i8fB3J^aetI<[dE)5e(*n_AKfJ9b)FnN$H79Q?)a\JXM$Id,maE,Z%"a!:Zkj#oBbK?*c\*HR2#':M4GJW]_Mk^!p"e"-jcB7Tm^Sh\Pr%oPH0J3?@.lfr.+%/q.&F?.Z5l(4FD3m[s$c8#\.T41UJT"$uE*)\^]gQ5"qq@%<R?Z,"mWVcut3Pk,<p$7Y5*U(O/F4ZBDl(5er*HRg^CsW;pfFA*]5EB-`irBR]M5(s/,JS<SnDf$Rr]lZ\jE/H\*..A:N]UaBk<3N;KAX6&!9]uJ+&Br@!#R]3j,Uf/f@09Ul46$,<-!'4*003Z8$CD6mnX9Fo`I?AQliJF0Kh0^,I_+5fQ=pm39)gqi\T3MIm1PlI_GM#R,&!bTR-;Qk8;Ko??iA%rbL9GrrB5g;;C^6*-;1&ci3uLXT1lWc@8dMqIH*;g!<@5HB&N>k.l?BIkCcA'5q46LQ:$OJWZT(\J-$'Nh493a%ed:3fh1A!"AaNI=Hq>I^g6h(a':hl>_DsOiL=[_`Sq%4S+SI!!aL8KB^D5;;[E5RHo`R3!7V3Y($Po9HW>EJ-j7<L[%sqd#Pn``unb1$02R\,,<Vsc_``5_ZsM^^:rps#IgE)3<00P,Q@bqcuMW$PLkp^%c\QjF,p3Ur-BH+N7&\VHK903a7T976@7XhkQ`?1q">QumDn1M37!%C3Zag]N#m5h&,uW5J.==4%o=rM3R?/:$t*]g=,qV'p%nRT3;+&S^`C2-"QWs#4D3.8UD_BFfQrMRj,Q/#5.SsP!HLArO5njgH@&M?n+iUGV#>T33#KY\mt*a:]l;nM!VI>'#f[>b#9JN##AsS:`XcH:#(t2j7j):hP'H<\Ih/GT&7^[Wp$1AZ4gI-kYC(:;^rbWo)$dTp*$7qG@$*\a*"G6UaQo!b"5EA/gmmMrf:a)JcP\`+!VFZ-5DDrAc8Q:F)=,TiglGg\Jj:N=B/mrBo]5beV?-?3>_!%j0uc6oA%r.fmE,9?USuIbpBSI_rr?;3q?!?2^]](,q/PaUhi:2RJ^YJ)N;WeA^qnt%_&:Ah!*jNq"-65Daj4>0irBK/70C8C!'\/(hbGk$)!R&00p1+1cX&]n(uTTul1bT_f,,R,PFfItj,cI"*;?*.*;(O!!KK73kGKPta<$]o:fR9$htnhB;:i;+)<lYPcN>6Amu`QfoGqqecQ,#>HO^)N5Kar-ob\McJ2hR1!M?(NEVX)Hf<>@7#I+MbJ]IC#rA"6ONdh[e5Q,DBkKj>'&$Y;Nl(1Xu4jRI7!13iXP(*s*^&FOM5EL02f:Pfk&cR.Ia(34<O3cE'NgUpap%B9b:HA?"j:483SNVCN0EWHh^rc<J5;A0ZdXT&nY>NS*r`D='cTjIfJ"Q?3J#+:Pl,ip;nE8Q8IPX4hk8?9)W6[j2!7pnj6/S+9f@PuUaZnh<iu_Nnj7)>S3??Fpe9YaTn]06@`dPArVLSjg*;1NT!1`T.fCCbRlc0k,q$r#oqYD1_M@On-N8XF.4.jRh/dGa\0qW9(rdLAZTE'3!5N0rOl(;d8V!!au!,%pDr:#1eF%cL^/i_0Q:X50Q*BDFtS7hZrH?)&YJ.*E=r;1lP#G.FsGWZE*HC]UH4jTui/ofM4l?fCQl.:R6:'O!3gH!;:'A#3`*kaeY3W=Nk'EI!9N:tT4+EPh'0R;T*"Q\b;+E2DNT'*?`,G/:fb44`::?.?t]4?qMa0#nCl.gF-W5l(Yc@7SMa8cQ,l](reO86g5*G@T+9P:!=N$$Dhlbsl(j7>8q?cN8`+-dusT`#@?_<mAFh0AjDJ-9frYo(e^)lGiEof+$edFTN$q=2Hir'rpKJ\e+i3#ls"S7<Q/StABsGGCaLe.K]HBDQ85IRY^dIYXhu5;&SNP]S#1r-t-1cdTWHn(`$Pa3uE68ks^S4*!B*rYbcM,S5F<Gf]qu^&]TDrGk\+2\(,u4ieKC)9M9+:(Q=)Y8$r/r\\BHZa[cc)uO6u[#I^cd_$0i>O!#.:6-^&>(u_)[0o,U.';RDG\th'pQ;ehZ2h/1O;Y:#ndGF=ama[fr[_Ep_46#!B>VOk\,<s\HM``1mq#`YT4aB<@WJQY[PEOdY)Q&\k<^n_<=$p6eSA*II$0E9/S^R>U%qJ*Gi@U_L0:)]-KD6abIDaPa'_qZKYh3^AlWSH^q02XWt?/"bAicr*I9SWV)ja0i;Li%^YYQ7!09lF?JYJOjEbbNifcCKDDBFb:.`JG"5J%fh"W8`dIHNkrMBK&GZ3WML\*`._jXqiQV]C"qTP7hC)1`bl8LbGM_*FW95bqu/Xb"]Ci!Jb<oAA-qe(Dp8GiYg)L1G_4p:C?_nR%5b>@^VL>TqShIm_:/Z#SGYeQ@;/`luZ\VaN:GD8U6,M8.Gq2&o@2A[X`EOh?.T*p7O>;E$9n>V)"W@F!q(\m7;<?k<6D/.TjT@rA;m:Ukpn0\]bAeW*6mtgIYIg4rsj`l_*I9)pp=Bn97kpMbA'^4K@@dT+Lo[L+LPZ@[VVdo@cYiHc4FlT>TeGA4'nI1&-BZIPE8b^"_JY)dZd#OOMphSilpb%?;rG0>T-BYA,-2<>Ubqi;KCioRAIe-G+jjg5dCNj`Z9rZrQ>Mae&>AGO+EH)rub$dd1eXm4V\!gX$@BF7tI]]GQ>Mj/+V5:VoVr(\!PM4kr?Ga/e[l3e+.3p_(b8cX*P-0h@B<>KY_thSH.P]2RqUdI&.Cp"iV^U'gD(2F/PtJ=DO#1(!P[otRQJ.ka!TMF\?7<]HT)eCf>K!/do>AI$L(.Uk<l09&2'n!J=r?$A$G3-=fi3n\;l*BQ["PD>Z)Y>Tr\;n'dhq6crD1-l/nr4TH10sDIKQ,1SpLrB.*'&I*JaXp>HW7l??+)eQhO-_@s`VHAkP3iMl/rFHS)mI1Bf<pgf8<eQiK\<@uhWWg.>SYP$W"$Qd)nOBBXE,Bu5!>e6rVTF-F;4#Y%a_SWe5U+XoK"m2'<hPI$jJ5(Mgh`^p$4f:Vem;P\r:7t9+mY;kk7%jqK"O29Scpb)<X)f)LD?hdKj''/pIbkCr6!4G!@TtHe"1>j+g7dZ\RnjYkl3QL>2lrX(%GY@bZcoc6LpfG;',k,:<+'-h^X4qP(h.`3oG]ddpMl8#2P>.W[<C(COEhoBH:<$2JN]rLXi>s8eY]J#E%&U`X#>NWFY;tS'(qS.S.42%R-U3&X;-&>"lYXtgGY@9)i9)-N%1X*2/j%5IXrt\R)_)_;*tOghY?!Z+)O9iq1W<p-=s(8L7\r[_\oN`O,+I!Y^,ZGarHSVbrr<IMaQa8MJF#etrr>31anX'Qci(0I.JjtW1W$j\nQ1B+6fSHb=lLmC5A+E`l]!gRH[-d>P58CPM00]16P)WtU.;oQRj9Jd:Ziht5Ek%)3;=<[0=Ul!Hn%,U!5Q<3I_CT5/`@`qc7kC$A[tfg<YBJQ#hF]'4C[DE>dY2E0bia;amup`PBX?V@E*df0*ckfcYN$r)0+51O_;1?4qeZ</]?W>>.(>+a&/+L/P/SAQ"$]_etX$@V-6biif%)4rT`k$FrlE$rr>7=HfN\0a$"B_l.[9Z!76%`V#C`$!5nUr&0=W_^PRL2rr=dW$D.7tp%dq"\%/Um/,fpin2B:e8#lJ*po1.F*^7sTkCn$_"!^%@)Qg>YkkRBQ=*2)>j!^e]6],S)rS!WA4ZasI]7#jtq20Yp:SY$qOJa07nefMi;,3u-4Jbb1m$t(O,>a&?b"X25a6puT?G>Ilj8A)KBt3p1m+<-s;;[sjcPagKIX-;Vrr@YEI`NTLDsao;45q.I7u2'l8St4"7C$8.a`0G>Q#5or3@D>a/nQ\cOiOF;IE2JU33U\r-\gb#Xrs/^i11K_Aqef,V+CZ/OuX,B>oXEub"At$7htW?m'e^m.f14+",anEGI0(].T1:Yg@1?%aYi5gP?sSWrKDrFf7\D+!qS#TibX[4E%u)b0c;TTKu_2ljf4%ZSJmCuL7;AF@^*@V4$,o4G*m]($m#pdjna:H^nW"7l@"-la,W<eFWZCJrr?;R3^!['_<_)Ip\t6d"2oUI&_$a[YL!mGht?X,85>gcpE$718G208+Q1[&:bp)K49,ZP8\r1_o:,jI?]1NmJ)I^6!![lgHqs4H_l/##GjE?7i3*^W*ZUfjH9S7cfJL96o1GP,?V+^nGAB4JMX;dB,]s/e$Te3g[Hcj6*c7M!X%+VT<Q<R_9i\54:7Qa'3D\>J;O(FMU:I1r>g?,L7`i!p\GO5D!q<r,JBW94M/XFnK?Wk.0K9ELf]&nn<[s@FXOX.>Q4""YXSn[t<2hfK1n^ZNb+b-Z)1L"_5>6^udujKV/78S/YQOG[Uj[YP%q7a_^LJql.2TlTgEX\O..B`^Hm.KV!r.\kg+40@]r-]?1lJW@l/q<u\$'2nD"AC*:O+O`Gi_r]*QkrJfYYBn7PHeAO$V)7GP1;%!8#1uR:Vc`UDH$&AVR1;`RBf,b)K.t,mpp?KTh)P#q7CX`_ol42O\?+S/]J\/`I7-LZ31\cEN`97>e4)_bnW3Ib@Vb,6_0$@]7G@,).#L3j`Y0)+(G4EjVN"o0RGeP8NooY>:iTLS<bmliXc;:VV;RkNe.QrA^[GH=1Bh:\K-W4E9dME(4)PNcEtJk<1QG>iX\N:T4m8#GD'`p?/@E5+"(E%nutI`\W1d:ZO8]$cIK?nFqTXMp6aj)W$\:m12sFc[Dk[GP8UcSS&Rp`_265WFLZ?^``&bScAnUT??&MTC>ujfgk#/jlVcbq)hICG?)"_M59W`NO>sFr8]q3Y.q&C=iYQ5j7fttf5Y1V*:PK-b;*>W3N21RH$1h[.(`5R.5t!2g>:8bS1):%g/V([]XC!GNBBkl*tGNZ`UU\ZA6^uaXCWjqo/qFNGg&d>mdRc8-&Kic8Qi+@^s3bDePAR*_iN!$kL9G2Xe3haGfS>-mQp"<PPAXiIl_e'n6Y;^ko,'<jZL+ln3"nOLf)!9A'a!C6/e<6D>Q"PqbRI%$NMthl1!$u$]FmFGae1R+,HKlnaFAJ/?#2pM&r;KXWB(3R4]FRRLN.SeF6Wn13,?`!!aSDIh0'0%nkYQ,fEG,F#_OIL9FH-3`N?sWIO?T8bkQbPi\N1J"t##NK+)Oiau&CXZE'!'f.rnF-U.r-L@jpa(86>Z&<I&FXg7CWq)%Z?afp<`uT+Q3<]#k*W<`X;WFrgJ#3J"[n_#:ik3%bJ&YiLrr<r758T1U(AR45Si4u,$+f:de=aI$=*<:@^9puX<\rZa@(_43PiF/Be%m#S3ZlPZIm0J'gt0WtV,i:AdB?<A)RSSc;O(?ZSOc=iV$`?<in%fXo2]f+%g.m.k'0K8r3mVub]#PAENOr7i%\>]AePhM9(AlJ'8<QETiMe18tB*;O-QUW@iUY-\)YM8GiKjY7S2^ZT`5!ViV\BPkFR/JmHQp%1I,B"Oudp?B3F^7r"So)9OHiSDtp6;Dh%SP1bP0gmFU7D^PU73EQ>7'HK,7%h7o?;qdf^,JtDT2$iGJ6rakI9O&,PO1aDeUY#"U'r(\<JY?Z.159J&h#C\n4Hl`4eP(,4d!3s3:!;-j4IuXI.Zr?s!hZs/]ftO0[!3I#SIqW3Y8g!j`T7c#s'n>LCWn6:Wr"i-nnBl^o$3(""<RWu.!1AaA5EE66ACp0,r"=\_!6,Fp*qp^*5P]A8hrh+j4T>DtFT2@%ir0d<rr@sYd.RD=Oc*'YXt/Tn:]=+dC]=BC4@T8MV).k\+$\ij3$8.<Se1o%l'S*!H0fO0AFo`o*-K<)/,G8*!.m-.f`(s@YriO]m+::B=@qNpLR):_n.!@t\[g;h%1.n>dT)YF3pX[=ZD;/>V/7i0#Z?t/&cB/#E-XJ)n^kJ[+6W0t7JKUI6cEC:4sTheieN,(>0"RQ%G'o(SN9H.(!(sA\Zi\3rjL!H[<\jW,!8$$c8[d.p'r_6g,r)mi\L?#`tJUG(^e\apGg<8Qa=?,F\]6U$HZu?;*-]>J"Akprr<ll*sI$_auHPWX&d>^&rou2=`$/\Af1e*[3^]MVf`kdo',`-H$lEk*)78Ke>"!`9E,!bh`1AjVd@<#kJ+RRf8@T<&H;`e#.^B&"DW>E+7eYL^3tS)p?'#Sp2TlriEt;+i9u:^0).n4[N6dE6XT*&,/)9WY1bnCf!JYs\_B<?Ih_E''jj/[6#qnF:Dn(RnIa*&otF6"Ji,crr-HG2HZ>!m35MfZC!`u9`QJ^HV^bf-4sa(.8nueP<g@nrEGN.M?Fm#8dqVIhq?Y"$\TW>;[.CAo(IoR4B%\`A/@ujVP,Ue`K#Zo;nMk:UjI>mY;QC%8BgPF6k870p;@rj.4IoRQ6FrL*o+8VUJ(N2&YQNd\5^htp;?$WJ%<M%=!;;$)+7WG-0QE0M"R@G=Va$J_q6&7neMSt#rr<]Ombd[.0BL\*VmV"H+7MRdT83FHZkm*F*'>&'rr><T@m?kt^J[(ql-C"B!9B!UrrCZpX8`/tBHQ4ud(B9T@u!;8)ih]+8",u5r"jGR8;G$?J'gj<1]IH.r1s;p*hQ,9Xa_uh&jXH.+94F`\,^Y6PE0&#rBgMa_0:CiLjU'"Vo4QokNUsi3dr*Zcf\ZYlsK'',Q$bUn_e/0/U$'r,O2OZPP_TkYK5Vcb8!7;DLD`CkK(.c%JE]AjVt@l8\\JTT3c73!3d:,OfI&:C79A5p$i7X:XlKuDsVA8Z*Z4?g"o&^(=s-3H'96!ng'$7JlROj3>J+E0A'q2]^W(nENADTZe*.=>s?[`QKI0I##.A%&ou:FBruSu<C:>RM6NYX_PoEk[X95+rr<D,iMQc*^ci>0!7ZJ8oC(/oNqMU0(EEM@6,;b?cVAM#f7V](564^&*9NP2V)`*I>iA;_>&>aVfZI'h<ie-*nkkTMpZ6*JZUl7i3)A5`iPmr/_;_HapDd#Jj)Wor.P=gu)QcJgCgI2MM:S<LWDoihSP2_D-an]i:'ir#:!!>73fAeA[[LE9W+EHJJjtKAH\gMrTpd=\nP'^TY8"7O.-Tq6=:d_?MZ)3-!.mjmh]=9:hiGE7q_A"NnI<dOi,9DkdXE)!R_8$/IGnNJ8FWdQiN[_aBjX-VcqS4aD`!J2rE64q[0phq,"8F0!!U1:T6q[;h\1AppugUQ0$d#;IN[J44rWt(2D?BfCDsXJBl0e_>3sX,[P=^PBD/r!l.#ml#d'nl1.GFH!"?L\X^1^?`SMC#%\G;<p\G\^ZqY#PGZ^cGh.`=C[HnMqi.A-PYUc[U&4T*;Sc8Zr^*)p+[]>*YN\Z>6fW'fbXanVD.Zief=-Z#+f7Z<NnuC1h36j_ZN'E/+qWIKAnbu[/%loq*Hp=*39-$,GX'tK;;o3g]YaCbE++\QG&,**2'472f<E`K5cO1*4C<P9sV-ijU7`bK4E.>[prB53o83%a3NXt^,::Tc5\?)5*mBmB68CSpHn+<_CmBOZ7lI$Q>,6O*>4ahRjX^f-hEQ<"=+)ZFhSe#/8r1,+n.7N\A.)/lmTAp]:^,2iZ[450bITj,CeW'=bX%o3Vhu;H2+2muAp;HaTC[_H"DtpI)3UUCce?j]5?eK[;3De<K.b:A30>l.+XF>Bmd^k0V>]CHU3rl;!IgB,BQTC,fhP#3Vgg4>mgg4:A9&&I!lKVEAk'7s-[$+,N,I&N#Z">8Q5GCC;/s"%Yc1&XEHI=YPFu8(g4C`49XrE5iY7"Q>KdF7SXa@=u$2Z9(AS^e1i6T7N(OU;op7:^=_%u?ZYNf;7];`Z-Y%!FK6.,.DMmeb4*J-iKrlkg0bP%@_6?'fVUqA>'.:i?2><0[4d!;/EMlBaRTW-j'][UUe;JPJ1IbMPP8e5.$r+#SCnZFsl:E)(H%etJfZT<IMKqXUeYS]IQShl81[ne^&+\ItEj#faKD_B42pnI!(VVH#6HJe'Vn]Ce2B:mn!iHN5.B/&PXg>_<[.9qD,iL^_&-BY=@J;-t1Z!AsPA-*h*#\E9c\r1?[DP2UDhGfs#iY^j1B\Y^j_^[4"aGd##*=B(n5n"%?(dI1d/5ebbONOYf_^!,E&67bV2^mt/L/Ns;T&>7:+P6>!rr<2Lq"-a6I`^IXF_sJ4DL>IBRs4XUik`,]VbusC/\Qkn^]hVj3\+prKU!F#AAL5P]K[7=DJFH/Imt78J(`JrV17=IR_B9-SXu@o[3XM7V%pUDrBp:%pl+Frps6gI`t7:uiuTi3qA!403/ff&bIEH<8huR:V*k,A+$+C6:38#2a5*]GhnAhJpA/doHfGsbm!WZc5A:&sg+VF:m)/>%=nn]\,>^;pG+9?"8^]352Qu+WG'.`-k^#D(+5^AZ0J=]IGrA^.9mLjF">W%8bIX^[3s8M\bfi<Q7LM+L!5MNrEK"t!ho63)']\nie:21Ng)jYM1n@B5^))/J^=7NTi-Q<5r=8Ddc>dXZ0,+s]=m+AD$YE%7gEC[>>9o8Il&<BIn4*j^MR/"kW96r0_Ep5P`iLehm(&?piT\M07]n(P_+EP;du@Of2]/=e)sK0=Pn*sZ4fOr[.H0fE=eAcpPOOkC&b"-DpTSd[=fsB?P\!o"PMr>X9hJ!RM8`H1@3mnMX_,5<p9X_,^,,c?*[nV6nXd(,UA,MXmR]MunD?gLPrq.&gOP1ih1Q@u[AoKWoBLXRZ\_i(UfO^bLjZ2\rr<N'MoD-L3]Dcb*Fm#k]tq\%Q_A,[R]ZM.JV\.o@@h\Z367&>?A?2$rJ<aK?Q&jqrr<_YKs[8Ed!QA_e[EsiJ)`GpC#RIHl/"^E@:FlqY'&Q+Tpcucg#Q+l,G+JdpCK+%rJ5h'rL#hWrlom/\+%/LIg'Q?%":eqVle&P]^[>\18k_+XD<"epXa<L"8O!I>!d[?/`Ar/Ib2M#B9@-b)He[qJYcQe8sER9r%j<@4r+c(P'FRcN99ET9:q=rR#6at9!aD>H,%T'!!p<!4t(h-ZOD>>r,'Cigp\EH@r"E?'^#&RAsp)QM5<3^pjO=.Wn##GUOg5+?WZsmSeEQi8h14"_q1G/WgE7`A,?E.f_USbl;lfKT>]<gOte^K\e2B=OJjXXbB#La+RMC4_B1cA6-(-4q![0k`,CAKLseI2p`%1Y#h3.U&_d#P6bh%jG)lg\frm!eMWmqmQ@!m';3a5RYOiU[ofY6&e$$/r<q>!?dkn[@MsL9;\Ph;4b0JQrRc`VhBj"r'(a;G48Jm+K<c!>Ur[knCUS"sma6d=*cM$9a]9N4Dn,qNlJ)U('=_#4&8K-m.-^HALIBD<j)Vi*ORVXm=ns5@Y?4#Y^pPSPlfQrr\#*&cr8l[T*\hu3Vd$1]3;NJ1`VcKp&-gintWQ''dP"K'4dU24QiI?Cu)1]u9I!rrdQPJZ8l<$0<+NuNb"/hO8V9;!M*E26@N\:Qe^engWl8XUL`SrT(.,K!D.Xs!s&,=QBF5VP.[%A+]*V!16iSP<<]3ACqe)Y5E[D+bIj%V%(dTer$X(c]$/1(alA7aZ0-]2.irr@=O%PN3.WV?k;HB4(<XK9'GJ)OZ;pVf%:Ek9n,pk%[&[@:4+ZWW2Y[d`0G1iY%/_,LJ23W;[di0*!'bhjGUBNm-G4sAA8\G149C0P$X?ct9"CpcJD#P1&4UM_="RA%0J[<oE/gC9B?+<oc1rkM["2;H/N'BWn9!eh#J,dG-b>b%C<P".P-^DHG8$Mh+8!J[:6j)B)\9R\H&O10#?^9<3\8>P=Gdu1<f2^\o3Jkdcc^Zf+Yn%u_9Q>dWQnQp.%As)&d+j?oo3+!lJi[_[Q&Ba*9qcc;%@4O?:Te((:UiP["_g<k8RTLOu8s-/8C:%RXO3[puo_.P:h\<JVTPN77M=diCDo;FZL:<sbM8%$1Bm3D1f\Hfc*nk*-e\%&4.#rPJKuu+O8DOa],.<7mgPYocV\\;<j!<?CA=R2!h)-JoRd->9Csltm&PfGheDXSj8p+iJKPFDc8oUb%V)bA#:7Y!uSN4Q,C/LKK3(bb^b"8IX"oeQ+4T>DF)#4+2rr?NrOjC6/<E^1rr(V;ZFN--*S0!$#a+)"Ap<!=7"[,*?K)Yfm^[,:Sre!Bcd(4RF?c:UTSiQUmF.V9D3UA9m1VquE-hAGW)pA6];"3ZCjnhJ2jR)GdrL<'oqU&p<p5/eL"JPhqP8X-Yf,sN_B-6h'C>Xbo/+MBn$`4mB)Dg>lp%VILrr@`gTQ2_Lq>).Xj7X_s#t+^m-8G">roUE_8[WKSO3c7h*^ASoTCQuo$o>me'V7HPihFpao]QL)^uO;o/&GZaFYdD%$0!V1]RKV8n,/iV"+Sse_B8_4%lO3UQ%--4K_/%]r-J-&i1CWd)p]&iZf3osr&_"6LM5Ci2cnRICbI#)'+Z%h1Ir,0Q#&/"0jSGZAc"L_S+^(]hr=*YINXC)9+*8lFY<u8&h=7c6/_Y;RG1-ZUQ]5%o8@k<VP:>G+k1A3UAu]/@Ju9AIqk%tjD]21MrF,0&4cXD\pnWlrr>6sT@?[7'fYhK:YJn.NQ6si.AqIK(-WF9?gGEF(=AhdnHOTM)>3G+\',b)/g6&.BhDKme8:?_(qc2"UZ_PPribj(7tei\ji]Gr%;HX4G)dXWZ*B$"'mHC0Pl6;[U/YkV2em35j)58e%fZNbZeup^\aDt@Fh$1W326SDjY3MMf?LU6_f]r:ejbft<GK[B*TgLA1n:.%#uZEiGf:PL14R+crr?khp^-J-^(C)&<blW-^D?:?D'6@#R#<$npu?-UV!<KP.S"2aXmV6?eKe-Fk++Em>V2]hrj$o<J)['NnUmAS;]p_=2KN8gl._a%l-d>lrrDf?9E+uD+J&l?$k#Q^;T.LF#R^+D)m2Xab3ROg%=_bMn4eDe"b16ifu$hZc\qHb](io,Va6e=nQ;4*g@ahBXR;eOmu"o(/N[7m61tak6nP`D[?=Zn-,"k:i]L3!DG'O\UBOHKWE0Tt2N/lVB'2oKHtuS`9dnAl4e.cEP(*"@qIf"Dj.!tu=g*E^9oOR(_;I+cbCM2'W\li)B]3s@N8KASWm@*Z$TV531<L[O_ojjQdtd@$#lalJ3j0I!Vna/!DneNE8j,2pN9Ap0V'#ITfDLj$g'do#*sNdRrrAE]Y'OUUpH@j<Y17OjX/UU$7ei&B$((K1o8<O35N%/:T83FHZke/TE:@$1!6S'@:ZLc%6,;ChZLKUI8=X&cI*04s-AV9c5FfHAhsusn49#:ggi`VsW]\eqrrCuh^[acV$m5>F)QnSZT9K9TYPpt?0<sQ]O3ktC4`U'(9)bL`!8tJ]njIp8EW6"r,?=Ykih)G4o3]\d8E:a3a4tajT?HP!iG-+3@1qm`ba&-H$"*3lhbI<pI3Wh/[=1f-K'(M;W+>I_9;U@%Q`9t:?O2H0$GIEk"9'\j#PB<+nc5o]f7T*u>46+7JdCG'ib5!B+Bh?KOX#hs!a4@7KiA%`M')h_S-*-6`NSYdqaK1B>M7^-GPJpgBkIiT[^Oce!"jT]%DBHg\h%ed"B"I,O[BOlZ,[b4U*;(eKhqt,LjhG`Dt.D6C&TLT`UQI:)LJ6TRXVI#mhK3^b)Sc!QHnMjP291u!3D;B,66?6cb[8B>X_8KcS0?m9%@ZJ6O/I<iu41te?ViF@cWd@X&6IBM#Nj\rm?00^u\['*Zr9P,Hm!@A_9*k5B!1TZuG\Qi@nA-0/Vcd$!+D^c?O5VG+@hG8Lnj,ooK([/c/[q$f`n!]FXLIiO5q"ib^4)Flos/Gd#&SAC94I1\dkFK&4L!)bdttB=GSn7@[F(;P"HHV<u@38Y0.%KhodNKRO6XrZuqgpj(d,$J&G+>K.^>nE5Sni.Y='I]'4#><K&'>fR#\0."T]`C`E!;Tg4_7UaI7Hc*GhMm^5[_gWELF\`ToK3,XEdnJ/rCE&7+;STf-J<8Mh>/r2B\a"@3#_ADdU9Pfi0DlIWrX#j3Hj.3Aj6+HU#]9Pih.a>V?4ZO(Rqot3-D.4^!p<Y7mU9me?cA@tlTL2(g</pL()Jo,1m;6O5M:MS*KA3(45j:L.H3Lf,*j.S0Jk7S5?c*;C\pUa7&`J]$7`_bBi]CVku4Ju;4Qe.TCU#1nDB%/9Fi-5*)ha;-%sDq\^"?7idB&[6Ft85B85utKoI(PQ8ZB#**-K1[gD^i(*D7+)i_jHlXQsA_r7:e<;ur7FGiT:oZ]Tr;jFSkZa3PVXgAB?4U*l>i/EWdg8)Kt[F=J\2&keT[^36HT(;1+<XBHUf$UkRbp/_^8>;*>G!#pG4f[E@HZnKK1&h7>j3uSo35=CNT,h"kQgBdn['ID(SgjH"ja9/ZaGNbGj>OG:p?gX(:Ae8iIP!gN>QHC[Y2R,Qr6:PcCM)7k$SS?#=!*?s5r>dgmA_gR;5Nu#drfCuA<\rbrr?gof8;?O!T:++inVAi3I_Ft)#Vg$Pgk,be1bq>VA:qP^Nk^U/.N/Qe[aZSP@sH]qd4_c\G`)8B]"]>'O#cpdritLh:d*m9E+uCHnhCgm(E``:$rT3_U^`)X*sf6Sk1g9p\t3r0DHT,[D.Tk+#RgNhU>6+LZ-R6-^l14mdIm5Wq_TV9.KueZs>`@6DP5AQ8=V)=7bF/dP@OGB4_FL3@s7Y!IBo2S.<9(E\%$LrI@'>++ZY^O2>6-h-*<_Y2=JQ%i9JY6@g<3]MaZg?,o,H[nCEU`P$g_`nNp$7Q-=k?P9WnEZPe0jOcAirHIP[D&>^q;8HZi;lPS<Q+eZpUJ=S8EiU_Ug-<ZnToTWBr)<GYB-&:;"D*OQ%K?EDnXa/qEH7gUM)^,,N5K4Kmk/;1NEgX8Mkpfj)H[mn8i5PZnqmAH"Ub#Hrr<B>p9FChi@@PgD;j;d<W<&PgVS23Odum!S$asZ5nsq_L8+G=E)d!Tg*o!/(&'rj&KBcfr#q[NHsQ5#=hQP'^D1j?m>hds,_X&WN'&ZpZTLbrJk#U.K(i^,:pdNBQDe$Uj6;'g/sjBR!:::(r%J#A1qQ3J]JG%[i"$T!&u[CYCN;#qLFt2`!L[d^=KcQ#@U!V_JU/;skKDfP`/SQjrrC#&L]7>g1^Ta*;o%6>dC_mJ7OTluYe5idb8GIW/T%FhIA5$K$,i/(&k6mYf5=dN`nhb,%oQ#EWgS8(F-N9#bd-;p$Bj5ac?(bhPdbY7;6:d$CQ,#qkg/n4WLMi1:CE<D33s.63,2EV:rI<c(Y"^Ddg8`$=O%b22Ii:dUJG"/[TS<DPCuj5hZ!RlT8:qn.fG\43dC)D=Wl3NDhfAYO%PiS[TKqs;T;EU8X:\3KJYX^f(3D`5`Cd7!3b>S7qQt27P+*bGo_oJSV^rj-^H$D/B<oLXt0Aurr@Y-pla+c5Pu1]iZF0X/N9;sGcSYe$1W_6Z%@AJ%oq.:*DdOh;DW*-^1*02&47igMZ,Ig!R##)J:ECBcdt:>K<MFnaRFZg)At_Y<`%nr][c!,-BamJWJ6@A:%_PWlJ=bMIb-eLrLoY(9[CXQ%e*GuWjt8V"GU]Ye>Fp84_LALF/`4Y9r?r.;[\ArV)><MaKK4'rNQ;%_)+=XC&\/7Iq6<Kp0V<e*u+M=9oJ!9Msgd70!;T(&h(KCX_o,t'[3"@M_:W1$uuRbq%Ap$+*%2;lK6sKg3]m"U:.J<NTRa\\<8gZJd>2cZV)j'@u_tb90A5$,(dae(%O8jqbqkGrLa&mr&F5%`34tX+,@5:6bj`Y]$PQ?A/Etf]b/V5o+Y@TK461W06.ChAQW!]gmm/)6Aj"%c1gV=rr<3tpmq:V7B-2KpidJQ!5gIBP05+02E(<!Hs>VmA]h4S,as^fKXB3@?_+PE4j4<AV>]6@J?/L;?c'HA`gP[J)!P"nLTccWeA^QpW(o/uV22/W:4eXfYr*uZKPA;g)o=_"<@Uq)B`?TB^E#E`qDS+a_YcI"fM'UNb4nUU_W3fsP#oQPbjeU1a2$5[.l*@ret\F:YumMjCgJJ0QoJ0Lonp)miA#JO#qqu:i2FE[;S.F8UKRPd4ostErWA$lCd'(gil0Re`V1.SZ:X$4%phU`o6`83TK8A-72j[K6Z0q>7siS%+,'Xo$Tr:rVrA5AIMmMrdO3WD;rXoG.h+\j,_%-Da-h.Mhb&dCdnS;nKU5clEdWtb':b4#><h*8_p96K<q23(i#da2*l%58MgRs=*KH>Yl-\skGo2([b9N:,f$`A12;RZLO]pJSY:T7=.;JjurrCuKhln2W^LR9D"u`sM+0kTrj'R_G+<E0*'PN]aBK"a)_nuBjQ:1<gY^r<oB\ooFF^)AoN#(+tBVYNU1sE6i%/>:C?^JbIEuNQi/2[_nb7TWMaukm31!Vi"KI*X)lro&r\92@C0D!qMGW3RuVPf=hN\'2D\==??i%['&k8Bfr<Mu)B3Ah_hh[dSO0acO1=#._BG*J`e<J9\tF0*r-:CTX?7t/S[!4-$crr?V;K&.F@<T/q(QSrilUZ.hmUC2/&587Fu^8n8-6DFg6eQZ<?(Wj)6TXM<UME=&A^[P8'!8ArPB:jh)r%dbBX<@;GnRff,9s\V<EI$Mm"jE1aCORPaNj!;DE]<5d/=a3'V7=*q@o$k<Ag@D9FseX>JfCR^ETs"`ph0ASrr@Y3r'8b\+o^0P*&$c'=nO:@%f!&B"mF,SZ%g.jnAK%=IqRJ)a)"R>I$`8:TF3'ae'(HAN:$F:!+fO'?PQS\k1(c8NYP2F`d:/!ot3r97PlRDD/uY*frC3iM:8.*0hOAppNP'#Nu*?g"Q4NCJM=I:C>%pH^c;M69A'7E@H@(OWmrmf<YLckX2Z]rSFG$J(NgmZbjd[XPoY<FT=gfc7'DIAhD+tsHqE7%9&`L3IMhkVqSu?V,VL?Tr["t1?+5UP@t]b:P>g/emis*:&)"/f"0YKu5EX"J`IC($n3K$H?Ntu+o8piC:DJ*q303QsU=(oRRr@eZ,F/c7ELnmlcr_XtJ^AU*iEe_id%uKW%/-5/W5;ZHenQW^WRo&HlVpG-([i^udTaif5=G>sk.'d8kk!bV0-*r5E>7s^\U(5VRWG&>/'YD:^BWdIGtXJ1LSIR8[s6>Q]2;8s&,lo_TD2iEO8duWd>-3M._Q,f!09:Dpmh9O#H@]mkGRL`I/a1_J+-ClrrBqEr."&4!$_,s:H7Uu]aHk!F81Xl-Ls4Y%.hU=1Q;>6T)=KEHbnV8-hAGW)peNa;"3iO!'U>^BW(d!Xq1"$!"f!\rrDR5c&_6*rWtm:lne-Qj,A5\p$jr@a4A!GrrCugH2dl!N;-dArrC$<)=>KB,[-7Hj+6jC^+8n%rWtc<is%[WrrCj$I6Zk+e\;.\fAjpL(K6CK1Z<dIk`gY^E'-Rf&3n3!hNdZ%-iX/o;`4RTYb!*>!7IM4k^N3bmJd1G75uCg`-r9t!9omM4cdhuf`(pnnC8Ve\`<Z^+2dFeDtlo2lrWqS^bV0_)0Xu'i.I*q#jqu>3TC89`IA(6Z3U;u8*odG!+h5MpE0,cC#A*MIsO8.j.PH'^ulj45,Y86hbP-)jCaVT!8,%$rrB$[3WB(l$GQZ;QFl[99YUKHWk/31?-hSErX.Q[*M7l>(]OKoE-O04>CV@A(\J0:\Lm1-fkKD`*GcNQcBc7-#d#u81M^0%$QM_]e86C/Nn+q0"oc^F!457R5A!-<RO?&2%JdJ6Z,(XXGcsFI#bgc9KXI2d[]cN"b`YB#H%'&eSNB<\gJYDcS.2F>J$r_<8)QUbIq]FG^+oCQisU+VO,5^U)Kqi"7_6sSgGTj/0"5<VUrRJQha\*Q)"XC6>J=R7_g`%9(&f$E_r/;J?P\#Dn`H;fRGs85C=DENN!tl*V[,\VRZ3e-Wb9fR.nLktZ(4jNXf`jeH@bbg*q9[L.*-17=g'G&(P0K*/UDPFhD['O<B<".h_V6)Q4tiE0:F\pLTAXpq2a^"V:UC2Vh,s=jk_ET,-R8B4AD9j43MVG(iiO5c7bqQiq"/$4HWTW@<2rp?SfLVk*6jpCgLn-p2d&87,b>H9:O\ZR):CY?//2+^^m_RSja&%O;hm7Z(=I7/,E9G!.kWArr<E'p44=Y3-[!7H2dl+:9XH_hi)kk\+;coIK7^@qK(jj:AOUel%As@1-adUrm50SV[is&Qlkl*ek]&kl$/__GW-WXZtncc?BN6+MYn)N/*KW(<IU)N.9:WTX-[gs=gY9@Wc7)aUo_-[C!+P6[-2WSn6OB9+s."Rm%eBorr=YH1\c(l!%,IIU]I#$\hg(c#G,$"NXrnq`IC_!n6OrI+o_NH$0hHi$R\mqT82Osg:ru]rr?7>?hK9Jlef0XrH!ou?5I=lQq"YrZSoKsFP#T6n#%.)^6/6XA?Qk]HkMlp2"HD;T9E!QRJg1]&,ljZq^$KR_#=l7(&jos9eUYH$YUI'inO7/9Lorf;UTD8DF>o,"#<7jR=o:f[\hDSLroS2rr@Y>J&+9q48U;Di(k>?-@ZZnT+/FuDKHs39B$>kI89)qnN938VjG$(Za1$PXBCtB!:^!Uk/G]ghKf5$;u@h!pf6h8rkol`kGUW90BqZ))8Q(j^`)5tBhs<6#ONK";ocWYHpSGrIhh1q`M[GT23mf^HHjn46e1)tD@^0T6#S7V.agX1Mf9;@^E^l\rr>7+oD1=c*7l-gb9;nJ7hpc^;,jEse#ur6W^\J&?aR^@QE<'AJ)*)uDJamMD\0X?*Z"9YK\;@jKD67;pih\e*&E,hE\-B)_934EQ?@r*0H#j$/UGjb<eJ;%oqP^lMrpjIp#oGh*?1Wg2o37dSgF.VnOLCp!#9l+E:@Y7$J4WeRrh[:Qe'O+(K&WKG:S;]Wp/nlVqe7@*`^B(]7;.'_Y?"Y>Jf8:^)-Phih(k+A%Bs6CS9<q2PF7om&$?h(]%^p!2]+MHFFY+EAE8AQlSeZ"b-V\3q-d<4rnmk`;Tl/?%eYZM*)r`l<YR`XJH?&$iMjBmA@^2;UJ*59a$gk/.tH&NNBPb`W#o@9)YcZ9@gaEq^_HN;FK!ATmu*0L(dle(Wk7&q^VB)_R?=2"H?%'*t[)Z.)O;?XYB_8dNeaVig11n2p#`G\/<5_-S2-pc?/G,XCZPM.S`i\:RtqU3d@#Kh5O/U=se_8r<Bo=`;"c?5%EPQ'%Et6auIif//B.Y1Ra[(7i^WrYCrT=UajM;%4p5)(DW-C@jMNCnC`,Ql:rr2!(paQGWg'EcQ!EN`d2k%cgl_g!!TP#miRVj!,,(/i;Sp`A^S4#BWSe>74rH<nV<#FZ.*n"A5Z:$e$PKaX$Xb27l7\or/;p2rBbm(n`G\t_n\Gjpkdujf&&jaB88?_&Sb3"Wb)\mc:b>e)9tA1LQ*mZ?;&N+WXCLZr!E9pn_UJ>6fK2I^*;mk[(=;;]M5L&P5MXBKUYuURcm$TG%)W'N^U@18NUC<&0*+%NUV]MqVH.Lc>(5gZFV*p%jnZ.b[PR/GBC'oW8I0Wam#Mt)uDr!7fL9oqhP)2_."*5r,%l%!,1MZi@@lg%rh1*eVki=9iK*qQ#Mtq<h+4+X]/T64q)3j#k7<%O,';Mpm#cr?MG1"nSX,aGbWAS[>OPSqb#:TU;!)5g=gnC8>L%Y+`1a#EtX;iAg[[prgXZ$$\S=)_]3WnKDmJSE@Sta\d!g&<>6p]"2o]i(MEotNqom@a5QdZea`Or[Xrm(nCun,O1]>gd<RpHrO(VA%c;#)EPAdcDJd,<"A]Vq!A&\7jQnK$I+\V4rr@cprNFQFgQ0=fH6;oL[6C#Y!3RC<kP91+WGsO^_L+_-T_#h=PUg-M;M6Gc3Ps_QPFU.fqarWGbc8+GUurT:7PTrR>Q4[3GVA&hO.Hqofo/$Pi4NoS]8A<[9[aZCid<c3oB2-o)\#^RKDM`\:B7?>"&>BP:6[/%XVk-<<jJ\R43.&%p8.chJuSak+1,[r?\oj10"`Y';@B*4kV>N"hVNL(6YJ=6&6R$iUS-Mc=2Za97r>6[>I9A.Z\Z9@TTd^nJ^55"hZpp\n(3UsC[.Pe@IMqIKDto[iULiVJ'=I`nh]YDjo5>4Y8I%on>"uE_Aut3627/3IhHu:=h_.H:<QB%5*p>e?/95^1q(9l#d.#C8.>#]%e[mU7`o[=GAti3_jMMpfmZAW;m.00=,N:ak.#e]76&bT-TY(X=#e6_8(q,U2]0\3>@3ih[uC5nnNRnXEG(-`,E0dFjS1$b;U)1[2K?V/=lJ]+kD@+8n[P)i$5dO.@u-C`i;KMsSOFH^BiC!Zq.'7Yi*Z7.Cd&p=LiqV.+3$MRYP`<eW-EC&*XpIZ<@<X]de*J__qN%I2Mgp,SL77G]Y*b$r6e4@$RN/=(A>1UrMC>?j788?W9NWaj8>Oh\fV6'>?^RCMEF&[h[Nc0IGu=_CDqYSU"N(]D.],\Y,cUaQ%cKS]UB41%E695`3NWB'LA:63p/BnGO5G.!WLO)ZT!Fl+,IZH4=R12piBWg)bRW,6Ik,d"MPkgBVUm=58,o--HAhd7's1$:CZ^I]U(<DDXth!QHM3n)NPEi(s9@'26b^QDL[YFNV]bN;cPPsW@&S0%mm)&@\'<bBdgsFgYSDsIm'@b*\@)i_jCku0[$eO-K3hh\9A7sM`S[bYa-5`niB^'>VurI1;Zu`[H/,Q;iPU0X4E"H0q7l9+]>?8rr>pHFZio!Vq#o?m7M%DXfUHLrpJe:88Tp995?UkUpuRWMV?Y<38h8s#`9Hr,)m<;>5L8P=T*dM!,)nsZW+3>n?7T74>ZL&mM0k?M-_O<RaXO1[LBoa3_V:GDS/D_W5m#fdmHH4)_Nc1=#(;M]F!T>]F3a1%f!ou8'lWL08HqsD,#+:'^9RP4s&5W%bn(mD)10/2cc+c.-Pic2VDSNPnfY^h#3Lfi2U.ipVl#"krK?4F\Nh57uV9O@'lE?r[+5g8ar4:_F>&k4@2K>PUuAjMUMM)q_mRN!CTj9H,mqb>jI2$4MDKMEc8*0`c8,>KO&_elKp7kqCko!?LDg3e?JG*IaXe[J"h?0HoLPa`9o.X6cEsU(Cs:P>7XX7_q;!4/"[QPT^#C%=d\2tVh7ffiBjCK';M!tUuLlgPn]uhkb$N=p)`ufq]GTHg%[3r3q&(d4'86I=2\rf"DrWlENu=J[#DZFBR2(h"H_k/F0%ZXP4ED3SD53mZ8+*f8\d=X*-%R;4`fB+\;NS.*tL4J..nTFa*nK2e)WeOGLi?5d;CN]N/b\C\Vg4B-r]9bY!Emb,6WD!n^IIE(],\0#1B]X4@/L5_u;(9m1r+!n99Dj)]of>MX'RFE`u$ER<:*YQq?&HD,TfI37O8;0N:9\odOOara@jQ-tYK2@u6hm-USJHXJF`':@t:g1uWQo`O[m?79M$-1]=Dlj8:LuUP,l(9K$Iur"m3f2ArSR39GK]#6R_k@I5F%>9-cWO2^*0lIDo#@unX\T024kWArYb5A@<^4r4*e4q%/?ijXdtTn4j$8\&+>`LToe>Oa;p1..c![VN;)8agTAC.b8&:b:):"E?.<_;C,47B-'o`1A.B<jOSeCAoL0[7u!HS_1PKJ#lu&W*QrWjHDaFJ0$\da%H4Jp=K8RrZhEq4u%f`=%Dbh_k.Ia.I`,1qb+E.['=dQ'C,G4as(+e?+Q(Ff.@WQBaYkq39*@Vc-?7,+0q5j5AP1sH4PS6qeNf^#3hI4g=O8M'1WIjCSH&_hVep^!oPM]F^85S@AMX6M'TTs99"Z6>D?MK?45`G>RutWZV9Yd.QG$3Q7!a'PbEcJ:lM5@#oTpiX_0XQ5"hm7.T<0>S!09?!0NmF58UT>8ad>f?\1C"_..O+K.FskanT23UJdA)q`2nO;PT<!WmHoL_;HJlTa5)gMN'W)ZE,Z/)iSkZB25)kIK'9MEqheCnB:MtZ11;eCF,jYnSc@7O,\fjUF_$bN]=Co!K*Bf[oTpmhoD<,)p$ZAFt<6<H0b_sB0#m8XA9;h)FoJY5GEC06*lJFd6'LeC&0HE@g_U\dn\@D@C*;L5R8<<[tZ^E)'qQoP"ff]*rc4pEVNu4q,d0bFdZ#bc*Ii,U9q2X]%,;7^Ekm5QAmu,r"NR34g(W!L\h86[g(f=4Q%7li/Ar3>$NkFA_C&KV.GM&d@dLLnQ)r0@WNMY3kTC2K]skaBm^<g!!POGp)!N&rr?O%NQK6>%9aA/IC"lTle=;p:(DU>1Q6__"F;.rrBDt-/,4\brrBmm'YGZmp^>.=%@;qL+lYRo[FV]J5Y^r6qfnuql84mE/5m"A_\C2>b*"<<X"+6%jMCir"P*I+Z2XeNn_iAbOdhCD"8_=gF9AL*:30d9E$l^g]IT:WYW1DZ3tYB)3`r=V$h\C+#==\.=aOnFP+OQMd5]g]DfgIRI4;mf]P$9.)e<2L_gFtl)+G8iiJMn$Hp2_[O/u=!6T)mD]sT5S@5/J0Ml2Gc/NH:pS7V-ZftK-=#t+^m-8G":fD[7pl+lgIX,M8=k<F_Zq!n@a"k1fq1ge-!TCPTE3U?\F'c*M/f<8M1a80KEDt)Ap*sfM&V0E7(c\H>L.H(^JB,Xg+VjiFJZhmGbF`:3\AtF0[B:;D&0.W40E)$BS@I]9L:Apc55AOG8LqYNi/F`Z>N]!pX:MhISe?qfrA%8trSo\pgeZ:F*pV\FkQ$h,DX#lOg1!bc@EF'#(j"+gU<l8CH@50XG8s#`Bf_o80*o!Kebr&,_e";qC?f>nS5=tAu^n)e2?_`quGW1uP3@5D'an"j)_:QpdM_Y4PX&F`2(ulo8fMJQ.:rHML2a%<p0Ae0b:ZCF.5j.j>rLQ(mpfr:Znc&TC2OjgI[Jf=h!$RBYH=MmDIYWjj%b:*YL&V/2T:`COK)A36pqO]G!!7NmV"g"gHDQq8U2#e7Y"L[FWp/!/c'@?=EN71_QJ1=TQ9R8T5fgK7JR;pfG)j8MS=Vp>e9B6f(!!siK&Y!d?\lO,Yuk[In?o2i33Qi:.9*IMV[m8tX!k#4AtA=+%).UJ!q@Xg]K=*C58*->*ck\E1X$&;KrL39`DN=!$'ig=3*1Bc*tM<(cE+S8m%YtL07$5o$:$QlJE)Z\\GS*H&^O/M'`S0LAUe3dnaD%%rMFrMUj8OdpjHhA?P)U@?k%+Yp`MQe25q3G/N).5jXekPS\mn+\Tc21nV-qnk<6HW!1\Au*P3Cu<@p^:ZIQ>Zm4VAE\%gDb)`rrsq^\UGCMV*T\6e%Sg>XI`-%b+mOssmP.e0cA#WP%-_thk2LU1eDBn^EHKg_t>k&HD+%6I&lLS%=F[-j,lo$iXKMcacl08f`JAA0X7(D(ODGo4PUD1n+gj1Ust<m#KB17`6^28e6U<5IT03E1rK(LIJM)hsTfE?=TEf(J@KI6.8cqL5jN07UeBM#RI/J,;P/pqspt:3<%:*8hmkkNUj<7Sipq>P9*hm!iZ?#%a14`Q*d6!lUTYY-7tX8AZj,TR[*&=2'&#rLSHHrm0.VcC+0G^cF]2/3H@HCON;=kpH*'!46XG,&;O.B7&sV\IXf:P,r>WW4m&/\Ro@JB,C?*PjoMTMTW05%*"9Qol-+K9LmW]PZ8,[CJUAHX"!?O\AlpBg@e&,:XSXpCWE"XGcR!Ik'=p.,FRZ(?4T3:<l*lPcW3*&ZV771?U@`k]7Qf48eihqV-\J)W$s-99$$pnrr@Z=N;O7^0q<7R-WJ.$r);#bK@>ePkOng\ir9!]+/sA%3U/p0S/VD,!'W,b"SbFUpI<Uo4n4$;g..11I32:&=%opMNT)7LqnUe2>f.kQeZ@`$)%:D[;N/*oUkL&VFoMGnC];5pL**bBK6!b-rM.:o5o;`M3:#>gor-g;&[IuKa=1[[]EVkP]fN[7NijD]I?RcjSFB2*e;Wg]P.L:%lM<mH%limp%i)D\4ik.*KX/h2)4,=9&f<aaB:iLi9VVg]e`B#oi2bhI.aQtJb>HHLj%8J6UA.0@n>kNF#'&QC#Nr?VnPADiSseiiO2AR@NP$6Ai/sWtT(k;.N#_dk9cZ/gZdL]-*@jjnNmCJL/F@QV)b>]-[^*5n/a]\"%Ch5QL,=kj-\WE`j#;`V\GlQpG9@F:5,4,gng^tGC=T>J8u5_!&pCid.b1J][[0U#4)&g(U&K[UfP+aar4`Is7WZE(0K;YL(Z_+U\1A[:F,)WLaXQ2H..\`;=[qX;V>SPe_/-kt\GSAH^CG_Ah@nAN]f3qdg\=_,3a1:#'u,SWD1["Z?aqhfe2k%/")1glaF8K*$SHYKF80\358s<LiP1@7/*$(*?d5JCPJPuHQf9#$p'DcuLAq6G]8H"fjTmLJ`]k[,-JXehaXf'GOt],Xa2D>>rWi5)i@S9L?P.ZEVYIX;3ok7WWM/U>]@u'KH/lHEAh^kq`@Nq[7k@S)/98boXH!f=jY-CP\*Q/$rr@dtn7Xq6bK#GGj59`Irr?7$LP@od_.B#D/>"u=j)OY-_QFXhB`2+RWIULM)K]ab&Q0(LE2c`qdYt/G-h,f=S_c;R$+Q1YHrA0N6h',m\8R)#B%?BRegh&p7l[3!_=9r$[-HZB*58:ML9!o\nT^!F%l1mW.^ZJ\!*PSWC8jGATD0hdmEab+MLVk&_J$RmW/GM"p4em]:D7GCpBgPa'$%hlDa0/eCXkm,'mr]`FqFoc/o?`J$aGD83&&<'`6d8SO"J<@`s`PL$V;ntYXmf65g)7$KhqtVQiYJ9IrRE>n4u:$cVW&3I1l/0+,"7SoE2&l!+X]hg?Pf,p9i%Kl4"[bXKjRl\O;S(Z8keaTLHpUko]Ci^Y#kZeTBVc9DtK1)f)G;(Y5%@T6'.1F8_^(b'<>+BC]pt=^[?14@p`ud7G94NU"D*[,K=Bpg]&alI['l=.;c\`T(rQ;g9#2Y?#\]e!u\0B,VI!)B@=ljb0't:#C`G&#(/*Shonc>K&]t`uG+P=?[hc]S:O4n`"0u7kDL'L2W$gd?XhjUJitmWb,D+ZK?fT>X^\OP\IrnFoMHH?br!%$2ZK*-2;O-Zr[%+S)J]g9>k9s_4/BSkW6/Y,c%HP9"29j$Q$obKiDG."6sh+m>U)r,`M;B5@2Bf@XtHm!#7b!$EBa!3!5*J.)<ku0KW4EPP+,E4\n3AaS!S9"3JN24cI?[`o?MJb4=\sMo8Z7eWXk,FfN`g[=&^\.dWmqaSu6.pj47$E7RC>nEsFO1pZJ+.Ef#E'f?i2>W,f<_dM_7.&G0JiS@)4QShCC,k[@<`B`SdA%BX0;:?a;gSQsgIM)S[_/Xo/J&4eHUVL4W1qPCs;>>@;[t]9!4Ah:qr$+BRFScd$ZDh=CL:IFA0'3Lr<+CqjTA@NFFo=&j@iSuAq[RRjik0^/qn\m=r#r1e&)mhLlo\/(0+bpbqSn5fXG5$s.&KY)KUtl"9T9e*0hiXM8K<l7)DX@F8#=,6`:=o:0$U,g3+4NJf;/\9X'r"t<3[.(1Jr1`.DB,#UX'c8d^rj&itmK<Ihb('ipHrO4?agpH^2mJ>E$M?Ehe01E4%-)Eh$uBAI6pek[UjH]sFIM=6fI`.[kBm1B.><>q]0ld.L*p>10QcZIJN)qb9j\]Rbr7CO`8;7sATe'.M_B6ZEf\X!u+>%RC02\j(b[0CVL!M>Jas,K(WTd<+7Ypik_9JLrF#BqT3;7sAM?c+IE:Sg:S(2ceZZVR^>]p9Q2NTkNAoNT6:$`sMbG%b:N5Z-Ve,i8@*CqbN$X*;XFrInsrtl0j=U#sKC-'C_!rJGp@0=&8=0KP^)F[0pg^:2?3)MXs`5gg=;8]q4A7pCeW(9ZgFU3u(6jmC;JAZApBOA^\A%o,Jf]Qf=Q>31A/('WB;-g-RTh<Rm&g>*THER^Xj.-Zn_4o1.2XkgAApJ_@dRdGg00i=7'ir[u<$K$5ud^7K7HF3H>GV]7<5VB7Y1_ZNsN<rn9(Er9c8MGgE?[5`2+N+A:Gq>4q,!5Tqp-i=n4F`/8t"gZZB-[[M3Bl8ZVBT7B!^Bn,+*Ne`\@?"gf%\3\YJfF)@2nVZn"m)L;l/_bc]<o/umUri?[^`WU[?7/n[(Lu`CR]TGOO6i,k`Wn/O@(7mYTSMu"BYFKiujinGm%Ld3q:S[4:cpK:Ro-MrlG*>Z[^"%,e3WAn:/9G-.H3<>?R.a)K**?4]>P4>/sRtO9j+["1/+a?EXn7\Vn;OVhNI$F3J,h0nRGSVbWg8`?^YN8u8K;P"Su?PpsuD34Us)_YCP95;F9&b].pcKmZ6TKPKN3:;'C>c>`Q[AjK2"8P4('bK"$;4Nf=LjX/r=X[aIgU7W_=Yb`17L[]%*SOV.u@(?*.=&hH=6Nt<p`]^=SrHaPc4^5CE8^DdJ`IDF-+7Mg>fP5bsE'>3+[eXdtB7n6R/WSR'cI!TrNn\l=#O06(Deo,^rr<2urK"Z,?<c]$'DN[.2q>%`?4C,W8U9=-k[[A<-+ofo\^[C`FUW_D,)qX]`8\M.[u<F4$>rsn^GN,qQLUk&G[*@V]1T-+;Te^FN$S/'\bL&Hq`K72`8`"62ra61bHM=g2)02-H0/mHfj,sT3%/A59@&lMYcESV*L*FddJU?Mb!5Ajce8KpUt)Pam!LsCi'2u$=Pm'PL#T]PRi;R=goW!orIjJOhRdt$QLYKjM\U%IMo5^3rjKRRDqU'-L[;)2ilg<D_d+f[KZAAt57h-P:To#H=r-Wo5-:mA,">kj7Kp3$6#CFH!Z3+]/C3r>&A`2tE'XV'5o9n:0h.9q)@QdKN>*QZ?5+df!'hPS:B#mt*o%5*rr</Q(&9KtEQ2k71/t;pi:>TC;l,i>jX1@,2s%#qWqg4_W>k`)d>]Vm[gHBkRf<9T-g8C^4pFoV@@)=Y,3')3$"<@o=.<$[$r&2d/a]d12@?(aUQf1:[$>i-X__l-0oRhha%7gAUOW@e:AM`jgiXJ3F6f(rJb!I2*I[d.VWSsidt,j)7WFC`qK/KOo[!L-rrC!h`LkRFNkBGR^L</9I8A>#Gc)Un*QAUWSho#jKA3<-!4Ro=1Rr[0pMpK@duRj':[QW?^E%jF-]sph%Q]II36hNsp)f>5k6L98HQDs/&WtOplfn'_HZPCR0QY)&p?S;u1Xkiin+dLWa;F[;p%7;Fj3t1PJbjBM5F9hJPP)pY4h]2%oc48o]TL_C4D,a2EM(UMCa%u%GfQN=j.(;5jiQG@TF7?Yl0XFVIXSaII^hA`I%TYScV4$#PLbf84b#,`+4PBQGr0t7W'0\>f*B$9pZMV4F.]@JrGfs>G"<b9T"TDU^gkhV4+2,$H4Jam0B.&n^S(RsH=oG$PHZ>&_;c@Pn^qjWE'Cf4%mgOA"-!*ek<Amtp#p+f!+^EbJW-0lcN"Q;1!dNmpA0a>f8m^i4Us9.Pge"PcVSXRi/YQGn^k;V\H"pcrAbb9:AONB".mOn3Ae8ooA^\50RWsEiuJAF5)IUql.kiVpZp1FGk<!6*1hXbj6i,doGrE&UEY4/PE6+;F49RdT0q**32OF_*8kitr3;3Nq@A%BVN?)K:E4B'ciS/^?@2D/V(Z_5kP2Z!4klPm0"_Zb!b77@niM/XS:2I@^JK3Kn68$F`^%T'OEtufH,kAQ^Hck3SVL(lqAqrCT^BX$3R.ogGN_MG4od`j4_Oi^:E0cC1#K00h/V^E*2jibj0qdVP".WW_8\Q`;IoMdL/0s(a<s-TH49Q+dY!^(c9M1(5&>RuPE'XuTEcQ9N:u;(I!,2MHN%_#kGM#C4[X5)*:qWC]_/0D"pRZkc?"SYa$,9e14!JMe]A&[T<:2jpZJ4L!;-[!;p"FaXtW'65>7$.:>*aclpqME]fL[>Dnol?5D!F+Go_3pgNNlMl,Tu"3<YinrV5j%[n[D6c`n;e;pKV-A:>USrD+:'kIi&(#@-Gb*iIbkr=3nudEag8niDjgo5s&?%o:d_EXr<Ia#Ot^pWp)D!;23L;Fp-S+&?gm,8fmj39e3b39eafa%r'"rD,_18\)MrqR:P45WqX"-j8UD4T"g8H^t)FkCM+o"U+AEPMa+^%R1STR)_LM6?sqCTKF26F<dZ--_@"%BgEuno_%84q@B`MqW-bNkE(+?qK<+Q*HB([nN[JlrHn/WZ1L$6G3PVk1;gUDMZ3Z[6':L*an>?iF85A!V9=0,r-S?T!$-#=j+53+NoR$5f7J@uO#V$JJ!PENgHGQ:,FgT5i+%gTClY=fA"8TWfK\pS#:#3#!-\MIStqLq)?<^X`Wnl_nEp%#]T20)Y!8'CkGN=qj+R?N*V(n*a4-XP3R0_X8il/"aR?r/p`/i%qG74=iVmoQf_+2!SFE'/-enHX@"4eTLSZU_3TI;jn`k2kj7DPM1&V=pc>k[]p^VWIM?$tYI1LCjUZd+^qN6e5SNkFr_kq\OU\Q!=csZ_2n9qtR"!9i%5DMHhr^#TFl(5Yn;3&;5ca^d_(o59hl.\>le9uD#mX"WqESET`A:=V%^7"g!3Pd6#-U!N?jj/FZ5669;_<8Q<)'([XK>0XK#F\-GHLm.]*o*8u+8pTW8pbZq3TT_#HK1U-c`ngcF+]%)_q,nm\]:\h1"ZIQ%m6!Mn]+Bh!VGOXFBkF5lc+"c8$5qXan>>O-9VU_U&=H$EQS'/E&%DZalBN`a(+<C3;bS($-`H'+S@,D3U>1=mDiU(5.t[nf-e&*:7e":ale\s;fI.=#T<7>fFE/J4Ro"f`b6GZHM/R$+&;btn_E2%!S`c_@JZ":-`?Y)MF53rB09Q4ES$9',Lb51)=?mah0S`6@jf#ilcWBOE&5j\T2*:o?lXYG!+'q5j:$,pM9d7+St(.*Jk$&/]mm\E5H]"QF%d_N*;728h!d&Mq>Dbb0MY,ER3,@Ya)T-q?XZ20DOjSomQ9s"`/_@)W$ePloBm.],G4tC.0m*?O&>5phi>7n4aWKG_8uHc&#&^aq0I+>!-]^_*CbBck2^uH3Tl8[`uKC6H_*GQJ!8"r%g2'IrqC>IN:Hj%@C\?<qKL52nis,<Nq<=]-R7s/WVb>g@K$M85tH'Y7Sd?Yj8s],1&>D9#X,uK%S?-`NuWU2j0gX&KH0J9fD2%4n2_Zk!*'"Jh4O0XU`WD'#:#gAP'W3FHQJ\b@is$WVON=d6.\7)5.u6^,Hp?h:cTE^gBWb07PTjGa'S[UJ.r')e8q3Il8JYB>b?*5dnY>_^uLB;Nh&2M4*graa\W91ofO474aW,-j#m8o'*K@GHCPI,F3#GX59\8O"$Nq[4`gGk4n*HTd#Rb539*.bO8f1mBtIJj+/a-55L1?>HAYrd?npDil.`TG"7HYE$m3Cb5@/YU8o_n\f:Yrg8H/ZPk6E:I!:i.jW'=V(rr>j<^L[<el>Ub#U&P*UI=6AhTEY8(i:6gIfD>Jr>c2M]%qC\a:N?@=P%^S?!ccg6LL-bU!3P.\.HC6ro]u?`rrB5k'EEcqa#sZV"u(>pc@(/KFrZH\f_U[#e++Ld-ii[`H2^1/4E^%MrY[74*.cCbTd9<Of=u=i72,`h)*Hp][q!n_o_hQh1,=<l`rKVXG@S+"J:7Y9!4cA6"F>.@,Hh?L4Z`+/a?5&L80,bHj.Cdb;*YT5PFhSWe76sfrr@l@dZK@K#Ho5(5<SWe4V*"\'EFO<4QN(pF;b(Q3Vr\g_1k&AN]?G$FS*]QO#0^!$]o`3&in#*l>SiaUsf>]4\$K6l[teb3QJ>q.%geH)"mP=p,N5Qe.1=!8DoGu#($:L^&EJ5XV=S5'@_NFT?MgM1-\rV+J(aB51q=Q5DR"U'Mnjpglmc:Fj<clH=VGC(4jK^]mi3[J_Q.270"a^bK`,o*QQ;,Io!u>MJ5;9:T;D?Su;5ucQ$m2-iaBh#9?D9!')'M,EAFDi6F=;gi:A1_jW!H&-(;~>endstream
+endobj
+6 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 546 /Length 56520 /SMask 7 0 R 
+  /Subtype /Image /Type /XObject /Width 1271
+>>
+stream
+Gb"-VKm+6_*l.;qkck;C'3nbK8<KW895uCW."rkA<$CZp&g4]r#'Y8_JkI3m_,K:JS_9Q-2E!?QZFfp]c96S=YM#InmuH2\>l4F:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz+ES;3]K;@GF7et8j2^R05AF3@gn0#`DLqYo+$Vbc@[e&HI6;lQdG]_%XfKtc8+.PPS)pX%:SD*g%XF36Ap)+i2(L>^>BO(q>.a?'7b[[](S3[ToCq_QgToelb%2B2j]j'no*a_&4.,WtikC\WY.hO$q%8)u*\qER=7&mh[7P,d-E6B6.=M)(r;-#fb^J.SjqA"T8h8ocPLg,G-b^\6[U&dLiehO-2RuQ:j?@umba>tOqr[55hu?dU)'5#GW+p%`Qq_]B`jG_#\^Dbg]ZlebbuuFEX;AQeb7+]_%fimoDi38W9m5&hjJj57@B-Trl`ZYhHM'RPk`6l-kbb5IES"sM#h(<1R]9D(f8I@brlO=QnC#*$k>"6`s,Mi^]NKS%ag6A+($*,Fgc3kec:(-%r,jh(bNEs&c(D\Y7_P`-.^j-EZpU6A%V6C]6.(UNMC>QXMsdWh.GM>gF?5mW7_Z3?ma!f\p_Z)5UXRm$!07;)p).bflUk)&DH./bg-OE"/%OV.isT.,@)!,Jb8TBcSh_AJ/ss9._49]O)%UcNr3G(nS-P6RTB)==:S,5ed614,]kTDLr`:Vu'c'q(/5lD(po"&Y9(b[QF4f`)"/4ZMTkfpO:;5)N/'e+^eOj.i^WlJdEoa?nB)VU;LoQYW@[/;79s;R2NpRXtHhUn/?O["D\9.^A=Igl-[k_GbIaBWA4n!K4m4`(tCA25iZHAD0KK-p8'c3DnCPY&rqN7ZfV<_s$l2Gi)r9]#e3>Xu!Gggp9kFk!#EujOu%UT,2Agf6JFW7s:G+_A40diL:1(`6\O4l#<hq[[b.VQLD(L;$N$Ot[j^9$YR-iUD`SYuX;Z^f<#!0f0Rn/A?[1AO5bTKu9&SNNg.CTW;?*E"b=X\.RaD;->LIdJ0W*noH0cLN@(rPP<O=$@]5o%u;KaL+It5DS?aUdVt7Km1E!@1fD54`iaF5d4G"r1a%^o=;e3?\%\hDr7Xb.nZ.GKmNDoVS2FcY24uL)5@6Ui,%:uh1iF5^(Y\YRTfLW^!e8cNDG)8Dtb7S0p/Ua&'#<<pj(#*LC.=@"E.'g6*Ac!CL>lAg9sT$3tb$\rIe%l>QYE"hBc1RbtWYtoGnTmZq3hKV=DALGGC)2*;08Vq6Qd.g^8R>e>$6:ocn99:$@_Wf/[,A1F[P?lW8.s2N(Y*]9Wp+Nf`-hS2pPhd;i:p"M(J`L/jT%0pDIZO;a#qKZ?9&;!<#pJ`(TgJ$s`ceU,]#:Ru._pr^6t>L]pq@VsX7+]iK<k4-ch]lAOhrc%ph-YD<LX1KL4+#K\D$i-gl6T=8cZDCKhPr]oYh.ii\>U9sBU11l2h4_0<,@'*[i;-H?S^'D1Hku^,8<-fqRhS]8c#$&3.AsKokT^!iXSp,/r'P;VGhr>?:S6ji"V=MkRo8+$\':BifF[*nX$A5'k@=j+Y)aYhIG8PJHAtGjO_R;gb-e]6rIWLPXqD"\;)*?E=(>;db:E`"9V8uR:g:neF.;^K%]?WTd%3FHh7T/Q#D^`nS'Qsu!!;$GdU#6UKk=oQ)gtfMOTrB"h4)33Jp2Y(#hQ5ZqmuAsV[Hd1&EKQp4aNnCHT10ZfoHu#2Ud02k.WDd]'+SsFgff"'c6oL4YqECd7TVtZZW=PR!<;&baZ"1j$71d2)9El.]9T]!9I*Z$+P2gTMa`/>A!"5a14"(X.">)ClVnje"K1h042Hn[^R78=uQc>2gS(f@)/%%#]`eI52WLs*9>EBQ$NXVPCm-=(S1Hc2J/cB$biU/-p>2?]/8t@hXB26ntuQW9tkhdmi0lMf4bdpESW,3*:[Zal:53rRd5(`!C2i5kO+[LQ.ceQ.<4e>&aOkN&M1!Sh7ruqCY)P3-tU#*XEBGSQNchA#N14i'G9E#@\ZDo2`t>*0(PCYfa!,ToI7e8/'jcoa7Clp]M=gffl>p=.nql:%ICRPs!(]5BhM-j\5c2@.]Wne/7[BJJ=uH-dApm5VIPu/[7N=WmbQ;4#2;J>#7om?K*Z0;)*;TW?!!/)7;!is>ZC'N\bgK@*o87'Y&1Y<c9;ee@M^'XhNi:Y&TZda<gakmp$0(]j5o_>Er-)TO=Rq`l"R92;4<)AWUeTGRsF**+=KWM$gY@)h_S>/mOhuu,&#IODTepC8i?bKSf&>e]QELMFe%chNSA0(dm^HD#]`eI4ZdTJ]j]&N17G[G-nGdt*Q%p4>WVn\AfXV)R*PlADM+<<\+35:8afuZ'BDn*]h*Q0DU7b8ntuQ%W<N?;+$P&dOd'^R\`u\883d-]Z`*)_drjSAI2d\4o_%\sCZX@*0W<a(IaV->3*-Ph&OA$!eO@&XlFIpj^RmZ!\'l3"K%9?VCNNm)mQ91!Z('"_7M,=TQ5m#Tm-&jL>7\n1k\A\/4FQdo;],f?J#l>Y@%^qH<ZK`bbN+(uZAN_`gcAF&fXBkg1R;=F)]g5Jgt3M'b"n>;]p:`['ic#8/h/!I*jBJF3V?U[dN^f;kmT35NNR!eKEq6Y3h:[A=CppDp=u&n4G`)(BS2$oQS1N#Chi-C:^=Pr`D;3t>-34GEam6!#;Zhi#'j^i&OVLnroeh[-b$?L)EV]oPK0ksWWmJ3pN[7?4nD3N7TH#bA7pRr4BZjr\F!+@<*]X;.$+3?nWUV`8VO4H.oS6=f8[r.TC#n'JPbjJZqb5p9**Z:1b.(Z\nl[6JiLjM>hn2jZ1Xuka.-+m5E=X\Cp!fS(o>o/l26`!C!MX]d@=k@2<eFN[pdLN?ZnYSH9nP]Q_'5$k,KgM\@/InjnjFq_NVqF"M#r,a,ckBEUM0$MQ`VX`B?XkQ+Y;@MU\GI6KUIUKZdUY^e]IXG!O5>=1^cB`cY?GT.tJ)=HE`to$'\8"nh,fgfoYlnrpZkSN8<NqsH]EZb`pT"ooA/4ouN!EDZ]#Kk<fdo&H]eGjO4RHa<(,\QFMS-]["!iGHinOeoo7GFdA"rla?'RP^%7E2+W`E`"Q66Z:HMCE5Ji<Ee3B.D0ZUbiq3]4al^&Aq<dbHcPM[;N+XgWnSY.nq=,*g%cpX@pYZEUd;.e@dJsBC<n8U&JiJ"'EB;Oa#E6XFQO@ZGKN1G)KhcDs0/38>htPmIA\JhYgr=0;+(X>da$#H0;lf;=&Z!b8MuTmE(]"@#Eo_[6C3`T592t7J)Oai-B6b8G1=P%UGn/SZYA:"Hadq-StGc.l.c<5l-b85d0l"1Sfh<\@lB20DXP_3ldoCHB[W*mO9gC[pTNI1^Dj[tdb)eX`b_Xt%3;f&Q$"_\KTNO<+4Y-DUN(,UWrbH76sYr/F^-+oN1q2h[k-sPKb]?P:S5:+^#Gc24uR'oV[@@5.C^@8a9DTmkh>$$3k#N!eO5K,*On4_W[(]U&E6Fg!1uJ'`1.*`E6k"g(.YuDI[)[2dalq/1FJ5JGlRb-A#4Nks5h7C=62B/otk4h?+5h1<Z\3pU.'Z[W"kM(CdsKo*MfQBGo%nG0+_U,mCa\lK3U'I8cYm$E?dCH8<>@]5%RlsiY30UXC\,NHqaEW>L^M7CK=cq\c(+<K6OM+c+SE$\bP?ICX9u7M#V,6cJ.Yd?VZD@0mD3?mt\#\f7%][WLm@b4:<^)[1A(1alSM$74MUr"&9u[Kph-i!J6pV)trKX*kXeABB_PG2^N?K!(+uSJp2(d-G(b_*Q,.,Ye3C;C.<k6L_2@Xm=q3^IM!>mhB,h*GLP<(6]>c[Xd!GDf^8<l?e#bL!^T<1g']U$^2PMH4F1,^Uj5;r#.Z%-Wan:0!/.A9-QY++-g*PE`E?pO?c`VeJK<';&npq7G(nC03s]kX@&&BYhLD6hDP<5s'WOcu,b8,,#BJlalC&b$!?U;O53_Fj"b>O,IU6T]SX3RX_%7jrAWkmk7*#IqgU9l"c>l_"XX\1B5XgbR/@\TN<d[*X>dm-:\cBEVe?g=,BtqIg7?HilrDkNj<t0[0B#2.Y!ON,4BI0#>T@.V!&aVt'+:)ug!'W$*HQ6'6.`?pD!2r4V%JQ;H@B2NSfC>dnoTHN4e?[TqNr@rcM'+_W]mp&h:3QW5o1uf3^9M\6<KW:^\TdAZMe>gm4.S5g/GJDpS(F9>4TAshesk[;fY%4;QAsMBSU#>;g@L(1$B'd*3h=)`nEt-jG#nUM/%LEjF#L+B=0edi;^WXA](,^gUK:Hk96\Im<P%V$JK3_d(;.i%STk$IDW\\"okU^HhVeB!Nui>FhO0Rms7T0Ldhr8gRuA2m[cBOb!aZP''&c;34R2PlN+)q#HAMq"A\gIUC+=W,?@1,+$eV"S04G\;*BS<%f3^0?Wu(.bj$##gBo@Y94jk^:fp!%r6F=OV5B#3T4HXn0Kp?E8jidB?5#`58M2(,Mgc)DD5A:)ZQdRfs)IeLF;:j,Dk=QH,\h&^,hm;qJ?h4ee)nkL*Dpk,_9_b?*)%.'XWu2N+1ql>t-,TqjR6,K9ZDH_PX5<$?/.Klg8lbU`B@ViX;WIL9II_^9Na#(p-g1H>pQoSUJ"<ikqNUBAU^un.1aW1]7pN[ko'B_,%i_g_A&fml2^XWh_8u+Xn_LdRN>f)$pGr+oDSIJm@,H8aWKP6"pep9L7cSndM_QG8BV1:MGpienO=T`37h=JjNK#A#\+]3qU@";h[Ha*iUIqM'_jL-<Q[ID7jjZk+`S#D(_@rj=%KP(AGCf\eWFsOgnf?RK5F4@]E:PQX/3cs[RiTj=BN5U0Y$UGG>kt*h<;jgVNLIh%8bF"@M?\,>>@jdC;UJYh5'1Z7Z@\E`;clGkT$%lsSe`n^_e%4d6qj>3fV")P,1g`Q)cf1LhsNR;J"=(,"8]28-W8u:nVsr)D7K4ZVl#uhY,%3[*c]_j'^(b$P)>cf,)dSJhNXe9f>A1bl`([975,J5,YlB_Th<l$7#<^1iLbnnh"!qHil`p#'6<6b_ktZl`2ToEl9l8QN/p//i`j&gi$tG[e]Z8Src,12[k$aBp3B_;c!$7-:HnCugMbs`M(<oE%i`H0C7p_/2if%BEoWGpf1Nf)nMAnT[eWDc\l&,>`G3%H`'mb.6-PdV9:qKOF37G?Bcuh4SN8?b?^p7_KN!8/aIq(pbA$5J=]G#JF+<o-krV=5C[A&57K0Sub+)g^+$4kr`/F^^+HRZS0:orGq+\GYEQe?Z>/_*AN1Y8SrU[lB6*=O.9?nGh40;&g;!,6D-CML[V'jemp=QC@#YG^q;"VW"B(b)H.3\P@JKf$hE38-'SMbh^JZg*H015[ak4VPnn![u691tIDS!]!.pKl.9\YjGr'!\QbfmNN7[J\LKN"u,'71L?NB()mChDprk"9m=k<j_FIR;('@LX]\*r\_Y2%Ni-^HKfkM_E>Z$q"L6MU+`)shY!0SJ$Mf''%'O$0=9h@'2/7q,n&J-9i=mEa`m2I]*qcC\7jf">b^Ub4F?qPY;:?[e*OQsH_n)f_7]`1-Z&1s@<(Q':$Y0?`hM$k-N>f=^I[4b/L-+)MBMPS+2:u6<ODbnD3=TNgU0]EWK:l[rA#iQOj@[PFA:"N@qla/&6)KqY"/4C\_5)NbD)4m4XN#j`fAd:oM:?"&EN,AZ0[(F)O(2G[FE*gG5LE[&]<52<3`Rgmo?EqQ18^kK"1jFD/"4\\E(H^/:Zrk!\"GR$l"!-[[S"]mF=kUC?esT7fMPS3`4mh<YR?2DjK6q62Y_\((&<YR58+DiIeubdrs;?7]Mf&`TerG0,:'"T%gG0i9f3-fo\XG:!%-a-][#La&20&]g[Dk.fE@[:-TZph.fqh>Om@)]gho+Ed)?3op$.$)1BH8<!AC_e!:<FOiRC&9=G@GY8Fe5d[-PHJ%3/Z;=FOWRW>:\8D.Zn.*m2k.ANE"IKk2tpaLO:;>#Hp1,"FRXr?D\np-(cI%*)kQH?NA!$UFJS"a4PQ5P%M8ZJX+V>N,t\:KM[="dL(gkC4uP2j1F^.7>qa4%J%0[Gnh`*e\=[?;Y6(b3K[3_ClmG^ih:ir)&RT?bp-SXCqe\!V4.R##7[)oR!eg&)FM8u$ga%iaro/MJKsC*L`Aq&SORN/\^cZ#m?NhT$'.\OAq/-]R"m\A,>tPLCiNlBZmuV3eG0=(=4u_Rj6NFJejZcPIM%RF5GE,0@l2\,(uSock,/R<ItUH_4$IC6[V_8!!;+`ug\3B)i2KDr26<)mWNCX<H<"1qBDc@NKD`+NW*V=HL/7gZZnrPNSA)0=<K.]V!:&q>J[JVD$2);,=?Vk3Z$o<QopLXt[>8T;DO[p<m&;]bR-L-d1Ek^"mG4DS52dA!tMtYcF9Vf+3pJ^\4['2Z2WcOIHr.;X)0O'':,=Ec9i_+\t)*kY4COYi=N`mt\#lp$.1g)R_0;[I@_-+J7uOp`&;V4b#PBbU,Q$T/EHK`@m&HS6tiLa(Dp`K&<ADSeo.Q9["Y/%ki-)NOk?h/Fq[C:B,X=#XPV"rWKblg%f!'Q#'0m6\Nl))`5@k2,:7]ElF*lU.'Zbd.68&qrX2abD'dNbGZJXg9"#JT>sZ%4^VL_e!D!<\sE1ISE,jYSA*12Wfn;.EYj%Sh!q-uWPa*8oq47b'fg(QX^7iJ8L;&A)7\G4:"$/509"F/6#N+O(O0Rf4`&du8L]8Q=&#gVS.Fhm1-b60-T@Yi/<U2;5t'NPZ=)MiV]H2]Q'>EZ@C7?Y+0l'N&`i4g/BF)$^+Z<?5F!$rf!N]W"oN8R.aM!lB(Rr_(ZYqPIbZ:L=AMGG]7BKbmP_+fZCe&_d!%*6Qb_Jd1As5slsFqZF_1S.rgrj-"'65Hf_o;2aGlL/PT)PrUWY_(g&!,LjITUr2V+-OOg2$CjfqKd[S=JbmC@fE,fhR`o!J!GUmlo",dH[POfnNrXV*:ldh%%;<r24=o$m8>oqJN,jqIkgM/Z\+82tmH#qSAm+BL2u6*<32`q@q18:=L\VHOaAK@6qZESP04WnPlDpY^TB]k=#5j%^V]GWp%8SGPGC:!8iZRe%(6kFm(4BR'n8A)kI^%9_`LMc6I]nXJr\KnUl?6=h^h9o_HK3:XAR*cuR9CCbI3S9e:Eg@s1i6!J)+=TZ0ELW*&]^=HM\"M&+?Hbi!jc94Cg[?J[h6YWBNe#77kk5H>rSf"gC+=*I?rMX;n,b'RT"ahe;[*,SK?9Q^Y4t(OL[t5q0\U#,!EpGQ@Olq)FZW+Ol*F8lHVGst"6*B]O[kte7O\"4bh_:mK_Nsjrob>b/142oJj28`h%:5e<c*dCqW$k4REjm[#rqGRo$Z\=N=PQFg6EEECjT`89d,>EsEjG:@[*npX_t54fE>lG\Dg`8ZQ8X*0mJn,$-h:*;Ie6M2dKL1c?G.s05#b[Bb1`gX_31&.,F<bK(CMYs'7sK&oEMjt)Dc`.WCeg8G;H=/biMJnrNBsoJm>/PoC)J[>^GN]bM1(]RV(9UB%6S@Fd10u(+i>4\ZprLlr'DtSp,gqS.ap2G?Ocl]:u7fUH`m7+NX6J-6(gXVjnl2mT<Q9Y/(3@](Cu;pG]XqV3>8@1i<qMqW(#Wogt826]#aaAFWH>Ir:I[S(EXY70e?.(*@UlH>U85Y(<"*#ZogNrEh;l2C$;nb>=;da92`l8V[aYj*t'5h333W`f$;YFDmQ$]QKBEj(uCPkJIOYNMT?-FWJ.aMhDnW7^g>X4*#ts49%-&SfRC`4O1^DbRF]c5,YI<g<_T[3@XZt'9SF?a)su.3q(gOa$>%cjJkX#4KA5u"(f364;RncUK7YK?N:?OSlo-paVWsig9jRgJ./#hlmD2Wp29Am2,Bk.Sot7W&`i4gX=%(5ZoqKed[leTVJTQ8*S,"3OK3K4NK?1[Fe"$2+]b_Tk\&:r%&q(Hn,0AokXS!=Sq!#PUV)#A0'Bid9@RU=+,f+T*TZLgMFrM+pJbpBTX$&a[I5#uX*!0tbJrh2+BPgn^"/Ip*@[#YG8^:7!?c@V%"aZ@[G]sZhYXbApKRN5mk/=t`>.VRMJIl6(kN)\Y$T,">c!j*B9/52de8/l=fZmiL%N>s[3%_<dV&.G/UeI0(sjWt=&5HYcQe55l9.t`nr*L+;HD*N.5)PKioF%7H<A,UUB^I)ngDMD(Uu04-[3CsIK%ehq%[5PHtjtENK$&<X>3!RjEd@]pUF)\36tT7o]B<H<F^9h]^eE;`1/OZ6N]Rr]6*#R\%PjBqVVaLjAPAh5CW5OesHeZ"M&jSd?CU[HTj7arTrm7Zat#&FapFFL*3t0n9oAKWroo..2'd*6+oo2bC>!<jpUjn],Habl^N!%`tC"2Gg\kK$;4qu_5_1L:;`GO>uHFe=Z^*f]'kEWrI3D1DV`e-8V)E_(c$'1a=[+'>uTX/ph6<arU7icE,LRVpVOJ]AcKId5IH^LUc)6ghEacaCI`R3\7F6R2*VLR-RsMbTJatt-7VeVF]H&L&_BY51N1hc]dJY?BEu*6<dTGRZHk;VX7C2?VsA^(<T=$0^1qE4NG@'Rn_c^6jf@O!iTp@6a_30l3Qg6DS3`h<Xt0P-iSh%#]T[Ei2A\XB&P_.`G4&+CCPjNH8]1Enkh7o]^qOW_CE<BuaOSJH+BN;VeZPj[aAoQk7pTW6'Y+Z2BoMK!?.Ea.Xt7ec[aRL&C.?p&cfYas+c2NIqJ#EbF/cXheT8\.rDjh#BB546C)6j@e/_aP?8(o`@d^Q]HZn9FFiNhbdU#JE6Knc#jjHR9)RO<JOR"B!(3-F[np>DdCqOZ`3gK!(8[J2As#>8"eC&2Ph\I4mHr!^aPNMC!LJT2MZ2RI:rbOl^labTBP;]2A+P6+pqFY[)5!a)*rg:1PV.\m'jlf;iI.c3U_hYBh?ZJ%P42:F^^OQ:@fi&Ctrd!_nY%]2c)P*_-Z"W4fFiJlD!!m8pVU"MZ*u=ct5Wj3Q%FbqmP=duWX',%IV($&IX`Be_+BL30HZGBZ[U+2pf<2**#HaR[@EXml>6b[DeZEUj"*NLkIn-I[*qSTh'H%dG"Kh(5ok%q,XulK?+rt@,C1St!qpkE+]j,Jd*EFiYp<=DbMRGM7PkUj_WM(%I;7ue(FJ76b+8ts&R>!<%Xg7Wa;e"P(E-Wlakp;0ZF1Y_<d2Fm!]:2`l[jE[4E[r#smJ\\P7>a0/RJE9NlX!l3XL\U(qL7).JqA1](Kj/<$g-i[dicZ,SnD>=;?&ftrcdO.g68#7jD:Z8X*7ZL`M:%n;XnT"o'],I:Hkj'SHF1f6-krt1Lf@rc1a&ea]g]0n(;W:VsO7McAT&Fq^mfJ!e?s6l'$@d.1`hA%go41fj;![PgU?]m%LTQ?kTU0k_2NlE[sRjHqs/TaOSK6+LekI+Y7ZPn9%qn>k:@V,s?POC>J/*_hP8c1`cPIBgmC7[nKg5=&sq%0%*XHmOuu?EDp@Eh$,T;6dATTSpFLE:L#5:5X,Z]l]^^nbOn!l9oJ-?0%EqVaue^uiK?_6qQ9BM4d>!Ls')!$<P0HWNplhJ1if<_-el:@F^H8'"h>qV*nQ?ah)9QFa:3VPa:p#+\/a(1>["o)b*&RL,3g77B%+6&='R5Q-b!I?$j2o;l!I%Rr&X8(eGGJHh_+$D1F((\qlhou?(Gt,r)dD#U?dQSPYUngA&U[O+6X^=*q;[i..P.MAUUJ>gq<\F,;sJM-Kh1VCZtX=CK.Jd2!%,^E*K\CgqPekpD_'T;C\R;ahY*[Xa%82Drj&JT3f^K<'Gh?[sq3)KDR<mc@qJMgrc*EH$aE(*O!j^;N<-d`GE^U8MQ@JSin[1IWC^2D>3G3PIWm\LM%:]lK)Z?X)o'c)Ruf[l%D5g1VQr:Ab)b[8Un<)j;Nq':Y9Ela>V8aPstXu`2-t^@"`p/`Gm8bQ#$Bc]t/+,`a0I;E6LRcP^G%P&2@3Bg!&\BQ.&4Sg!ZT`_UGFZ<m*EPaHc3G,0gg45I`r45ju?^<:j%Z4_3JCWDc%Xg6GpV7pP]\@@+>Imd45("u9GPV*V8oH/?45>bkR_b"29q]bLK<maflfFhN,T^N[0FrnW/]^K++hRr;QTI9B]+q4=.d%GbXP-dOa-denC:YVc07Z)^?im=$^"%j:B7r$G]3WhrPFG3D2Ods5qrL^O1Y4gS:l`8Vq*--%^+[8__[8\Nc.c_.'$h:%[fSe'q-[]HsM$IQdqZgq!YBg1@V5OYm6?hPV`e]U4>X'St4I.3%4M\;blXi@>$1OkT41;-C8je1GAVA_(mD*b=<!8#W5@;`9?bB+an\XW9=]V^[//.qiobcdgjY4hY<X!Z*NFZ5\alYE@82k1aMm<#<SGKZ=<7>DZY<B>H#c37\e#Iu.H=d(5?Nnij]L32nAr?m%C@mTPW7X'LtpHtd0dXRPe\QX+@QDXEA)#W3)Z]74sn/>S6NREUZ:%rc"lhbu"e.ge"\'da7I%)-8Ee>g[#8"r\8gB&Ne?SVnfZ<)QGn\`&U5phR0D+\G]XhkAYIj\)QLj'PM-I>:[]LJi.p<i]&)VH>o'G<&/1;7rAnU6*5%e5$WMLl<ht.H<$[`)fH5Z.mFa5Y?Q-4=:m],]sMNV"31(`W[,O7Bf#5Y6.[KX4YaC4C>HKN/&57X_-F\uA8\D!(h*$tH^I'js_Z$r:=YA6"1Tru,oi`#ISo@C/a3bYqlgM's/VoGI&h=[lmD8JKIihrju\_<"UO5I_P:[_cK8fhS>hl6?h<kJQY4NQp<2-!]]ME`07J#+TL5(<.<JJX1&mlPYoS86,Hn^#W6$Wlj\qFE3)Yk[84oqV!3eNKNF5]Diu"'&:=FEJPB9V/cegmPJ"L^6.T%^NZfrlK)bpU+k);IY%YLIX+d==N6fg6$g\A0`OmnpMraQ$0nWXgKl.2q4iD<T8-hNCEGO'BFJ3joi5Lg<Us3rc?``7>@tE?cqT"e,"FYhgNOIOmNQtf<;ce[sH"80Dsk'h?2#cL@WK62H>2?n+bjodb#i45u"g@qB?*RXkpctMUl@9b,8e@DGEKBUKG(;Xs(lG:u9234/1a]Vk6,_ie)C=74IDYYu/Z$GAiD.)sPIe?R@p_kSk@HOfBD^:)UgcV.Wi11;*Y&hCMS\+</s/`t$hG<MOaD"G!.$:^V5C2i$B`9)PU#]*u-UJqB;DZY1f4T!>n+kG=2,]-UMOOA`d]fO7/!`[j/se%=5$:KcKQ;?c&bdDQqYBMEJb];kPim`D$5:]@[s)SAe+X-^(6=)Na%oa^.8?E-c<AYhTJMZ3LK2f<X`l1^(e3(CIn4+l=T"n11/R8#,3lo3bKoH!(XB+n;4@qik'pX"2M6O.W?"RI=L>^'1TE@U":m&^!p,M-[8`6l`Bg<4GsX$eA*f:+\L=.,7f@*F8HfJ:!L59HqBOIQ"(D9J6VHf88m%CK+%[j#?@E;b5M`8GTY!5W,PJ)<BiI0-I`I56g&]^'YtSTjW%PK867%/t-ee!@tj@b%Hr/QA0]@\=$)XfR6TCXe@/ga.+.Uog@WA]ebL61+%'7tV#K.Pn_;*a\L"(=raVY5U>HW3fJN*r'+3'p\0+=^J':N5Ln5)<;-GIbpp1@9G`Eo!k!'7rKZY<UV97dL#sB!e($dEjr[Ccn[otpI5WKJ&BOJQgY@don*IM.e,)*`c:td<u.EskJnlOVJggb0H>(j+R@HEhsGE#<b6p=:$]!Jq$8T7H.O3Xfd\^@:WI!kNP:b1c.7%9[V1dgK*hm$V1[ROG@Qd3pKMp?j<f*=%ZXBN-e#0$i8*@EGN5HZ:E7!GA*9\2_IKul3N"U^X;B]u9p,eD(<ei_*h\8^h$>_qg%hC4X=sIQ6HPFW+Lej=#]fSC\\hB.])&CIkG8B7gkfN")`sS761.$W#O)2&aW'Y]fN>T%U=h>G=8L1a_rXC&4J^j$EUW*r34F*mAU;5sOnS.SD5>`4,GI_gZ%Ff\\9[\!8lri/(^kALiS!\Wqn#slO'edP0G\ZO=fU@5-?\k3'&RBk=JdPejNa4&;qKb@q#sa9?\ePDFD8@2gids4fi<4Sa@iU*R5l+A)_h=h<"S+?lNo)25>E-3jbY_p<-jR(OZ9h%;EhVjo"a+`V+IR$bhYL'gucET=*<bjg9Pj!m=m>><qX`_POH'p`MmH;=M<o:oqIq`9^)'?d_:-1N#fH+Zu(ud:2X6bmE4O'77A<Aa@=^Ym:+q\MPpsrmjiHt.rOkijHc_RJm;U%Q)\WuWltC-fmE#`]AT?Bf!"fN2SAa_bsAN%:%pL36)YcgFR?_?j-PZ[VeL4#B9%NQeuP./eYo6iV<DiEYL$W\RN+D:mgJC@f:JB`_BRNG%p&V$0\V`Vc;I-cH.0s+^@[qU%`*22iQe!\l<5O[6rbh[<R.b-SNL*m\Sk^kmJu7-)`3GcQXe-X:N,,)[JMFBD`oY3pM=SFjVh2cePJPn>I*)El)^u<0IFbc>GqmM57J/9R:r'QH2QsQmC\)KZO^X0pnWNIh!*CLkDpZ"^;t`oZ)i0cMQIi$[q_E!D+/,A30>>m\2FV5FZ+T`S&X@#BA1qqq[H78leBV@ME3X!\Z.`@@a#,\I@qK[ek0:iej+5nVf\29rT_Ss]u?gjP;k#H>BW;>V.h9J+RM6Af%rnDQT@i^WJq(lipSt;?i84<4^Ug.E;sM0-?05NF-ZT!##gA)Mck-Y4"K4\9NIg$"hEK*s8(:$](Mh`$`Du/.bb/%SRd*]n4HEC\5i.TOpF'4lKt^1F+M\:nSi&^S?&59g9]tJldq_0rp?E?djI4qJ_Y0.9@MA0NnW^fY+2SA:CVp2in>Nre_0j>0uUH(b+IeO=7u;V)X\oY^F/d$Xh=K>A+UOUb(M?M^3n_W%=5e"7E`WYDi/WO@K()F_h1*D\u$fMf_Y>oK6)Lp4_Nmu'@XU$p\m@#s&\S(=.1F:ajp+aRd[u1[6-DW"hE&\nS&3*MH=PuGEH51WC/&RWFh^"+bS@I83?k@6(p^b<i]CiY1L[9=*<A*h5AVDrDuH?4?@hDa]HaR?Zn+!qf&/k/+d)fmel_EP@;U0!$Esq*9<D\l:kG,r]]]?D+&!_X*F<kP/K/`BessTi6iV%.SoOF%<<Q%oWRWK$$,2BjD$j;N2\m4.'oqWZ]i[K\`/\I"Ab+0N;A":h?&/Z2Q>,$<(&,D)TQUljp:dPkPVtcDuPM$=_"6HdF<:UI$=Q!SpFaOdt]H#cBGAZSL:6_q7M/6=.YDGpK-iU8ro[9C=S7ADW%PYKh&K;PanL#:UW$X\Pgt0>e/]Rqb$1"*iWA)(+$Y\nCPh4$-"7mTh'*`lZ8gB3+*I?C;WiD)]R6QDg-K)ho]`gkW1Le1<@.Oj$f>JGaP)VO;\j`3>CPs^MJ'o^3b8d5D*5>N=`chY5H>7nRbh<A\EFD&+(K`q^*Nq+E(FjalY\U5\Q-aX6b8&\Mm/k[ZsV6Dn;b_H3cuBRIk&[jF>Yi)`/>c=HM:9C&G<8Y:KWrUZTnUVqgn:rta^fAo\6Z)`?ike]DeYICGJ#6WFM7AU7EY\)kKSIFU/mQ'h=DXXV!dJ,j+>aAo[mWtuhhah1pN;!!oM?:7'.jm/`IhTDjj>Tk!G5($2Z[!@8;`f/EA&0L`4a))=Kr62-qea".;VK(esf3^WjnJ^V70c&iQ?6Ln-A)<,lGsc4M-ZF#.\Z]=fB\tF2H[$`!4!opC<:SQMO`h)\>&WsY]\R^J_Ya0#]=14G^J+@9&(0&Uo&%3#n\@dJH?+B,>->>P[IRX>I<t.)*E6ooh>^F`@oc%1[2[,E+1(3NAr_`$YF7b[4HmkV1Z,D-UrK,EXcr>Igd*Qf&:or(:QR+*Ms'W8@,?@1Mh7V2G1G]co)-5]d<ZDTI+LWar5f\:612FVJd.2D/^I=)d5]Ca4BBPYT.O\CB?hb"]Wi:]EnC0&ZuS_]+63cMB's['RFWke\8ftWV-C'D$hM6Ga#[6<p27\a+*gOMVPVoppXu%u/JCLE\_^BoE[uK$@k>\A?eJ'Y_j"Lm4"J'_gEb+%jDTNc)5j2ig?mC8WEEYAeI6I-2]VuJM>W,fMncHS7:a=l&9:IT;opuc+,6tGqmOF".pe6%]79f>ABJl!:^qFQ$Jp31F,L0t6@/C7X;=?YeA_:8aRpgX7@KBag@0(kp>fgj19p2<X%&1to([k&[<0>]no:!CQ2GVj,LbDmN*UO)HdjTj%G.R$IIi3]/]FnuH<RA#^4ilp0Y,Mt5$H8M@mTOQR="SWXTA0:$<jo1.f#[b8?1USlC"?:4"iaA^u&I(K%qJCmX^1R@W1MGB`JDSVVJ/8KpOlD>&mEHqZ]>=1n$+AZRHK([EoA'Kq:Go)%1JS[RbZ@kga=$<pcLUbALVAI,6-ngg!oCF&R#6$$%m=g&E2hZZiLMp?U=1iJ+euI$:_<'[#RT,DYU>*`mOTr0*TBFAI#iZm>3,6=#uop.6,0EYn[skd)j"O9bMeb0/k3R7#6R4D?4.e7]FgQ\A>b%'-*gmJoDV#m)lmLF]i+b^70r>TdRFof>j)F.9R2\9.7TnGsI-K!HeAV:Vn8a=!Z1&T5"<%WY!7@&0*a$hNT@H_,/\l]P4rio,Mj)iMs03d0RjnMfaW3C0gf,+B5+-?qGmeM1OD<rM4p>7u:4hh)/S%$Y4\4IKBNo4K-aRP5dbalVB1e2-R-dQ#aK+P1@#hWOjK<uG0m:+Es#%r+k20&?&-N"<q2;F.JV",04+gUYcGZ[N&X!Q`26-i`d5N2g)HHJb<qch-:m1(PH@G*=#prXDWoH#eURO?6`OFBX0b8<[9@lr1X=c3lEU/&,u3c@&[*^LOssES93^57DWW&`d[XZCaFcr6'n3\T&9'F2m</a$u:JMtZW8#BY?SoMr"s,o.3-e!Fo#hr4bp2Uss`P554rjg&@S.=6YO[;2,$%3N0i\p'!(6_cps9bGM\RS'*NpJ+XEKA?J)6=IBEp[79Xr<`N+OJrmD,*Z;eLiX*nc#UC7#\]8?(:J"FU:dE`n];NG6#M(WN_NMG4jA+&4DTfhWTRMDoPX-`g%2RdQW/GE9ouE\aStnoH@'&?NSL29UkAO>2RYhtpt2jh@_LYTCYDNnH-af`gS/ggO>kc9F9SAS''.3<>^STuk?[XJgD5LS8t>e)JkQ8,XAV?e@ec%m6%7@olf%`7CJFU2!!FX,<Y#c!q*j[A\N^o*>jD!,:3M*`G".cpdW4c0C63f+5`Ru#fKc!`jN.#hS^C;Oi_uUBXS:o)"M#G/Cs$^.6%"_U.RV6dU/p?O$VrmWQ\+>t]C-Rb_>umHmIpD.F0fKBXMH16^s_:"T;C:YV&b]7($*MD^3lQeo\@4_X(k18bLOLt9rUK+c8BPm<6ZP0o(Xd@`odJ&E^*-n9\_*6LLGs'8@!,i4I<DWqu493:)=KC5s=#qDGEKQp5;Z6_c9IE:^qI:?G$_c(2r,_Q()aQ7r>Un_^CL00[TLZnu`;jn"5':WsNf((>5c3=89AU'&Csa*s^?R0^Zntg:op;Z+Cn=nQ5-L4aZBpccr;VU>A]s5a&eQQ+K`@Ca%kUOK5m@[idEnAD]Qgea!o>]C(4oW\*Cm-2Ce\pJji5J,05<WYsms0mCCkf<'Ufk06d]'j*^*#W^H>\agu??Gi-4qm&?iiuS9dSU>e1E(&/&=Ets_Tc2u!6bd[qiagulJG@V1@1i&k::@jDShPJcI!]ktr2j7&LZ"#ap\d*56*A3Oq]Fl7Y88I&R&d,@[nG?4Jb1T'hL5'.ZJOk=N&fimjsQ2DXRC<X]n)S2G4T)4&'UWMg[R+1l43@1gGcP.KG)d#Y!S@33T8KWTkisb>H<*HHfNEdQhQg](Qkkj<37:pgPXI,X-%a(qtJ?;pt)3HJ)9;^<?q)(e"gj[D]f3+OBK9MRJ?@B-?1uI5Bj]3#RH-<n,)fb@9nOj/_#DXd6]O1_9+F%7#Yqd<ql%12t#0CX0(,%jlbl49#q6'Y/VZTfTU[]bbJq$c_kbC>WDmY;fg]jl[&/0^L>?W>LMeIH=!>Ght'87F'.TG8_Vs7rRLJRhAI5=?3Oo%>Q0]\psH-qQkR0/mF=>4])$?+l8qe&DYfYPW)>paEfTPEPGPtBdT]lK<AS^-_7B0gnW`69--N[s#Y$`=kUjN`rDtEYm_>hc2[FONLTbc%1J1eu^4gNfHh?ejQZlW9hE$nU,YO=rgQU0Zh:%>E;pOZ(hUte]&`d[XZAClM0PGusB8R[0-l8uZrh-$hISf`n2*+V`F'lBLhIgC5!C%rj4")M0gp6]C-&46sL.JqA\boR4?[T;.=QFJpc=N9?;F.JFH1%0!Rchu+]P@gslEoXNqu9>=[CM*4JWOD0O=N8"#5$#V\u]l'bb'+$cZe\!ghNN(j9j^c2JJ&4F<rgRO1BDN40m8>)$I_P[*rutML:Sg1:6GJ)F:OG,+BP4-HD\,Qj73+W:oUV`!>26.;I]`_>RLGSZ9i6fI\&F\W?$rRJc8WTrPZ+l&6@,gn\Z>j%$:HW\[k59TWI*;7^Z$dYpD(UfWBP/1@);?KpT`_&26^kBE"<o^A!;pUDF7gN?$c\<csN`jh@B;gpT9aT5D/%7..;F&R7_s(lB#9*DZ`pldU(\CEo)aAjj\R"\%pCY$:aQ/],WG?XQ"pPj;ueN[?_2i"Ni,l.JWT-.3FOj+>UT0@_S8H4FTf<=?)hK`=D7>^7'<T+2W;>k:QNYnd;585O\MYuYAr:/]kRY>pH/"8PIVm0Hfr:4BmGL'MGJhb@>^F**=QC^LU*pDVP7h/m-q,[ZK)=/3CXLb[W6l^9Z`,NMS6[*<jBBiWGZ;h:g+BNR[k)4Q6=t<(CaPB&[[b!91FC;Pa-"m1%Rir=?=>4B[s#D7DeQ?@'K3Vij[$6dJ'0uKcS=+_99"k7.53;@,`j9=E2C68GMiR)&2u,"AdjE2bQUMYr]c^DTP!Sp<l-_?CqEclS@=.]QVZ#_p(uu/F\B=j3Sj)sHn!aIUmk^6J81bT^Dk@#scCUW_C8u^G`"U_d6Gljun%EPj1=9ZTHD]O5nj0E47HY_GW[*SDPkq)fmCiGR4-QR4.1r^I5@7OKW2l8WIJ1:06BJ7QaJK3QgG[s9RuQpWZ$#A&lhX0F>*5_C5ELrikGaW8Q![&-d?TXRk:,.[W3>dR5'o)6o(EIS*h2qq+W09h/7[5'#PVR`eha$c?.d_FP7-s;X57PNYC\LMeJ6&)i*4I\Dn/h;n'O;s_hX;MA=u&+B'rg4gtrDk!.pbY6*>6XleH2GhM\j<QQ)5hRKp`Q2Y-f2a$Mu24a-J3hdaFW:%So9(14\BlhOGN!M::NJ#`KaOgO\cJ%rBQ=&]'(E_8f_X0KaC#J!1aN]K)BFh[tm0r*mMK&g"1]mHQER,NnMG#s"1?FlnseFS,1>$9ajoR@c:@_Ks\)3g#o%s$!dH?eMt?2<B;]tTRUGC6T<'Y:cXXkP0;jCrJ-3$..0h'H(i^kqoI4Yt7ZS2_9'EQk8'm02bAd.GEq^)`)mek9r/4Q4]*6I5\NbZpf5Z8p!kmr+C;CiR&AYY!p5L]%_'F>m&`50+JYNnW^sPq0SBDZ/dp\<Ec(?WYuPZm>oLTq">3ZlHX+XquNbRQ3Hi&`d[XZ5#[n+*71gXP50tHB,p6+#bpl>;om;qhdj,@r$`dCtj!J`1/7:[AN'XX%<E"56kAR>:TKZFu?`pG\m?JR+u?BU#>?-KT$*`U8;;V,]j:%?R?R'B\gGInK><ArgmAW;NjgWB)gPj2_CiEij@V:PsKi@P]h,e73,I4RK7hbf/mOD1Jjq#*TS\CV_XF2$93,';6;lVG"0!lW^)Xr5Glc!I2lich+#K;A"VW$`>=h"9UYb^Q>2PrHWq3[mudIp*+=>?W-"r+-?#\NOK5Y--3h$'3HP#Udq[aQY,o.Q)`ESuaiZOmgTph9Y0c!m/(\33`5ZqKD4Bk?Tm#U"?B6/lSnlIf'Wb!Cn@?DR?]>+;aSfA</>D&sjV>4>/F(eDe^*ohjW0$`S6`8N,\\?=k'2tL=D'AM0XFF8V5>72\(UX`RWm]\WJ#d$o])_[Vi>f\.$r6Vp]!sUZrQe%<LQ`<FbfF`!)sgo#J&j>,Mum5[7JBj4<+Vmb4oR-I\`&9EY\3/m.7u<4X3ClL;CY+X$g1jod``E;VeqSiii._RPg0#2XpXuqcLQaZu2H,m$VQ<q%2V%/@$!R\Y$!oV]`]s`6bohB6a02gU_,q52hcu.DK'Q.LZ8;jI%.W%34Fr1hn"W`Jh@m!>jgC?+og1=n;bB@kMJfVTnZI;>T+YQE,A([J.0O4"YaTVW`)_bfLk]EeF@#8eXQ=R4pAVrk4ZhC?dk"9<54ad6DHgHZ#W.kjr+oe,!j^gE`ag'.J\J%tZQ$![-Pad$*e/cVJ-!E_'Cgmsos*]I'.V<@5e8o;8I]SsbZ$[<C%o09JXa;`$TPrcr2KqJ-nm57pcUMqg8eH#L$qnrFd)Q]ZH?m]=*MqQ-Vq0?VbN;l3Ih&`icsn1^[n6BJ7Qa;+riW@;J%AO]`9D(ut+<(n>VX?@q'_d4s0p[7:D:-LLXBG"5j`LUi,D5`f8:0l<1?iD^9*gf6rLu2FG:+?jLG\_HgkY4jF][lt6djK&m2UFm?C9X;KLE-nGkKMS\pF9)C^r[7uqS-0;jM+2iqFC+dIi@SMC5Z,LCKFe"I.U]+DMdORRI=>@@b,H7;g_TnP7(>9I=!V+p)ri\a`jOdgMaVY;<GYb"LD#S*n6EXAWE9ao4D!Z+BR412lh7l^@l;q.73:LQ.$OlU?X[tXku*5Ufn4;Wi9H9s5.5*,Kc7Ja94YQ;eeU[X0K_]"hFGSDjs?>rUQq!f)/eCKq17U[]!-eqUO@*NFE@P\<Ic@.kG/Jn9*JD?.U,ZS3QUY_;+u@>:3Es=c*/>DU_/O;hcg<i?5V2.-'I_kH2BInG=81Wms->@Nte3r9eE!l-GYu&-"1?B]'&PZ8L16BfdjEIPo/uh"\s#"s*ff(nQa.QRkoqs0C,ojFY%RLC`740QqNJP@mlI[iXASrOQ`Y/F(qH20JFlm3?n^Zgnc=:WW-i.h8i'J*kU3nLJH$PQ6B"mt\!Pk[f,&2d#hFR-(J[O$MZ@^^QMu#e6s#Oii&\<frtYfg6A'1bQCK:gW_-G@'^7;;V`7[SG>ddYgQt\JgBB;33=+13JB*B;YP-s7PP\T.M"0(a&-J\Aln:K]72DbuuHMJ2B:cjMCfJf<40uH2K/\q:c^rDfVJ`\T'4qjK\S+ZC![eCWB1Ce8LX&#SWHZ\&?o4`S&f!1Z`jWDWqJK9ft'rb.+])P:K(:ffJAi57V;]cE#mHc_#R^Sc&--rr>r33,S1gpNMmmnl[$SKA;IPXr;WiW+4$U:#c$BaV[6Se&66q^E:%qGHYS;RsCm*9`K*:H&#EMkN).<e`EFFculI\rs]me%NW2/-M#g'h01KAHi3ZdX8KW>ceUsFhIYNb';t9peX(cXZ`h]a.r*Um/q,'[q#1Sp<A.56cNU<Qn^sBdAs:Yd[<[<GO^]+IFh/&j*pM@?Off0Hll3)Y+1,D4N!K)a.[d7CL(.H6G9PX?eUAk@5,6?GWa.P5o0A?#eO#@uZ,kK"\U$3YeWSlE_BLV&207YWL!jEP0uV/a1Y#*W?<5JjFeY>588-['8VCg&>:%j"[EnM0I)R2ZW#`EmpDq/jF?IWEhjH-)HJ5*`5$X_;<F,jYX:s-ja0M\.[RDi3Z?#c[mFuM29fWlnkifAq[rq),VY'0lB["Q,U[UaX&+7-\?5gk:h"u:')X6)j\9PT/[BN2o!B`P[R_7HPA^AiHIuN`ii:?kGr=^^Sfsl<TX#BB=VH)C3>4V6=qHp]]mk,BUB$E+r(T9C'CqSW+AV).HDQB([\`PJ$"32,kII,<5`U*#^8fhF3X8Z:FUZ/%E<1_'jo/ubAQ`lb0=m'DqE$b?TbXR\pZ,kK"\O,K)AtGFMWs8:hh%mp38crDrQ\Q(YgU']'Rr+cfB5s8=3>$r:?^4['ei-S!<R\6bU:BKJQ.>[QfB__`B5Lg"l4/`p&'+TqUZ.\#0j<IbE6!T9TmQMjMsgVa6#N)_7_V(qPGbc,H/7cVRF+k1<F_i2f__c?m.OFj?@W->4am0QaP\r<^3/%hMT;;31bALpOQ"6MJYW^aC=b)WB+l872HUAK&+72KdPT7pReQi;POCE\/SIM5X0Ka3#.Y=q*AZrK,'W[t8"$nNY+#31+`8Y")oUs"^Jq2FbHOAFRaL3!LEYQWp>jc9Q\n65'',WEr@#=8hHO$6:F256Iu=9,5D*Q(pLieA80A&G^X(d&9TWJa9Ct[@Rr>l@'lNpEj!kH3hp^%K%j7,73BpHQ?*!/5=a7]]Z)Bs@QohcLcEcCl>B%/t\"JkWAQoQiDkJq7aBD%TSNHGA=YnCR2Z),'deJ0ggDa2.i$-7m=Cb'Wgkuu?R'ei@p_"/S4aL3YJ$W-V]_CZsHfsdbdT4l?Le?j6+R_X6nsd=B(M"F4?[s[i[Ffi/]"I-F4Gh:@rdMQ;!X1oPHh?ej=7J\!1Fof[+P2AS+e,r5%+Nn2dbCH]CJ:gT!5W58qLpSu>Cgg!Yk5@K2g8mbD;A![LfT,ZS=b#Y3>+T+XO!F)3I.XgRA5'QFSb(9`_F.1ZN;r.<CODRVsg^[=T0PdeQ??TK3Vi`)&q_\Vp.Wu:f;Y=:Edc2gu:7o;M<f)Fje8#:HTL(St93[?$c):/[c02X6Anbga);_Kr\CBak7e<WQot@:)Tqdp@SX#6M?t_2JnVA37m[.a.!>.<E$Y@b`6PL4;jtO"fRUXm^a&YD1\au93;hl.P&ipD%Ld[qK&RX%DQH0a_MH*=#[9@:l>2F89#,aAkAJ3I.`a]-ee87MD\`2Sfb,JD(3[rOK5Y-<X6/ce+NYNV9^#*X4oO<QbV"t(L$5[pYJTPDRpmd1F0=[.5-Lklb>2>cat++cMLpu$s/`h(q\ItJ$gJYC,Im1b\-mPQGZ#V8'a@_/(2_DHH&ZP#(g+=`jOu:[S:qu^<B5q^T[37kk$<VgK4O`,mQ5IC=S0HqT80=)nYQ'^X(TrFJ7Z[hgXBscQK(DXYf$43aHF^H$VqZ%Gen<p\ju$38Sa./%MkU05<tX=fD`R/UK?@OK5Y-<X61]F5O?<Ol5EO7!uXWqo/+B>!?JljOW_XC"Q7NL#MYl!7*2q5PG0hKHSm[@"PkFk=Q6pVd:Sr:QqCtGrNmnGt2m1aH]P#Dhe/_>40)eS+[QI(Z_Trmci1Zno@jP<k:1DaV@"4jEmT#3U@-(,4e&pK80B,]V-W?.!MBEjW]>f5H`/c3Q5pg;OWGPp"1Od9p-&d'c0d!DMGMeWR&1uRi<=3P<mJfRkKt$STnO<%1qT8/@*elmUm1kb]UsMF+2eZF[!uik>kp@/u_J!g>?S1&)EmugpYHdr%(J`"M$_IY.@k2)E_V95c!2(jOMID$sR@(o78SC=*@tiQKbR\N:l6]-B@ce;!Gn+,5K:X+tV`G"U@c'B)nW6e,!kRoETY&k+]Q4Ad2\6>@k]V=mVlX2@P^J,2E"dqeNEIj7S/TqP?pt[e02W9c1M<`UgRI'qZUMA!(U6Eqf"5UWStl]7_1'S@<*WgkmP=[(grl1i:BYFc5(MG=TC9$,(\b$m3(Sal?J%QRDidgs=D2M]P%0eZTRd=HH.S>L3;Qdc#Wp^Vuh8#>U@2/Ge,BB!iB:et4'd8;oVJ<k"#H(m_iGQd6Pq<R[Z%P,!g$R8pp#6;2dN$/=IpT&6>*?!MI+bph;QrRTuH;h+di@-XPi,DN<@2.F6i,DNCk3-MV6ck9haCtj?t?;?(#3AjOo:.phL]To%umO-VN$!ZMD<md20oQZMq7[`r3l-ctNeTCKQ,uV'MM46G/ZaoE*\JgBB6]`h>4e]le,N=?.#->0TPEjk4rDm]J$XIm$>7cg[BW/CXS[;h]<O7PoQpIl+ipXcBC.DI`V<a/7]rqqFq8;)R^46Q2KfLs`PWD$gT:CXg>kJk]f<=?1QIa#qq+bTYDch.])Qm@!H==pZQM(B1dXM"+8#]^Vq+6&!m,+;oFE%b9p[5f6#Ofs-[C9e0oX`KI99lC.%:d-?]QD0C*P6ONIf9+qdj6\7%PpOA?fJ&"6/t@Yn_Ua9_=i@Y;:[.Obl-4c3\OK.4A.?gC*hVr[H^3\n_8V]"n,(Hb%_'i)N/E-O;n/e&S",0SB:P>X1$(!b'R^5.fAf5S:*9ViO+tV:rPN3enZ,/Y]OudF(8Gs!>smt"/;::T78e=Q)\^H9RJ:eN!0inm?brSOf`00YWrS:Kt4NPEN]?1$N(3NIB5t$hlLC`FcW6U``:9>nRFI?Hr*r)nBAcR:lZUQ/`5JjIel_V]@lGSl?;>khY]D2^1s"o)oe0`dT5cFg"Y%7F5"q!/Ko_gfH3""A'?Je4^,<g<-HA7(5.=p/Q?a>'".CJY&rosVJZ^-s%ClnDP,Np&2SaWp:K#R9#b\L#Bc+Y8ua%[K%q(Wc-=7imoF5MK:Iob]pB["<c\+0"%D(OeW(bR">=m:`9=3.-'R:^igr>^D*oX#k<4gDM>bW)Sb5tN1]<lGTt5D8C=,*,YMV-a)sV#H61,Q;m8V\5@!,8J3mJK6n&akD-_nUYd_+j^fHdW<ZMa\6pJh;3?+Q:eY-;O"V1st>rNA9Pn``8UX8I3RqW,7:iiBp,$.6dt[RjBsZ6im8Fi%W9:Y9^LdSlcs&DdJe^mWZ4l:[%3RGTJHGrols/H/e&1hJSSFsV@l\BWQ>8,Ds.M/]G3e,orY3g?%2k2?A_FDf[s]E[?GSf>i<pFWfaGmupK[bppipprN7jfGi6r-pf%DJ=4Z]Mu6]9pn60O/4:<I,@#"8BXq+DL;poF\?FBI=!P%G-&3p@g7h'dCc0W'cSlDXb#iLgbTZBRPefM7h6!&(EMns/ZhEq93kBUceaZN.;ABSM5$9LC&PH6U5p)Oq<4Na?g.Lr(B%sfE+L,(:-P1*IFjg^?6F$2Yc<JCaJj6Ie:d$!H)@_QTY*tIPnka=2DG_RHBJ):er8F-l:7o?9ktD2?#R`8h"%RNEH1K@e`u*)RX`o0dQ_OGn<bAOetaR]HMkkCLCShW($f^#=W#4N2m2d!B:UYjjU)CP9q/e$\^UDii0(C2S")tHYi4Hpi0^bgA':$6mRQXYn";,@DZ0:erlb*#irf.]XP]uCU%MtSaNHP?eIDD9SX.Ke\g)/pq)EZZ_8L=t`-(qJe/_`@:Hr`d3bdnoZPS*dN^#OIe4,FC&8BpuNA6R9N#h4\B$THD>BLZ`r;G`8^)\:23HF?OV"%[-KrhsG6s7NjhAA4"<I$3eIJh^p"+C'JB\Y^VDnOPl8Y#S6DmT1Mma$@Z[`Ia8B&1Run^ELIPI>6+'h40b^O+"<X#!eJUAmE6'B&Vqqtp"gdD3AWT(Z,B4Jlc;A[?%;;$JD;leImu5E=VVmDj(t:[';A[iRb[hhoXBp?5pnjM+32p/kA%?F6k]CXP=Rkb'f-i?o-`Yi6D0Le5SQEQ#)(D;$>Kb'^:TTB\:kmFj-d<9D2C=._Y_R[t)kJ\u-Uj.HE'>un*n-$S!9(qn&-,&=H(`Pk<cMq4=3gdS/#<"c0Vh5H!?mk-U$*7bR`[Uccu]Tpg#YJ*U]E+3-dkj]N$+IWP)emFn2BA\5g)(f&?eZ,g`+VY^FYXr*?N_@BOhNXILk0er2JN;-YYZ!je3t\MG8NK"Ik+3ZLY8bi<A]N(hgO,Fe<P&s->.73=!S>]7CF5(rr7gRdb>Z_-4`[a=-9BaWC!WBb(:!.fj>1jim2\!'_fl2aFm5'h<3Q(`:7[[ZkdPTnn9&ebmR]u0-"?HNpKh$i+2;]>p<F;q](JD.KE(pjE;\ooK*JLD.b.`bDnUST-2"kNX%*,n@G\*!ktB>C4a^%qam+pkRaq0$s#YT(;9#mLJ,XV!r"pl0?.24&/,u\fgEqFKp!SBn<fJ$&Ibq8T`Po67:Y,Ieklh%uTLu>(EVe``q/)Ut*Hpl8=+U3S:-?qB*EWVd4f]`/<YZef)n[M*CZDb.C1</`;:_9N/oNmhh/lpd+q6cse<b5ZY>)t"II0Yp[`pbZQCNq<GXSntI[[Y2V]WBBS%O1GjR#knD>eUsmY--2MN9s+DUi=Ge1>*uA,n7M&\p&US7cd%aQJ:>/hhD&J:!1uc?>,OAEe4N6rubfAMk/N-XiZRGm_kL7Eure$NU3_[]ZUcQXr[1/(;g+?-k?;BB=?"Q`-1(k*GG_2Vc?T$BmX1/H7s*.tq#@P0T\@@"V!%(B/;MW=Wj.]*?97g?<WE&ZkU^cb.LJ`uB/I1LMcONYbWdODi'lHi`mgj5`$Gp:'+i&&@pd&p&*4R0fMn\=6FD5[$r]M9)d^\ars9,S6OfB2:a,fd]kTJSRVNk!)nM*P$%1NT/^rbS+X-&:N<.kWU*DHdG/d^%0D3JcYoP!!kGSUcDN1C0VM4RMb<Za?a^a%Z>1+Im^h8#Og78/1tf,nk/"t]'_O:/E#OCXP8$nV0/'*Mu(DZ:Ru%qdZ+;-!!&\%FsU3rS]7DN7NSg^p>eT=$gJnX>MnElE[n%"n]tC150[@pDE1uE`AXp7lEYG9Ab"kjFeUJml;2<t!!!!BA(m_q(A?WW"*>2c:/meqlTKVlf^>dSl\9%f9V*!%C+QCB0IH+/hWMZk_EE&$<k2hD=F*X.^Rf&R%Xe<W!!(s;i.2m:$H#o_FRC8q`3?XEQdT`t^f=-h;D'b^b]N0>p8[V7dhUoojm/aDS-(B^8OY[\aKr3]+9_?;!!!!c=O/&3/DN4^`hLa!Q["POguQq<IibmNQ8b,bDZD,DgJW=b/L/<*[r9!Zn!U(iHs,_),$ap`(ta=LnPKBr%Pe"a!.YWH&pMdP+Lc[QW(Rqu3*<ufB-2oZG3>Zi?#(m)8b+!1Ok-VHjB0r'n`K+q9,>5BOG9hQmj(>T$NL/,^gbp!k16PFh==M4(h_[i.h3>65i3"!].$I5F5+)sIf8!B6-K;P5@Ea8A'LL`5C*0!3?5r%!<<*"=D`k,^8b1Qgql8c3`WPoPV[kL:g'@E0*2&TOQfaC#bun%?ti^AO5j5-ZK]I7!!!",]g$sepZ8refg/)To;E8e*@]Tq%j*lW>%6aiYGTfFKCIO[4*cic;,P`]YM(Y<.*.Z\0<@j^i(25q!!!!u=m&OEE_1="/W+X2F]q[g-;5_HM+rgkWU@b8fMGZ1nF-/XCp"tm;t\!*QOPM#4'6lIh=+Nd#eQ!!!!!"lC<Lu'[WU=MlQVn^c/W0n^U([[I=!PI(WqV0@/WmlM!iirPMWr$ZEJ",IJPA*#WR&O8,eK!qW[nN?=@37z^h_/Mp!uPm2<mT#4n[1a&fj2_?e(,TU&&E;,rqU@;pX-%77'JtH0aTDMm**Xf=gko$31&+!<2s\;i5\@%g1o1C>7ki2O24m[*bu>]9Ep3Afn0O/WFaZk41_E%U(\0>Q3G7Q8'O!!!!"L"'.%d?r;uVr3^63cIuNtYGEPC*04F6f2A@jE=X-*g0@:WVX:an)n0FmW!d5[gKYp&!!!!1:7lc-]l'&lnW%rfX+0Nm7Hhgd]7IY::`1FM86\#ZZa5sN$)9F^(Z`#ASb02NUWk(dzTcjA@dq8,N`&mP,9(QZ_Z*QF\]#p%gXu_`Q](N.sGM-+l6N;KbXUB/roiu*ME<#t=!'nr*UK-?$`RdkVYf4nnr%r+lO9N0m/Ih'Ud`u#/^A0,3\fZ@UW/W\O#64`(!#,M?XKlA3Xq^=u*4OVHZLm?h<U==3OP@KTb/[<Oe^D(=7@cIm[4]Oka3r*1!!!"h1Ob::dk_4<>\.,*hS9)o7>lh,%!$,BN4F64\SW)SpsH.>Q;s1Eg6b<!D(>to!!!#oQoJuiFn&5A^)=?o,UY[g60$VU$?BG/[AQcjG[O`E4aln4H-8VAIe8kX;mqqpzI/H0@T69[!IiE$i?Ffj<<eHdt$?DDhg2>Z"_U\t&>;oltXXjGP!!(sIaYO=sT*5J%S!.W#OLoF,QFp>)j$B`.^i4pS]*LQJqRTf[l\!tg2GQ%4zYJ93A#`YE\&R,Fj-FkE)_iP7H!<<*"^dcIe^)$D&g)oDDhs9OKFZCJL<qRSZP<6kaB]jupzi:ZDph4YGA?Ff^8<rM5)mE+0rkF>e8KA;FX$au<(zHs!tkEo0(SXfd'7er.,u_7/ou4N.*;Tt@a5eDj'&RP_Km$_c4oA%%X+zI#K&ZcFS75kb'fA'u[d]Y%<Lq>8lSRWZQZLRXP(o(;>1r<VsbdrTJb2SnVD3z^dl]lbH-VG-B6brB3BQR[&P[C#.\)iRJcJIOe!6;ZU_TL5Phb/g[-O"z\4JcpI/Nc=Fk\2-igm'4[b4f\8X9h![OT.ZC2&3XK=YWB^0P1'O8f+)[5Jg+zj<-DYG$Y9ok-9fIrH$hE43OujiKUr*[@E:a[3fTJkSZVPYd9XK&QXohn'lW^c,B\`!!!#PY3i^"g07SbhkCl-Z*QCpp1=K[<k36g[r&EtA(`<k[oaI-2K+_>TD-q!&cht4!.YWekbpSgWYo5BppOqV7@Qs"WIn2D.TmGuenl7fPEg'-/^9io8#dk.IWt=iLGEpe/eJ'`!!!;R->g)l7o.(K#PM``>b[i;D@N`kGKbm92HQ$&&:MEi/oR*+K:a--df)Q6!!!"tieiUWG3tH-?'&9o@Ebhmp?de`4.)EL/0gJBHnIuQjj(=l7G87"JMsXFC0`EJYFYX`/t7_#z?6THQ?73n,8>gUb,l7qD$5.]6A(CQ<-Dpgnnk<E8bBml//UdWr;6$OPkF[E1q9sQVSn;W/z5Y-bqBk_cts*cI=.9CP[L#k)!MWXrMf9%O4I/1Kro6BSMqHEQdZZ#"e;D\@R!!$$MLga?O,9o]>Z_ff?B(a&sO.A?a&K1A9[$Qltl!Us4qIpcfPC:Ib$%B6s['J[1bPJj42[h/*-)]kY2BEe;!!#9LFT65Ej2Q'SKfS^+gskE6:6f^2dcnR8b]U,71iMLt#HGc_Cg+D:Qh]]?:+W=I!!!"lb$(3^hU362Uk8oBgde5CO(I/LR_M^[5=p;+n7C@M_SZ'@=,YL</2+5D5li4k'-KD"p25&fI)M*>G>nYE!!&s,#5$)8#4u(2jL/fgQuD/N8tS<C%#@&dr4s2tFuC,$d@\Pn.;eTX-**'EJ313rP]L<UE,MZ;doBr^zl^U!2Ye&>VBO)T:YeMup:9"3^gAuT3?H3.P<H:TZ@n1EY\o'\rH2O[V1TT)uP0\].I5<tj@mVdJ!!!!LrA&MNQ1J"P$)b,"QuH5$^HNNU8\P(f:'J9B9'Fm3_rA^t?9):GDVt.o@J,`T_[#Wk>tP(s!!"21hVEbfiN_r5?MF@oZf=50]#i`om:7A)I?K?chmo<0VG0s=X?\);;7fTQPtOoDX;R9,F7ra<1\0&UT-eDt\s*0p!!#@@mrE(d%H=d)5,S,GAh=Xe4F-=95s<MaGuV+VPSDA&3Gqu1TOsanm9=JL\I+"dR.fp]@qi?,0<\SEqW>1jV[Eh3!!"-P4aL5/bf#_j>gq_<pRK\S!atmBeND2g8+)((S_"?@\F)MF!c0$Wgh1P/[S4&Si;/sNFuru+z+`#Z9SQ9skM3JQm_Wc[K3dgF7_a\[:)^2DoCrr]oWq]=p-XVNqXBBhjkrL61aPlG9NW%tag`+k:QT-J\:g)$#HJSKO!._'l:nMsc+5cWrR^5/4GD`$d^G#KA!U#t5p!>#Pm:'d+;l>*:SQdb;/o)?mgraEi0#aFTQ<i?=W?O39&pH%YaXr,qO:ZJ"cD5U!^A.7j@lK`6.^qg0BR)(a-Xb>OTCQ=$]liB2h<b&T=*'ED^3BA1h+Qq'grmeUs6$_$D^tUrlGj6b1%kTtngJ_H&A2:QflF=']%k?S)cTk2e-;?OHilts:o4'srYa48V5=(/b$j,!!8'ETLN51rqkiS(WUJ9`mVI//0DR#EqlI;O\%pD>=6*[_6(N`b<knA?C&abUVor7D'Y\sEr94*u8Z1asg,!@%L44P+3d4oa\nt@4L,&@j`.^eSe)_J,obtm$WZU&kFjelI;T58f+2)CfS:):>(XARs,d%iZb5hSsM?\,^hS9*Zc'tGODi;PDY38+5hr5CdICt""`O=#MQD^=8>'OSo]E<Z^T)%"9"90pn>`sJHj1;:(:-Eur>P>[B:S,i1Xi8oSAEA_]gZj_jmOZW=s7buMJ'L8$rgApgC>J/*ViEudr92[d%j0%ZDC>h-[nHfoWTW?PPB,^7\feJNe4lGM)fT;Ph,NjfdSeBg^V0O6CEdKf!<*Kl`W?K*7-qUF,3mk-hTt&jGC$1Z.TJ`!YTO4GK"W?6.OZ(N!f@=U;(U%(2nNl=#Wl6XpjGBu\bFs-8@E'Pr,u[bfWND4KKE\\AbLbmanNlMX1E2T.#[5[<,j**ma9(.n^2K%hbB$Ibu\Ud4u\un?+b[=`BRr[oQ:[&*J(>XDEc'=e`PbNjL]M2C4OW)&pQ!oV+g&#!!#ici:^@FjC?K3Qe/C)[J+]!pJpYCQ^.,r1F8a]=R_m3/'a.p'et)H`2M(G6\gBAS8i#qY)DQ"LnIptna'21s6V*?;orcrl/?:8G213]VcUX+.A"T3X>h0[GDg!<p)=]a[3p;\4skcsRWDuY6ot#5\%,,F4aI?l)],o*jk1mY>ePOT`OBbMPZ\;_dFcffo1&P@b7l>^jm3f09'if)XSjYon@k7c,;52Jn)G0cp<%h'/pZpBeh1<M8pCeB,l@1?3-TOD8[72B<'-+_+o\rMn&!?1WL[6J!gUVd=#Hd!'p1?<l5%mdD5^[>8%$<ckMK1H:;5d^7ZNMaYpG=CYlXoUrEHu5N:-:0-rm`%,rMYmg4&hmo@KZ<\_VT9fLTj)q50e7.-f[$o9NokB9uYN/c,h-`e3Jm55b_@VC"M_D4M<I92]]c]]"7a5-=/qgZubAT)F8$*knMeW]1?K12-PVP!@g9/jo(BDjR=pN`A1"Z42!#(>?U7b+e"\]jJjf@g^\&-YK<bhr55]nR"s]_<f+41*nR5gf(nqN5F=.[;JZ+;Z#)h7C/J>j(RQEaR'r.CKIA*EXT7!\>no!AoVXJ*u>Z2oZ"r&hr.!K0*$Nn=<VpPmf4Xo6-AD^?YdE%9oUs]I.5<4ikXtT9)f/dlq=kL?TqH?X]fm;(`oZF=,_XQ--ZNR01oIep,4M$>3t!dWD!!JSNpOd0WidaM(qWh/I+R.Y)B?_f'jHu`\lrO?Ld`%gW&gh%A)]:VdA*A@_F^eg4Ob@[Va0/*tVnI(RQhGr$gFC1?A:6eGjm,"g20Tk1Z(U]sgIg<D-+,<:.`OjkPtCNn)X,dsH/j)2mF?P4Zi=.o(>^WqsX'KjUQiT>7QJcBjhr[BdLH!2)PHCWY\l/ud'dPpkcaaZk[_p[9Virt)9eb:hZVL'WC,:FE2L<T85DIO4R[Ms$][9oS%38_.lj0FgC4+FfXr#$Q&T&aXES5$.-?Y^pNPd<fq'BsG@N[cZ?/PfK9EAP<p_m:>he#ekEFmQ50*jN=<sP7e5;Hu9M++?O](I&Z?[VsZi[Hn6u7O$pZ?\%Nupp^%V."clkFMRTGrSGai0(tm$MDtEgap[>hb<pnSCp2[MB!-A>L\H,3=:p`u<3L?O=`IEfIo?Z'H-/3`Ti0Gd:LI_rd>T7S;rHGrCc=!3-GZtV#f)e:A#-p"U8aUslH$D,F?XL6/^)at<g<A\O^*rrMEUKgpJ(HW]cWIpBeGM>Kj2ONMHnfhgdaCR`)qLVPqsXBLPfHQ@IC+CRT)75b=5TW0/rDeeeB:PjY5*FfHCVt6E/2oES)oh\`Q77;Ugt'\@s7)M&/4lT@Vl,G5^+52j>Jpq(d9d8[Y]e;rQK!Gb5MrRF'gBE=t3cKR3D<Ml0#lM_A%B$Nf\#W+]iNiDNsm+p9;-Q4jKps`m$[1rHhJL::lF/&BI!'A00s6HUD<sp&D#B,KLH&dUMm9`f5JEoC).HqU8"72.t6-I.d&gm0s(-$\o1A&it9Y9hm)N))6f0A9M*9b"[3WVS$O)cnK%':<W+/4P_MonPqos'gfuAe`3A7`gK4oDO][DYut_+@-h-OgifU\A,X2/Tc19Nno)5FqVGa!NME=-kKc;6lQ9pRXg^3;:%i.GQeh`LYm&CQNgp06i+`7bPR\aT8YoBi.hDI*;<?qi>dHcm?U8;Fp&"3hifD=rE\/EpWi$uSU0mq.bpp_D5s8KO*^-S]/fU)1G&.,\Mb:[R@B2@HkM0Hp]:;c%?ecO+PIWtp3OG$0@d:Y>CAAar^gae`!!g%L5SkG'jA'1h<USAZA/VflG@6cUZ&;>d4(.KQQYJX[Q4n:G^&6<V%perC\Om.<63t+O\Tm)D$T!VqGA=J92\iN:#)mlq&B\<Zp[0!!ErYjqma1<cs"O:$>C$+CenaPj9ni^Jpc:[_n.E]uf]QN?!d/YCe'A^U`]YS)<SJfGl-Y@?Jd;&,l+P4>m9<'k\R'8\`1YiejAY[5-7eX#/6[!jNV4\Z+nkukS>!eL+litRjJjB^G_$Mah3F9BT,p/o9:d!`'/:!#MAD`UD"k@Gg)W:\Hg\n]l$@9W*P%X9b0AEFUNm%og'?"d('?AX\?rdf^k%c;<P+YplYO1Lq?rVn!*M@-aRq<B>jBQ]T3Cl"MZ!FFTD-'XZRQ]1aW\.-^53eI9)2IRa;%%_<S[$0g"O3T7i&RHgP*(;%bcQ%022=HN'3'K5Br,[@G^5?RX2WPZ;0kjfADG[LL!UbWS2@"KY7`k]e;nEh$J8c9mKIjIR.g]gMY9"O(/TA!1>lmaS#6bNiaS#-:9uimt"a>q`j#[FiCu4)7VQ"$G$';J*^QJ11NY/]+cF?!^a&A8H$AH3cer@2GHDHE<?H#IeZaCpC72BO=Ou8D,L81bE#mr._t5m'O.Y4L[#fi)0Sf#pM!."\(8;C]-/-Ei[k?gH2FJi:%UsgjNk8P33W'+"12te4QPqdIR1h$56g3RSsnqi>btIKWfSa$_LDC%9SHN(HgaY48dMso#e<Q!N.9Kn=+F\/)N?d:ZBq,tUGqi%!MBQJ93-OV*5W,jr',@X.)FG-c!kG(=h?HVldtV%mKm/=$b7d8$.iRR<`k7n=n,t6$?8(MfqMHZG:hGNKNnM:FmtJclGaG<*Vi6=BAYe[hT4LJ(%8oK0n!-aDn&5EgBFBq=.VN/7bT=HFctlfM&'/!+]epm<tTe'?K>:>1qepSNA[;k@bK;IpmI.mbIQ$Z3]&;Vc%#ZsL>9<4>2MK:Z1-[5m'^[bMR&;9B^p_X>Eu)[%L2kTj8s"rK887YqPKsNn"6npXVp!cnooOTdNcjSKD@I:9Vo@>Vs_8'B=#g/?mkXBcS(o?G&m8BOh7)aanQjf4&Z9_1u1fUrT5dFEYZu"G6fcQB^?n5Q17Q:*<8^k+'-UU(=-VG:$8]g0'mqoGG)FXUVcK/P].?tMd(GcC:bnkC[sJ%n)ja=/qCr&GfV3/O&/LUbMTP,>q(uPo8ifj<V"FJ=(B[sR"1qjaN?Vpp5.kZOsa7rZX4[[\[u9e]"uL$n+LRT[:,LXZI5@;\C%W?'D@&'7R\<PF89:ro;BQ-A<iaOI*0]Z'cZgRqrUS56(q5T*1+Ft*!Sa4,%f(^Ti.N_Q@AtPDh6:h*S?XI=,,j=]J[Ak)Z/L?5GDsaK\[]pUcr3/fZN)ibo,3I2j%mJ^lbB9k0-HQZn>k7Nf1aQ\&3jeL'?B>%D5F/oD5lZjF8@t/na;IY9<6/..W1HY;Sd=jQX.s6%90N!#h%7EXhqKE%Q3.e[09GOHNQg@4*UrIo;YT"a;f0mS!h&PQ0=>bTkeX)pV*gZ]e2XlQ:L8jfsdus7ES1]WCrgAM;1khj`&cAs89tF7KVI\8C9Llfu3J)#ipW%uM*BBF)/+cm@b9-$o1o2N9Z74<XKWrlP^`k>lae+g'q20nrr$o<>\;70Sr>>l5"^pMf6^3j(6bfu_im>5Z-b?V*Ido(l@oR$Ai(VrSMF4#U^\*uQ6'>pupdbZZTcVp)N#cqYbF!bb8YOD@W<+guo=qjH/PF`l_<VOf>t]&j+%2Q->&HPPjgZs[dWJS?I(\q-$*$lfuXlK+A`^/e!?gGDEr\9@9%Tr#=AFmBiclXkFChtu^U&qDim>X`<GEqr@8_K!EBVSe@BgS'#prc@GY.#j:j:)t\BIeZ`(G"e\tM>(tC@mQ%m(Zf`5g9Zqll"g"Y=751:,jc'_(2eH`CDtSqqMJ#;4AKW0b3_<)Ih6W$1aXg8)Op,!rVkZ?'Bjf7kb5'RQc%GSqr]G3T-o[`dVV3M2>u5#e+_a84o<s%Vq]\lG]PP"?bbY,2g31Sg-+?*Dd^D6pJ_N8HTeoV=gR+hpuB15B\bjpne(n%oR!<b6HE/[jrr>YAR2dVGpF97iB"3uS6&=*VPQ>u4$q"oZ7o:']9+h6Z74XV:-!2T#Et8&WG6j^ZMH63^AU$\qIJ%8=GphM,)^02pT@#a:6,;NWBlrc#430m/qCqeLKp2&!L4B0135U.htpC'&06nBE;iFIYP@A=$)EY&3ci;trOX]tk#[r<JA7>:[BQ@=C#l2u\q%]J[>t/P1Na:@&mr4(7JnX'k1AgCFS2rg_Cn3??R1;07;*HWq2WT2`^SG-I+*GS5pM0ZkHGgoZf.fC6HBTD1_$?6D&;`W"oBSJLP/6G=\5F5F&+/XMWImka*KUH?:3k@m5[3#b@`)*0S\As#e9pROrSLhoEfW,OK4<)lGau7_^TKn9UtJ&-fE88)T>d4O/7b/O4Gb?"B*O9[e9,0>(_p;#gG[gqadVX2kPG@hWhf%TEY>336OBL&9:bmKZ`7@DX"LR4deqbm;iC/eK3[_LKi>BeCJC)cm^IB524nOmCd=Dm`V`8/_<Y+Z(XaAFT_O8rnZ1T*XK:Vg-Ng195Vq_@De/R"rq[(<->=U]dS2'Z[J+p4G$.,;g#2^'gf&IZjF;@Ug:E!<s+5pon4c>;Up\"2_#n]r+YTO+a<qP,\]?h^n$F#2rMF<_&"k"q6*f[`<#Rj>H_Dcba=u0C=75_>:\[?_UO>+)-^n(jTD^XFC6E6<A&^<hXM1u!TZVheVger]57!d<S,B7MY34/D620a;%]h2Oon(m<J1Q"f>,'NY[K-G%-gsigm!8r7'fY3NZE0#U@\2@b-[oZ)[$anr7Irg(&BdjZd-k.Qk:5?Rp]*G@bYj35?4-E;T=VW*F*c"WVA+B#e9s++lqoW>0(!\-rng*RS"ZB-V]IqFd3p`6EVLhBur6`>%`0%RhgkCQk%"2L\C]@R[hu#WD7NT$b:)lqc`lF"EWUenZ9NN14";d<I`D;Yi>/6].K(7`r*m!P>#i'lrG)*M(&Wi]O:bD'E`\+j9!DWOK02?OR'g@fp=7sUQE[5U54m])+(JMZtRSKHBcq'[:qN#Ha[WoL@).D8f_i1(NN[Y*kXfs9X3^IAKp2oC%:)qs3uBoI]"GS''<H5M4*-g)sZhQ4^:+3A(Z+ET^j_pHNO+Rp1f*3(BJjh\K^bY4(#X8qpP,]&q2AhIp]g6ElC49PP@G8@m,i>aH]36\Ke4&f<.GXVtSZ(C\;0D:LqWYBpr!0&98MZ?HD5`;sr=#T]CrgBfEkZbk^9%hbR73K\OUg6Z-IHh1,ML'$aP:K_<fl`OEN+Xe[3W20WNuAst;BXX<1R(g$P1Wr5tf[G%\Zq[VU=!d52sRsQAVI`/DAgF>(aO0V7u57<E4dN9pj)2)6.c$r?=>W!pQ*CInb5?&!##-P-rcX$X_3Nr)39!B*@oh?)I7'lV^KNp#,m("[@^*,TVa,GnSYd93Wnd/7?284i]Qh0/sp-dahDHuk$`g8?mjQF4+QsW/%KDY,/Q$doXmd%?#5I=WN5qSh)TkW!^\mG7,'65[dI7X(mZ]ZfD=4uD6OS>@5m11<(<BS^r3GllB2f2;cnuGbkeertFH_t/0S/kC`X2n(>=8-!Q(!oSY&%N#e>uD2OKNs5=r^2eE?$TRq@=drHCqLlTGYe=PlrA29hK'JWj=3L8Q<^<HRZdS>mnEr^6>?n'7n61pCEa9O`s]FbCVLB#*%(&PrEjd/53_4rS,_FFDu444&['$$IiJ8m:S&PAROs>29Hemq&$)]Qa]0[qC\%/k9j-YO*Bok&FA]'9BC):biNCD<PqUFcIVp2MUW5dJT9Dsc@q=ddbrY$8rVCrNkpGL:reb,c+d_PraKU$G2eC:(P=.$ODB?X>Y5Z;ole3_js.I`Dj.dF7:#<<-1Zm?gdLoQ'01f^Ip@Bne$r'G\aX'ftmjBL<m@33g^,J!QbEt(9ERa2CpOT%!/.heqh-BpTGm'0F))63PM05lJI/^gFHguf"ls=!'&%O_faApR`G@+:3MY?DH8FC\4MZs\$n(fXq1Xh\lq3p(tOPC)_h/Mn9Phk*#:W,DD>un)tH6VE"6B.)M2B.dA)#qsi(rpr""XIRgK/_mLA&h!++*`YH?AAs"UloOVVki\kk3<s&F@YeZBN\'S2j/6S'R_\4Y=c8e?+WumI)I`Pdj@bE(/r:]NZAp)._<d*dY>0m"q1tT\IPEs5@2&lp8eh-YBa0gZaD=4qK[`"n*a^X-YM=Vj.d.Qc$>[`+a<T_8##b!&]^\IZZg<#T\bR67X1E7J+kPJ5Ee6?4**>KMUL=I<"9H+c[!SoQr47t\Km:H*_LDTNZT?+BLpbj27mAo*P(,`0Qa&Q<?e:>^lZ5kQ+tD(LjD8`.1*H#aAHSVknR@BWO-F9R?YXa07#PZ.0:[e6>#KOOV-YX-iW&r(_iEcl(uVcf%,9h5(\6*AX0/)RcY@:IRA#;dnbE_Y0[(ldA^2tKN#LPX8h8&Z%ihMk1tB^bmG]V.RL+rCG=YlUa.6#lFh1F^L!7,NuAb,7P=gu%(S0k)(/jZ1oR^bW]"crU>B+IZVr4n8[tsd%&iN-9V6X$FreS`M,[m!<]N)nmbsP<;.e#:js09oZ`O)NqBM,u;2alZh[k;7ApKKqXbb?9Cl+"i$hD!AF^sQIjuF8_a/2#jaeq[u4)qnU1@uXfc,+KP`;%Xis'(?M%iZJLFi-,p\(+h(_h.<<Wh&6]!O554D"i*rnsqWgnT+=2=_fFi?uE9''4L9cZV%?M"`f^/,KA1Jo&D40)H@mFs8Di;TV:=F^Db'7-S0]%K=>_X?hX&KJh*f`KNrPb8N8]UVEU<Vgon-C-%t(8Zm"'!g=>=#gRG0t:p#mDK\W)U0BUMRmb5R[-UoJ'"*jA=L'V^^Sl=WD-5Q,7XOr$-pj_BmaAmo!/\))J#2R8O2\j#jTe3'H@EQ-TLC4lCRQFWmI;nX\2s0s1].;Mt'tnnu'L2SqpI9t5?GG:f2!U3]8@b,\>hRYpc3t:YFYJjq(F=-r(3q\\X^i\uhU,Ba>J&h"A^\MaoBB&?(F-NMHe6gVX]?77?5`_i]('mh^ef%pP.??N+"HUMm'oU7%=PHtj#A<<<%m^sIae4a;P#?8hd7'k2r*QZIg0N`aWGkSKR?Y[IJM>@O!V`d@DfrtQs%Gi,JX6Wh3VCD"=eF]R#X>4<p\o,\+-YDm5m?Y"X3X$M*fo(&JK2WM#$W6ZR(6ZKR$9T5';`cRH>5K`UgT<:ZeJXd6i#]O&j>7]r&ePI%b[#0KAE$aPG`SA%4ZPWLE5q5AkkU`SZ#f`K>(^@87K9?/a3n@/@6TlYX!]jK9d.*>=>=,J!9(+!9<d_5DchC4/\7^MW&qaQD?Z.R;'TKYen!>hjZ%kAX]acp\ggHiNO"<6nYK74XP"K@%G$mU9_i+=W?QR(Ckb]pJEK!r[9&ONSjbjL)&:pug<0P<4t0o@S&1Xa\hCM>;F=4`'l[]Z;,M_P5-%^o,`2bqucfd%TDUeIi,Z(>dud6gj[8(F755$4a/XmbZ5a5.e::2`8^Js(hPB.,'<8PaI7hj+inKO+:2F%<R"tN4WQN2Qe\orV?eL2,_chD>pRb>M*l^k3@0S5VE)S[A1"n&9:b[\M;.mgNium?R_`7@t1/J%f^fuhf`f6$"54(<FYrp@[/99<34c^q!lCMF1>O,Q9V"[1YqD\cL#Am.ECo5H#$T`U6eB'>X^%REXgeWmd:\2pK)ROEFV6__?6S$lh@rrP8&:qcCa5/(34&6e+F:cmL$H&_%lFRrba)ZSC!F7]c'LsgaA.HndW+G]=d3[9*WRh2r4,<p@.Z8E^Tb^OgDHlMR<#%M"l'`Q9/VZGdZ%_bBj!^1]+2@<GflKjrUt`+m^DmNfA?3DceK<LK!T=e]U_2=_N^WI&QL03A$[SloY+$])MQ8UrrrA$1b.%UZbgV#pl@LYcm)cd?+qfTE"*b+]mK])jr'5pam:j4?[CG0$R#VhgNVR*pbSAbdgT4pV*,4/)A2ZC5/st9%0[caSN<SN#<7QgV?7#V:X2:@\&q-O1pAZjN:ZtQ6>6<6;GTZR/bN>;rd4]JeD`M2Qb0\Y=N^2P;lUa,o,,d;Yhm?YWXmKHs58*FmtK^SQ4slhCb)Z1==g,a6pP7F-B%)OF8^9>V-:%E[A3U&gn?N9LC,,^13Y%7=+V5bdmL8ni@RMXJC:C_8(.S/6BF;mA]/:,0rl)hm1k@.?e7Q0)%ch_]DKY:^p0T:4fG![C^?6gE>?J[(h^'oGFJEL0RH2=i_=+GX+Tu^Fj;5%(Y6c68%lT#iC05jdItU+9/=?V0=tr2X_jN.RJSW0)POK>'<Ba=VS^2KE^2rb"Qtg]VRY^n*K4F+ZG^t%n\fQa[\m%Q;hPNmqERi\a&G#+ZC_3;&AAqe4sFgiSR430K5D*!TUH:qMi5fL>7:PkH`-b2ES>\QhAE4]/]V^Ss2FKc.kMrBobVZ_?+XK?6W0i+^2H*<W#X2i790ls-Ao2EXUaG]`YF\nOC[pbup>_B<Msd9+JKb]`YVP\SBp[&9>0`,mb_rfOa^3S[S\*Kkg5#;-<Uk=<7Q2KHhkcKTN5?aW\.(Z[FbSs.^:!df<R8S+Fd4@&V9SljaeOf<%fCX_.'N8*=k@_epu%Rd"c7Qi,jeO.L^oAJ\udN@QUY\5-R'qeW/RGQ$6:H=\E%pe3nV,%8`Q.!A3<b,Y>j3D%X7B84#6Q+sJAEsn^**W!>NQG&I6T\S2HZtMa_`m5r7r8G^sh0Ok/+mC/ZNt*=7%1'LJY*,<@goU+n]'ugIHL+OQ'70?^:hmj)KNpr:%_:r6g1+O3/T*&[%c1.fMQ!ZU2OeDl0M%WnUm&]MghE#%YFB\:o3Cg1e-#D;E,KitON[[Z:EFrN`T7@/a$HF\#`nn)eRGX3[)\9O-X:\CdP`__Hc_$b38JC#B@/nE20_Z:):lp=YX#I-OlN2Y#ZdVcdDjg5?FDPQG!Z%W[pWOJNX<1?S2Y%#Q7eog&FE'XY1u+sBlV\LT>)j+lTSu[hS8qk?f,C!Bgj*^+QR:J8s2PZ>]`/V]?t2&$4?Yk8\h_aA^WJ)#U*7]P!Z>9XfEb+;TZ>cm-D1D!rtCELQ12Rl^c_K+Sm78*@^'8^&6<:ZE]&>#u3Y^9:pYgI8Pba.m$_Oj]O_id4RtqOi5-^\?N(FoBe0krjA21_pt_D:q2;$Nf*W2?-7E8lV1YQ`%TM_h[`\hf+pH>*Z+e/q"=I!/Mk^9D>UA<17rtnYFEB2?VC=UQu1N\k+#=2;^KjYY47kDmb;YFLrZ18rW>#-A3CS?SN<0mOK7Im;28DR@["[BgAaATYIQ*o+\p=sA5BMs.(P08+]f7T+d]r'pZN>'(S.c(\i[3`c\met<V#b<:RDtDTgPItL"mX!?;"&ie%Oc5?@=o`!CQ;4qf6fC:WpL3g9Z"=bo=ZG7b`._p(_V%6fdK=fW;G\8lj*JoTFAba<+3H,^7T_<lpPd0"n4LDdu7*2#WMV'3r+&7Iak]:3E#oc`b?]X9t+-Ek1(#it<5U=7JG(OK7Im8SH5ZOBLkm%&52VH\Si>4377,+!1FP`>@7Q&OOQ=KXd-0,Fn1:iV\nVQXW!`:Isk3\K/qrV_$a*Y'4L`0BJ5B2QIUR'QTDs$7+GFN2Psd/QTcYFC6+@j?>/uEp9Q6?,[qp)W8O%4c;6g>J#^!UQA\eh_]^oQsOR_ifCtElHG3"if=QJGF13NReCD?ji4^[ig816^E_>VZm5%nHJu>hq_*;ln]0AoDPS^10>@dQl:t)+9Ud@(\)VPtR8iDQLoF*DaOU,l+<`]1T&P(s+]lieU(+Ye%kCp6A"[O=UAq!Yc'^`T"P)X:5fcqnRitiMD`n;Z$L9:Pa3<mH)B40fi;_a7]CY3W`^Jl.3HXrPhTP4cV_)2=\mjo<Ei59`-Y`/4=RuKp>(1)ZdaK_4SDLLsld14<Yb4(U:-Q73U\n9:VqTjC/Uhu#9t2a[A,i'CdNFp3de:)iO[AJuJ$)DBA$Gh[4SXrnX)CKh>0(!aMRG=@eRbABhp]0hrZHF[R9EVE]R$u\O@q^[YFp<5Ppq<L,hTBML)hrubRXC.)Ha!,('!X2Cg]a.'7WuC^H]@qLLM.'Qo=Us<U(iZgr7sU5hnK._O=&D9Kq!`DnUKZ[FHZSq6sl.kE$iq<?LPgmnu"cj<EZ"\Os4Pf?5sNnuA.5;eZ+fB957X.OkDrI>)EoKFi/=@4UCG%KIkX^O<^H26cQB"*=6KB9`\thV>b-A'V0o;55@Ag]@pCcPP?4>>P:X,E@n-I+>MY,U94Z/Kp&!HRnbWU:meJG4EH@nP$P^Rs,iB$FuZ*8s^<6adIM?K#.Pj?0b<1pJ#p-hgSI0jlQno*HUf95;72rK]j<&';eQ`+#POBX/hjHTNP>8f`13_5#Vr+5)"LbEe'H\<drp&rZ8m4]3!L16#q[:rHLY&^1fg@R<,n==T%r(=.0G:g#%#GW!KEZAaTJf\(ke>'\bT_]%@?DJ##6OYNXdiJ1=9_(#]V8]C4[O@H/`ROPB`Xkm?Ci8,")>g:=i!n8sc!']UC'#mR*/X%1kL\Ho`LY#:`4=*Snm[3Gu2F7G1KMeh4cd:4Au9K>:T:9pd1/?-tikTd%Pb?+nXd+sgFW=VD!,$GAbr9Lh_SUB"i4Sq`Whf?b&WW^A;*fs>_fe^&uF6p;:;;h_:'V6*Vs"5_UN2=L89O]ZS?>`l7*Z]_0;.6<X>H\WK[Vbt$:Nj_8@H"Z\KT6aeQ^HotUqX4IoEcpmM0$+.LC1R(+a9d7;OD6^RsP],M=05Le'MLr@.Vpl0B=&HkPUMJDHo1#*97e$qUK2]L`0'%RiQt3?-"=L*`fk?*[B<DmH+fRJ:XE#B:`5?k1med3<?iQ"-24\A^C):'h_>dqNZX/9?A,.@p2"^<Y,Y,!JdXX<(Y3RIN`-&4ArfRmZlcIarHTg!S"IJc7h?9V"BF^m2\H@TS1r!EqfV-m>(2Saf.Q9KCIe\MuHCiEq-Iq*SULAo*([[Z,]V_#e:5O>-=%`QJ@_#+p7QL!nG17@I*=!M(sMKbIM`RH%jdj=!&pXZ85.qom->R#\d@PIVan0;MU3#aAmn)a;&el-Kk'm-)[=sqPa-LC8IbqfU'nnRH[LkDn@]@CfHbhAe0ApCX,c;A@EtX]DIU*'sW1.f&c67_HSUa#<PnOk,;eaLN66nGkCQ.'o*++hTPtq&rrTum_LbfUs/fe6!2L)?>b<]L5$3XISA;?Vgn3+=c(T'PB<ab]5mEj$*@9V8mOFVA9D)]:W\g#L"qof#'NHTk/K\R'CFNAflj(.#DR7OZi%8==U#BHqu!FEG+FK1O$<4)DedT5]WgbOah/\F[t!nYeS//(cY@6!IN*u@=AZ86A#9oD]qfSpAUfEH]5N1WD[L%CG;7/+F$F-g]9H[R[Z0GrlnP(Z4/*kJ"g).YS+7JtV>).C+nZ%Vr9_(<pYE19@`A5J@[:$fo#kC@cZS?Il(kD'P>@/[.t%tOocW=1'6:LQdu#]#hl]W'X7T69OA#84X/M-'>d_WfHP#eo#^*fAmd-`5IpVb,mAE]C*]Zi%e7Cje,.>:onh`"E,314?(il*arQ`.#Q_*V1n^^<B6W6HXadSK-h$8X;</Pe.*!qPDT[4-`cXgaS$A0r+f+&C6\P!)$JW`eC2KrQkY!6`V_-o[uKQ0j%%QX*BZ"'Oc4!"kcm5!B0&kT+VFuRRk!'3lr-'s<O6c,YL;TPb:/ib6U.bdbF/nMd71#a$S#pfP@4>H!afC,U::%St'GNVCn2:=r+?-O-aX)*5.gP)Njd@iqFX/T9C"l!&Hi;EYlqmkJb(8c?BmL^)qGH8,)DfNg\>#"T>iDaGQZRpO4>nFOYr6hX\1qM.Y]f$<>C-/cVE8sQYa>;5ZmoACVH(&IscV$Lsl7Jj-1:qG\?Lb5_Hc"RMo6(uBo[S2.d4CVII3M"CcY,'WjJj/>q+"+1(@GU4>>`eTDLD1OOlaARVOGG/d+CuXhVGZs>(8k0qts/JUlUluGuBTgrO-os[Y,S>4%s"j*e+)P2e`eTVB<Qr1CL%m17KV:)\YfT`8:j2$CT.l>e]k%#UVcIach`(DsuS3]7"`9>>)?5eC[,#?Gm$Y$fA9RS"G\@A%HWnFSV*KVVYceC%2dHHSf^Dh=.??L!J0=\7R8ehqqLKWrWhDriSa]N/BknY&393e\1ha8ipi[/s@t'^oCtDNG3B'=ECAn&Wa$hOB;;N;tg%8ge0;)/G]%tV'\D^^*,qoj?`cin\Wc\pYT8uH.CV-PEMJ:HL"%G;j3GkAm#Z9/,G[fF+"I%Q):Ug0=`hsI5gKJb)V3%k0_Z?ohoBN15MMZb[U)#D&Y5=1qin@FiuH\3a98a)pd!p-K^V,3T=US[Va6ah19t>s#PW*>5E4r^OH,F@iF,#L8*Dk5P*:?lj#k[WZa;Oj4WWNOgAYkYUFR*-dA0$_HHdV>?mK\k7L$E4*t#&oljT(OeX+0,4hm;M-Q&'bt7Jp)CPGm&ejEO8gN<LduA7D#P,p<I0.M,[^eS4&X+Q\Yf!Bn<`i2G?.,6/`r4p=FR;[<h%:d>#UH#jm)n[-W^X6qQ$?ob"KF)@#e>h[mM4(I"C>DSd1LY2K`h6.'c#29iom-c='%=%O*WM)/'dLdQ2.gna(_EQc7-TIZ#2bdRWe*mEFXX]%h$tB(#hr5NUMAK-VQ3Om-`]$XmLG67<6J?,jpMf,.%chjOW*_B5B)oD5Ze]+nsC%8nVc,+PQ,rq8cTVh,#\HIU1e([4B`$(rH<V,,]a$e*F=)50OD=<3M>M'N&5#^pMC=)rd'U%rUg4\f^b2J,pg1f:smOiN`g*b84'kN)0GeHV],g&#da>IPJ1YF=Rs0+KioFb,*+T<SGp+WTiU8iSb!DO*=fd1JL@sB!eNX`-UUUk]uE*=8IbBfE]KEXR7+g#P-m!S=X,]H0L^2i1unV'ok,'OK3-;[@t%kg[O1B-uN/2EgJCBeb3(61Nig6I2]FLA?&q/GZA:deE9oo-M",!K@tHGp)bVZP97%G$JL,RriANA/Od`\"M%Ma?'Ld2DIe3Oo]:/3O[E4+R&BHY8R4+D.Mh':Nu/aS/EC\=Lq5M"^0*X8k(t>_>h+0iPVGHraRp/&m7.b%aV@U(OB_YXUYsEg=#UKpZH$[W?G67\T`nlj#$LDS;CO)sAG[sj%gXV4qFUZ&^3oI)^,b%pih'#1d_InpI_sk`K1"C@ESK3X1W9R0c;A]>YZV2[Va`F\$$R887VL29c])G%QhY5uHr_`(!_Pc"eLfk5IN(J&,33p1)KMfNo:d0L7.H@C=]sqE?gR(nh"r>9e`buW8)8pSMEmf'Zor9Y^X'OdNbUic\Vg1]?$];Kp?qmkY<04!kfJmLgeP.lbNCVsFZfq`#5[1kIP\.E&3c'N.AQp:?(nBJnnfJ?PI9`PL6*pW"sN_\d>.-p5<%;95LunuX6fO0_YunTOaHoc'[Ph6RA$5e63#f00rFdGHVMA_Hk4WMa),'^nqf[f?S8uHY?c.&[RIooZS0ki!f[X`UR;-[`U>k]#!-aOo[c.a[AD.<^r7F_%cIShbtU)R2Rs"*/ut;KBE]R?lI_7]N2@nf?1*l0WGR-m$ra&Df-TMKf+@s,f;/Ypk$pc8?E&kFT4G-8U@5>+$g,/DF?L$EE^@"W<=ShK>r$QfCHkP&D&9?`GJKkJ3ul4+@h(1*QfRSW6\^>22QJ]%Y':k<gsW*m,kTVtQdqk/s5Us,D(e7\m3:U@m`s'tb3GMeikKJM\qFW05Q9k71LVoJLM99,rpm%>SR:$b5)U)`'\[GRRHL14c+"suTIQN!Rn^5ZM`qB6g\9B#4.8eJ+Vu;'8?\,uRl*?[lM3%/m-)d+e78L4<`i2GNP/`J4KnAIUhb9AaAiZ?A>>n.chmT`Gjq9<I-5$qM7;g`c5l(a+c/J^0^2u#k0HVbQ<*jl"b*P[SGGr+#eAr/&98^/RKa12`e:637Y#lDe0=6r5-jksEg>@(F`lRjq^_NaWT>a=E0>ATp[&dhp'ntpAc,Z9VCuZLcHH2AmI[o(<h,<!N8$In\@dP;iNHVdpnP0rfLH0?n2L>u(=PtC$R$<0=%J[>bF_]Dm_>NF+-uhE(M@)R#92?5\Er.)m([I@F,h_f)jl2IM]Pc<8jUN%>1]pAN>WDoBW\b\,@($4>c[:EH-%^H:sXmC*na]P>QH@Ad8ehf0C1<?ZnHr#L6*pW2Y6!)B;Sb-9t:*_ro>:!^n+#0BO;oa61ZLsENrSlC!0,/In811bT&*306*0u8\7!rqZXZ_-YfM^hFRK%)+hA_8$RO*6H^-A$m<R0mE$$L)c!)$#e:5O6Me.OLAKejnGI%O;S(Q%C_5/O+5D2jrdr6fd<edH.ip6p>S++89B3V6Bb&gBgVu8!<(4CknFQVI]&#XQ:h-C7V6+73a8$UT]"K9JMPj1i4gZl_+CdlZG2&?954u_h3Jk^B,gDo03D@L/dmQq@mmi(saX7FV*4jkM,D:6@-]F+P[VjXGN<>S?iC,AWX["M+,;rJa$<o/BMP7E0mpEgZNG9srB>:*tl>2MpV0b#h;A4t%00=UY"hf@r0<aK[$b8H1k,MI^1l#=)VZK0*(",&%cCLLOiVD#hgfI+MJ-@Tp]tn%%W5d1Oa9@]$V`aD5*_^qLF.cuWde0+MCXH;%nX;W^9X*d/--[HrCW&HE5=_3.7*$*=Ruj+\Oh.R=(]KgY.@m#WkKQR^Hg41.SXor:[GR&r-InEqr0!1C&fuF5gW%IjZP)(!KQQJ;-`t"CS<-D1g6+ntCkV_k;c!GQa!)i^,*t(">7s[re!)nf@nULND$ebNPf+cf43]Z]:$jHW0\B.U!0Wc7p@=B/jH+-g]JcThM%%(up`;]A("0"l13XHR4tN4Ikqf1aaPQ,]mGE?6+Dqm;r^B/Rk@k44cl0W1nb)5B^K-tj<afsC_Dg_BJ,12!@D/GO5+Q>\).ai+1r/\IAW$0/YmhjX4DdD;0kk)*<F@O3VGB'F:H!/_f_3RX2m0hpG&N2dIRC9Gl7\.mH1+[qM@T(!=nH@LW6p_[I0'g/<nce6-tC>h+?edl]'u6X*+A7a8,g4Hk0)r:\&+(BEK#&Sf`#&R9/1P_h6\eee5pj1a\oS6fq(oq#>P(T]1OdiH.5'M3i%I7nr[gmIf":po_J78i<-WG1b%JeV;U"g4G6r_*F!RQh0Ibc].`R"-VfU\Ep2f^bmL)sUl[s(I@WdMZ,))uj4/00br#qR(Mk<t]OB$J+(8a,e4r:o,YPa"r&+m3\u&ZsX?R?TPh5-tq`rp,+1u5>>h$N;f;!tRKn&pRTYX6`C(0JSGO\U6>&4m>Y"2-(%qRqM0JJh'iUg[I5t,h4q=LTB^AUlOce-Tn6Z-2cp[YWTm**mCT:>.IV0R@*ocFktSD7@o7PGWnrqE-(**B`$E^K24mb%lb/V`%TB!gApnh@hqi']_;bWgG,ZQF+l6(IrWDf<444G>/p>".4,aPWl:8,bT;CYCDST0c0\\NTcl<`Wljnt@@O=&t<@+ZCjDOQm>48MJ;?HH!6BEH;GK^N],gr'Bt2TEr)9K<a0ol)r_M`_=a\n7TGH8+>X,(OH*Rcit-H7So,?_I)V"\Z4B<-pi\",34WX=i_oOr/iDdaK`-.JdR.NT[8[6dhUb)/S\W9pZ%&*1T?EGm(TiK;<k+-O^28k>H/U@E`\DGEeAaWEr0"h)R>k(i-lVTh"gqrNG>L'9NQKPNN#tXgUA8WL4h"&b\LREe^X9c;GD"p+]hMH\O&?3>hV+Km')TEGNfe9[(&`h-6qT'ODkQ&2(R"Q>*iq&`DftLp:nl@4g7_?k"1t0M#E1`b*(I7_N[7_P^]Jh/*#<:o;,nghS".)k-07MRFWmWG5r4q`HtW`jY=P1E`$m&OmG_ros8Z/M]=a!p%br?b3gZ$]*c*NSP>`V)A;'O0)dZG[;TG'cht37cS%*8nrkW2rTcjXBE$c227^/9V3raCJ_7btcnb?V',9cW1u>oo;qn3'`Rn5b=igHC:i8BtR1OBNEeSTD\bgSVD!._)W@Q0".qKn`)'KftIJR(72)UDr<-6bOE5eFZUo[cp2gcobC`e"@Qh5mdf[5hYDc*kHQ]SQW]jYb==*LC>4<W]_ah@V8heHY;;>QHs-b+%Wr0As-<TBX[hf]lXKnoWiWWmL,p0uTLfN1B9)j'uZ9.]lp7=648*MR%J5"+);P^DYkKN%>A#k]<,&+_<AHMY,BR]pf'f;pq^o1)ae67tU-OH(K.oD/k#342<ihh;[d(G$79<"(Mknpgr"[L<,Dh&eEcC8r6Grq2pq\b)(pQjV=%G3\-5p3TbUcDCJ[DL<;d\e@C_XYZqP3ihu6#1k]egpXhBaf2afC6dLY/@u8"6=4NCs0Fqf-U2WNF0O3X#,Ff24e)"E_O6RX<Q]dGqGP+(BZ9tUR,DmjVU;@S*Kg+l>`Xe,3'0OL?+'ThC"lU63%5J,/jc_&NZiV/k_F)">7bg@Nlr5G\FcLW*]e,r8)IeT?Y7NkiQ')J@jigR<;!NQ@j'TLRJa7)0FeIXe*Bd[I)r.T+U'#j'N-k*<0+4h.<G4hQI[..VO4)q?h[r>pR?Sc>d@FdE!%&J+3AX'',3!TK\Y;8D^-ZFf08Qj;nKK,k'sc%g@>.=:YJYLa<,>*F&'T@)b5\O7Q7uF*>Ys[Io4K$X<*%"KNoZ@6git-*-1jM0ATn3o(1^rggl(Ci2)tsmc!FaU"YIB^LT92@-IQ9D2]P<\ld"c@kQ`\[:j*U+!%L1Q]%Bf\)aj9m;i3]jQ=ap_F:DB0d.hgn9/S/JX4"n\&DY\!Cq'1[GHdI\(2KT%Ha-&AY*/[+d^ihm/l\3*]Q-\WTg>Fo7A&F40qo'H$A[MZ%UZAG,:.gC0%=o=dMJ+J)@D%npa%r+QOa-$L-6,]:^1">^#1U@iq!8_;]f&+li\T4sjWGInl6j@QX\g\Hgs(UWQe`+:['VE]iW<i!?6jgTlgLIsA"R+1a9L0'%%p$+YHD)T`J!a%&'Y?.Bj:g$]ID^"L%21-/aq91pnH#m^30Q?gNUNiiRjo*S?2[3?dgf(IX#BP&l,fCj=/A*^>P[#X-?3qdkWRNG+O;Xre.Zun\s/7e^3rGKaS!>U6KMi]HbA&qre.+J>nm@f0M`,@Ct0)QL7s#\*I\*=]W6Hl$L!n!TTDa%5[\4c+lgki(]7YF[#ih@oU>k+kg85$*^g8QH@Ag_`\?HH7nlLOE@V^+Eg^V][WEZ+at?SX#cYb@,#YU)NVTV:?9k9fZSSpfUC_:Z"iZs0Y'a<eJ]A#Zoacr(tG0:s2=%AfH@LHTI6E3mL2.P.N3p[@/uHQXIY^Nll%I4Z6Y(EljNa,irskO&/rAf?iPZnb*XM\'nj0(-#@C29Bps#W46<.((')fSTD;,T\BMb]GiQn,h&H8SoFln@QJU\9X5@W^7a4*/CJh*Wg\BlV[Sh3UTjN\h,HMI'*2"7LA8[EMY$4ll0H9VC8paU,Gq[T]tBP:">Q=F0i5J_X0O+$G,IWNPYN^YIMKk[lkV0][tUAu2;jfs\XcaG1<!`Xd-oKV(u8*lG"YZZ!Y^Z1"bs+K<MCni3n`_X=RcZkCi*r/Hf=1PB!V*CK8P9`LOSqDP(SBlD4k)'];.[tDl7oWj7QTD;oV6'W05A=%UeKTq:aYo;,"O[O-F/=-r9N4%u*o1nSX.4o3T+h*q:m\Q8mDYSkk@ODTG=$rtTb,mh]+;`H8J#.KGj3e=`Xs/K;(_=:@MbhH"Ilhp'Q^i]p1KEsl`qY?]ODR('pEf]^`q4r/lSG9QmpE\)7]J1$(@=7:?E]IfqGhZFRXNJ!i5pX=iKqoO'k8p-oe1`d]V_QuK851S\4BdfI*f@`>^R^dk>M^S/jc_&NZg>Dp^Z\jD*=r3mY0p26HJP5"HPC34Sm\4@k"HZaGq8qin3Fo"s&21YV>5N\jerk+-a=c+4u"`oNcdh9[Q$jDV(XtVrZE/K\jK@lL$simG+@<9<JFrVn/,cI*[h2j2ORs.gF#DE,L+<K_CZBp.MRN^+q=9I1ABYRl-b>X#Y[d\b$21[JW_8nUdKjQ"3+;?_W5!m7N(;@[YnBE,?+':&^NU>5mOs'm9K.0tl=JF6:Z6I2*Rk5gDF:RRqL]1pB2@GMbXJT-QYJdRC.HQhb]d=0FU\VVGKi3^CbTa;*,XjIW6=g8krh@G(?V]'e`=>KG>D-6c7`-6qSp=QSX%,:R7O5bTaKqSonAa(oIM<AHZ"h[7-ESM$eQaRb+87kuESiYnkhp(DD,KdcRG1R%:qhL6^.2Q]]p'tSO_I-9&g"1YdF3N]mZJ[]7ERC8I93dV.COeMNJIQROfg[J;@-`KlLa"a?B;/N^m+ZK@YnU`"bQ#6*4DJhc%>jq=;a?7&Han-\g5<WnBG&5;X:qfOqo#o9nYEdaK%L=3o+]h4TODA[bU3u!mr:,XjV\N@G/eE%b'Of;HhJ:#F5q3WPPB0eXD9%tKa"r'3!`]t1=P-f$B."ci`WD=Fr^/<mY-`%E-MqdccZt!<@R#=s<:-Ta0<#k1c!JaTDeX')BSqdq5^'[5I\V?<KRC48^S$YSgR=;X6cf5DS)VrX'CKiXm?/P@le"D^<*QIqaCPm>T1qPj0X#;Ns4td=7u,u3^LSDW6Eun@`_Reh@BGdYEK0`lN#@G7iqR%Zo=[5kjmP$]KTM+R/#6[r,t9[L,H@TPd7i5'D\-qN'YZ?2@riFcGT"CJX&0:W=pHMVm*!fNV[$N4Qdd9FhI/X?P#S7GL2?c<?/q$9G3Xp;<n'-Z8:O"Rg7Rt4;YPCc]Hu/jc::CcolUd'd*HAM4QK%=;=Z4$*ch'8ii/@Pp[>aCEI#dWLA\^YCl]L7X]DGJQbDAGg6*cQ4QUK!1VDbi#>:\<EYVqEj.6Q^b`k2apRPN,3mimTagN<fR]'=O>Rij^0nk^IO=R,FaBc4?%-7rJGUZ0G?D,dTa@5pA%RR=NC[$)"%&<,EVKlTV/>@OBh&+dES$5e&@Fm2)0V!q>hM=7X'oPl04T=$k1n*R_&B/pAa(lZ804hn[&99l,n1-&g:h5dIPh3G<UE983qiKR,MMf!5VDhDL>cGdL&+7+^H0MnqgjM8iWOAAqnZZH\%1Q2F<;sm]L3X#`[bY<,m`NKH4)[2:?RoaQD#:WHWunlB`'loKT1+ZCo<DdLRslc)GF:]Xmh0]V5+1($g^j-=*^VJGY)k7ZQTlQ*@e.()OlF55I9O;=c)+iJ73LYP4Gs=(md2shH<:TRC_t&7[!"?f1_N>3:gRIJZY(Se=E8`dRWEt\8g@p'lEmrLe)ntJT'i.'DL?Q`rk[0<^R;f7mu:ca>Arcl(ARI>(S-Qf0_;g<K8\iai_k5(;YKHjDJA+V2<2G"1b;Xb(OQj^\D_P*FF9>nEXNr$n&juUg*Q1@OsPMe#^4&3_q-.rSZn<>9@VQPGqh/rBoTZ=Q:ZSrJNi-50<3bcBCaq&ZgKPjEibY)s3EMgQZ;8>X\NY<\tm<KUi*V;532_*`k/!\_@H:O[;K!5QqnT,MW$aApjg<IE@l"aQmlIY:%aH&I@fd#X:47G/.R2R'VZ1[&TWTtD973,o#X>i>-@6bo)H4&HOL6Uf<.8igl>tbjn/31'oRnl89+5,SiJrBlc.0DR/B%ThN1p/E4Wq&OW33TG@0t0]h:pJ3k.+]`f(StaK*S)%[qV;$cPg.K]Z:dHYhOK86AeOo$:=XD/.)MgmiH!^#JfY9U)`,=WJlN++4taN1K!]l1dkr0$=R3(%8p2mk8^_=0j4HE:n]YoKhW2+D6"Mk3StYI+_<:-*CT,UM^P([UQi;!^]J+aQ6m.EJ[m6C<<TVW,lU3S2MHO$EI/=U%dV!oP<jg_1TYl+lopBk)-bgq67P^#7Ln&mclI&):uZ/`7Xe@_L,q+9\d;[>3&Q74D$SEpEZ4YZ3%0(oWd9I^[(SLEj?Mf\Ho`4qM&87c[!W3/&52.7ZWG*Tc)EfJsaWla=ubFY?^`;+h&]S/,$T`?*K7BB0PRRVe>AT"1^FY?@M_*f(bXW-?cSlDS2/(lJK@[9UZsUR>W5oif*55Wfo5C]k=t1kT'!REO5g%L0R$iSOl&8M4jWc&kjJ3g,gFqs0fnPe.ChjX1O93T5Y7pRS[;*-&5`7r&D9:N1II_jJ)HJVAL(,hlKt+QL2@7@1"&E6>g3t`J`0jo"Ts'SmQpsVKp-P?79Y`Y/,LB1-6l=]D[KLh,sBFS^"fR.f!%QUF#;C/8BjnMK`DrGI.$XIXp"/5K?3p[^%R$HV]WrCA2Am_9'[bg6FDs=2VmAk*>irle>>Q'Hn89=%KNVbMPul&rUEF['EbO<JO`&3aZWL;V0b!BlTDi?]1$#EEp_6:4HY%?hi,2EFOmqJ(I>bcl^T.lWQ^\Q&#(rN#iXH0^m#_9Apih1=MjnD_e8aUpu;!Q^$1.JcB<%NK7+`:08RJ4XJ*2*&TcTra@?6j=W<ZpQKLp#eP9/$LkSTH.s&?\V1PE?$cg$nJsArQodB$>0-C1QMt@Co4O[eSXK1Xn'o6.5OZ;`9hmq-4>++1eAhLXWKWBm9+AF=4u\L0lF.D[r=ojR`7br=g0>MRs&JtNeEgq698%mI*$0?[p5EM-oV"Xh?GBO;V3OcbCl&M6YJqd9J<5\N/#6CjjY!A%ohACq/=Wdrbk(c2]._95'5Npf^?EDG#t9a7UmO(;E/KF4gHdYS1l\4L3F(fXC;'#^dsq2Adl4Y);_RJ7Zh\[+FcX+M*FS64LrRFV>&HO2-97dHF@\7?-`+3F$iAdVRM;6U:fuIua.=%smB+'Bq!uB?hg_g=)B*LTh>Nr6ejqCsVOIj>gK_OVl]RGY.D*#oTNr`R*cfjT@mFje+]kmhSj!&%cQef_LW'X!f`*A1EHAublBY\`?.DS;9CD\$?eksA8B<@J=)fn5rj$i!;Y9*!*\X2`q3\MQ^ONCYhVMOB01]crmA*q,28src\l"T.*]PQInl3IXC1q9!3J&k+0ZEh)%3?/UR/Za]ZS;p5OdbPlYBX"3G'E!?G3S.1lXm]oXjhrmONY?DoBk9C].-NL5H4>V6EZF<h3EhIUGlk9&cQ2r5Q2hVj$t&<*#9fET#P%2f<%Y\orfefjE;*342)'2f='!50&Cd9m^mamL5tkB'c'ack9&["812fGb*=MoVe&G"I8IiLmFcl;P(,U`%oPqFg9`IWrCh4]7k&MK^*rq")1$5XS7JN=Ie)O$g%j:nk`B632DVdZf<1?0b7:)5I604i5H1`u/uob:B61kt$;K($NN8ErU7BDnba)L3?15hCpbSBnEC.mMQP'Ocj(Hf6gB;+=B$HRs+1:@RYHa<Zk45pKjS0LZ#d#U/r9n=t5HuAuq:[`e*8qjQ1M<4km0dchNl[F5m]UHJj`enX0p1bVKoO.6L,J->lmUVK"\WRRAbTX-?3+k0]R59Z[p2VWeE6#)aT">NCfERH,K7scqN2P6NL-+%^-dX0%j,e-kjW(LLP6]IBa:K@M]_=?mg-Hjp(27[C;(-g`[d^^oC-sWV2J5UChtu"M(LmgA7$+YnG(B9p8p%O2d?I"Le.+<)'kj7#e:rVWE+.QmXogs]$='bldq_TrMl-OXg[ZQH8B>;U4JeY8GdhP?L@4;H)o-NK=/Z+;Y]/ss*3Is&6o#)$^rk%ER0Z'UuHe_qo//>T0I_%-asp*3kg%>dFe6Se&V<oDeeatIZnrdf_</HJ#u>4id'=9laikHdhns6iG>M6dQWQOO^$RriSd`P'@U<WSfnsF9^f]H]=2F:?"%5/Y?lT:Hna0#5_su<3Dn'>-TU6'(/t\\'\XPR\4pr,l0iiW\sRCY(HUN_DUm1adOrMY47?P@d^F`bc&:j=9@Ifl$nO#[_AU_Sgg9=HQl,jbY+!0i0=jD5lYAU=7u!OWIl1DMJ(%2f,^tG=\XN+^nJ*Ccj?uT.O7P6Z2(R-ZGfnW1#6='7-QsgdprE`T%W(ik1=oW+fiEL$'dk`s$I/^"/">,<?&0&4L$TuD&i%Gp96_)j=)Wg%$U5lr#:b/uC&OKA#4;M@o><(+;_>u1`U@OoG>48U*!ATG8$IMl"\b7>fCe?,YIFi3hs%fbN.e[eoWoi2L4r8[a-G@71M$uZ$AoB9&"`.c-Lt>5X^3omRd7MR:Y23;0"h@A$k4:C/o&UtaO-b-Hh@bel4kE],`R9TUY,)`(nm:\Um;q]`*9]3NN199Pr27IV/pifDt!IL4"j&F]:YPi-omtT-*\jV12kM4m-2t4\oLNtnj@uhOSe,/`rQ9Gmc)Em)u9<Xdn7Q.iLtZ[;Qi+#STaed'a\*\A+R+8*D"?4KrHXfRVQa;62ir+.Vr'VZSP6gT@gA6aho>kI)jjYL8M'lcHEl#Wu#f7*`dGr]%Y:hSul(=M@+K6<bD2,qYb,S>0(lU,+#p4>;&e^qu$BF-f=s,ZS,Du>'Um#i*I%\e#-IjP!cCk0"$mP%(VT7!$PFb:."Aej4%[tFDK<PoetXE-Voas3*ma,(#!T`IUm%Q>I+$'QgVT)$]@<TLecaEJ&%`($JFmD,NLmJe)a$9AmE'``i4`#E5:kL=&C?@7^T#&7\o9CKO&98Z$%pFL;P7f;Jt8tH&[Q\SInn$3O`1\5H*3haj)`]IXcmo9ptl.qg>Ao5"DiD"hG_K:s>7AEhAVEEcVbs^,Rr6F65Bse+5PUkB1-Kh<:IH="W?b"d%;o91nWKQSO$!htqS&Pl1$(?%FWR^152RDch@(qrURM86pGbXMfZW_E'K&&0BKhe\7uTZE&n^)4$aB;;?2=pC.N=\mrA8c\E&(!PUJt1*,jphX"2J\QheG6H[D36knZIpoh?.+1CRlP!tp<XA3h7Vk)gmI/iV-kKXd*YlFDk/O/r76UT?"G@)FTX@t]]Hsl[pDsmfV(UJQA2@^JqDmH^JS,9T=1ZTHX\ZP'q&9;?fT9*8T>h+`MNDOYn(Ugi#KWJ=%2CeY(eLP3BYGuB<)u2qPe9icpqW[k,1@i2_=`LnM^ej!"HlL7?].kk*-Y60[+bX+@@o4&03'LNhKZeSDR63L\G'?>9Odksbe0WOZ0<(FdftB4Y=En[7pM(tNc.*cD(lfPNR<.b(7VVZ'>:4k897LMbZ1OP3V%[@>CFBV(.ZDRr+ljCS<:k+*%G1I"g!\1kAEfgf&i\+350h;qQ>sA.6H6@AR/GdpZb=$23jXm]V=qMZ0\sWW^>Y2(A`a8,C#c`lGjl^m9;`]Sds@_d4[N1$5N@7S7f&P4oB2^BT.M5d9T4IGE6mWKIjFaQ)^qTC,]Ztee<3IXe%b!ZA'_ApldF7sjRL:JWkFktoB3:`P](UN$ieSC0:f`Pp?j"bC/i-I8[5)b5%7KERn!bAZGSnM(AU$Ia$t#&ZNlH1Sb1Me]6[+OM3_C..L<R?fh][8Nl`6iZ'3/o]B`>G5(Vcq2.9r&=m$+OUB_;=n'5H;o<Z'rYAG?DC(E8KQ)(`)+kNtfK\k2KlH137>;p0Z^$-4\.dH/8Ds;!OC4+Ya_kDK=H>br'qcqZZb.5+0-*:i80\n4A:PaG$Z;(7fdB8oTChu:8a=SmCADb;$\Jhj20J.SKg$@p0)&"^/?G69bUSklT/W%_6flkGBZ1sQjODFclLj"9EDKDh4g^bLlh3^LP'NnH0_"_tgZK^+DHW#1]7_&nJjG9G;\(/q':FU^&qlWH&]qiuWV)F!3KNo\4$G"*TAS:d!O3Frb@-d/ks$k.Uc7)>GKI]`]FqJa8&pjm@rV/6bKTq;pV%r]Sm,I@N*Kd8o%M6V=9\Hc4@WTgpI?43.];qQNOD24=[,fqrO!!X7Y[adh9g\6Y-("'QfZte0<)ZLq..9]::E&fM8J@i/)i)+.hP`d/h:llERUV'`<C]@;07Bqjo(!#B1L=.RHkdOP@+L8M.bt]j%(YOr5G>4CMVl+<KYoRgh@T?H0!Y5UFN&\1AoF29FF%1JJnmf\ddK>eAmUStPOU<hDVo8VZu/si\A&Vr&TZ.L6c^"6,7P)V?;p)hWQ!>j`IA[<.3Y.^-hm!Ipp@P'g6NrD3Z`bH_FUOA=/G*R/KPbSY5VSe\[Q'tRDorK[lY)GHCi0=^cVIB>aoh&QF1Y/g]eZnf%8XEF6=faH1%V.pnseAhXQkrE^t&PG4sE!D*'u'3m5Hsgtg^;aJk<%n4GPo6-S&(MYq4?^,K&lDmpU)an9g>dnN0G!Roam>&7<Jo8m_pqat*taHm;V'Zs/Uf&@)Ynd-BAqtte8Ki>_]:mCmcr#f'<iV#7T"[Xh.Y)kf">RNDHhaX(^3)fcM4_]],,jq*pH^-t>F^WA+2qR1hiS;mH\#!49lo*q5-mbjk$^2&W$b:]^#"kJ.'@a@2;l2uhZs@dujbg%RCWhJ(lKt=R/'eQld^7[lQ8=AR43PQt>]RG8%7-l3r*n4r9@dXhJ<8p6'N,n0g$A/!B:jMC1#;AbrOpnn\\FuTOXfTsOBtpc46.#!-,,u+_Q%L92ldXps8KR/d\ADa?YH\C+HpaL%1.CPk[WB%TK.[1KNoZ^%(X-@2_"MV8T[2:/2j,b!+1QbAg6:s+Joo"H]/QAKl&O/eN:QAjp@33>["OOU*:!!]00BeNJ83:8*'@,`Jg3-DocKA$f?5j>hBd=$+E@rohD3L=Y,8jgo2<:%J7Os;2*f_bY.fm"?BPELE"L%)B8RK*\U@Z=!P1mK4:#tS*a`j+d^C71VMfPG9mu>;uClUZk"ZD#e<HmW$m.NPB-9kCK4Hdg<i8hmAcK\]/$^*T(r)SGsYhOA(7F[+Vu;'a::QiHb-j=YMnZ3d/B*@l2?jL8%Ws=NK;2J]P.Y^NbZD#,Rn3$RrDYZqWGqhgVVg;8pRL4c8A<$jq71[;hNpG%4ug.>W&)jT=fU%;ReY$kKZhK>un)DrjdLFFa$o:4uB5Z$/*pOqM?0c=SO?!d?QqEXT)d"JrZ+A^:3nZmKo6^ol_Zr4tHHiip*H:`D'$!0(CX1_RYH#\V(Z"-22jS*m>I1<1d&Mj?>&plmdA!>iV:Z;r^h_cdp$&jQUeY[(*cQX0HHp"^UhS8-la3\O-!*EeS_'b0%<;P@Cq9j_;8E0-CZD)Kt<;)`_,XOR&#!oA47Z4l`SOB2Ti;]uA.SHe,0EVOKVV*5/'?(.5,4m`k"5*UUFDp=h!mGjEd*+A+WnZMFZlSOliJ*CDPob.4mB<MiA5`<YWo0"9<<DpI>mo31#@q+E5&Q4CN-8i9E7NH#;CPfSqZUa/0&qg^Eg^hu?HQX?mtHJ74BmVh,aBNZ#2Z9.P?25eL&A:>i8P4P]W>7bXl;<CC_liC"49g;i+>VUS?_DOX#7E?4L[ueenc^g?F2,fio<]K-li]gAUIJY1/UC_Gddan(/)B>@ZT?d0!^8+p!h/cJqhO=o8bVM[rI`:sD>go:89eaKr3W%EsF.YYI\%YGVmiqK*VBcn]o>%@B#2'HE3bBABSS_l5qQ-'GgL=)1M=>E]['%WB'(.)8-XnkB.Af\cPhRVV+dWIB`kPF?d`R#aCt&QmXQa=;Ud]]4]o^DJ%i#oR5gCE)0S<aqJ+cI1ob?H:M_?m^9;8;K@FO=u*5aG$J$rH0KNtnm6EX#U)0.<HIpkWeS6Yt#oIgHk5IsDMm1s@q98h<?oa&*gVn0HZ&7l(ug;4BnY]dug]f0"u9E%W4XGJFugf*5W0pdtB,AD&FkX^].DX2_$S#91.ot<GrAG,5MM(IJ8ks_[u(h=jR\`(PJ0BPt&<[Hh8k!N_911lPJ6h:\W5&.a<`*ZT*NHBrY.eLokluQ0ZQfiA)(<Ja.BgV6+D@UlCdVfA[NYY^2"R\_@BjUKJE`lBalTHYCh-6uA16np",5E7idC"a@AQYoReER`(SK7,#6<'I78SJI@#e<:q)02jE4S^sRC7I21RJ6g28QiY"'M5/oD$<8/j%5%Y;#-J8c1*i49]Ys:5PaEpePHcKq=q4DJ@\Mb\<1LIWP'uSn'-R;#p)9`"l1%Q,`E8$(:=qf7Vq!!h5.aPTCYjI%6d/1;lAe(Douj-E%O.,+9/X=jYq8KS0VO,bm\GV/h80K`;E,lq]g.YLRU`!]>Y:$(4Lo55ukUq<`_5+HH)C$:!(N5\FSTE'Hrgac7F,4#aV_[RtpYp#`b38AtBQo=7:!%+]jKcE$b&H5L-W7lZKK@DtboWIpTcA[JA=VbVD@;o:>BkFm0pNDq?:Yeti!@+Vu;'W4djh<qNZoDZ,2&\ZN>G"B1pgSeRBPrBf318'#g8o9au?l90:Kh\XJYGh0N,a)-=Mc$@jY8a[]E@SSFd=23b8p,E-UQn!4?#C1&^OdB,hIsi*^mZalu31GUE[L=,gG$rYXOsa9dV!EFU*XfO5Mg\`(EiZ?N9>/%!04^AP/4/B_>TQIj!Cq(<1Jb\fHc/4T<_erFX)$V.UK.i6C-Of8ZJg2snO1l-n2iWmn@!&%gK\I\.'<CCSUJCZ>'kh>%NI\cl?rG,Mac8u9.l.Y4VuD1RKn5F4.gn2d%Ja?qBf3DP1Iksj`>#]=e$DM+%UEP`;GME]3iqASJThDnlor:\Ho`4p)e>.$TNVNYH.OAi,c7)^l[^M;/Uk8++sCBmH#'9I(A+DBSC1V#e:ElpX2^nOeZ79YpG<8W$=4ZRQ5a<=.?n7CTCa%&dd.Wgj6;J9@cr%:+AL'[!XqHI.Mm)@I)O890ZA1nk#a'_I\jekWercqXKVr7JDWRhF$JP9thltW%6Z[BhTh(Wf/#58\5_S-(=f0cX4d#Ko>q(EFOZf(B!CEJ(>4,+q>^-;Gj,`"[4=2"lH+K<IkbU0f'Y60%5tVIh5r";E!,^+18dq@0i;_2(g2[M#Tg#mko6.Cn$387@C*m,8".i?,TLj+e``0W9F-4b/o/&If&8$G5QCff0el%Gs2!,0)dXQ/ipbE\l%pUPA&qQPM4M.1b5'Hd`p'bK'?T4>L(A4dBr1K]t<2\,dPXdSKr9e[S</,6b>sSa(s)3`3u,'Dc,KfNDGoFGA>:0?-H&\Epji.2JUQum(@Zp:-V?;Y)E+H>"i)6.S[TV!]a#I.%EC[G/:iP5NeU8F8ebk5F!iWV^JQPI\o`\nSRpLf[.!N>mAu$2>3rIbWe,4/'_rb<G4Tfn@<Z"q6j"c'.1Y>@>AX&.,oi2`T'\$34\fYRM<)<F4TI>(W$skbZ<YgOq0bl;-3KT2DT3rX@,r\'n:9B2*,dHNf+Di]XRFUqfcE<nqn*1EfiSP0SiYscgE:>IjLAh'h_:4+)su!h\TG,p@'"[/o&kH%!(E*/QYMq"6S=&Z8F/X\p7-($%'2dc'ippp[C'!7&=?pChZ1a`JuNQUW5c[?aT^Gco!?&84L%mP^PVH:89gQVG3$pk8Mm*89QbnBZcS"<-O3'F-HWkO\fHW"OS5MpWo^#=hjggaO-+SV\ZFL[S-@drY$WuOAk1]b2^fJm=')h5i8'[]])YnZM%WP9o>cnqjt<`qheW&aIu7Hd@P[^er=^<HbR5.C#`RbjF!X^rI#/_PIXrQ8?=&V"3n!)e$o.ji^3UN\B=!lCZG`fm7r)9+N7hek^n(-Nukm$T;TXslr-p%ZGi_RcTEA"LJOI]r#"N-%KOjA4>6Y\njMI1bulj#-O^n+k!]4`Z(%foJAGZDbWN.WHZi$0UK9+_[(TGN@\0u!(d+EkEbKsJMP[4B=s#p`UAr$U^@&gcgk3`INhfjA5rPmhL^Losi4b(EFOek4iti"B.7ls`%cf6LEm!,eSnup'iQ$9=%sHt?$,Rt%c(&c_p$sp"cc@1m/$\ASD?mo,IOAhgaR@^V2<RM)CrFDN_*c,^01@dm&%<]la%"=EPI+b8HAMUg.ljfi^\b%h$N0htlX>62FSPfORkj0P8fTW6Eq$;Pj3lb9qt:OA4>^m6`0dBZ;ZH^mb159K,YTYsBM][/2'*K5VC"Mg\CZ!%PM5'\dDd98GJ>9kS+c4ce:1lILf"aoa%+IJRnQ_^hiSj\):-H3[^Rb.5f`K,Wo;B[kN"8"Fi4"YF-=S)M^!A#INB[![@7#7f^ND3I%NSSIc]#,#PMCtN.6*Pmb?H=gEcq%!/,*&^HF4G5cSZU&UF@GY&E-`\Rg0nWM4`d-d8$)Js>NV$&]RpOF%-+n%OR\OeA&4<`8Rodb\<?;q@k-ol%ughRp"jG22t#6UT>W2mmHF0sIXVjX,6L7q+.IZ/3/OD@$'9p)ESigCLSpZ4:D(>5)QHa8lel)`aY8bGsI5W?kUG9rC)U!0pPbe?S`Uo$>;[8$9i3zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!!#7hoRBaKD#4~>endstream
+endobj
+7 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 546 /Length 203 
+  /Subtype /Image /Type /XObject /Width 1271
+>>
+stream
+Gb"0;!=]#/!5bE.WG`:P'EA+5zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz!'^\^[af!~>endstream
+endobj
+8 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 137 /Length 18297 /Subtype /Image 
+  /Type /XObject /Width 150
+>>
+stream
+s4IA0!"_al8O`[\!<E1.!+5d,s8E!T7VQ[M+Eqj?FED)3+E_a>DJ((^Ea`p#ATAo&Gp#UqCh.*p+B*2jFE_/6AKXZ?6SADn!(-_e!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E6$gAjSA!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%!<E3%s1eUH#QT\]Q3..3!!3`5!tbS6_uLkZ!!*6(!<E3%!<<*"z!!*-'"9eu7#RLhGs24oF&-)b4!s8T-!sJi2"98E&I/sBO!!El;&g8tq"qsjB#9n.%14bR]#U;[@_%fkqn0Bf!Ee4T)()If*)C6^X-n-W&2)[BQ3BBMq77Kd<8P2o\<E<1'=^#<GAS,RgBkh^2F`qtRH$Y*rKnbA=M2II[Pa.Q$R$jD;USO``Vl6SpZEppG[^WcW]#)A'`Q#s>ai`&\eCE.%f\,!;ioB+]k3(smlLFH:o_%qPq"add_uLk[!!<6&!<E3%!<E3$z!!*-'"9eu7#RLhGs24oF&HDk5!X&W.":#)5"98H(G5qXF!tbY>+Ya065u@kqE>'NOJHurVOeK%r#pV6(n.fDQd0^X71uTbN(Dn#.-7:2j.Q'+C3&s#e6q'R884cEP<)lt#=BSg;A7]@cBPD4&FEMbNG^4UeK7nr5LPUeEP*;,qQC!u,R\HRQV5C/hWN*81['d?O\@K2f_o0O6a2lBFdaQ^rf%8R-g>_/RjlYail0@j2o_%qPq"addg&MN`!<<05!tbMt!<2sGU5Aq!U5Aq!U5Aq!c9M7qrr=P3r)Ma[%eq9d]$H:^?*3@?)t;1/[/6t0>h=,!fJMtK9@I^OC$r/XDf2A.hVJNI7X("u'gNV]8/;'+IbWcLEgMPD0rsSg!W@k&&#T7l2P4il](jh9[Crs:K3_!Y(p85uiHQ7]:W1hhar3[u[<_Cm13?WqZF8<NVTAH$N/KO=CJ'UkKp?9YHWm`RhB%_:_Wo^8jc;9k/7[!d=euk.IPu2<AU,"*>;F17LH:d,Uoc]Ngil_2Vp.;/-Jp@QBfS,Hric("9]NlJ+&9P`LJuoYlFfqVTTA5"5>(qU0e\Dkn5M(9-qD9]WUDrhqcJ5JM.DoTg;h#j[C=%j+t23A/#IP0gHr1B4=CqD9,rqu/<`0;R1G2MGP8NEXL-a4f"<O18,gm$H6mb6d*R4eGlIb@bfWRL,bE=Z]16a7R#Xp/%&i".hc'$B13AcHk1C"u)V,M<@k1K:\jtM(l7VN!C,]2H]ao[dMYV:kiCbTC.`!uVqck[%8iP<nJlSV8m+oFhO7cTX*f$ppJ#7Pk'Xdp`?aK5!(T76>)t4MGZ%L%<'.j,CpeDZo,k)>a/ItXbe?0H01Ko%L:"+4a!$&mq!!no-QWhq05a`]g\N'okeGfN#GlIc[@t/+JgWJDJn7#(?')[5;%s+[s+RrJ(0/fm)<KHP!^&loD>?Z9d9S);2aTON5`Ng%nFK9Jm0?`O+';&g"VhqH@36W@+4AH&ZW2[e]o@B`d`iV3^HsF"0]"F6?^7-D.S;TM0Yk4sA#E!59d)UJo18uVfa\$;cSOm/RQ^T\@G)"''bnQ%Z!.B.QOcJ5kj1fnDq'55mMC>,!MC>,!MC>,!MC>,!MC>,!U7,&5-^n(8N]#\]`%%c?/Bl-8<",'<i!bgg94+!7n6&!0K2DN3IpbL#*]3BRl*0]UN:d!3KcUT4M28dKf=iHOHp@S5A?'j]c@r0$hWlng\KBI-=U7DUl+pdXj7/LA%1@N!Ag36RPA9>S[7J3'Y0]pbI?Y[s*16Y8/AD@Ha&dG\KYuBZ:V0T*b'^88;WNH$RTlE,hu"8ErX,"O+55?+c\R'`?\CTi\[;='^)$$YH7l/MA]2qC`P3C,;k%W6<n3ag\LtNFTP@;.BmL8U+d1.Ak18]rShf\JOFBNFcTeak`F%>Wa5?BiIMD#^f6<NaI(K=XMYp&IhaO=842=#n[$!;r]NaDjIcUHs8("D8M9aeXYN=MQVV9j2aKa?O,W@XjYhHuPjmC!E'Gg6,QKIW+k!5%uVjE]rM;:I-\`B&Ca"57qfgkB\rr<2u]O)"j=8#=l\!t8R?AkZT9B*/BV=>J@-rXLC8&UH'l&b4W+2J>3f[tr-IN@[^&D<OcP']i=8pgMDaHkl-a7NCjXp]lf=r9@Q.7)FX3C]i6:.d^rQg5Lbl1.H[G<1uaA"p#1]c&VEV["&g.d!.ZB:`Vu@pU4bBpn*CauBg1/#?9gUPd*$C"K>:bMcc(S9"P6#D^4VELECR8oG5k_cEa^@^0$:08TW.BA_@rp3$.EiY]<mn8$sBX8@,=@^<3iWVfB`L#Lj,r$p.f'V,k<n5$m653)"=3`Wi.Mbb#]gK0R#ktG[\nS9l`qs.,K(]4u&_Ra5_BHIA[49M@t'?i:_L#3/b)e_.\d)MJ.Y*7hX-<m3E<"5#./^(@,`LdQgV&tGA$2ahnJ&=/c&GUD,I3ZW*%\4#I_eH"%`s^2?`fV4@l\.WEI=!H:1L49X/CGS4irFBK:"dT)-`2,Q:e+l!7=I[_j!rTa'<(DBEH1/Y<QlpoX^7fAU\8Z+$n`Vp-pnN#N%)^oY'jk7X+u:0p1]'>c[8=D9WK7=%W<rWaC-i?K.`[h(E*uf8or7`04<4]Z+60/.bL'o9A*0qiu!7^>5nTCY8-A)Q_#2lp[Fs:#K>G2kBhVm_k.^Y%esKRFu's@p7kmAoXtdSg*OsiEa$dcJk4r+=>nTmn\:*6@:+aR'BN#HJ$@5+ifAXTZqlH7(@``*q`JW-._O<54@?)^nf-Z&p^?V$na(BM,K13D]XhI$4A-P.AHnd'lCecka7cM0;LZXc!"2#*rr<D`=EoTnZI-=#Deh$(,9B%tXQ#:GdI..Og!].fd3R7!P0?ti::c^bA7fM&R6ntZP+RV]%=D[T8)d$prZ-6t(Xfs#i8%OGH]'m*0]?.eoSmoa\5JJ@(Uj>DB%1WENKrLHg0`*XYkm2sc=gesF25=tfXc'#`8K,<Qo`T<=/gkCk=62@DXa["$<W+aM5Mj\rr<2^bVtB-$YD@*REfk\Nqb[X>#]Hcb^[%sh(%p%7u+('f,p5hOMe'I_UPEC`F[]D64`AL1i(NH\_lmG+8@9cZhn>32=VL!^Q(%WL&4aF">T+h37I?UQVZ,DA)[;F%[1hk/$1Sd3+]>Gi70Ds[%A0!C7?bs=B=Nd,JI9RrPYo!RmQYXh[P$!Ia2<i;?$V+U`(>2r!2aV_8!>NmA1kj5M2Y!Vo(0EP$<0H_S6q1Rl$!NDY6pOCJPl*Pg%j9K;;hs,@+VK)?/-fY$nuP\%B(g/\TXg>X9j$<_-h^AVro!nudqQ&&!?D(1kuLH%Nun.=GP4O7nc^<A%rmn[)jEj)EMEDgI&$8m%T?S,NU862T0-IpmS7`H8W%L+mn<3q!Xe;Pbi[M=S["HmI4:7Tc$Dnj=4JX[a+m@oO6h`SdaqKqVhA-_cJKjc@d*MC>,!MC>,!MC>,!MC>,!^R9$83Vqn6Iq8$$rmid@9tC4rj-&r^I&?2diQmM.N(h$I)(*%Y.H$SG*0a]X9f;^Prr<5frL<JPg(4/hoC2n^!5fQbl5hAK*N\LT)g&]=FI%9Q[*K'5l5&52L<e3_%sN:XK/HAK/YQ.+r6hbgD'C++U#A+&/2%Xs[AukcS8m'=.D&b9X=I,"D<R=nX\S8jUO1g"1Zs"kKksNok;7/JF/phqGt&/8P,7O2:+FAt\5Jl\:AhQ,f_uY9@h/oNpuh@brKfW$H0#ts6f[@HX,T_#^h@XCSL;Dq:9gkadXoQ9C0Gb>c'%2/cSFHar29K<^LIcTc/ESo13e^TN`"e3MOlZp\&D,S>[.7VRU6nVNr&bU7t@oJ-e[iK5Q-p[B+ql_Xl;c9T_&.oT*)`Q+2[K+Ig/(c9.\8%nE])C_nR7!)gN>\T1nahM_pE3;RS-05EgGlg.uQHA9kWT9-/&l^XZuUVQ8[XF5c;5[@[Y0_5VZL=R_Z4ohPs1(='5?hY;9o!)'`2d;GYG5ZqTh9pXL$OC6/2(k>0[msJ*#+qr./q3;ljX%#h?dB//AWCiY'8Z0k2Q0g1o/ln`iq2^7)$oTIL="pU%9+dH,'2K&IDg=i2UP,Hnl8EDW!*@#u8nk9Bg<(DX1Qn)E72/ha-gh(D4'N_FT?E]&I6ZYsT+:4(orj"_'^VrqMXsl,>OZ7:1+([,QG>ecBX9cCrSpAR?U.dj],ICm$98$:hZ6:r"6lEVQ2"M^!!TCm9q(iei.lqpE,Tk0&9sDWD\rIG*M/au_.amPW?K\=VSAQZRqYohhFP`sKHHoH8^rcMJ`OH*FX&bePGRX,l>nPG8O^8Xe98R@Lj^K2@&s&i`K(t\]nJSX&V?RW3dHB7>U2#OV.A;Mh-.0i9(&6BX$ie&_g`-KNtm%%rMKQ3?/bG5+9'KV(ZpGf<d]/$iR`jWi`C^b@RXj85/UOmb=`eqIT"p%+l,rfO75($qbm2Jn>B+52h,OJHoph/c2Qk\heS_!Q4dF8h8tqLPNkn&2>j1t_Oh&[q!7J/^)tHBQ?k`qnB^*bL9[a(??5<(hBDB3UZ!J`UC="h5OacX,]T,I+h&u4EXRA(*ZrfScnnHE7(39bqF6r_V8-(t09`<f6YRDD$/<"""=PX236rI+cQ(pfopdWM$=)lKRAZg=C/U<&[rnI1.8u^>2VNRX4q$S@9,B2ab],N#5H:g^1;[F(q5ihtGV!/E6WY!t(s:<!6et\+:UMYCCsbZdn>Gqe;+20!;+20!;+20!;+2X>*Cq8M"TU,Qe8-]/>78\3;7;)N:Xj6YZ+dQTM.X6.[(;6i\@.tF"XSnJ?/h//"^N"2JHUVr?gTZHH@EtcZ5/LFXF,Ejh;H$Oa_I</_eX]Y^DYp#ZoZ%$pd7GT6c:pIaJ9N1/O(L$faF+L_V^;:n8dE>%/3q$m(N9JHrBaA,H6_unTTn#]^Y';F#8l7H#7pjUM1Y?^Nj_;$H[X7Th7nl!0mfCbIDaYbrKEfbAe2khO'b%Qs;\[T/+>oVhTi4NB1sX]$]=Y_T]NN,g+oAj)O^"=5j"h,s5KW\#$gBKn^qK^$O9?dTX$,=$I7Gi3<4]n4\<GI_st]23/Z#-UZC+&(u0dQF2(=p_UjUNH5>VFmW(PD`(=G>4eaufu7_i`3OVkmc["Arg+gCn.RsK7Xn_D!8rGnn5\oa7H#m0I`$ZB2i/a*p"]Z*_r*2.r'@:WH<.eS9d,fELAId@GDN=XSJ#!XpfHiA*`fD?b9!!fa`1`'&puA&p\+C^!.rRHg0P<[?c-_Jp/T^dhh?M<Z+JF;]K+qhfpBYrSYao"FoYl2>k,Hj,FN[&ifP,g;bMNs==-=TBHWB[:X*`8rX!TE!!Nq`U0G5_fcT6B+t&7]AY6lhC%i4^N$X(#I/0G,3MMWO8E<L._^_E)7o2_B[4l^/INF5@`L-"dQ9KquW++t&GWN7scBKOl(l:9&N+5a>?I'9SSE1+B5C+!-S:;E:,8$2\'@$;N!LqZ`lRIq/%hY,fBMk:7<-#*rK2cJD;O#q:6F<_i6;8gF.)d:md&sMP<`T?6'fcC.#WWlF#cCbpPQ(Ucg%bOG!!T4o/`R@r^BB%"J(]b>(WClTf@l7GiFh\aN?a'Ln\;tY(2]/RX&%aHF$)W/dBlP8<LUg0ZC=^5M'7XSLM2[^V*C!T'6S5H*t:>.j8BY,rZq9(W9?.Jo3-At_Qau$NETPEW3*MFA%0%4-nU``GBYle[kAc/19s1j0%9U0AWp0<EO>4.(P'PQGt[GtN#"%">#cg7>r[189mp2`7cRXj.nQ^42NdkP(PqRgEf=%;Mo0-EI2iCt\;YPM<X0B,ke`#[f;e&^UIMq5@SqflS8biN<Lr(`8^4cK7.D(LoPY-$g:"cU/OmoQd.CN]NC-XpFUP/8D(MdU&Z*"/ib8aq;9'Rf=LN:)"*">@!$D4@[b'mm0C:Rcb?aY/KTaC6D$gs8Nr[j/&W1,GFQqn&NE110OpQ9u60Hb9E[YU<jL7ogm=/n9gKXB)rM&JhnCNV@bPqQt?Ou)/@h6KC*A^gHQ=m\K"3!<eTc@"spFs$[bOR3+eG0u(jcKqC$N6IlC[a^,rr<Z'cP-4nn3;^m,PYnEQJUoQ5k+cLV*SnqUCG.X[sHVrW//o.Y_-iee!!Y5=+'heGb@BPpP68-GslFXnISg8GHu4bKu2-#7gR6da[W;0m,_9G\Z[hu)!IOFDtlQ:Y8K%N-K[<q"m!1cljaY_B1Ab,SS,<LQl+kg1o2[DYumM'_bV4A/B_$cocZZ)*F^`_M*emh@3J3/5It4k8RL/_;tt;#lWa/9isdH=4@AX)/YMUP]]>Q_56L0<o%RJB&Q%&BCR;>&F<Pd0NLdJIL#+9=g\VpsS\G]Mi22"/^Pcs%YoaOli<>\,$Zm;*N-$(I_mYkNYVAF\(9$qDU<!p5Y00Jk().)]<Pbl9[,9SUp4(X.?VU=AnCHYUL0_MGd9#ESE%E9HNKYTajWEINftBN&(QPVT`b"qf2(MD/#D]K2dtE/'E/^&B7T"js*FgNFq465R^[$@Y0n(/4f*Q".3Q#*)_qBbX0#Ju6'i-g3TjJ[rXXR;jj(m%eateZU<[+@)>&]+l:)%BOhNXN(MCZ[nrLj,q_1n<9kJOXKJ?a@66C!StnZj[s@X8ReP'^i<>1,Slp]JGjXhTTJRJ^,;QRclV_jX?$X4l=?+.)@rf!]F,D&M->\=Rs';3top)i'V,(#uBoer&AAV)W2>g2VbNZb;RUT;,?1np8`;BP*ZM,'=i(iJ5J3Yqhi8nVhG>XA#G_=sVhY8hmuFY0fq&M]sr+7V,IpMO%.1+RL_j#EB*3L7_TiRWh?t=4AXmM?Xbl70$070@rn%]=p2TGFrK!8X@rI+$T,OOF4:e`K^l`N'\t:=O`ni3Zr#VSfb=nho%_nl'!3GrrBF`L]7?`^Or^,Ro'+bKO8$Sh7(CR&8A,1\[T3@[tr#KO5T>>X*'RC@doDCW9Z?^H%mCQ86l@*U6i)9c)&?14SHW_,su`ilQ+1Va?c*u)&u-jIIq!-"0.Lo0jg2,\&AmQ,R(*,0)S)sO,UiZ08b3*kW4HtVd4*<!#5D\p`%600[R31^%1iU2VRcBRb"NbTENb]Lq1rU`RF1UmNF<]S3C%@l"-mfq>H%'\u+L7n2MiUlVlD,05XIm)O9#k1TO!?N3+MIntXIRUqN"$.em`cV_i=L`_-V5H<nP_j\DpHCH4]rBt6_'E_9&uS(\jsn3i=khC-nO;t/u.B8cciCi>4Dhh9O-AN,4RH1AMc)ZHc]!jgd/PN!3BU$I/SU<'h;VW1EGaL87O(*W?WJc>]R#k?c8%DIto48oPYnO(4jBj8ZPoDBlJ%C$Js5UEnKP0:cB'R8Q)@>%1CD_5M<EQmLMO4Gt9T,U"-hi0ZdV(]UpM>mPa^*IB`(7NiLeR.9ZM0qJG/Mf_bl5,c3b42hHMi2?W-\<3]JdDQKj,)Fi<B.nkXnu6"bF\hu7qpp(N5)_1_B4J\._jE+f5,h!j8T+8*Z=IMYB?U9F`h10X)DFJ?eX;YVos?sH#"GK+bf>9DBW(7'T,)KVK\?VWpoJ31ORL\#BmG6+jMfeLBsieVh*$1=:@>=bH$S8/m.\ICILhoH^jN.'B:5Sfft:[%M6H5Pspf(IgfD<<oh_Mbk(aE3io5,boUQT%Sa>=[ZA_prO"k.)p91YfRIF3[>YEfN]DJOj,#.C&Qs^2:Hc@s36'>2!h%_-869bhH,d8hEIYemFSU"X!"@$r2XICu4F[n>CH,:9B%ZMtP\pR+WS5OWV*b;7oJcaj4o59SrNe_#J&C;*JBq"rCIA$^['ZJ#-njp;Y2;[GB]$5dm,tB`=!T=4<^.Du&TMk:*!!7](9Ym"S9g^t,GfJEfnD!//X?bF^mKQkY2J<G4LUQ*LrH:7\RsDWgX,)@;Nl'W:RU#dF6>#tIDf&\rrA&Q`W":?MNd,ZR&Z<I;K?`OK;WLcdns$)MJ:%8.t2\V5O_N7gG6oC(W=(pSt?b1E5cfJe+cSq%[ul3KJFg:8MAa':RhUa,Z%=[0EH*b]G^_L"W,atL9e8X-c.n1k*9I]W@Vs@TSY!j]-=tpOeVnnD6G/tnpoX0C\6XPfDIekSN[Ke_n*jOYN[ucM/BX@*rabhZ+*/Q)Cq:;-%\Q.kN.fd*gefspHm98#fM%LR:1R`OB$48mB0Ga7j(M>nkM",?cbEGiMVYqNEWab(WW%i$<NG(BP./WOmrnoN2#bX`gpgPCX\2b<E8-@75aMgrC_lcI*3su24AM;5DeSLPBd!h%ZO)BdoB<O"UR1>hL>%HnNJTjZsU]=)qm\B=7F0^iK=kc4\nl$28,ko]c9o,_Mb[O&FN[m40kXjSe#0&H2@a>Xtb"WDh?gS[K).0/)^M:+_E_r`e3@S2k1sA=a)bh,::"J(&lfLn4l1YCV&,O]Nb8%I`m$RM"D]_o1IWA9j?U9_u2AmdWK=SRN(Q%7`oR?/"92dBpGF&JnX25.28S8XLPFFiFe!3@aEag[JPH+5!Ja5nT"1)Z#:5nnE7gf:PoX@RXp^U*DJ@2:@)(7fs[76k&lJP@XWs=*./b:'E+Rd38lD1M]N7GAdU8NQ!Pa*kDXXlV^/+b$Eh*/Ni@e3W21=s`Y@Ysa[mr(d[/`^#N4H`ef-j4Q]/%n<eVE1en%_E(Gr(&3'-^FpGocpgJWWe9:&GEB)!,@!!Ku9+)C@Y_eh3&!qEonVC(?p!(G]4U@ZAq)*#WWc6f=UrrE$))<#hbp8+V`"H;),&T`AI5,g1%r`Ui+2;Qa,9;a2bac,\"g!+rWXFA7*!4CDhW;%Ps:Djc0>*L1dcRn6`WuQc"JSh6&#iK4PYDcE[!5Tt2Aj'HN:Q?JBp_Vm"&q97JnG`KH]LR2*?%%p2:FCi@T3KeRC-YWXks5u9/cc>eY&MZroWlEcUPIhWpd&1L7:*G6jut,$YnCn$3RPXn_`DL<nPGcfI35ggkG8XjqBOq_`tat\^Ct&2;Om!uiI;3u;s'.Sb-BUs2'kuRa]*@s\>J>d[^f`g&+,GX!!M3K:9eTnIt9fg?fKCmVRO()9(9%#J(aPm=4XO.XO16jrn"pSrgBTc>KLj-*#JI;Z"n#Y*`'-KdA3tU4r3q2p4rFBD5QW&cbfWBp3,qacb*pT/(F4k!#9lYRa6>/OXJU?3@t.>n?_(`&mN)Tib;F">mK%8'9A?i!WN-'?2jnV9mC\9nE5B&!,18C4q4_hJK!3UrYP)HK_1UqI%GE'h@Zur)h7tW/g`gp(3Wpr?_Q?bIPq$Apt;H3i]i(q!#.O)nM<Lq@kO\;Y7p.!,-t.VQ/;@K`9%g==]m'Yb0%lL),5Rb6S%0o2_H>40ib5Rjg:uFZCG6.JPJu*;QZ<e`a^LhVNbLMe1U,I&$eqh54G#,(]-#+D@+0k]!YTrc?P*LSn=2Nrm-hiH#F5_k$JoG<iSXrS75mdGh5jE*jH=pePs)"WYCZILuWKp5%a*#*3glMe<Eg9LX')To526D^\fjm>nRJmU4<S!U4=AtrrA*qO8@forekOk!%.^GNY%oZiUO\DO8_dB`Lls<L]2$)M#FCQA1kXWg>i1B:&b3fg:tbYj+$un%upShp0'X3J*Oo@*IbQX6Yd:*=g`W@#s1&Kqs6u>f2TKGf_g6<YMeIlVmjlU\nQr:gJ9?3G.Y/bn,7BY_6'Z:n8n<*_P7&1`QIt$SZ&Oo4rs.okQ(V_ldt;Ar#F(>IrE)V.V"F$q^m%lmV("(rr@tHnM`EQEM!11SUQWL_6)Vc7mCbGq^Gk_5P6#d"b(Ik!5ZnZ!:kWS$pX+0Hn53sX#K$TG3**%FL,'#l?N&P[on.]cMQL#f;n?.ad[e%XNJ<E-SJgSNm)V;d:p%I9bkF7r=d)[^PR)K*<X3**i7jJHW694oXtc$dVa2U@oAjAP';Yu9[hq0]tK[SMFgKBcq>aQ)nt..8F-1Xn8%%(J@*kX4Ep:ei]i%%=XT6ZC>LQ3#E$/KVDZ;fGuis%ehi:(:HhZANY=VN,R%3o$N#b\#n*eIq@EK<U\7L7HpOdsH7"QJGgF=Wl8l)UI;,SC<`#ED4u/*D]YD4I)`qSEhC.E0jZq9WBV`6g5MP)n'OUQjrK+/]!+QPn)U%+N`BT!h+L9RI(AQ'Cd/6$CMgQu5%9m!*:8+E<>53!]6IK]=Dsul>J$u/WQIb'De=-aV0'&<8i+Z9W\:][D3AtZ=AX%5X\G0R-:/e,aVC.snWJP^0N%*_d;Jenr>En'@(q1ipO-@Y0>7[7c)4"i81kl43#'F>m<?[->l7.$LiZdJFR$q#"bhK"XKUeTt@eDs;rrC]pp@/$T5@K%tRNIMQ%X?T/:CBIfg0AmKiD&a<4T5KRer$d]g[s;h8!qP>VeS$B#$W['9M8YdcK/GXSnh>lg0aKSrLU_^pdb%@p`8kEj1g-jP"uC3;t+seiuJkH+P^2UCDLmE[@PD<)k/:F93[&l'p^3N<96XG6`*7d)jB@`7jId6#F!4g;p"3r-O.?5rrE$(Kk%+8J&*d&ARh_HZ[^pS>?B:B?pTuEebi@JC)SY.k9&pYl.6^>DFYa@-Jt.)o%keVQmcA5m*_FSFKr-k]HpaC;2"HrV*_"_e;R@,8sJES^M>.?aYsZ0X6Vl!bd!>NA$X7BC=L)?#96Gt:!.FK<Y_<"q`.6idY1fFhMbedS.sD0dJj1KT=3fXTA(miWFCu&IQi-P-Zho4rr@qBpQA(h3<85*\]oUnrrDP(&uaC]!,NuM<%VtVV-@D_cIMG5ahSe>8]P:9Xa`@'[bq"S:[M$Z!+kWYBE"^9[J_"n_5r.W)?$d(l\E@'jl0J<pnbau*kniVa!P$(]oH@b^=V%S\g-At9u$AiJ,,IE?\M2%g@(q6FOJaFqFCPc"m,aaJq\IDp+c=Wi;We4^BO:5r&sS*j5'F8V.mY!Yor<Q"7VV-DehPMY%ap#/5b_:Md=;tkgr_Pl";MOh'?i"0U;VD(-`FVho+H,f0!L%:Ddl0`Z<e)?1BS)]LAr.XD"Hcc[2YVg84`2TU'k9SjaYpC\nS@!/$k-BE%sf?7GA6^b=CX_ceYcZf%I1(S3&EVo3AO'U!t@7;TV1\o$#LY?o$^G?lua;73p_mr->VI6ERr>tU#p)'?n[LAXQFGXKCf(Q3YmX'Y!R,k0BgVec8Qf/2_SX5,:.d]T=Ye$U,d#\4TPh*Dar*F:ZRZ;c)%PfJP=>TH!H_r@n^Tfcn3ig)4';0=*iSP#$@6F>1+84#03Pa!a=e#;Dnm[DnKCdp%d&llhYV-.3qnAG3*Qb9</1P@,Z]a2l03R-&r@d5R]:7?fTZTZ(_GO0bT<r<lb>?L[,q_rn5n.(>Ak425V`*NVtf1*6W$=0ef2/PMt6VGmj<:=h*h:aom8PiE;YPTZEa$!)hJbW%"T@oFJ4tuIr`P3L>cbo_pn@$*i4_jjd^U9D3^5=qSmq'sQ_/Z15p8L6NX2h0ZFesMHejmH_Rb;4TrP&%Crr<9MIaXf%d<*,0rm@>D4raELd&j$sb>n'9R%(p`1Y(h(;.c.kZ";Ft)ldXn._3KDDhkE,OaqS*6S\O]rr@XqHtNBYJjb(=5IC-<n`Sh#_d+qRBC0uBphRhAoDCc&D$PaVelQ10dQMANdWDTTl;%QXT3]q<qg5AbXCs#N]N.(RVtRX_O"sr*RILK.QXFh%38qs/V]$;@/65t\AiY&tUF9"9eJbg.[0Sca8ogIO-oc8$e)l[9B+Eu_Si[,SNPqiV7p:hQKZpED6S_W9-r.P-CJq2OFlsJ\=N6l[P+%].c):LAGUH)61`ltt;a^'Z]mJb@G=M)aMkt2q-e)Y7MZ3[p>.1!!g0/5Pjn)SN>M6u>X'S.VrQKGH6#;`\,/F[b"c[hsC9V(O"!$6Z7i:mYY(%ZkYNM6)G:@7p8lBh).e8h"m$3`*aeY**8L:Y?(DN*CQ.eeTgMPUo/%;R&>J4AA6Ad1e0VXFQ!Xl4,p:1,&XqQ<K[]f7Dptu)O-,\bmrK`M&?i%">7pkQuFoMF_f,s\&DuCI%r_>Zt,`$heptqKK?hh;V(:qS>rb<7*q"rlr[JK'?$+r`OALIK'K%_u0o(NgN1\(JF(9QqD*EJH3(TU2!6OL#t>$k'22a=JF!;JF`r^c5>>Q4\7/)f[jURiU3c9M(aTDhX\iJ7B#c\6lAB)GB,d@^1k[Rf<6n*O3he^+.EYD8OuG6.^D'^(8_/@f->lX-0sn8h/irP(N5(6UNS!/t(MY70]or^q+Ic>Z>7S7gFuW34pVr_Abm])>P]<pP76Aa7k'pX7X+oWcH+J'"b6r388/IS"$j#2A]?VgYYtVt7l_@M'iR=)o$"[u+n_G38odXjQ<TlbmJ]NcBW3aXsbQ29hu9<tOH40C<XomNV6-/<O8Z*79TI7eK1_"X#N-Jbi+@!!IYVe$W!H.>R8TVeR"@3gG]VNP%lm2HOm&hV1f)nDhMdTUOSGQ5K`rM'@cfKlgC$14h`<J)KD&fW.N+iQoE6gC*!'Ke2l.T82%'GQZs1d'UE34)''_YM?1'CW%-QZAp5"d5C.uR3g)Bb-5XM8%ClcYI2Dj*Zm#o%'q+\LN&Pl6.MlmF,Er_3RjlpNCnSUVse1k78MVfF%(++dln]O_t]b>LU0,7%>[o:>?t1.K8hm4eYK1nQ!2P7Uu<[i<f:p=h4YaMk?OOTo=+`""Q]N<m_<[ig1/%8"2EeSd!Q4p`FCibHt.N%?AQ6[WH^d"\[OWNS)Bi!@i\LdF2KCkN6sqgff[uinhODTV#LEfT8.jqn@-9<!VfUP[t41@>mJ4F#LIRr$i"L,ZA_4fVWc_kS/+!uYf<=c/9!qD^r%m=lGQd";>_"#dGln5oA\rNmu<qK[:o4$)Z2Pa-&7=6=[(8D\%FW&[e!#="E#,P03PT+o]u:.+eY@8;^?@grrAspm!\b.GRsMerLNp-r."Kk3\H]XI23c]91EX_k.gE#M(O7enHXd@A@@e7LJlNB.-J"01?U'j8qj%*)#ea=Sf9N[fk)RPPk(Zs:))___-sUN9:g90O1t,uXJs?\gea7qX]bKJKijkMd`:=G_*^%a[451A??_7BVR]\`hn/5)hqCOMhWKki4V@[/^UE%tSkn`Nrr?X!ib/7d\$c/QJ&/49neqD15O4*AcfO.irc15?aW_h8:[LseYl[*QHqXZ"MPM?h8T/p,62(0,oPOU.#-jG1BD01Lb4rF?=e1K^<UhL?+Ri,fit_67<uK&0X%C0"4:Y'6EKX,l3HA/;>?@O_7tb_34]1@$hIE-jS6OFEBmg\um<*nWp<W^FM>mPZ)YbKQ$2A;pQ\W:/GRf4\qL?Nb!#")^B>ct:ZA22hRLb/(p4[m$ibQ4\;c^0Qj0L[FG1N*Vj4gH5,aU2PE3mE]rrA7+rrDO\chJbMr"Oo^\bMTi(4:&2pd_N&5dmZM^B86)IFXpMX3*Qh/N'_c4u3gdrZ%BaG00CT!du9;:FLJsIWPMhK(XT/rrBO+`;]hk6X9SdFKYr*Ht<!aVKc$-nBZ^Y^P8eflM`((EMD^F>[D0,pk-B@B"jR*93/R5]t<eNLX)Z5G+W>?6J"e%3/mk;bO1Xsl[BDs@F__j>?^N_M=e>b-nk5Yh*])Kon;j,M'@uB#qWIi,Y8]N_7Tiek)HSNnMjm1B[t2n36[G>/)[aZ;lMlj>THpUE:T7T.4d))0<!U=)B>uGe0."icI8&B?U;X.9j3R&Nksn+4[U6S6?/oVVi.B64s`ZJ0pX<rNe4Tt,(.ju)je/DGNIEU!3JKT;4mV.VoKnS-`;]84soS:4Rc^s5D0rYM<oU;D;pNn)nul-RnhN,=KZ5`in"#VIm*-i%H#iNKO&:Q`i+K-,fpe489TG[pcle_,kta+cOKeDn8>:RTm4&^3o6Femg\S$FNk!OT<)^-.=Z+q&u-lYZn2uLEg"BeO[uR6_"Ku(^-6p\poC8oB\sPR1AjW:Kqdfj@f&gHHu%ao='a93ld$lZ`QasErR?otE$0EL'*L(dE_*4q*J+'VrX&8t!!N2oeba^k@IWH5r"%b79&&<"Qf:.S^+=Y1^TtJ\n>D!<0b)Vk)SLj%W:nPOWVEr!e+^hTkVhkW?!Kp`h8sB/`H?A0hU/<YbHe.3i[esX'06`DrG*2V%g,:u)Gs*`AO=&EGug^SVeT%m.SatgX5\U0<h0ZF25M?6bH\E!<cgO/KQZ=5Y>5_,SP"dQ.'I2W%b"1Ke=d/ioB@)VoTT%hj'09T*sR0,HpbZ&D6LTtnAi=N1qg=kCq%(I:PEnMEon(UITWJ^OVa4uN_`U=Q-X\R_jYe%r&*Hj$0]t+Bqoo_6IL6CUfsDl/[Wb<_V\):mF=M<=D]WuMug^%`u(t6^R$F[3ji6MUJ=g(b+)A=/NHk4-neR,5sI2U<RX]"l,HoL0S5MFnkk:1]ld+WWm@V@72;5!72/Q$F)CJZh=l<+h8XnLV`]1`4En!PNtH*@n4d,*LCsH.nNZC?!:YO69>k0L[6FfNpk&7uf7tt3S&PC-n<E3A%]srTT[IA\>@FX:?dF/#aBh(Z8UDZr-*-\SjC[-(!(ek:!$%2ifO+a*I5,)fRQnXW)/<NaT>JnTG_b8G]6trs[Jmk=Gb;ltqBaA3rr<=*Xmo3,QW*0qNMM\k9cE%_e0)><dL9gnbVKG4Jj#'m&H1\OLr<`h?OKW'_r@7+<G5?l1"99)C%F;VS0XVhUDG2PDKUHSGk3o?o%E!#ACq;;/u<rZ5K-R#N6A86(j['[(E(*">e2eX)KV(:;u9c:;RIp_euMRS3g>kp(:/eR^CR"9S,N]gbJX>[$[re7(W"u>[4dF6(8^&<)h.k_;bbX20+_jS(kU"EeF0QILi)N+Sh#4m+0dr.m3E=LM=uAdRljpF1\Mg`q=-74K?!ok!YaSEWBRj7_X.`ja+un[htXt&&$&!sgtJZ[/A<:_kW4F)G4td_e`)_R-C8Rn29WY;L3ZQ"nA!o5`\3!P[Ela_"R6nS\)T,nIKAp[`@3tbGj]h<RVa:er[D\.CEJ8e,1L.K!1Uigfe/WMl^P=i[V4)mWuptHLj@U*Cd'4k2ra"SoInn<iEts_n>c(_potUBnSdB)O6j5JF7t'hn>;n[?!MWh`1@q<7/%KjVI&+08#khCG[BcT)Y.n^9ge'E^6KZI-W7W]=R*:K$O!^KnUFi0.&Bf#S<bLDlc0YCkg?45;uQW(29B#N<M_,A5!+f"Q8GoBf#_EedX4oJa`6!-Z3n.N3`Ekt*/%abe#A&!P\(b&Mp*tLd**Yk^uB>o>rl,K!]-DY1Vm#^r=d5$Y[>8nMDc6!(&a9&IgUR'd&o6q^CFNDA+ipPo^<FkT1QSA%or-)L2O)7#dkVB*EqR,Rp4>8fu\)V)"ZH3TWRi>`ZNoii$>n#NP5^H7eh8hhh\_PAqQfBT+F+L@IScb*tWfSBq]d'h!03$G`pq(:=O.?KL]_Ic#7lE\g_K'jRXSL-Lj<Rr(1o*G^Lt1S2q.T-\XD'g$doILT#!fB-V,6Ra.VdcOS94Vb_HEb=g$GD=2%k(AXCI?,53%3dBuLfBl93!496&A)e)O)MXO9.t(LX^VaaWL[f#0?Wsf+cD./uRd`@FLUC9'D/AQW/`^>S/CQt1'K6h/mr8r!2R[S&K#LLr;RL8eW3Y\jW7A)?<Ki,^j'bMUVc$-_kc/W]lZ0fjb#K+>@0ijHN-9Qg).a5q@Hg\1o't!]+GDqaK(+u-4HfrdG`:J@CBZiP",=h='8Um\^Y78Wd%SX<R_qn/.h_&5\W>^9r"Eu-07t'EBC,B^.ot-u4mLW;2oCR@2rP:%B"$3-X`U&GB&Y?!g/Lu7?Y?^N\Ok6?.&=>aM61?H3C*c2Ns4hkZd6FZ&pVITYJYhnBO;9&4?;>dpt=Y&%sTbE<k9?(qCTtAqCL@+IqHZ:@s+kG-A^$l$H;_<+LQpYON9r1GM`fk;;lGG+0cp+Ift-_pk.QF07_n8^@ADF?N]R3C_1tjFR_SN[@Jhdo@iE64dDT*p7L=b<p'4bq^GP`o^E?^AkdgM^(Z.=rr<tO,_"*iZj!qV:E9-K_4%k"g3sWY1J@9#OSTcPr)'ZOh=uV0^XOFrd$B$j$OGh.[aT';dmlRob<&3"<P^1oUJd@LZc;!E(hbI"-ge1];-;OTPq!VC:7SB7S=K)4X&]]EV[!q!mGO1+gBGTbil'ep1<T)c1Mg%cEuTk-L<4G8'f^OX_-#LQ50'a(E&8t0SeHon@C#n5hd\*:V)j^R]EN'#@469p2hM&0i1;#,4r8"l[-N)Sp`lha7cH"L`4dblDhriYpge.0h!&k)g?lni\!gioNN.9o8CJI18a`.sQ)+!cRCj"!F7qNe&b*uZT,2qgHn;YoGDACr%8PYKnE$"Rhh7tAih%$%<`/.CBkMkQrr<O2`McKgZ<1j2(hSeB,/`bE^M3M5iRdFSnU5L4L0bG?XC"9g$h60mh@/rKm/u<A8cI&9fm)hug-WU3(Xoa:!1)KZa-Ti@*k:_c<oG6Gd^9TC6f,mpa75e>rr=-S?aB.e@;@6CIO\H*p^?)q[As#%+,7KN>Mk5X&^k4"n_(D$[&krohCEl-]<\nGSMgjK`kjo)4\H*6Y:.b#Q89+JVCb]#*a%[L2"6U#N9#\+b-Q`"9,!%p/d]GK\o')[e%^fBNVMZEK:Y:>_Y?6rV@SBUMSs!hYpVP@pjqTj,n+*=!gG0TALeq`$q3]`Y6j3$RUL4*Y+?R^`2]H)?guX=%c[8!j8T+:])Mbb4t-1r_Oh=4[@:ME2Y_(ID[Pd=0]$V:jO&(_B%#Dn>)aRkMJ'4-#i1/M"8o(<r[`:9p(-rQU\lV32oM>@575+QfR.ko2#dOdp_Ukm*WXTq45F+<e[2s5>1kO9\8@tjlp8&.mR3o>4NJn+_'E_;.Qff3hsc_T8,\HtBQ"7Q@nlotr)r"`9e=rMHu\YP^7!trj)ojK:%g4KgK7Za-D=pf*Lk;3ok>P:Z+jdgM5l$NT+ZSeHuAnQ4?qbB&*gaPm/=&6C!ci.8RiHU>flJJ`\I6Y>dj/TQQ..OFrge<g?<:;d"17l)X#g+@8JRS\Zki[2&_`k$r)*R+r.A1OcCnjV(+HP&(V@n@9H>_B3%lOq3tAEAP,2$EJsHDHuHueNWN1c]H7\r=M1OUqSk9.7-`))S*'WS/?2_5Kr7LNYo-gU[Y?,h2sTpe>dh;L=cO\q^e58CT9@+]6iIB2nE8d^^)F6SK5[OTf9r[8D5=Z-oAe..c)Y#]g5L29T!b>-3f;fbWT\MlYAPW9Coend7(B^LQ7/UsrrA`RYO+LB"5kf+h[;P$i#`cPSeKL.*H/lF*r&=rIpLU3?\`qtM!\DDdcL!^^P-d9CS=IFC9lWQ,7E=m;UWN'&o+n7]H?-K^Y@AuQ],dg*E$e_Bg2X4/*P]a]bR'>UtFtdT8<C_Ff4Ku2dgnc?<tBaFX=CIGK>le<"KA>R"&i[42cFe`QoWN_r4,'Dq\.++!,Rl5>BRR-fZk7p,XjaIM.$4\C*4/D;hksLSj>Lc_Y=K<\hab?/=)4B5)d(BJ(p>/fI(8oSTQ8e\Y4f?SKGJi+%R^`+G:8e#-R,2#X2O=u3!ASN'5?E.mLTk)?30dS5jmBDbcI=:G30*Ca0p0C8ZkQ:m!u%M4U.7OopaQ/V9$Xp1I8@VB9Aq!;<K%tgWI*Er]#Y-=2T@<']=.oD9Zf3K=r[F[7[4'/[B23t4OCT,rDf(3(hD6I?-jo[KKb"$Gi09n$_OA?j;7/9Da7oH*[\?C\4igDnHi>Far"hh[0AFR<jr[WT=&RcK4)c!_VC-+,Ea]i?+9useGb:&;QM;8tfm;(hK77)$PZVcsM[$9+*VNn$[VQ>tZ8LZ!WQ-\8?FerFOL93GbK^.Ocok+W=h&<Mg>WiG"NEQfjF=Ka[A>_`CWp%]"PH-o\bfV?.T]le3U4<f6JiuC?ES&ud5.)2kUlI0^Sf$M&?i\M9:JMEs0f9XPfD_-41-[ETEVL32p$>2XpmMsP]5Rrj,^SO'5,5+'-T*1a4b'C/J*%`^>40YmI_0\pqRIP7(k[Ck,bJC'+0KQPHfm5W?O*H(f,2R"rr<OM;UI`XUo_=(YFWGSf:`5$iBYEg3B8I\j.>&dl1kPin-D!6a&9sMY&j67BVX_g3dTPqQu]="g:DHFl!'l_Z<^YBY?!J4"onYnguJ"lO$QGo"34`GW>tjjJ,NpLbtCJegL.MLgJ?::95M3OLf]Or>k2iTm>c2k%Xn:i=s-AO(`oKEF.DinHNVb-#96^M;V+unn(mt0EJr[&o[PS]p?p].D=66?o"\X'@?.61l-o]Z&2D005QrO$94ZuYfc9Pe8`8M<H1f8:B7Wt.7GY(hYLR=\^A`P-U%5D,qmC@RbGS>_U5C?9;+20"s4I~>endstream
+endobj
+9 0 obj
+<<
+/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 115 /Length 7915 /Subtype /Image 
+  /Type /XObject /Width 436
+>>
+stream
+Gb"/l:M:bMQH$>s?0G!M<hlct$$[[!1QY<a!jctanM2%r0f3#AM)Ukt@[PMu+`SXCJQXu@"e,(XBcGJWaCBs8H8=,j@h``mlu&%)H/,2#@4/@O]_V6t7V@bMXf>Ikkrn:aqL0.<WW(\aFmIU[kF?nbhSHuE@uN.^(h8LZ`Y`3E0ub&?N%r<h@uN.^(h8LZ`Y`3E0ub&?N%r>>Vi=3-*o4R1_rl4bSDS_hn]_;OY4'%#j^S[6=O1%A\b=:cs*=+O6"ejf@qL>b&@k1):1!cLQB`t]/U:9$3"!(#:)[W6)N[?t9tD^/]5[Wj.`Zk$45YLZ(Y5gI"Vm:c=U6AS8gG#'K>'*NN0se_%"2VO$k^1p9KnI\*V?S_8UdG,aQ_3\D2^2*!i&N<_WeYINF"WNBn\C`4R"sHJnAcF^Z-Xb9/<!!BVn.Z`gA+Z[DF>LLaC`_-itj*m$VmSABN(BOdTO60uiPl<)/V/TnaXLg#!("6A>Mdk5()I87Tj`U=PM7,dCCkrddI\N]89g,_A&*CGa%ur_,s"-ak0OgjU(m2TO,8@Z<+>&,Ode7SA4mO?LL34MU.MUG:oH^oeX"%TKY#geJl'ATRu,%d]g[Ld5,bNA1Z)+*2FR2X!D(.@hHZ)&cM^4;q]>KTX,2`@mn3eT(J2?asru1rel@h9@Rnjue%^9MX(uj/*](bWaB^1%nR8p=\<ZhL(j*GOOtdlqB@=BXk-6GO.'(b`k"o*9fa6L)V'NB@!/4q>)&NNZC3-o]Y;oi_Q0An[#hIH1(JE?[VC^M%cd_TDn2`caL9jVNP@JfC+1QDW/U&ktm01g01=7X>3JfX&lL-XK9)(_@$`=Slthcj+:$@iA\A#/M3Z[kK]Vc<;1V\C7=tnVEJ^)b[/*q`8[duf#$'OO5V4VCm^$PL]"qgA.>ErlK[Zf`.oF`Gj<eXf3We5dh*O^4f+A?=C,<G.j"Fk/k6q/r6;W(AhRNsT"/0^rb?A_A!ksBolX5/WlSP+7`5j6H"9a6XmEsaR$stJ7$9t-\5C>("-Nrbb*B_ff(76ZA;kdH_3IJZ$>U2EWJ.VIn?&fEbWi'NZGpf.n_Us+'BFhA&4o!".3sDj><MOLY%kFO`a*nL0b]'A2NIN3(l`CLLm0JC/LdiY.c.g`F"4^e%mqLC0H_`97tF/har"X.7<AJD.gr,W9c-Zu4tR<Akg?0XMGqh?_A`qF#k%oQZ'=.CUG6@3cooUQ\p:k@)J`2Zc)FX>Ufo9!/!G8*IG!E5eqjss='g0KXU4m]K5]IA5hM4>q2@@PDJinr:WqB+4$,O"\ZrCo`AH?-G"b(!K)B]INt:3ijia"Fp/I]3(9clEDa+-lgpqJ^4iJtF19@U[Fd/J3"Ac?U*1*.m)]_f[)"Dbuq:XqQ^f_A#6lp-/qt'd2pV1tKdatU$pY@KHk4;4`SnK`kNt364KfC1eqKH^jM_rbO4fa'XF.I^WNLi_('+FR5Va_C](V2=rIRasQh8R@Pf7k\eK1ORs@'3dRk:(#9&^ER@aik&@T@MKBK?hOOL8GfdV(Xp[NVs]hlH]6;S`*hD;9j<tp#<*[Dd>Krai9g0#%V3or&cYJD7k5i/r@M>$<$t6$sO4p>[Cb)R1omh<<#nC65pLt>u#K=OR^62'.6Nh40tO435r55_5l`jZl>j$Vb`pKk_qVq+;\la,;+.0Qr17*.rP@rorD/t8fm;q)>*i60:hn$J,_S=8Bf0O=L<&X-R^OQ0d6gHPSA'7Tb(DGHF@GAO?at)@91>X[\AaONum*pU/Mc^U1+R%;6V<7@<McFOCI<[0T6=fg8N6IN]%,_#90is+5:Dj82H0+6//poT2<R:\2r`)r7;1Z1+k8:!\Dd'G>lmHDTrELJN@;*I+tc9NK+q1n!?.A*MP[Jg).5r4.S_H>1(oO)o9PJH_nLmA"9^$cl^1o]cV$RohU(JL,T%SkC;A;O,=S:=#Tr=[8F6FRV7/mDZQFSFfH8(55VF!5t$-T^/A%$8hc?nc-)sQ5Y4R`o$/Xu@to9O@NUc]M_Zaa&"S$FMX8OL"$=/'>u'G?:Z>VGW#>Kn!\%U+W,"S&I[O(hGnUF;kb16=)k2jMpO!eXGUmS[ngV*0fSrO9c[6)fB&o?bW[NW.I11jq+hE%PU_gsVgCoA2KqQ<njOF$h+tfC8@t0C"q!mCLQ/?rg#43j,*WOhWWKW:jhDA5'O6skKC8QTS7rhMb<d\Yh;=[gNf5oSJ?#/K;d%.g.7(nt0RJP/aaSLu%mKh,Zd_p&]=K!JC_QH\W)N7-Kj*F$.Wh;b9)#NNZk7-'W<62*#6'HF:#<]@jk9XUd$sTP=Ed2Rpo7=K*Fefof5TKWRoghU),njJ$aJlRI=$^^a(SrLM<2GkRMq"u&XXZ@<F]<;PcAb.k\P`>pqAcR,f5@nd'Sg<18fek.(I@+MB9uBU]?fH+2p,1D)9&FUTgU*;S5D::,.bA4;Mpf-UP)W\ght6oaO37OaCoDe-G%I?d]L`3c\"R7U\;@;FQDm\^]2>`lPtr/;eol$W+;_tH)T..!+F"@8@#--XGAeNs2q7"1cr'aYko9GjYlFcd#H*^Cu-Wn,sQ_(oAcn_8;m-%!9TpufDB!.)CPtfq96"K8s6<fr8JW+%C/R;AQe0)A5cs/1FXKth$IrB.tu9Ig*gg^)<3t-QO?Y0=^a#MF'@\0GU^^7UeFalOX=j'=(C``'R3tqhd70GD,d3?Dd?PXT</<=NgckIY'ej0K*L`r<iSdM7Q#p6p)/S3E3ANN+GhioOiNBhb,917W3nA3H**5"W+*sMV+TpKDi39$d2#YnD_O"*,DXbXF`UjG,pZ?n+=i-[g-0VA2Wg>ZCDM[V%12We92JPpS4b'A<^#n?0O.fsJl=^d'%pd(Ghl3#'Q;sUZbLYhD%%pI:9?4+[ZW@6G9[:B8/l]T$R*sZ+In\>iPP1$l-7))%Ym@qZ*_IV<QIVPPTF%C,DFGIXs^MqR_eD'?6'MfA",p^.C77P)!Is#gF.!qr=><VP".(F"3FkFqJ2jLk!=o=&li3Jo)<<t1oH-cld:ouV-GT!:a,i'&>!..SHu'tWR35\jce<7lp>H-<=MpS9^1`hnX)t]$Mb.3E\M<c@5iW3YLecVS73q+Y"WN(]Vi`hiRDmCCMf<l37ntr[aq(ZdZ]ukOAtn/jmo0I82\L(6C6H+FiedOXc7lYjr;L[e@k1H3<oU]1o=dQU/uuT[#q3YXQPJGZr'@?oRoiu`mr)']Am":@hBtcrfohl=LI(?RPgs0'k2[Xd_]lM2'ZV1dBM-T:tg_ba$\[-Y!tWQ\l9N1MRc<]WSnQ._W/m+lp,=.9PC2;/_TOaffQRGd;C33XJ$WD*4afEV5O:paoM=jmH1h&Sct=Jn03r?gi7rV/aBpriD;J--a=-m*A#T^V-&d/SP;U*aTKXk+8Tb_D7&o_=3&:Bg6_tF]M5]\W\Wq9NQOW9<Dqd5j\W5&/9d7+ffYG'5UWRk+5&Y&B@2R7BEsbcA?F>H>KnQ(<E'r@P:TOo.CUjY\cq._/JktqF1eu<2\rh;Ke-)9dmf!]#A0a%h8kl@X8F8Rq5U:SXMH)43d)te=h!Oo<@H`+Q*YM36H`q(MsdQ?/omo2l3PWTUoq#I@<4XjX_8^l$pTp^D.LJA4HR5KTt`Lc21aq%@u0J%$&-;/I3Z/T:9?qF8[1jaNZK^)Xe]5bP(bf7`l?<);@dfBL@",+U)ZeVcp5kk;PUk!'6+e1X5dQ4F,a`Tq_0eI\bO#?1,X3rC3#;^3$Y.<VN_FCe#="UReTl*.T4bcRH1QoLI*4[afc%SR:M<*bjEo+$QqFO?>b7,dmgI%NPV)NSJZKFFeE8;+$[&2_PiQYD@.akkt0kQgR!&*S5+p>*#;F6[4X-L)V8X);Q,;\*lGF=[`I<-BRU)OY.uN*71?)5X62M.=DMDqM<?`Y>X^$LCduPh>Y+f46Q;jpYs7L6/ps1@LGs*':T0^3g,dYQ0m"uDOLP.5eCN2OmQO-q6RAOHZ&+ZfoO6l3E[E)S,_bg-<F\isPTms!!h2u@W9-u0HB>/A9r+0bR5C\MP+VXfNrD[$LYN?EYq7<R8G!%3k'%C2,,1_CZqr>LQ[:<-N*q0:kFetA!Y+%EUS=b>$t"(&*'sG#JYJ`DSgh?!7h27aq,;S(J>DU.Y3/c7g5K[RdmI.dG]MQQUsQ0Hma#kO`]KlR/AJdqoD[?'=#>s.1%IcjB8=0&$f-S^C`ViSm!3ZnaPE_bPFe24\/6U:=T?j0gsbf5Jd=:.+4$#M7*9cGN\!b4XU#S[LtikS:Pb_03BF%(@hCP`%=m"!=p9b)F<!V0l`h-VI=3`[eW!kNNA3n97'a'9@MILu^[\M,[8CtrfL[rULkSP$$,5rJTH+njS7f=b(j"VK&F=VU*2=ZH9m(kR+=XZp@BPXiOQqB1cLSp-W"4lG0IBgE[URh-q<nQ+N&`<9&2Vn]Uig=,2@=<>O'Z.!mcY0a1d+O6NItY<@!?Z#b9n6I:6;b9jtNH7hd[,+JDp7H_N4O%m$tI\h)WJig>7`GEhYUMnaU#ZjDi8g(t4;JENBX4F^Ng^4[U0"'/k:ReqUPOZI/?sf%*<*,Asosd2:?Rb*DG8e]-.ieYT+=51@>YD9SWU#5Ga-,u/Pgo"]I<oq81!/A[trHU/A%GgOIM0lN%+7bZKQBj`16`]bEO7qs9*eERi%i3F;Ai=#0d)**H"p5i`pXc74umQcE?kVkFH5&J2Ki&>kX=>UE]`2DAFguL"-HJ6RL'A/9mh?8"34iUbPlFs4SH\j[>;JY;TIoq-W/>OrJp"Ii4h+A,:Ros'(hTL,QlMiP=eE,p[iMKc%b\6^e"PSYT\%&q-Y2-$r72dPe$8_tIm'JLe!4Ol[@3L&2.,iVCT!,\Ed?rR-pkA^KOZ(M&+K-V3D&fUI3fhA3:!n_d,DD/J2(:_'RCY<-D)(a`436-3C2r_7>M@^adk8+39m)dU?Y6c`9N#`mTjh.r-.04ZlJfcHW[I_;^4ftcK7E4OQ",<,@Oq?:Y$rXqJK9_8>N_E>CarlqUo@;Y6LmY+3_S9QWBh][PT?ecHa/k/0n``NULEj<[8W.:^JTVDN;T&h:hc\rWK%L(1ml(;['B&VkdHjrZ2eLSAu+7=MOlkO.M"8=YWI5uL<Re%a".P--\FlB;iEd&5`?j"_^7d;W%*&a`M?Ho8tU+..=]4\c;?0Oq8Mi[Uf"'@]A^`i$fTu*1dir$p<PO?j\8]j&h,1!;YH!!"[()Jr#fim)k_"arMpHXrPrBD.U/Od;Z4k5CecH^iB$M4#&_R<s649.nQh(hpYkA0brCqG,%#W*I\@c=<`o!*Q2'Qi-k0+@bqj*j7TPI>'aMYM4q09B@CQNR2(+Fp`")!ulpD4J+#QQ0!@V*NT8#+ZfW"3o$("+0MMVMI[$\F_Q`7>E^>tHe773lh1PR8$Oe4c-j7&se%lA\a)cd!m,Nm3$8`b57-G<JmqHu%$Hr'^l7lPnj5q,MHkb]EFTgh0gMcQ=7N0:b<Ff")sk"pW.)cXSN6<[0MCE.,!giuoj4gh\;,i.2,Liu$&;2KZ+)A6De0;Lm&ncT;R2Wh>1)U:6Cb`%VgSs;3GT9N8fJ#XU2k"]9PECL\Q*dq+P<=/5S6])8t0"L?!Qk2AqIQi[)EgFF%KVRReo8*[[D&e=d$Mi-)=+:!As&C/;M(1tA:+am>S&K\J1WRD=4@HM)Bf@Mh4;"Zr7jj3Lb/S;Fbd5;'P9Y&6rJ)OW4EP?`G7[?Vq`*:Q.q,N9O]V/8K6!1K]@Ou`/Bt+nHrQr-P$'[Xb/ns0;7*TqJ30qX="(!/.uXN!(=I:SH*hNrG]mVnNBAX..>;S+3i!Wl650M[%]kXc!h,DnD/>_hqJT1/-e`f\l[H)f7^h3P>Y]qC2r6"'iF.^(29qq0]!\f</Z)_kARaoSL-?<SGP8#rE62KB8r6Tk1Tb:l.'t_@3E[<_23YLZ$3&K*p!h!tmdT'!?_l.6/V:BMT$co*NSVA&KJp.6p<nF,S%,@U:%L8G9K.)=oqeklcRV5pq64i_`C%q0ZuIdY0d7D@>XtPqToI_UY@h;blin1NQkO7FLg,kY.ICh.b$&K-2f%Fe8m=4qbXL3EFi\PVXM&n^\iJs"pG\"$@rA)+F+)(mF\T>'G/S_tC83mfA1\0mLGfWc6[%-_d8U9IWen,\6-C7?aWGKpeAdl<-_Eh[X$jVJg@uqfk*UH#a3[;Ag8p0'h"E7fH_MAL]*L<8mFK:GDJ_cuMWlT%-qR%5N>ROuNHCpd^Q(88'P&L>cA=)F.bRO#)mqES@VTbu@?3;2U-hg(X8&UbYc$:odh&QuO'2kcXj/qA*bs3E=;0M:\[8o9dFcCahh=7I2Y)'/rN#e1`Yna;PM2`0h<$Aul1Y&t`Z!S*n.8ON(\#'^#X$haO/$uh#/f:K75osI%KDSX2O:QR&M^78)H@:qJo-5HWc*qFm>=W:FAWcU,>2%m%eFr9BOe<%e#At#g1<+oLZ\'HNB$!bZY+.)=[LJEN^A\2SrU<AKK$IK#qglg3YC].\B2"2n?\d5-:3`KA6p?p0e=ukIAK-3ma<e]FSFY.C`]YC].rI;T[CN4*oPG$8#G;_f,M:&o%m=sHG=J]#o@NND/5glk8;F^9>MHT7%7EZZO\siNGU7&fTnKAffb`^)F'"6<Z"Q;kXK;s9Hu<bC:F%l?iMk9l8I*gOlS^T`uG@*7cRn?:ikT:DYG&Z%Zn[:#8+l#7[@-5CEBnGgpqKOI_ba[UTq$?ZdFSkN%d<FBT22KYnK)$<=!))KCrW]]ApQ3ZIRjL7"=[Ame;nD,/tJKNB0*9/MaBApd6q[)a>J[-XVA`fWeq7`WP*?M@ZZ]rN#6KO0-Je7P]lBC1BprNM^4E<qEr.;+AWQS-S3qD`Ws1LbKT#Y0(DtCJ\AJbb:jflM0Xkf*]j8*n2oH>?a2[h",q`^7?^?LtQHhs,3680Xciq2NBt3N%m2L%G$6t.!_m!TEl)uXN+f"Pl9ZeS%n;$`kcQb^db(RVEaA:=4gK_ULSM7*jNDl]s=qar:og\T2IIp3\=FE&4S;!7\_\M!p!MIc7O=sM7drOj'^O4;58='RmQ92(Ogb;nRaM]\!g]@1`BjN6NWDiA_,GIC6Zbgqu)=B/eCLsmJ`SN5Fq%t(k;D*[89<k`b6!Q#cQHj1r`3Sh-,BKp$-nUC3f10oU+=cg-Q`uZr^=1f@JLa9\)nB_iJ&:/a%&bdl;oO#!$TAaO_8=HD82bDR3qLD)Y'.=+BaqSjUh@Df=OGH#nC^>n^qGPPj(n-\iLVSUKh`OnZV8R3-:pW[c4PmY%pd(fMYHWsChral?$4?YSgA5&2hjEMtrG%FbBdD6ns7A'DGR*coLnh5.%5qD`EQoB=RH%Dp[UAXG3l9SU4-$b%4Aa$snS"1"]rj$"-n=H>4JN%o\?cF;]kP@f*YI7=<#%*2N-]7rWnX::SOd@GH>0s^kNq=s*)X>&kp>9D[7PK0mNnZibTr?'I=lrb0b1&JkrD]YX7=m.OL-%d3F.5MU!`#7GSS^\'N(.MfX^4AFJcUb".bW6Fn6rIOU@W6A/gA4lAWs"W?+8U2B3W/g#"*N5#0H+F2*5kQ(G.0dR;ONldq1m;c_+/rfdt&Kg2+bFM`>CBqTTE9.qLYTB:575WdC>ORbOP>EO*5^fA'>pEr?dZFERsW?[?^O9iO%4(Rd@K'+='.bbXF*rY5<9SA'DT<kb1t"^AV@M74nFAa"8Zh'[CV\N9Hu`Rl88+E_s^_\,TeMokgJK7:XQ87K&#L<HN?1(iqZ&rG\C([7).D<RDY)fYBem7)X(/F+#E?M/$o'r/NpRA'EE>SSu9`r57AYhtVcpj[JJi%Q1P0ejEKDeWOU)H&>JZ2.g:\,goaFXCMura_oZs@uN.^(h8LZ`Y`3E0ub&?N%r<h@uN.^(h8LZ`Y`3E0ub&?N%r<h@uP]uq-T(`Zqg~>endstream
+endobj
+10 0 obj
+<<
+/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
+>>
+endobj
+11 0 obj
+<<
+/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
+>>
+endobj
+12 0 obj
+<<
+/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 18 0 R /Resources <<
+/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
+/FormXob.120a85b25e09f27df74ed3dd6376b1f0 8 0 R /FormXob.2c142ae4a83dfb816cc592166ec9ee0a 5 0 R /FormXob.731334a9cbac82f848bea22b06a6c4a7 9 0 R /FormXob.85d01d3946b8319a1d268e97a52ee385 4 0 R /FormXob.c51b94b7f6c2506fc5af23c42fcb8aa7 6 0 R
+>>
+>> /Rotate 0 /Trans <<
+
+>> 
+  /Type /Page
+>>
+endobj
+13 0 obj
+<<
+/Outlines 15 0 R /PageLabels 20 0 R /PageMode /UseNone /Pages 18 0 R /Type /Catalog
+>>
+endobj
+14 0 obj
+<<
+/Author () /CreationDate (D:20210716084258-01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20210716084258-01'00') /Producer (ReportLab PDF Library - www.reportlab.com) 
+  /Subject (\(unspecified\)) /Title (OhmPi project) /Trapped /False
+>>
+endobj
+15 0 obj
+<<
+/Count 2 /First 16 0 R /Last 17 0 R /Type /Outlines
+>>
+endobj
+16 0 obj
+<<
+/Dest [ 12 0 R /XYZ 62.69291 450.0636 0 ] /Next 17 0 R /Parent 15 0 R /Title (Citing OhmPi)
+>>
+endobj
+17 0 obj
+<<
+/Dest [ 12 0 R /XYZ 62.69291 375.0636 0 ] /Parent 15 0 R /Prev 16 0 R /Title (Introduction to OhmPi)
+>>
+endobj
+18 0 obj
+<<
+/Count 1 /Kids [ 12 0 R ] /Type /Pages
+>>
+endobj
+19 0 obj
+<<
+/Length 4546
+>>
+stream
+1 0 0 1 0 0 cm  BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 741.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 4 Tm /F2 20 Tf 24 TL 166.5949 0 Td (OhmPi project) Tj T* -166.5949 0 Td ET
+Q
+Q
+q
+1 0 0 1 62.69291 711.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 3 Tm /F2 15 Tf 18 TL 194.0924 0 Td (Partenaires) Tj T* -194.0924 0 Td ET
+Q
+Q
+q
+1 0 0 1 255.6378 641.0236 cm
+q
+84 0 0 60 0 0 cm
+/FormXob.85d01d3946b8319a1d268e97a52ee385 Do
+Q
+Q
+q
+1 0 0 1 62.69291 623.0236 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Authors:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 617.0236 cm
+Q
+q
+1 0 0 1 62.69291 593.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.49622 Tw (R\351mi CLEMENT,Vivien DUBOIS,Nicolas Forquet, INRAE, REVERSAAL, F-69626, Villeurbanne Cedex,) Tj T* 0 Tw (France.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 581.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Univ Lyon, F-69675 Lyon, France.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 569.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Julien GANCE, IRIS Instruments, 45100 Orl\351ans, France.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 557.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (H\351l\350ne GUYARD, IGE Grenoble, Universit\351 Grenoble Alpes, Grenoble.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 557.0236 cm
+Q
+q
+1 0 0 1 62.69291 539.0236 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Parteners:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 533.0236 cm
+Q
+q
+1 0 0 1 62.69291 516.0636 cm
+q
+1 1 1 rg
+n 0 16.96 469.8898 -16.96 re f*
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+q
+1 0 0 1 6 6.712 cm
+q
+12 0 0 7.248 0 0 cm
+/FormXob.2c142ae4a83dfb816cc592166ec9ee0a Do
+Q
+Q
+q
+1 0 0 1 116.3529 8.805004 cm
+q
+12 0 0 5.154996 0 0 cm
+/FormXob.c51b94b7f6c2506fc5af23c42fcb8aa7 Do
+Q
+Q
+q
+1 0 0 1 240.9449 3 cm
+q
+12 0 0 10.96 0 0 cm
+/FormXob.120a85b25e09f27df74ed3dd6376b1f0 Do
+Q
+Q
+q
+1 0 0 1 351.2978 10.79486 cm
+q
+12 0 0 3.165138 0 0 cm
+/FormXob.731334a9cbac82f848bea22b06a6c4a7 Do
+Q
+Q
+q
+1 J
+1 j
+0 0 0 RG
+.25 w
+n 110.3529 0 m 110.3529 16.96 l S
+n 234.9449 0 m 234.9449 16.96 l S
+n 345.2978 0 m 345.2978 16.96 l S
+n 0 16.96 m 469.8898 16.96 l S
+n 0 0 m 469.8898 0 l S
+n 0 0 m 0 16.96 l S
+n 469.8898 0 m 469.8898 16.96 l S
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 516.0636 cm
+Q
+q
+1 0 0 1 62.69291 498.0636 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Creation date : Juillet 2020.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 480.0636 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Update : 21 ao\373t 2020.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 462.0636 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Status of document: In progress.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 429.0636 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Citing OhmPi) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 387.0636 cm
+q
+BT 1 0 0 1 0 26 Tm .425984 Tw 12 TL /F3 10 Tf 0 0 0 rg (R\351mi Clement, Yannick Fargier, Vivien Dubois, Julien Gance, Emile Gros, et al.. OhmPi: An open) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (source) Tj T* 0 Tw 1.36784 Tw (data logger for dedicated applications of electrical resistivity imaging at the small and laboratory) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (scale.) Tj T* 0 Tw (HardwareX, Elsevier, 2020, 8, 24 p. ff10.1016/j.ohx.2020.e00122ff.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 354.0636 cm
+q
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Introduction to OhmPi) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 288.0636 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 50 Tm /F1 10 Tf 12 TL 1.130751 Tw (This documentation presents the development of a low-cost, open hardware resistivity meter to provide) Tj T* 0 Tw 1.370697 Tw (the scientific community with a robust and flexible tool for small-scale experiments. Called OhmPi, this) Tj T* 0 Tw .732706 Tw (basic resistivity meterfeatures current injection and measurement functions associated with a multiplexer) Tj T* 0 Tw .086905 Tw (that allows performing automatic measurements with up to 32 electrodes.OhmPi's philosophy is to provide) Tj T* 0 Tw (a fully open source and open hardware tool / to the near surface scientific community.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 276.0636 cm
+Q
+q
+1 0 0 1 62.69291 205.0636 cm
+q
+.960784 .960784 .862745 rg
+n 0 71 469.8898 -71 re f*
+0 0 0 rg
+BT /F1 10 Tf 12 TL ET
+BT 1 0 0 1 6 45 Tm  T* ET
+q
+1 0 0 1 16 40 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2.5 Tm /F4 12.5 Tf 15 TL (Note) Tj T* ET
+Q
+Q
+q
+1 0 0 1 16 16 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Everyone willing to get involved is welcome in OhmPi Project!.) Tj T* ET
+Q
+Q
+q
+1 J
+1 j
+.662745 .662745 .662745 RG
+.5 w
+n 0 71 m 469.8898 71 l S
+n 0 0 m 469.8898 0 l S
+n 0 0 m 0 71 l S
+n 469.8898 0 m 469.8898 71 l S
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 199.0636 cm
+Q
+ 
+endstream
+endobj
+20 0 obj
+<<
+/Nums [ 0 21 0 R ]
+>>
+endobj
+21 0 obj
+<<
+/S /D /St 1
+>>
+endobj
+xref
+0 22
+0000000000 65535 f 
+0000000073 00000 n 
+0000000136 00000 n 
+0000000243 00000 n 
+0000000355 00000 n 
+0000015380 00000 n 
+0000044178 00000 n 
+0000100904 00000 n 
+0000101315 00000 n 
+0000119802 00000 n 
+0000127908 00000 n 
+0000128024 00000 n 
+0000128144 00000 n 
+0000128605 00000 n 
+0000128711 00000 n 
+0000128982 00000 n 
+0000129056 00000 n 
+0000129170 00000 n 
+0000129293 00000 n 
+0000129354 00000 n 
+0000133952 00000 n 
+0000133993 00000 n 
+trailer
+<<
+/ID 
+[<870bb68092b857292686b2b33a691c37><870bb68092b857292686b2b33a691c37>]
+% ReportLab generated PDF document -- digest (http://www.reportlab.com)
+
+/Info 14 0 R
+/Root 13 0 R
+/Size 22
+>>
+startxref
+134027
+%%EOF