From bf1a39b42edd0307187c186cb4cba32d089baf10 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 16:09:20 +1000 Subject: [PATCH 1/9] Initial commit of sphinx docs --- .gitignore | 145 +++++++++++++++++- docs/Makefile | 20 +++ docs/make.bat | 35 +++++ docs/requirements.txt | 3 + docs/source/api_reference/connections.rst | 7 + docs/source/api_reference/index.rst | 9 ++ docs/source/api_reference/labscript_utils.rst | 7 + docs/source/conf.py | 134 ++++++++++++++++ docs/source/index.rst | 16 ++ docs/source/pyqt5-modified-objects.inv | Bin 0 -> 64143 bytes 10 files changed, 369 insertions(+), 7 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/source/api_reference/connections.rst create mode 100644 docs/source/api_reference/index.rst create mode 100644 docs/source/api_reference/labscript_utils.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/pyqt5-modified-objects.inv diff --git a/.gitignore b/.gitignore index 247f33c..adca393 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,138 @@ -__pycache__ -dist -*.egg-info -*eggs -conda_build -conda_packages -build/* \ No newline at end of file +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/html/ +docs/_build/ +docs/source/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# Editors +.vscode/ + +# conda build results +conda_build/ +conda_packages/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..11a19a3 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +PyQt5 +importlib_metadata +setuptools_scm \ No newline at end of file diff --git a/docs/source/api_reference/connections.rst b/docs/source/api_reference/connections.rst new file mode 100644 index 0000000..1dbdaf3 --- /dev/null +++ b/docs/source/api_reference/connections.rst @@ -0,0 +1,7 @@ +=========================== +labscript_utils.connections +=========================== + +.. automodule:: labscript_utils.connections + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/api_reference/index.rst b/docs/source/api_reference/index.rst new file mode 100644 index 0000000..bfaf552 --- /dev/null +++ b/docs/source/api_reference/index.rst @@ -0,0 +1,9 @@ +************* +API Reference +************* + +.. toctree:: + :maxdepth: 2 + + labscript_utils + connections \ No newline at end of file diff --git a/docs/source/api_reference/labscript_utils.rst b/docs/source/api_reference/labscript_utils.rst new file mode 100644 index 0000000..f73d1e1 --- /dev/null +++ b/docs/source/api_reference/labscript_utils.rst @@ -0,0 +1,7 @@ +=============== +labscript_utils +=============== + +.. automodule:: labscript_utils + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..96ba8be --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,134 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +from pkg_resources import get_distribution + + +# -- Project information ----------------------------------------------------- + +project = 'labscript-utils' +copyright = '2020, labscript suite' +author = 'labscript suite' + +current_labscript_suite_repo = 'labscript-utils' + + +# The full version, including alpha/beta/rc tags +version = get_distribution(current_labscript_suite_repo).version +release = version + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + # "sphinx.ext.linkcode", + "sphinx.ext.viewcode", + "sphinx_rtd_theme", + "recommonmark", +] + + +# +# This code is for sphinx.ext.linkcode to link to GitHub source directly. +# It doesn't link directly to specific lines though so is not as nice as +# I would like right now. You also can't customise the "[source]" text +# in the sphinx docs (if you could, we could have both viewcode and linkcode extensions at the same time) +# +# # get github version/tag +# if '+' in version: +# gh_source_version = version.split('+')[-1][1:] +# else: +# gh_source_version = version + +# # define function for resolving source link +# def linkcode_resolve(domain, info): +# if domain != 'py': +# return None +# if not info['module']: +# return None +# filename = info['module'].replace('.', '/') +# return "https://github.com/labscript-suite/{}/blob/{}/{}.py".format(current_labscript_suite_repo, gh_source_version, filename) + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# The suffix(es) of source filenames. +source_suffix = ['.rst', '.md'] + +# intersphinx allows us to link directly to other repos sphinxdocs. +# https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html +intersphinx_mapping = { + 'python': ('https://docs.python.org/3/', None), + 'numpy': ('https://numpy.org/doc/stable/', None), + 'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None), + 'pandas': ('https://pandas.pydata.org/pandas-docs/stable/', None), + 'qtutils': ('https://qtutils.readthedocs.io/en/stable/', None), + 'pyqtgraph': ('https://pyqtgraph.readthedocs.io/en/latest/', None), # change to stable once v0.11 is published + 'matplotlib': ('https://matplotlib.org/', None), + 'h5py': ('http://docs.h5py.org/en/stable/', None), + 'pydaqmx': ('https://pythonhosted.org/PyDAQmx/', None), + 'qt': ('', 'pyqt5-modified-objects.inv') # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py under MIT License + # TODO + # desktop-app + # spinapi/pynivision/etc +} + +# list of all labscript suite components that have docs +labscript_suite_programs = [ + 'labscript', + 'runmanager', + 'runviewer', + 'blacs', + 'lyse', + 'labscript-utils', + 'labscript-devices', +] +# remove this current repo from the list +if current_labscript_suite_repo in labscript_suite_programs: + labscript_suite_programs.remove(current_labscript_suite_repo) + +# whether to use stable or latest version +labscript_suite_doc_version = 'stable' # 'stable' or 'latest' + +# add intersphinx references for each component +for ls_prog in labscript_suite_programs: + intersphinx_mapping[ls_prog] = ('https://docs.labscript_suite.org/projects/{}/en/{}/'.format(ls_prog, labscript_suite_doc_version), None) + +# add intersphinx reference for the metapackage +intersphinx_mapping['labscript-suite'] = ('https://docs.labscript_suite.org/en/{}/'.format(labscript_suite_doc_version), None) + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..c958626 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,16 @@ +.. labscript-utils documentation master file, created by + sphinx-quickstart on Sun May 31 21:24:37 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +labscript-utils +=============== + +.. toctree:: + :maxdepth: 2 + + api_reference/index + + +**labscript-utils** contains code shared between multiple programs in the labscript suite. +This documentation is primarily for developers who might want to use this common code in their own custom features. diff --git a/docs/source/pyqt5-modified-objects.inv b/docs/source/pyqt5-modified-objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..418cb89648e921f7eebe61d58f5fc2dac9e2df02 GIT binary patch literal 64143 zcmV*TKwQ5gAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVc~Nu< zBOq2~a&u{KZaN?}E-^7KF$yCfRA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}H zZE$jBb8}^6Aa!$TZf78RY-wUH3V7P&y<2zOIJTwxett!b(dRWHccrs;?@@2EWI4Ud zN=ug0+1)QWCeWd=!;3|XpQe{drSfC~U6t{@P39&Fv`{MKB&fH$yu{@(u2Keu&x z_%o?@kALP_)BY{3s();cMcQU%@wdPKZQr)lKYseDqQAOs%4409ZCUTgx*+XOS7qA# zbo+eQ{?DJtQ%j15{>h(7m96*fA^#tLUf$k5zWMn-D!}FTziyvDJ^YKL?dR-otN#c3 zm4Ez$ewu1Hw@IBGf-?a*g#!EjnABNPw0}N4|JgoQ1ig9x%VGBUzwW+@?+k!$ynp;- z1c{a$HtA!MA7ew^k@nBDEDFMT{;ZO^ZO~i(pLVYS>Gpr!$xr^7KHT}(@*nq~VJo6{W1 zQ;!->1bw=_(FuW1y%Hj!e?O2mDaAM$dl~*aXmk7bpKqVP(6Kr&I#+(}lm|O62Xk&% zk+(~xm(tLG`WtHg^*z*S&1;1s2_2w6L$9Tz3c)I^3cz=?* z{iHFhn}=f~eEwgmc-LN*HCeMix~E=qFPMoOwk?YA}A-&|k>JD0n_wCe>U_ zy`v?yphO1CO}QaC4#D{$&t}cq~(C<-RE~*F^`l|GRzL=r@n|BuvOeY!*=@CQqB3#ZgHQxxqEy$PqgdPaxH%V1x#SWJ_71{@( zJq6mJ@x&cDyN#OmLwviek(sG-B9$i*t0caxW2JWRzRgLo`HddA;R8P~>4Hj6B_3EN z1RX25iM-ilZT3j|Uqix`vOTU7b;MxHH&R#=v-|X-sb&nj4an}(go`>64S!pj(P7#E z5qHItcfpg!3=sjk(5~2(C44+~!D=!hXPA;>M6fQ*k7cqU^$9?8E<71ka!g4!I%F#> zJ!Y=UJjaLag{Q#|9Nv6mM7F`cugfF$_G-s8Cm{-VU!ZX?8gzVzPd4}i=?5V^bsPJF>V)VMcb8kF~j0 zPBpkU)VjAj#3%smXlUnark|&oc5W#$Mw1SGOFVTGJY{zg4IRMMpT@YXNz&4N2~B!O z=3MO?llJFUQsI$ukMU)|F}s7#k@XqZWUJ;YpPL4kp3iqPiB`D#5|4v%L|3NYu%M`v zn}vBK=>zlzOIu4Qjflo=Pgrnf%J}+P=XSTS@>TgUkvP^CS431GuVTR64t={ zNa_mt#4af3&q7%mbroSc4_%IE?ucU6t6JODhJO0R(`L_5igVaNgRf3nG|TdQoYO~ z1A_Dj!+kn)FQ9Ua;XWbw(kVwVJx9630X4?ywmWD*-8RpI)ce|#iU3W4st;m5p4l)` z$Oh5*0J$uWpqTSTNIW_>AApPT+x4vwsvnR=SeyamZIXVQe@Btvco16PEkpuCbsL8g zk_DugeWrZGVmVPhA_7k2$4EDDVO*IJJoc+Gf&;!*6p{k)zu0WL)0%iF2@@5g3Lll~ z?}#ZbOaSmRIh2q1h_#TN2B|YR(u@&yz`S}cl0%ku^SJ!Zr{BSX-3W0x$IG*r+sBRU zi*4#}+Z#Di}tv>f)G8(e%S7J~xu3ai57y{4*=Ij;=IPO39r5qc0?KBH~f z8R4eWbZ*cgcR0t`7{T8Ox#-bF?vs17J;D# zoNkoDeg$*P-wl`;pMThIqZr2*J1?9MDjgETE%kRoM#YT+Z7&d(?HsY{H95J#V7Il#@fhQ~#AkXxyBgMCX zpJwO5v0t+H09ZVU#|%CN8GkX+u%|94W2Tqn9&r%^{(VXcg0!48Ov|}osBYsZL$ZJr z>noD8H&Z>M+%cgsZKSf}1`3sArIR?bik53^lT(%&%C8%!!LKnM-1 zjZ)6tNY&GoS3oEg=PKK7j}5zn`-UFP)>)DxKy8HRA*l{h)QSf9L#aiH2>{+#Bt7Oy zeGd zY^KE;hgT@pQqj(6ID^SXM5l7SFUxd~xTW7QJ@58icZKqbgG(j4A#IX>E{{7*tOFCR znW&cy@P~qn5>o?YvzgrP%VLKK$V4k9>IWSAgE_{CsRI61(s5Ki90FYA)jmOFEx7)0 zG?FlVFSeTs3i>?ja8+rG|p2zgPS#-AS^1y z{kP|b@@e*@2^~nocFJak z?>%1`DgS$AmToSZ*;!Vg|0so6F(JUGtii^klGEUNZ&!km00L;Y`{yQ0ll+Q2W+}nr ztEBFR>-r!K3P+TY@~Wii%r{STWGVQbiH;;4y$d6Z|Hv6@L7%XJ@NB<=;;0}+l9xNo zjQ|()ZvqToD5Gf5R4Dpw1QM!ZwPy}c97{PHo)>9)JRI|xuiRAZlR?l$qWW6mhy%@l zx+iTr@6|~PP$R@#FrA+zqi{G1$lGJvmIdOf{J;ghtFq|}WE2mY0>wYfenpN1;uw|} zyf>aml5gahJVI|gkr2HT5K0gV-T$FX>J8Qr+&8J` zK5{c$;ap*+L1!Vp5>3-<-p}1hl4_|Z zG#P&5?z&D6WcCSdF80&+Efcex)#ksl()>o%hQ?7q_=nji3nYjbQott*B#7z<Mc|tx&Y#jhulfqoRYjK4!api%69-Juj1Rb>$V73nKcQ zJYObFOE7y_C(kL@^pXwkuGHdTgy`grc8F~9Za*(s=j_TZ2091VheNVE0bIsprxFT= z2_eP=t6{RI{VvN#QX}y(y;SPi!8BJez9_gxL|;hLV$rlz%T2=Ftmy<{(J0!s&K`~} zN`E>nJ4NpXCK8NArFfguPu_h$CNqztI+6#bN2H#WMt6nMiG#~ZbW!h)2YQs>V523S z@HEDO!y96Z$U1D+@?-3W<93TO`gx#=+dzJHa(;dxIJ;9{HL)mcF;v;(p z_uN;@fq3F0dk;ALemMwtWit6PJ(D7I{H)@0dZ4go6`w)G0oJ*}QHEmCD8!sh%{L4R zF&$L%%}&v~fr$iT(J2lUJ#M5Q4oR^=LE(a_5OnZpzHmU1plMLYJikV{)bc&0Qm%_D zgBO@i7!VcVid5|$>8#I&X*tjO3~o>y;aD_^tS0;#a*|_R9@z|%?kglCZ!o5~0Clvc zO4@WUS3eXop(xjT2bk^*2Nw^W&eiVOh1wkok<@aqbZ&4)p;%OkcXUXUVl3E%3t9c8 z4-~}W2%35EnAK&$PQqcW;$)C?ui_(bFrBynRkZ6YZ%O@6@{GW=G1#Og{l3@{+u=s;V0_Urs&pTd zXB48G=~yX*3zW{X{v&6!j&OfZFH}cs76FMg7V=2)PunZfCRvU_!}QAShU?jRG*>XA zD7dUdZ_8t`p`!#bV=y+~gH#t&7Ehx!h`gDeK?PR!`yW}G?y;F0t~!lX5_nUNh*V?D z3i3y`X;H|i)(@s-=jq+Ryn?Z)6bMtPb`aKyQ#%H5me;@_8Ui`c;p^L^t}~Q9)Pd_g z2t7ND<_bm=1(%g*{i$L%_+%x@ts^>I*-KC3Tq!KxDB}g!k()gVUbA4iJDqs+>q=JDi0C4C@T2Ro>r9e&rD9sy{nRN!6U! z{Z&UO!O%noOP&0{!JtAe0_J0hV_5{%{L{m~NZQ_J={J;}PRZpeE@uVNJfTD)fKqX8 z6ZTN*2KgzbN~lhHhzTNqf{T?@XJpqhaLx`?otA^AbA$5=#iCKrg>LSA5dAwWSlD%Otuj={kprR53w6lj3U&D+)9d>I*$8EOt3+ z7h9?6N7LPH!NtXB(y{Yc^XFYu*_f1V>P3}Ib+%;}3!TQr7D%jHPxwmUzUf5q17iw_ zGXlBK{!Oqr8mi^S;BMAXg0Scm`SY$UK5e%R!RZdyE4iM7Ms`SBkhRZf zSDUI%(R0PgbO!T^h)(6goDIZ33y6D$l5i{_#jjb539`>xKMV78MiUN7!{HxiPXgBC z@Q;>hzJ=h;tA~HlgdCiU6i?gcvFBnDk3R z&GDMuaybu|^t8tp6v~G4>DbPDnG*z6a?wd>(%+X_G?+F(^p!#&PFyDp249+y!K#?| zDJjUuGTESvmKvs(b2TfJ>IelFnn-8Knx?FgoTxS?9^%fN#h7)me}jiMz*n&n7$r#3>(d3UPn z2<8%)2w>^&W5)yP@1^%q4c?BhVgYoaVa}gyGWw@bw$n_BHC}dr8tWKDsJV|p6h}vn z!H6s@Cuk>wn%qg9!4q6;uqx&klJ1M_`w`>Jd)sMQfd)4yvT!UQ1=^Lap2c&a%XD^T z6ak&i#c!bh`xOe2(AqdyIyX3@P%I$DMO`P)m?#Mo^z#T`XF#FR0H~i4yY{oUYd<@e zpa3i&1#+8yp4O(H{Yy}IG!W`$crXzYO?lqY52!LY6O0emhl$>E^+D2U?H|!hjW|wr zfcg#Mw&#s^+w;b`9Spz%P@uhKMUr@4wxYW_(h1B35U~^eHz=1FB$Dq6gW>B4D?FMV z3VGWg$tGgY%<7!kmN`RXGH%q+0ic-@YrO0LHQL=slGJlQlJ4qA zGcXrG^qHhBf5sUPs_rCxT!XhGvRD8Cv_I;ky1|+MT$25uiU-#O=%%wHxG3mUuCE#S zQI$2u1)oPLWhLpopnw8_Cf=tPu~;q<-dwdOzPy~T8$|z0Y%I^BJIA$ zB5Wn1o2+-WCK#OSu6>&yNn4g;uGN<>@co|~mV@k2`~p_$Z{2BruZp)uH3R{=)#fBxjz7;OWHQ!4(Z@90eJ_FH`Y#W{@s(w+M&vJV;a{tI zSKS|qZFz#?GAcW{0?sg{NfE*NFxQu5P3W$Bo9&KsXGQmrr_?FcoL*GS3Lu@@jB~Hj zTi-pY+2@z6Aab(W8sU-(mzULL5Kivg8CC|@^lRC)=o^MT6`i6T%M}!Fjek{`@ z7xAMq=1f;C5)&|03U{C}^1`HSL7s6k6oPEHz zysB~5fxbPH^b~89Lb2hq|p@|z^#O5TE=SA(~{eGPDJfoYKYrlwD&`ixbPIj33 z_v4HUY!K@4IJ&|H@o`^wpn=gesE_53cLk|;&lejyW@t0^R;*cf$SHhz`GaunWY7j~ zl~YiyG+>}-!|tW-Uw6}-ioJj3PV=$~6tc-ZIFo8#P{&$c55XFJdTNr_Y20H{H}Og( zenscbzGAr6%RT-5l)db->IRMMzr zMlUXBrE|WdD`#8cl;Y5Lta?ck_pJcaOF9&B5f=QiC`ih#b)0CYn)U`S+NXkCo=%)s zDb^y|y3BK&!+RB7%1#6B7`%zc1q)+dktVIPYR+RL5ayuP&fOhrER0UN?t(V{@To(UAEyqRB+p9YniTZ8l;SJ` zeGTlcY)xDJREkNVN5y;BvSD8Px|`nlpBk1zZV2K;^4(AGE*{uD%V~S@l)Zil=2|~} zPo!2twIJV>?q(Djm<6O*v;XF;-4GA^4_c)GveiJ~%qud|5#!sWrfW`yhxd@w4HtBi z4Zha+Vn7=~;Sx>3@x>I7Xke*H@{!HvFL?8~umfFfARx%a$GicL<~b&qeD3u!vY`WI9i!ziG*VIfR5 zrAmI2R23>Eo6sdca8)m)O5h4KHd2TYXXBvYxi%1EUsrs=(O{?+m8hM7(|TeGL!_|a zjpzM?dH3N(P?mwBJ8wD5-gX9abqAg&UCvfFTwfH~fj_JGsham}rACl+s$~T|N2wyM zMg(v)agyqcY@#d_EH)*VgM|CQF)fTRHeY`}K0J{6E#2ZYcpxh)ZS5;={brf4k!gj9KE3; ziDSkISYvM>uh;+ww9^dw_b(as|2p*mC2rUO^EM-xcvVLHScc~~yC|Rrod5lQFlnBi z{V=-YIH2%E14~(F|1OI*$&I#kp+aG$za;9Y#ql=xli6oW=E@x^TM_--|`V zH4tS4b5*9JUjN!`dX8g?0!qa}YFFl5y9XaAk;M@-^L)cf zoRt6SyHXGbl!AkPBK~peiTJNmt`x)vIG~;8sr{~ydF>8EG^fwbW`iX#Fd zg#~AH^7QN)mGmw^77P2+@0B%q<#V_6FHHj`rc`wTZTYj|k<9KktJh~n^_0g!J3YXD z1-Me8cu>^fql(BNdiO{VbFZ?dO4@WkXQkJ;2vgnks!lqSKxt!)aByRzjM2@wW;bos zv*zJ*)3V#fYGCF)C--WgvM&f{fIew4IfoV)6?|yPfe+}Ah%>6k2a!&~!Btr(!lS@V zjvyi%(fV>v(r+J%4SAYG8>)JQsQWf)2@+4kw45lyO=(vcd$>P=qA)1FBo8^k zTuNFd=wC_{U!^}$(7^4ABPbJ!z40SMJR8&Yf^Mk6SM6R5G?wl~5mX1&oy>Y)m&a-@ zP$#xyVla&E$2u08!01x&KqSc9q{&i#?qDXw0~6w>ETF6Ct8x>$jo;d4t+I!SdLt?XS` zw2NCB882V5>Aa>}5b~eD;GAn3I3BpF>-onv6Fn7ovK&gX0R+ z$W!fVSPn}A1BWAVF85i!;pb~+f}~7{pC$qk6d!6H#8vM@n8G{rGS8Daui22+QU*5e zJXqe#`WZ z*sbtl4`$&pU3sHoK{4AEO++@L^>v=?8g#BLQ=LY)5(H2iBZBiZHl`TIjJN#B3Ou@s z>-o5(tKQhaDAqQHj;JT9$wgJ=S(>11FKUtuY8D#Zk+&;6gxRPFV(D1w=c+AtbyDrK z^w*@>&!tiI_EZn%8M(4XMT26rE1rlX5qtH~eM{SZn2EyPxYTeVkU{aG=0RNbR)i^h zFemeEiOrD6j8E+`O7!GKDOT)kJ%Sy(CSbMX9x}@X{l>X2S!`!Z628O6xcah@TJ{St zx*Ll;sJ+pFuu*gr*=+C3;+ToZPi$a>dg^ippS8Gat3mJ+cZ)SP-&N-%;tXOuiaAXA zia$F?f^i(k2-rCp`_Ug`7~EtN!r6~o5ip8@;sfmw!nsSzkVz#QLGL755yW`ZgfQig z{ny;E}W8jHYL1S?_RB~4cBE|2x&+%Y}jN-0wUaa1SjAIezoRj~3q|2(N0 zvcVY46Cq_E%WGb&1L3@lCIk$jLqJ$P?Q3Gc(k)|Sq`ORMs@uo1tS}sNs$+NME?uaL zS^@ztTe9iArW^T`G!6eogE8J1U@9TaztPx-96ielU{SjiKdYs^XArW9{IN{G&EKYW zlsQ*(gGooV;Q=8moeUX^%7XU91!wU*ZecohEeZ?)v?z2elI1$f=MD`4oQ`J1Yf-eY)qu_FdJ$ zu`)TdE=5df>uSuwj$v;}eaM;y;U0Dcv>HTxkgC7l`MAie-Ht3k1rT9MA%IrRRc!A`PSW`&=$UmRrL6Y7m&`km_c;4dA*cw?O-l}cpghvSIk?^r$1@#c z*RCy5pa5NpBch(D;O~xV=Z}I4{?e+}HVW!}cz*)8nym;?xHNxH3Q}k3MZG&7=AZZ5 z3AIG3ff%MEWr+bo?@1J~=q#T}d#npwqMBA9Z zK~}x15`TCUxHAz%)Ddmy1}kfy(WX7iq@ZWoGr*ViEhZYHbx{S?LD6BhI5?VrW}M9& z+H_hlisr`J71ZA7PuM6R3Y4WpMR6=8V_&mBp=liL3LcadYTbW{aatE(?7y_1-5pb{ z3@WhI=YsBAF3zR}Pz9ga4R)BwH52qR3SV=%2uAwy6Q_*2&J>U#D`W(L6@>?TaiilO+)ZUiM5_atl}3J8C#6#@f)dzRH+ zxX4y4YdOw-;gY5E$Lyg_>bVof?Hs7*l4g3qig}1H zi(@so4#7u&0=6ZFh;$-^3%`=ZdhJ(r8d|itG1!ph%kTXQGTXQy7RQ2!q)+Z)hI;y< z6sv0ludUVWx{L7iHscf*D6MlV(`5Eti#Zp8{e(Wtaw#Vx&czDU4A*=&x~vb$ z{0+Vk<#Uiw(X9}50If{_z5@}GK^==RKppV6 zMittC_6_0QZT75!_5SVNL-cA%zfm6+EmqpzB=s(v-SLA^0Zlsx>bazup6;S$>Ymp) zrdyZmwUX{qeqg|h72Da8rb%|>;@IxlRYWl--sSx3&Ih5JXu7HG`m>#awIzB)qm%JR zs*`>!cb8?+lBX7jFfVth&~uR~u0xX}KmnT>LqsE@-Rv872b!JbW?kJ)Yg7n(TXTX$ z(Nna^B{N1i>2jc2{LihYU353zkdXFfLxM)3P`smqX9NI3Wvt%ZLv~<6zj5SC7OU9O zfBSNSV0_?0R%_`alV03)ocHpDE9Rdb{zcLj!Mx-`R&(hiQ(xS5oci*GkIdI}cU+*{ zK&Eh{y`~3grMPQti3!Wrx2U31=(?G%5TLp_wyZ3@m+W33?{SMlg`gmOd9Db8eM@Dm z*4#s8zo6eZ?hY}f2RjQiwz0QR5##<`XO^eJUiy{7|(6 z#_;a5kBSNEQe2^RXce13Ju7x%qLZ(rZswo(C_7Ox$I7D+h4Em2*40?ajNV2Ypai^4 z>Lkxeeook*fIZ-`A^lHhgHf@b$^xYM z@lFONFgq4HkPd{cjdZmvTD0MO)k}H?_MkWGReVfF_aY3fL(7l5tYA-b%-(@lTq@^M zFpBEM`WDXH=uf~9I)pNt{WxdEG+asw1qPu%9!64`&QGJK(156u+E` zHZGHTo}t;uRkSV=lu_SeiAWNCPKr%=;8O!4yvMKRYP(Jiq%j>SOAHWtqoRnVVahOo`i5Unh>OL#rzNU(n9tV1pgmQi$Pcs1~(ahIQwxQ0!GnO%svlZ z+s=Z2mgm41@Gzr2eNl?lHGgZ4aCW^GdZgF0VHmC=@<>odJ&7eE8`1iPO`?zU-0>Liz{FioAdh%f z8V}Ul*oi%hK=grI!EckcC3SHs^h(IT4BlV@mzT5P_ANE%5xxzdFJsuyd|97{D*U0P zBNj4G|Dy@e3D~{%{Uo6MtLUc#_dM3lM@&3riHJGy9$Y}oMijqjfsr1(&x`t*U0Sx- z&h}Uo$;0fqOKK?t+jbr-<7NGfj2A9e+TJIR1Yv%dhRRsyhv_}2?ZSR~#!DC5*^)z2 z?dhj;eLEf4xOZVOFK%fhy?n{0^JkKiq?vubwkN2io|~k1RhtkT#nPPc5%omhk8D1c z1oytTrk9;?=bM#*cQR@|v%PVL*<-f+rqkJ2LdJq2J$Mfn^)q|2Y_Xl~o(_LEH{?*x zo+P^AQU@*t+pAtI?{MBm_5nla5VBp7Gm0_ha7`=*+&)&}%!-O#ZsM#rk4Lau!p*s;&qcGbZC8DGAaYovcmUXft2s2|h zLdiNWw(7)N8phacRG{*E|2ivnAG4-KIqcwSIaPBUaTt!g72zSwwnPw1$MTFZZ+!D? zpE163V69lt%!qu+G6zroPHUul6}Xz`js?R}L>?Ss)Qa%2NR}_;P?hYBnpfG}6I*R3 zwaMVqTACL{2b@MJ%jZoD&0+OMG$*SH^M~GQ#`eA%Og8UKz~%spB{z1 zQ0GAkZn>a^XXMNK6A_Ksu9$+dLan_jh1!{)3WtpRxR#eDg z%zgTF7j}h`Ub^tkJUh%Duu%!vkZH4wPw!zQxU@9x~$v{l*zDS*&5Z{ z#HDc62qd-DyY8BEdYf_N3zVk1Vcc`WE$uhiC_Y`TOS=LwFJ5?O&K_LK5$29*dm-3- z@L{Qka5Yj7Qn)n#y`DSrJl61#lPOc5Qyb`6p1hpFXMI^7D!MT)+Uv4DB>VwxoEy#= zLfVOMdvVu2=agsV;1PW|FXB;S&n$2S{1m*?F|CV3d|2b2M;M(#_j^O?4@Grs*%Vm$ zk^KrD=8=kLOuX*JeY_4H+4Hj^9xo2(75D&tcOa-6%y^d%Yonqv$BIf}goTnzG_YR`Byg&Pgjqo~$!*a2PF$B%BVXd;iURlI~qQ zHVDOuH7Ag<(Tz~$OaK3U$i;mG7j0W-569WJ$2}c#aSub%34%0$FNKPVMsHMHL0O?1 zbgE_|Rs%OMERe5J9q~rvPX3=R+UOGVX9ifbr6YP)+oBPF$R;v-btv9Ot>$WOFzKi^JRpRnlObak#NC&ZnPDT95OTB}j+$MV{@%oA2j(C7lxNx*D9Ae;{Kc z;9%wV{#BJ{Dc=L|X9k=39D^c%WU;aFjGRSVq5>MVE3&vcE-L@+k8HCe?FD-xe>T;I z>iyt)3DdJMnXbHnv7nf(izlLv|VX_ykmh0%q|5FqyzbINOlBy#*uZ#M5jzQ(yl;%-myr@ z%uYrdU=PUds=OiXzTEtp6)gfB6FhLiJrlHnnZBZ{@z9Jq8B z^EP`J2a}_dv4qy6wd8=bji5@-4MXoFnij-()R{o#cmDq*&kto%Z*IyBzsF}j$2X~X z=oBqHV`tu$xPZ)d#THk`#otJevm70mlxsm!ym-fgd7I4%7($Ow9vkxZ*tQr48V4r! zAjE7Ks-NgaSb|YcLICCqMz-yjRgNnca&pv<{6;P4=N^Ni9zF;%ore z)M(it>e>o`{=BP^l9|1YHozXREc3TXjdQK0rD6|B?YdB-`H4=3B^Y%qbRYxBG2P#m zw9!bHKwBnQF+t}Q(2=j~QZzK-!I`73jz-9iBwF4q7}q+hJuKR4&vgYt!z*3Y3(xvvgiyOkqG&gv+uhNIL80^#LO7#jF^LACyQ?92jIhe0rHw z$wQWB?VKxEAm8w5s(4JmURmhe;ht+vmTEqeUDnWbeeNwbU>UU(hi|t5`Ar^AGvddG z!7;b)1F?Vm4iUH`j*C=fd{@^fV++D`tQ^7x%4k`C)fuxV{!X};lyEF6#SLkiWQW0U z5K2~p&I!sQ1cmDV>ET~=mAOsYJpw|>#VRUhrBM8!ID+D+Ah)F0WX0|>$#VpfN~on& z&5EKrLeYdKvatNYu8or#7wLx(okG_6dm@Vm69D{7s{9!bt!8pQDB(n zu*b2izv_HX>c=c4c#Cc$1bvIG;R}Tl4VoQl%|G6h8-kC=KOU&`M9|g1;!iVLa1A-z z6$!hk9)q#dvP1Q5V0^(?REpn=?1{ah`-(JaogtmXJW^5iV(?8bYUKj_p|GOFQ~~GC ztvXP_^Q#Uhv**qkpJ8wt7x9Xf7(L_OK;krx?q)u?jQm#3LO}cxsi-gfa$Dd{RH7PdvoDmMh z$RDTJ3*{-K8i^;T5xw?4DP)D=fZ6t3t303xk8YIp@Bc}H7 zzOR#Ne;VK&lYR-YV3`1m4(RY7Yt1<6OI`o$)cT%DE zBqs=uU`(j8>71aulqZyEkiMv$XI!PHzEd5o4t2fksMSI?v0G1EQAU0FZlA3LU< z^2B3DgT$F{#MChFv1!W#9ep6LXQ|NLOk2@33U|IS@;XUBCJ!V(1!~TOr?U!@xHk`w_ zZQ_R0V42d1NWp!`_*=~v50YOtmq~=rko$j(cpHT3n*W@84XY}V&1c2?gZ?gIPlpP`S3D6X|JnrTM3tmY?4$fnf6v6b zr9Hf)p3TX@2%FZ&5=4`;7$Tvxm?B*=;cI1PQo{rqHOv*Y= za0r>L!EcXQzCopBTayQ&>IGE^T;aw>sxo$;iPwI<+hlasx1b z>bc!iP}b*J2UNjjS4I9cFvKmu`h2B3BR2r2-qf zn85w=SU0DuK+Geba*vnQ0n_>Vah^4~t2u2Quc_dr{fN7QiR|lZGIOq}Ni}Qw53%hbwmAPw@$AqU{;N+3&YnHna-?UbpVOdZ?H{|d@>iaz*?J0);2QJ?*`RNA$ zAd{;rXH*1)FD6F$P&5@uPc(E9v$SNL#qzqACS6mD3{XYG zy%II$3Y6~}S!g1a<@Wic7cr{mS6s$$GC_f!VG$O5@cjR6e%xiqg@6|-DsD8TBp0Wr zLw}7D{l%TQq*oR4;toY!1dM;8QyD`6FFKjw;c|E4%u0caIN9OZP{s=n(7bH!uAF5- za4DxaavQ3ce(dHVayR2VD!6OkAG6op07?JQFlAChDColCC;e?ypDI$k|9E{Y(s?hK zq@u%pTy!BVcKNmw9doR#{uD4?G^Hs~C#VB{p^G@_FqAIw<`KV1FNKVvgy&2;7(pr=r0X)oiWXS+~s(ycx= z`x5><6pMV2P{`#RZV^ZO^nc2W$s z*Zp|Bp%IMmgD291un{>wP5FpH!qoVQ(nmXr?kKtwp2BQU1i45S{zS!00K=F|zj|7P#XIf4Q#Z7i3p#P{NA+s1LZb~$WL+N1{ykt8Ciz0+H*IE!X1&L6m#|Fcn>DbK&7nc9>o_g#7 zYVMrpd)nN(Y)|Z9Bzfw31|K$C&V7fAIfMY|HuH8C9|Q zatE3DVs4|Hm#cH|ydiC!rOkZXgAlSgcRn)Y@W*dyNKzk}vhxDB^!?1zAK~ApNlrGm+0!AZ(BT^{UUBh>=pc{2*qjNnZGkzL z#3lHF?g?h%F$oZYYqRDqV4}BUiK-N<51;0~32^YtO8B*ZgZbdrWgE_a9DBelAd2;u zIw|Dq=H^dcVNkWYwx4ok(u_J7J+GtV@n@}2eV)pkMPZocZMcOe{wttkO>fmzlUZChs#bOl4EN;=&se5-*1 z=wO75&i=-j>4^01Na|*EfwJ{Cp42+D7U?0stZ1E2_-RhOYk{1N z)`Y5G`2Uk&EDhg?eF5klsOLnzV|XS_7q%PQwmHefwr$(a#I`54ZQHhO+qRQQvhU~p z_Wt(2{?SJr)vLOyR@b_&vkPpsW+qqGy>?JLT+yi0Z8jx{Bb{zZg%Av^OYjRE4Zj&_ zB$N)fEE1i5uU@nL#Vv-qs%0f{#t1y1$mf12&CT`AfwVs}A-e4k+Mu&3GwpG2?zqOq z+hnKPWVafV#ttN=SF5)DgpIkTr`yzDic4hz6V|KJT7H3_fq5Ef2I*F0$DG6lA*R;= z+yycE5i=J}8R!GNRQj&dxQz;yN_ zY0Q1$6C`4VZZ2(Wfqkf#oY{4GgbL z5c47w-T2VM8{_uP{XbjmGIXbot^~`CcAD-;dHTpj%meND+JJJt3l$G!{weT<&a-cb zS$#9DyBI*}z{@LF*2qQ*&!w~Ye+2mk+J_;}PrL_7*JF5RU|m9Pzp9GrXc6NXJu!pU zn3@xOJ!<6o)|r;WlLCQmym*{@V#JdQC){-@AxUEV`Tiq2P=P*Q6KOdra__J8+BrvA z2&5Lu%t5tc%meN8vlvI&CvQz0Jzx3e2$$ZnD!lyPCmgo2^ z4h8|iM-$=0Q+koKyBnmqHVe6Xt2;7ot6iidKhNtz4$qCIVdrCrXO~NP_U8VG)EQX6 zw1@|?miCkaX9dWGl=)rtVi2wgz#xly8<27mE=%3Blys$u!c(E6bNgqxi9F@>Etj7*ZQT=j5 zazr2*cCyg7M=G=4Uu1N!`gUf=kew#{gcZe0C9xxVMk zDgmx$h7<3-4f;M^NgS_T>fd+(HQM}J$VBq!56o0s25JoyxIKsY6e^tn@W&oDZXpNqS`1g-r zm7C_lrx_|S@QY1+b46{nXl~u~j1KEKn5wSET*ppX*4)2J9@;NSVkcnlv1IuXO)eko zDZ*p>ZZ`p*12|Th=^zTc=bO;NI#w0~x?hw3%pbu+uG77Ti*LsYas<97SE@K>c~zb4E7V>NpU1LF%6^S9i zUa>ct>V7Z96w?r<*X|yJ*>uhjhao-nRdMNe<0J2_ZJ-G&k(Pb7(Df2WmtiTBKJiFo zSMGGq(YB0$&z6x+NOJ$U$3*t+2<5VyQqzz=4*yE}oB4YL_Nrof<@=+fKM1_DE}!6b zVOdIBX^Mpm+(OhvvxqWz6_m$@e1S~*ls`rR8hK9UqVWu)alu%pMritOkP>aO$~jFb zmUwL#F5f-1vZc|7gmVOR>z|~;=ix>LVk}p1HL`o$gqM@2Gxuhyl?H8k$Cw8+A@iE3 zmGU-SqO&{$tulqlD>|P~o%ALMC%xYLnD>7UD#*KN9xo!bDS10VA~0=kA#xJIhv3;v zV)OaowlZS$V*m_b5;uz9p z8C2iqkAwMkRHF2)Wzo8eGr$Xz<)uO*V&IoQo7tR{9RFj4ZuNJSDn>i>xH;j1$yT8b zcA1*zHbzqVf+TZu_O=`0sIpDr6eve)hS&;YCO1(w<%olRv#LGi(lqn`>~b!|&KUTj z!kxhmr&iO+SM1eRa$T5!J(MoEqWAH~L3hUPC)URDvUBb_Z7Fr*k)Ql;#+bT{zTLW z3D3G(w>Hr~AjD@j7P++2i4Q2{GOiXGI$`g*q@E|}t*%<&hMWmqMVUbs&Nh*nBIc81 zMU}V5J>x}P4C3Mpteh#vO%%W15Wml+-!4?OLs(ERY0gZ(o%PeHWZHM0)-q+DQs{+3 zv`e~Nw8X`x94R$F+nVN(Rv`hDN;OCou~2OO)#*-Q6RMA!87j~dl{nzSaz zR2u#e!}0NCC|*mMMG|JcjOEB$kon*VXSP+!hF{M&U^7BWSCbvGu~_n$tV$C-CKh^C z_`uW8dciXJ;%@=QKZB-U!tj2I!pwK3mB}qON`DeOAM?qX&1Gzhl*Ez+oR-6j@h3E6 zc{RR_e=;3~9eKh)6CdNDR z`PlRuV2m5bnm4K%>~LM!)4c_L6fuR&<`sEP!S?f;{+?^(iYn{4V`99rB8n-`mR>V#wvkJt?Sb4dF%b%D@1Mo!$Z-v+)RId>netMGjTY z2#u!mMjM&9b`2;m?G}lp`ipq*wS1er_v8`s8OgO zzcCwP_*4M;#1S=Xk-UjwPJFc9>B*-}8S7t7%u#D4U{i1RF54I}E zuk;j5^SQ?AdtY;JMIFqkpv+~Fz+dr{s-jRCApd>@5TU}yEXUg%(r@i*mPd*x4* z5kgz3JX*MjU0fx7a+^Rf$0A4EU;p`vmsh|b0=&?;vVl(>bC)zK9i*DKtm_XbywK+S zmNMcrsnA9{`qwUtbw)4fbUNs0FFECW_cI{PD_pYplMx?xB*-(pZpoMt4|t^bWB_CH z?4tGu>85B!qD5uVlezh#2WKn#Mr6qJT32R0`rN)GQe|ByQ8aKyOumq)!Ie3tYeWYN z6`@?^B|Q{Ky)Y<1v#J|5dtM-zHO3*<@Tq=lAg7RyR=4rI%dFPOLp$*ZcVR>$u&%YA zhe7l7MI#4{9jj?&2-@P@xXAKXngy=aF2u%GJh%fvE49Q|#!o5{c;}t48f3s#k(jGyGvs0=>CAy#;{X1WpQPvqNZa~it&Q? zY;>L>Ywm%%by~EB%mPzSSeaguX;Iu^jUOH{xzOC!pnN7#pZO_=AUEVvg*H%pxzUhw z7(=Vmc);@sUbMCP@G`%XKj}f;>M#(wT<*z+wJBC%^!n$oPrs6_K#TNpxt9@sH-q_W zf8;?)5&jtA6u$}vDELZz#3z<0zm@iyQ_{Z$*322gwMp9(esg9blkB`q)4OFHWYCym zaYeFXf%{Q%B#pKhbip=fUab|Ut*{Vlw(M1j(8z^dk1{Ge^$kN8dl+ePp%W&f_XM82 z_@?oo(4hA7ZRmZwOX)aT2$=7&32&fpgQ#h3_c07wOO6Tec`Nu$>4Z~>73yTi4JUfm zJD?N$H)16qq&l$$-Y_o?n~#iY=on)=wYMTTDwRBF27$>y;yxRg)G#pW*mJ!uZ(|BD zRFvCKAYe4Yl^CKHPuKw!J|=yA3e|_WW6jKXh*&aJ6Yv9!X0uzMip z#d`i;o;GKE9l&Fx{_ipVDSrnNvp{`Q`*p@=nisoUUxz_XEYyZ6IptOJqiv!b)?o!t zm9>3QVGroS^R&2%M_=h<9mwefu1e0=3C_t3$w364^J)}gvMp^kIX4erSmJn}R=sYJ zy-MR+5!35cH<43+eVkUN*9d`o-|OA>q3A8h#=6aOsm`)f<=Eln*d_hJbOdeCt&m%O z#6+9b$II!ZTBkdLFzHmu9(auPSzyzD(R4~TKWA?c#M1jQNcf#B6H??-1n;HXgq7bU zCz`GmDkc##AnbyN)D3&PdXOW=ol>jGMcS1#`_0v}FX|2ZepU`x=PyPmD#%m4T>Xf| z_}eKm2~vx67I(DQy5;$}=<<~BO;^9A9Qk+`^0)Aun6icc6&sEW|DBM}|Lx~G`rS(# znXJ;MgGf|t^#9t;V_+Wg*WxIv zmN|`$Zjv?cgB+nFm_Y=!{W!zTuT}A@=fTL7G;bu8O1+xUJN6xOmbD&(K_Y;xqMY2w zo|$o`-AYaZkYir_2aq*2=29#}#u`mxw|PB82RKSTWipIoAk~~W5fh)9#4!LK(V#6M zVAk@`j9&U?3x?Z`SknyW)|B3VSaqM)gUy)ufgH`T58Q6Ik{*(7uK?CouP^D^_}7z< z_(amgvdj!f-2(5ZsW^Z!G#;_NwJMb%p@QPuSrlIEzWEpdF&Dz-#9;&p21(&MHQ#m~ z6$h{JVeIHVbnzir(O%~%F6}KC4wo`}TrX;+H(jKIHZX}I1%(6!>`*zu*_Ej}yo@fZ zL6;U5BW=#(2*>C!46QP-o~`Z<01kX)kX_eP=;u^ozt(RMw+i)`J}8H)<17Z-&*q0g zzxg4(kd&Ze+zDfKH3i39f@g>IqNyWq+g?O8Nv7l$MA(|QBO@eEGK`lr9c5KGEcXKn z7nB4Iew2@TPUiF>eu@N2D1;U!JPFEB)|>m(w2?N#pB+~(>HjB~&`Yo}sX`JDSlVf!~@ zbR=Sw_$Tj3+4FuvU}Wh@mcdI9w*Z&kpr5@6kkU&YyB_oN z*2Ie5J!?GyLPg1T6?OTj;+jcGZ7HX%I?Su5952WYC_$+umf~<)aoBJ=QaxsP%JhWG za`iSW1uj`XGS@r3hI}k%AFlWt5FrhGSg)9P4}_h5HdR4UEEv;oGg#6eOqe*BVsf@c zOtBL{d3!&ah9J`^m`r}eX3_u0bg-w(a||v*b#8>~SyA}U5~fS>dp-G?8AJKk^Oi(+ zC2Q55j&VVQMWRa1y~rR+!NFB!sO)1aBqlZmRG8C2t+-S6^CC}nc}P&hzQOi+9#i|R zD^}+xNo3HxT&T-!(9CJi4=~ByDHh^+n4;c^;B|A?0ZaaBMkniN8J4*7Et{tHie_Mo zBn4m#*babZX$|iU2ilX zRP>Wud%uN%ZNhN0ZJAlbG1VwzL^vri8&Df*e1{DI^*5k9R8Fzl<-&@CGVquhL*&6I zIWgXkiE$1@j@Ib7MmZ?hvcca{X9tpGrAKEgL*%g+@ zRTUYw$nWI8ab+?3xJIp_lcneL7-sa~*&m7Jhu~LJ&DqCyV^^9DT5aC|g`Z|6`RML1 zqg2a$GolDKqox?jw=9 z`%HcpQBv!<0P>erp(gOR0EUB6hQIyB18s$ ziZPR^4Qxt)pPz3u&yqSOJD}6Qo%TYWe}Nc9w~sG9*%jlghw&&K~@gxA_Sz|U6#Lrm$D*+5;Z}Rf_j-((in*Q+~m=@9RkleA0tY(AHetI-Om_eb=AhkSKQ#AP;qFFrm%tE-n7 zwpWQ*fAhOWg5&-8Y58#uOBvpaVbiyvzyG9w_nUpWX~tQ`ZEfRPqeUU%`)NtUG$H}N zJ4rd#otiFT=_rapT@GG}EvR4ptui_p>L74_cPP~8F3Un6;%X-J3lOR%2N-6gGAL+V z*U(kFADTeWQ0$CJiXlAeUj@X`q0GE zOgHwe_P;lHMNCq8lV|v1gCF@f#^7m&b{i7zED!+vVebk}V7F@E-}{16=Gjf4YXcyq z-WYp84_nZ-VtIFH?4(`yQ{2b}nt2yYqag)>%6VzEl(lshKuhqJiIqjNcV!4F4#Ma@ z8r_Yg4OC}9HS&l*B-959`hY=BbapvHPXi3{bfS3?jqX3;;b(7=h2?k^13DUH?)k8$ zANBSY85f*wDJ1vC$grh>G;`U=$x*b@ItO$4!2WX}x+R*$e}lm^iye)m%~WRsbo)`` zXgI9JGfTH9`I;IBtaoha8g8aLbNN0AG zL>Ipu>|`PQ?NFvYH`5me`^aB73J=>KT^`q$4+EUrCUW#wjz?8-4dQa1eK0O{ zZK|^@e?NCK5b>hCw>dUYjp{5b=aUl^_^-fi{fMxsqb~og#pFK%R6vlo0gy3=UVDP~ z&L;oOlz2oWQoguizL6^*I#>gH6HL;o51RiaVwvsA{1VtSlIEb~%^V<4>V;mwNS@@) zqpcKgSfg$fZGqgNu5lke*(#s3Hg8N^b_3~*FLDu&&EOecW>dT;4u5?S-iSDU!0*v1 zn8d&OdmjcX;AWBzgSxH#NUviXzF#`vQ~ntbHYegWaFmbV;eKu5J>aHFcKChu=taPx z2BRI|QY(j8sxkCag@s81k9;zHu^ETs&$9wzM6Qd!4h~>pRImF;Uw!*Jv$#T{do38? z99Ep({ly|}z<*)mWMd{gXxdkk!SPHRgs7@}Q;xyV5#?*~Qfku70Dx}&%O^DFS>&lk zp#Utu%7XS^h>~jmMsk>rF?&vhZ6eGDMPb=ajtbaV#t0>T%gNy1tu|QFvt?$mz?1Cf zR8R;lM{-d37e*zjnE%sA*^NPm(U>X5V_ASjpn(dDu}?I4?<{qmrCT6ji=vz5jBnV9 z0fw{Jn;*DHd$@rW5%Sm!#gudVD;yOnclsfeqa{+7GT{-9CeKl|rvMYvV3>(m_(#!( z3V@cB(*S6*d^9m)i)RT?AyT`KNKa{seVukFlbHPb|7G-psj(VC2~+vkA!n zs*lqwv`r0Wb*OE&5KSI=trN1^-_i>@&fEy`U^o|IhGJKWpn=Dlc_FJMLdC&TRFWq8 z$@H3Y_gDVMgdMgZZQ!_vWP2&ilfMF6){mT(Nr4~vGg%qn%1$Hyd_?CDM?+;ID9(x) zjAxmrzLyDd9W%9Ub=GDYeAjN4!;!J<@4gVni z8+_WAxiW+=@ASl82Gad|5)<7)3tjGA%n(hTYLs{A?9+hA}(6m1HB3f!*7VH#qb$Pf*?qZl&zU0vfddd~_TtF3U`VlHpw& zhL8qoSPaQVN(?@C@eC{{D{9m*&hutoV&C%^0giq}vMYJZ=XBHxo^RnZ$uo7|Mz_>m zyv0lOB%dvtXtKvL&#_hV>UP=Ry@yK1ZOCK@!~S4vZ`;fM{r?GM5P#IJ8R^6rc<7En zQ1nukg#59f+SDnq$CD}(NX?}M=I73J)Yn}z9Fi?h%E$kHBfXESPAD%I?O&k%SqQ3Q1>#ZHN+CxDSJ00&m&$^d504M8uBK`ek4yvuF@ zH5v_Rcn8t|1-{^yX(M4KD>VpaAWp|y@&5Gp!|o-K&-)_lbZCm@Z#d<|(0Bt=S3m6m zh;#mzH%Ln^<=__&bEm$^!by zP)x&2vYIpFl9JwLS$)p1ostsbWTn793=IDE&*++SBhUL)%63`5kD1+oK9><&nq^TM z>ad?N4_>zhY*3(_KVqjE(dK>O&{F;F#PFSU{DenD!GEB#5#z=lpdvWGj)b)^G_I*y zEX9tuuIG3IM2!3w9BvRLw|7$Dy%d27R0maPYA!->QTzIbB`cVXWCDu&)=T@8%Jw|k zjRF@Od~2CSGK{l53?alh^6ErjU@<~AcXNgZzO$JnFD|2wGS}r(9sMd=Os!HzB{@UR zEzFQX0qOJ?dA@6P)}`UjR4fBQ=(yf)u@%U5J1q01qD!c)mOY@7dJAmL!HUcsT4u8eb#WhQ1a04j zZt?CccSm&z1#UI}PkQv$(U^E(2Tw@Nf#$&#`hDsq^rPAj9iH2B>o{lT0*Th>pKsNS zVON~_2^3~TyAuw{56omx<*ZK?0$@>=O*R;mQX*L><(mwjW#w52DFA){L+5e-I@ehH zbn})?0HaCni&t?j`UOx4C?ja>T~a|N%x^M*l0;3f9^mQ^vz$Jf)nVNyJ>hoh$mJu* z>KT&M0O5GqpZ3)#&3fnW`a|^$*zI9=8!`|L;B(jK)IZbHxYpt_QGxu;{l%-&`9IM2 ztt98GE>Z*me0tK|B~j9@R(Xv9n4&$f2&<&+S*nfZtfyapSkwhUFx?$n5OTiYz667k z9_2Z2DJOX4+va&wf{9WOvXcCsF3oN`#XqsOlVDb=-F2zf)RpGIF#WmwUYX%TE&4{T z>3fX+q)88p;?izl!F-^shAMVV#?$(L$V&9*gE(FI9>X9UV#bY!vz{g!V3Wmpkd?2^ zr5L~)SQl*R_hX^ZD&&QsyfRn-h9MOa0+7c&}vywYsJq7 zx8veJ-G0%Ka|jWFvhuV%y0y0Y(S$3qz5eUsgql zY>`OQL*AsO0ED7s$k_Ojx5?IgyfFhw&~YoMq+D|mmk@bd33coL}us#LKsa zYOy=-A^kcKEg+J6Q3s_t zeVuB2xn9s~`hgFe-ll8X%P@OBf?nS^#~C3z6x@#T8^$3WaB3<5yfA7Ce`4QC0+ytB z)S30;QnUL68zsP2d8u1J2@^Oj+E$P&&Bd)8>5p*KQ9W)f=DWwy3&Cn3p^0;9-zll|YQ?r+fuPh5W^I zpG6*D*#cj?nJqze2?Hdy8@Jm&RCE;=EhT#AQOoU^|IWSC$W&FK1!+d4UPDO2AmIHw z>?W}n$)e+MC{969a$<^vgn&8pFN!SA7zeAQ`zcho!#?Iz{KTys40oE{LjSqY@P7#p zMoPjb7s5v7ZhgIeP0iD&zMp^g;@A&K`L*ESH5p;Jvhl2bZ9?LZeSTj|#RWZTr(2F|47Ke-w@p4Uk1{aKlzTM{na3E34 z&74Sblf#bgvB*)vgHA9`ifuE!O+|$3kEmw_=HsicnKonr>S7 zR}DP;mlKGjdTEAry~9CsNvA&hIVN!j-Mv@R&Z^7M)WdxEF}$18ctyI$^H6W%gwGv# zI21$?`Ka!NjelVnBtZB=Rc98auv2J$sGk){*POGRl2elLuZ;Gu6$wVz$P;!1Dux-L zhyA{tBF)s;^}kDYiDus`G{zChD&Bb!7)AAu93^dMcsiFJ@@E_8d8JO(Q8bU`2TuE{ z5|K}DM5S+Z0GiXOOxKq2OMxZ5m2vRD0D(gQ<~YSdr5Li|AF>231ve&-)7%=KFW!Q z@+IJdtsGZrw^hc)ydf980zDI3FFDiL?jOR0|eNNh93Zc@5~~hM}D$o z$bk0sAgF$(lD$(~^Bspj3wO#Rd)Xrt$rrZrzbHlmZuqJjE4uBhJ*Isz)CPxf=*;%# z|BV=ekL2@nn4Pz(>zSGOS$)`Z7SAk>x$$=&64GUyk}Ut7uZ>MOpJ!MP4IZ~L_6RdG zHDyo=!&e*aGQ0Kh<*+@6ItP#>$D%$tRVJ?Uv>a6-kJ5k;Smcxt4?mcxEv_V{2?tk{ zzR8y=b1aSK>M`>V4{M#2)my1EL)-!1%d$~^>{5bX9#s^1P%_B zG0}c++IiYY2DV%;rfCtN*?erGLuDUEz)0?2g`UDa^%PPp>Dgl+VNh>vB4mdq&&h9`n;5ATodwWx z_szs;2nF%O@dWq{wN4bzoaojI7;y|x0GQK9+KSJ^IzB=F+zr=x$ckZ&ImmLV5;>K9 z%juUWy%1d6F*qig72{2+x))wr2Q!`nk24phS2a#ECxO|vT8TkDu0Na7oM7?$K)fh` zSIxCz@-hqu8Y!h!V~AxC(aPIw0YJ3^V0i%`Lpi%n2KIy;*&)czkNj&__Z%<$ZAqX4 zp8eEdzyU}rsjT^fob6jv+1)^UQtdrD{`=6dBXu-!6X?et%k%2?KRunsc$aWmjhD6> zZn-R=S>o?vVyAmr`X^-N>of~;0%=S(FB2{0Rh0o|LM6zJG=P_$LV7pxL15$KogHlr zlA=8^AtcD*3VsL&H!sjN-5ec3Q7T!72tZj@K!O?mxoDR_(EP>z_mP@SNZvNVhW0N_ zoHUsZ%>35p5jV=4*n5nDccw4VPyC~#>k0476R*c8vjc~t?HkOSOHLC27QVs`ooP)x zetKwIZZbiJsI&mV`2vv;4X+@0+4A`q-k}=}U*rY?0wV+fHT~~wIp((@nIxAi;i8qj zn+Y0nA;1;VR0{M*f;;;@r)jYu3KC=B=#qYYD@Aku+dBj*17<%0)~>4zB9vy`BA!^o zd!pQ3xgaV4;UJ;&2=z%L29bh&oy?&ao0+vQ(rJqMm|@N>3@1y%aKE*B&;O3wR0k~x z6G@5+2`XQ^DOCN9#XEt}b^8(mTaoT^&^jcerIAa9+VI%e#qYpE4qGQ29UFFi(Lr#e?b}57k@xGEvVBiJlJg6RUks_q5<3r*1ZpH_&IeDd zUTP6Cq`KuSJ1m7}xgy;?6BjS(ej8a$f$)#}xoq^cX2nW9Wi;lRgbM4ar!WrC*10sd zOvCv2nvkSQ8unsdH32y`b?s@5`{lH=5-)>+mn4cQ3fg!MdFcughoCcuc)0dxm+s_5 zkwW+7QVUh0Tz_ao(yX!7zWfyi4$g>nW4B%4yNKP!O^*#D?f$_t_mzvnRvNt28Vp+6 z{hY9?2f4@-bz^S*OAJ+=>1KZMG0z2K)&yRq&Oc@?yd$1 zY0iYSBaIc#B+t2)6LIaFmK$XzMart6GN2yqny`-S|XT%tT7<8-hT+E-OA z_olbl^hhp7bI!%D$f`3WoUy3b_xw|Jj-!ZOBQO_lA02jN2u6{_6Ls%YzOyoR004q! ze=BWaeI=(JiCxvUL%jdA0wpcX+cLgvXN z=fIj>SW>ub#dUN|IOkuh`^2Q8pNyN=+D*1F(^;0DI9#rw4Uw_)LZPcV;Ipgx zeY>beJZTsL_p&-YfBl?ba-3g-v7isrZeTf8u1w4RkdSXR7vm>URx=x;c$GLPb9>aQ zQ-Zs1NP*YMzySOzluQp=rAYExuOnoMfiZDf`=+aY*vo&qRG`)^xCn_Fj*&-BG&1qS z_jXp!a$ZCNg`yqiTCfsE8`Bwdt{Fp4l)`EnN=y@@j9hFd{HgP&o-V9mZG=8}eiF5? zSU?7>X+aj7LaO=X1aVY}mI7QYpcv^skjwLZupTNb!2fN-XXNuGydP-tV2vou)a3*H zV~OT_IQ$PrR{{6Ct@pw3R|DYZ8ZIq`2O5O}h#6W?!}d?XW)1~Fuq&)JsKfLwv7aJc zY6Dn#!j&-2UEw(Wr~Jr6&jwch`daP|GdOUQLYIU=f%J@2Il9G`>#kn0eTG{Fjx$R_!2vZGWT&+{l~ zkn1rGM|K|LK(7qwKp;Do9!}AXV)GVU3O))Fr@VUjL^*j1s*9c;4$!1{=_vj+YtAq)0B=J0A}&zh*S<$!>v{x9I( z`EaP|1?_+cqeV&vsJ1JHxqq?!pMb{*NW*DC7jvPCIy*mx7;|Dog4D(-)t4((yn_ce z;KhIks%e$4h&bSHg9vJdnHIgNBKk1*v8Zwf3w~y3_z&JW1vM}r{P7}eQD2bN= zcc@+x+{r8`P(QG#uWUfUZ#O)^$IKPCd64<*b^S(sC%>#49i^=>t{FGw^{asfs3_Af zSzK+l_X-S39k73VorF1+TBtIxf9*lI@u^M(yt|l1TNGY90aAU5+->Hc zjx&X)rB>1eiM+51(C&_quYdGsJf8k>#l29kKVp`F@w5kdwa}mb@fe8uM;^mig`zOB z)vmsGlnR86+!NnryGUP?G7eT166*C$Z&kDT@a%yU)vhq7_4YRNZx~tUv8s!Ne7%^~ z)!f+RSWQ9>$Z}`@tO{Z-^o4gb3GDO$f8P@+T6aY6M*~bfq#V>$c%76eKn5w$(68wD&T5doxlthV~mv_Tmek9D0Rb@{r#`rPWe4KE7{NW1h zc6|8P062J_$6*}a@>8ThkJjkB`A4pUbho%aK7|hzSN&gsbpjUed$U%iOlZ5`7MNH0IWG$wdg@W1z1-x;j?Xr;ROHwFLb1n#V-%fhl-`a$ z*CbPh!Nw=-<+}Rp@g2$E4)iZS-lI>q*P;tMXrGcAloX(qE5BzVX@M5h2Eig`!XSD& zn!jHgKeBA8pH&rO@wa&+hrjJ)-QgxC+ps@ zDC5G*ux`9LuOzOet=Cy>RAHzcUWd<-W-uMz^s2YqePj7K??Zhr#WE0Keb$jl+i-wZ zpE=7c2WF&=-b+^ns^?63R_`Xp*C*4a3%!Fsw6Wk6Wxy?&U zu!@B)?~Ub_Vq#3XjPqUF>A}PFMB1vm);#KmhCt}gBDI|HZ1L%!bc!Ztz1$t=SZPNY z_{(FBW%fCzgZ{mw$h}r98Lywd%4TBoZ>&dr7k4u+kg*xD zhII!&a&uIE#42K`9MmvGrH8msakXxYJ1VA?F!EFmKC^LfgxCg8^d)9@`pbr+M6v7` z9(96QUdZShY>&H$8ERj)qT9#|mS!``rd&aK%ah|Ft@XksewYV)m;>W@ON>+|{=YABp~j`*Mrgwtf6QZ#@Od=}suS68uf2JmD$WJfCD>t4~&-d`?&(^O`hOL6Uwwc8#F@2ZcIrd6(&5fF?tS(MVcAw?54_{)9(&FVEAVf@66k6qkzt>>Jba3B zD{6>64%j6yOo>@3p~YV{SXKwm3Z?OP3>+m3APK&SlVOARr~w7vXiE=AwWvGbfXFf!ijpIN`V zdRg_E-g7We_O@9IstQ-##c<O4%Cy?4wtGWSHT9UhAac-saga)qP?(#dW15^ zIL+xj;6oBaWB4!QEpYY6YSkyzTPo23u{mmNGyhgOhtgDAL=LXk(9<`Nc{3TMI(QJ~ z$MfJ2rJTI>MN@d;Z~cb7RsZj}7kJBNPF;-O(yItKQ;*ByYodRDk4GwUH34C1#4Z4{ zLNzJXaWxpU)YAX;9cdDmAk4j`UKphyBvThfot`~5Mn5r9R`jup+@`Y}l0-tG$h`>p zr*ps@G@iIz3+&k-(iJh*`PS;8oq8-P&BO!1IGL$9!KgT`P7Ft+1+Mp$w0WFO7-c?q zAI33uOa8j4I6Z2>+uzdW;3Fs~Dcf0z4U&r)KH02gH8A4?Iv-u|P>hC>Qf-Na`u|2$V} zJol^7M2R?TK9Ypi^vYz|2zd@kqm*_*bmB9h5VQOSQnS9SJCk@)%owbFN=nJ5F@>_I z@kr=4fIQfqR$ZzI1%a|~1%)u$LjEC_Di(s1N;C&L3H4|erN-8l*6}98Pj}^7H9q+n z0T_6wMTS-)|6P!R*6Q|Tq+$LpFw5HSF}@j}F7t(*@Md$mkM~g_{rx?o%@}-Nb$FK} zXkTH!>vk+%?MgQEWJJ1OX{RSkhZccr*iiXUs@@GnBk6Spg-GPue+;~ULJ$PZSlv;LBQm!d;=}i5$(N>Du7)+B|1F!_+QGb z#ul-#i;yeAcDhkrgRPDIypFCe8LP~~*VQFNWvS!j@d18v38l#u4AB;xj<5+!76}b9 zRhiTr9v%_9-o!Zkdt`RudH6g!_H76rHTQ`b=FG|I3-w?=RTe#Ex--goy;bc%rP)?U z1sG#!N;Mb^`)89ql+&8`)pz-(7r5mNi>WBvIM7Lt&i6V4Ja4qq!`xfR6~y1?3jHJe zx558dF4IHD$3|8`@yCDE(LC_|){?+%>RwaEW#OLLcr^tz2nG`CX~L$$22bQVDRfg= zAS;RtAKUQTw4g@pi)bTJIW(I9$V-egX_QM3sFT(xepE}_BqKpPO8Jzipx6UE8>BEX zX2v^XXZ}S9uc|oe1h32ROvzX3+RDt9p3(OTxHXuHHK<{%^nKa~Csvl7EFJl(0iCwv zsl80a4QG^3EnVJYlbl-S7K+XzT234 zr2Q4w!I2(XUOHj(wWpsmMb5)48Re}FaOj4v;%P@?mLn6`_*II>VX`EcS?9Z^p?}xT&TzLT+-Z!p)J!>fPrgGe3mCRaKBP|NLcqN$2FFc>IY| z7zNWEbq>BRqds=+V&C@Op70hNR!1N!Q}ZSqk=i#th#oI{bdh0n#?OIiZu=?IvvUa1RecOEV131$~I+?qKCw7H+{=siKsb8t? zX04-ZE$MM>YfCSUG%Z(plv2dmw|%w(Us8vZO(2!o=9a16cY!&3WPDk*QSRtp$Kh2z z-DJUe+={JIn+{8hRpP8ZJyhiY%;|ea!6}HZMda_7!Q&XK8Ly_Lt>!LWWMu~9RW$Zg zgx0QUYKxcWb}T`L(UeHQjMw=I@a8sf{)p9V1q0%ADzDP<5#5?^xXU=W)NkrRb^QLLYsb66`2wp?1`W13~yuK3E>RXY<2b)5@~BilVd#{DQM?zZ-prd&(aa! z;&B!Y*;1h|KcHnguR1-&u^8ZNkI;B;XL@=yC0EYYv^xV+^R0=X&1k)h$e(;Oebis_ zZOS;8b%0j?t&VvDb+W&3e~-kfsrMwmhM&ipn!So>#dNmbCe&uXQ^S}*cOtuT>tKfr zubSl)sW793P#Z{*R(u(j99rqlV*<~Fy_hx3)^W+%PEca+TSH|_(9z+&v5d|{fSEm9 z`hJPs`Kt=h4vi;4UyHBzKn9d7aG-^^7)x$%PB$Qk=C}U~A}QwssWYsT#4MG^gy!V3 z>Kque6Mp@J{W9-@QCWmEm7JrbIWOX>0P4)3>d?e-N60hoeI8d_CdomL*2-^aL({VG!KVOjvWvbasyrYihI$jf~a#gX~MPrZ%C=-l@MN4-1v?q3{USq-VWNk z2i*TkTzW0!fT0KH_H#LMr1y#qh5yqxRROJAeV)rM^5ycs^VWzSqywoGiNXwU5o3k& z@*`RKG|%6GeDt&NR!;BjaEFlSjYsHFAanh$O=i-AQN!H?y502>no!>3 z1GJ(AXax$;N@}2s*fOYgpV02^IO)S>Zp|KS82^kXw29)`d#_xN{YfoL4jnb$p$?Zm z-+v=o`M(jJt^i2ZMZgjh5=|zwXGfBOLYy3bBRkFeq8$OpUgT8B0yB#Le#Ib#GFx?I zyl>3XH+#?NJ3tvz;XE7Iz;Jq-5rd(5RU5;c-eetN7JzZGCXDb~6M#IrCBk;7KA-(S zNQm!Las7V)<3Jq0iFiHS@sje2;_sdT_BgqDL*(4Cg$r{8b9m|a=tP(^7EI4nV9xBY zn71cqmWzWAM^Zjc+xdAqr>U>rt@PgOIZEd^A7SbQxY-H(DSYwzUA!qM=8 zoNIrhE!3m4X@5^F)uWM|d8o|%d`;Z3g7B*1ubn|p4p*ckyR1ieB!wQntxyZn>5fnq zmL_m>b@7;(Ebq2OU$>Vn$>=|CvknQ0Fxi~TZm4XG&Sel;w^lfBuC6wcKFs%7PXGUe ziFn5)r}3n>k;&@-ie&6cA~vG^hdi-&k*p`Y!1-9|CwXG8Lwlteg7dgjx)m}xS-Qr! z8FaVg*FdVAK;EOEbwUtIU4+Z<<(at>6ki^$B}yaI=gX@g4&=ZxanLA=3h7=0laj@5GRg_^VF_0^2NpSZ-M{N`dMQh)6zii@PAv8d zxO!s0#JQXPSZ@@8ApSN{a}znRkheD%7k3%7Sl*Gg`wTw2u#2o`Wo0(7BWi@%b4j=9=N0yj^u9b zkaA=BxtO;nyOxWCkK&xl|3rIxq7iMW?!;S@k>X6JFmh~_e34vTXFN61ZE?|(3;}Ih zWK<}~B77h-U)<8opO-&t$NU`rhgUKL2>frVSaAO{-G9uMm0^XlZf(&s0B?s4TAjWv zx?wX>tLu(DCzmDgW!l0q@w1$(zc7o^2&evw!-%we*!^tC`oOTnv&yoOJz0fCaL z1Yy7da{Hy6+$?&rb2L5QW-X5GCTnBP;3ES3vX=3STV2+C031J{ZS_SM{2 z>=*O)WWsWB@KK!K_F1*f+U?t+?{O-{k*X8g8?HS~d1liXxwm@ONN%q`&Kk9vSOs$| z#yGpn^k@t(0hEQclDRp*+8B9$gUQ@MQ8Sg$f94X7<1Wvv!ACr;gCaXS> zt{+;2A&U*H?aZ`79GV-YSkT+alO^MzQ503a$KwFCDH7cg@?>cOH)j@)iJt{`Wp#sV z#=7b{iM^`&tDubL^Lk^e@s?Rp!L%aOc%Y9fJ=SQU283Z=ldTYr4<8C~KtWhNqFV~q zA5{-5&Hx#O7#k&Hdg__HAVfGDmyC>t)7HC|KAE6&O*BF*(mkR3K^84)?`F=j(QrYq zK6#WZ@vj~&S1o@Q<_Kog((y5f9-nUeCyeD**cw$GXhle*8_%VsynQ*dSR6Epq1*G` z6$A>Z#rt-G6r&sD#&X_nZY&swk>XpnEov-`7R2Hlx*r8u*51jJg`=T?44VyU-)7Yo zfrDvns8$eTbb~xu&fCq91>-PM+~#dvmN>&yI;IsHsiL`2iUqx$+*mRWHU&yMkV8aT zfuonoikCMIZW`UbZu=ag*QgUpK@#Z%`L=|sn=^}?yXIf~Lq4=cgWykn+&?$-vW%yx7g(71Qr4P%5m$vl8{>9H)H>Z|++A=1j!XN;(j;Vz)G)I;L3ln%U zWa*d~EJfd=RE|O^!oZz)p1i!PFCP{-ch~=8R&6of*hq>!)0<)uu3By^%n{6=rQ@R! z^;!OtpiP|Kak==A57QH}YXuN)UacWA4i45}R)G^A&1!m%8MP=xD5I8*jDgb+I72=< zCKc=GR$e@F7BTi^$TAVo5l}`9LUx_QwF;nE)~zFA5wvsu&wG-=mweqRNclf^!eKV}nMLNy`PW20T})n8 zUU<*rvOa8ToY#9JdJdwoSA8CTv#_iPD^?2D6ul5&QxbGO(42?I+?~8#1=B>vt|M+< zI+!68uLoWM!Zf8*J@GyUGkaGD7t81MMbeA;zRrj48_97g??APssxu%*0yDSQMHb8I zmBrA{*k%WU%Lj^c*qF1Gw~Nz6^KomliRO^d$L@- zmiT+m;6s}=`y%g<#ygJaJ0Tn${21Uc3(HCoW94G4Q4PS>LxcTbu>;Y04;ISb&i2({ z#j|=n(encGh2v52_-get;DooCv8w=zW$8L1=0$^9d(kTum??N>g`)h;EL{;+EMwOc zJue{Yyh0k|j46f!6lOlJkuR3vtBj|Y6mxC~4Rm^%2|t6G?W==}<@x#|>BU6+(shKK z{OHx=Z)Ww1uwt3Krs(+rvA*Ne@Zz8JIo?*rt^p{TrK^aT9}VrZG>vWI3pLl>%FmTB zMYD7*ar4rB&o-!JeYTlF1+HdJF3Azgy+z{_B09gU+lsVeD>`4!)E|WREZQ@Z$jRGR zKs-?jUPH`-?DW5rbj<=e{qGswvcRp=xFu!HtW#xV)o~6{(0{xB%Fbhz z3{G)a7u-btuPl-wOrDJYI*+3A3T*CsJ&VQ3{PluP6oeH=*pFQFCBg0=>Opi~=aBNZ zioklXq8YxT==lNbxxbod`$Fu=JVUuX=T>|GPwWInGd zk`tKcpYV=h3J*$k#$ZtY?(K#=eCBcMH!`| zEH6tE`15(um{=@Z$iFL6k{#ZZLR%`1&Aaby_Vg)7c~D_`J=H7n$P5}%QXzsX4_ z;jfQE1j2{>cXUZ`8z zaL(DV_^jFyRJ=|~w;(+O)M7C+cGaM!xv+J3CdE!xvTpEX&v-BZblM+DcK zW&XN=Jej<*h#6>@Ow%xCzAfeL%c8~Npiz*={%u=7bQm37Jr&z?V(9Dlb$iJAzNmJHI2jebQ^HepXBLN+ zQR_tv=IV;0>VbXt*teN#njpdw5LS((Nmz?RF9NGY3>Sg*Mpc6?4g{$dqDs+PNIF5T zF5&8C)FS7u`D2YDoftZ*jTe1+OE>B-f7X^c#^Ae&5qH`!yO+20hx}#F+A>EP2RA+V z%^dNzptnC07K(#O@f~Ak06^%&vjIpSkqIwr>5cshpS5P*60H7vsubkOC%y!+$xaA*r;PSk)I5P=@W#ko}$;{I98uMs8 zr@yLgeOVt4C^M7|F#kIj3lZvm6l7U@Cx;h~h6%zZQ^mnxQ@F+;xR=O~C5*jUu}B0= z1hxb-4gy>9IflT!L?$d@?9GHlB48rmJkkI`?2$$}i5z%wS8w=V{@h3ZA8+eNtd;5S zH}zwDS$fTlQY`500Sf%zm&1y#sl&OdNEIf3kLqK>#{ocjm%!;6?pBQGeO< zwVluTKm1GQ4vmBVBc=?FQ=ORvDo<8O7RbFd#?WTG$uI_{bEGB(;m~|8x|Bw?zoO!rXu*2Ng0lgkU?^2sHR<`61^i8!u`)M4BYhfS3gW%}?<15(O{ z26GyeHbXF=>x7MCqFzM?>5Oa1LozS8>!UV!;cpDOp5ldBn2R@FFY5ob|6l+5S4!hj z9d22Tvg1jaIRIm`dumUyuL#S3#vh&S%QYbGA!?(BwmTWT+3N?Leip zbHf(qTfSb^hl{>HzVf9azx~?Q@a0nL`kX0!<4j)Cb~L=ay7+!^oA{lNG|smfy?1-R z?U4Y6pL_lb<7goJtj+SCv{zIkokXeuQ3%Cw^n_+{B8{a!97xrtQ*fP-zi{!y;)VT3 zXDT(ISZ{?;z+3saC%*uKYyQ5?cBl|{LT~~``G(`N0yG!u`%^>EfO;x60mJ;lF1$Zn^H%zO58gc&24rKdhy(QOKlMGXVSVhGSSrb4p{M_g) zjH7|jv~&O}5;6vT&-uTMt!bF_0!BCWyn4}%tv5jnBIxEw7h+XMFG1zwJO39)7|n0m zIwxIMRJ%`A*S7=C(_*7ki%~Uz?8GfGVEQ>ROe5#tEzhzFz90h3cy#pA! zn;VoRSw@P_jIa6Of@apo^$ zXzuy-V$=2Tw)>iNUA7|#cQmQ}+pkP$AGmh#_9l-w3(imqIg2Xu5}@xh_VFj{Xo6 z)MH&iG=J};VvNji4#aLXbS_uYXG=Dc=Yu7i#`>0OB{(h!JhGyJz+>_R2=fcaWg#3t z$W2|Bs4xu`oB_mq<1tzo%>yNC{ZG}FJmR6rTTcP9Q-CHzB!X*%buqsVq%d2U=p6;kSz)o z!ugSv#WuB{-NSV+b!P#N6jR|_AFqd$v<2PaAH=3&rzEHNM(;={*8(^c`7s@n^f1E( zWaQbRO1^_(VWg=4N7rxv-)&8k{xw%n9?Dez2m4jj|IgQpM;IoP(M|0UqWa-n7|P!< zLj8F7o2!eeIPk}^W0bVxbtdS_JVRj=ep?Qtuj_t)l&Cs-6oilCj>`~sq$YH1nKMh= z)!X5?fWd*9Ox9;Vif(}F?)b~gQPB)YSL}|gNz}ok+=rn!N{JpfihLwxbCe1kILfGw zqGO~!>-|wo?mEj8t^;+nCI~In1KAeYaf<42pQMh9({ya)n9P5Z( z3`bT2+VPs`-EmbZJ#G~F(va%I=c9D^p`+AI-4#%fV9m^9^t9tO(YC01Iga8eRZT#X zrAO?u?r2nX_$c|6{(FqpS1~037okn5`~Z`)NxjytdMa6^)}w~tliM|%X1 zZc!Kt9^sUNY>OE3|0()oMgLRuwp1eKs9*@+*7?r_RdKi`nL_FCsYw)%ldJ5u!Z@4F zF@okCIcgG^qonkDSs%f3q?j=_h>AkjfOyjVjqrbukoKsU57C|-^0I($!%@t*mSK6x zlETJ$P3xol$oA?CRS(Ri+UUb7wtO%>4vthaFg}SypFMk5fa5*Bo|ne#-Ga}x&S+!u zclaNW9sT?;Q`unp0`1t}FN__0h%ISKq)cH_2E;c=VXk^V(Qm)9$4%CeBVBz`+?8&5 zOMiF`>&<^@;Y70JV#@Rj`{}jiQ<@{$YHLG)Ex%82TfNU~9IBHgbfe9Yl_(-z?K+Ez zRw>PixIj9@Mk}i(#+UP^+#ze4e(4SCHsMiJ>L@N=zOWI#>X#-p1q#HJ~@ zO-U*?&jCK2lJ?-eg>CS%*UPuv(kI`0qC}9`Y+1=A(iNANN&cC2O+xJy6_q?P^@62F zX%MeW-xWD|CF%#k3}z=_Q4^zCJkYl}$yCAxgne9}*_JpNy;ZbzS>lr^VTVj@ ziITB31(Bh~bqX~ewl<*;glxvnY!GU)7_uloV@AmkG)l*6*i>H3e&0CW7w6Ih39Z6}y zKgUA@RrmKxzSAY!X>9TbWbd62(%g z3D^ISr}ywPW{mvc;mD3CEIs<*LGMlta-+|X6fB=^Ha9)-oEElc9BYb@(cmj6tDa(A?3i|Y*6Bm$Ie3u)s%U^sKFKW`;4qHapzZ+j~jC=gIE)Ys9QxP`*hQBQr zlqx~13p|woYyH=ULzdJ^bF?(WOP=EMMSQY}sOl`iN0{;WEur_N`U$Osdo(qoE4js6 zp5fR6Cu0gdPd;tEMlkDmlNBwJp_DU>VcPN=nrH#Y3ILA8tdj$}0!h{>fEKQqbq(Cg zIjHR6i&fF5sheY!@|@b(dpyc@9#oFed9HVj(~Z(^V3zL6Z#U7?KQVTH8oFCZ%tcx$!FAI z9%cMWVvb4p1g0vCzRju*CX`6#R7wKoyZo&j<-&Dppg?vY^k0k@qEpiLFa);Q^Ip`} z>6*6aNw+6SJ+Bc}yKjqaxrHqb6FnQUBlUsw?GplwE~lREEAl}kdF>Ar8p#@@G}~+X z)3qEnHH@CZJ7+^s+Ox#)d9%$}XRgEybN|^tv1t=p%=5P-C4@*0$3X0W6$MSsLhwdn zTio3Z9dr>M=*I9-*BBZ*J48m2)by868eiz0Ok=l0dK_)&jLLiWgIcU zN9ex;y~V;J5{Tv8Co6mB#3opqB3Rz_PAb7vq?CWZW3FL_CZ@(K)7qHK4 z;uFG7aLz+K&E09r!iPNPPF1&?;uKE=UR?qC1-4DrYP5Rf!vgZUtTAt)eqq_|Ls~xK z;1V_l!^W;Y>}$srl~AxDewAR?F}~_0Ub8f1hWemn=t%-d3pO9v5lHO@rKLN2TMFIJ zr%nBs{6^C!r+S|t$$G!3_HXv|W{enjQ&1wX#9-w4F-V~w#SC+Q@Y#d=u1$LR=87p} zNccb#0>)T96mHK%tVcrI8)jd_^;dIv8VoRZo5Rt+**?&x$NB+*KxqkYy6JEB+jXT) z_TRT?*PAXUyU-x%Dsa8Q{zFT)CuwSi#Wgh8VMfzaXyMcOk-{8xJ9LQklc6UWAT3xs zu_KTwC#9u38&wmVa!MP}m-87#j+?`3TGSpY$hNTEgG7%-hs`4;Z5o;$WohvmCsllvfyC#p7cEyA{+h7fo)_2bLb-P6}W?H)MB_w!lJMwE_>)hiwOF7;AR-^^| zS&`__{JEUz&(m!GpM*ZNWbGEKW;gZ5Ph41{zb2Q5h=qIb81$8ZMhLOmkB5TXr;VAm zlt$lo_xg}&v0Dk#RN~!I4LSKa4^Q)l{ZJ1b!E)EcR3|4*i8vz#d(_f>y#Z&tq7^b- zO}7pdFSDhCIaGI^f$AI5+f?E4yF&DVK2(-SIW=ktmcJpv%qdo2fBVJ1lS^&jxnlAK z3H#j6Z0d=f`Bjv9|8vFk3(~s(@%J>p$ssI!@w=j;k7;*V(xn*}=0tKd3|~+0liX;- zsRsMqP~~Z@vw))2_J7Y)gB)eC+xLhROwVHY3~51vHhZFZ+Y`)KC{2sxTlRFx(t|YO znIDlwC|V?<7h#H{IApsMz%W@q(I?pCVnJtoUf+`ziAUFyAdq$`()3?YQ!JBz_I4Uz~dN^cgAMiL^LD*6xM_y}NYSC`#DJbRjo- z;EJBzj5fpF9ZJ1nDJqULrU*509#W0W;uykXsxk{=O3d zgA2(qTI@%_jFylN%@D*4)6X;^VBFC*7t$Tu6f^*CMWPE)lC0&qg>wFyoSHv^Ch=VF zqW0(fU-*hDb?p5dd5*`y;3F+_2>z&0H0&KF3XRaxru1O%LtR(?M!oxq;VQM%a8>p~ zzWeEMJ#|S?ck|QJ857(@^FWS0-1_)NJ+mh-#Zk6oM^}C{^Pb@#l69R+MQo}Cc_kYNf z>k18@U7I!g#IL>mf_e|a2S_x&0UwX4s~)MAQCiBH{`S^0ckR&i!vU%#oHA|-Du0%E z$rBw2gg3~xlpIoOzc;q`qd}rg5KL#GXaT(EsX-2e0lpzgi^Lh?tB!-BS>zo}=a&u! zi>)bPMEXTj@XOMnDYGXO0;VH-(%^5u6WSSTYPxIaEXh47>$@%Kv!cXs*Y(u=Tr};= z-4#oV6Kv|C+QJ(jHYy97$5i*xy%l@#QDJe`?xCQ!ZEQxa>SMcQTU@51A`iv3M!bD~2U>w`vbHTyE)+vgjk<@lw>&LQa1MRYtn;KphZ&_g z*BABM!_@6j{MD!$4llCJc(`HoTF6YgN?V=n@V8Ufq~ z?Ex72QE<1wjDXV97~l>Rjzk0VWnm(Wf*QjOB!(e+dbg@}C2A-PO%3I{NDt5eDAp77 zC?@?O!T;3E_U(#)2$nBs>9)7@x5u@7+SOHkch?b|GuHH!J4^e*(p-YJek=|}|Af|h zw-m?uVt8tx6_5E^*M6NFevPa4+!sBj@m?-HHhO<7+~D)a%j97XJ~?U6lKdkd#Qu5K zAicsi^bCMYo)#xaSxqP|>SNKC7jlkmU+46*$r%55aQcJuda#2w*}uVa)soHzkPBB zhc)lFZ~uDe)5dIvMLj5A*oG(&dPbSD9;je8u_?-uXZ`Z1>C>)RGk%SG7hPAkNH5>-O1mqK#I zq&rJ6Rz5QKrOm+|eE>!C7J7#L4Nr>`Y=)vlx)waLKAyLHlZ!>mGHt0BIYw(|6q5)v z;f5u+#!Zd(aHX`=*RXZq(TZLjRbG@x9b1~3nqQ8kcssVl-l{he4?szp6sn(d5(RUZ zTu?gz7alApl(1^(Ycn(vy5&6~6|IhN#j~Uk8idVOO;00ZY*) z2s{ml9?gGkQ3!;V`EB&SuEMTaOYggw)=bd$zktLL#P5iw{=0SRzh8x2kx%`1->LsT zb?Vx?4NMeG)&{yBH_gIA50kAO0gMLk4Pv=@W0jjX!E%E(%Gl5|-2-Ee#SwT7UQ^Iy zfadPCr@3n$gIqXtRWDAoKp?fjH8qpL+X@$ZV~zs1B~6O(_;2J_Zk~5-(U)xc{xp%$sv@7Hfs(zBOEP7 z6Xb82dhHwIcwdl*hCbpU07xmhl$`i!Tk?*mbU&`c&3KYFc`R!?#A_&!e4vV(OD6@jK#s zp7ni}=g{v|SMcp$k@8qJ+kq2a^!)|fayf2^v3B$p-NL)aq%TdTr8(WLNYcMC@g19O zw=L;#d4#5&krzBU0>eL4-xeMFp7IIq4?QZG&%nmy-@#wWeJ*z6V1U_@>gR#<`+D1* z{v>QivDk-9z2>Qt=TTI5^$B1>)*t6jbjvKN^Sq`v#=5#Ic0=mOz-K#&B}HlarI9|5 zydy1}fT7H~j+~6zbdj|HOS|N05!!v-_2_voMeUsbNYf|sy{yycL7C9CsXo{CyeK|_ zj!i*}%ETpYoLiPUL2}yK((B;kd`^8SM9~YIrW-(F7j(gd0{X^JB-LSM<9nGq17G|v~m6# zd~Nr#et?JT-BY%ODYaonxLs1u!whXT9pg)5>ukbvIj0ePZQq@e*Dx}t zOoEU4yV=O-mzyge5AMW8N1MPE|BCxW*PPG5Ay)g$y5bO4LWs+H_{?Pxe1~sIm$yZe z(uo?EwW+SumRVHjCDD`)(@m5>(WXO16Ph-YXd_O;$mcBldd6p9JjP8`FS5Okotv6& zAZ%JbLKS1pFMTwON6Rx!b=deE{+E_fQB`q6r9btou@2c}Ee&9S$DjnQSiH^JTbAzU zz=iMSJUTagloW( zla2hWy%eeLl|T={47?>b5`@E!R`l&6A1LZ%R|;Qs9>6^ z%LQ*?%WJkVh=o%w96=YxS3ZoxdQ^zsN8pqjyb9P;`-ZDtcoIuLUHC^@!QUQ_^Q|I3Nq`eb~s)~k=O#Ra6Z$I=S;k`Wy0to5n4kG{pe&_A5*^qWa3qptIt%-_p0W9Gy zB$yzuUVC302u3N>wd6EnH0e7{a!c8s-l-649ZOEwf24Q7U_G-J_X|`CM^cgS8&R0% zG_~%2ZkJ?z3`0xs~Wz<5~khAj!RzU{?fz%Rhe6(<=Zovn@F_ z(FX}XhjcJS5GLZa5OE%#;+N6iq2`CwEh^fzTS(-27y9Tdz(Y4eUk7b~S!M>daZldv9 zCt4k6S8##a?H;$GeD7^2|A;k|@9`VT_rZqpkEw?8{b?G?_tA#(k2wwHd)!9Vy|+>I zBi5+8M{QKy`x;e0B8{rYC(K)*sV40I*Z&UR03V-lss*W|EX``5Zi)6zMRqG3Z|c{x z-xbMpF9n+nOim)668V^_MZ_i=yHZ={aGgW%K$|pnWTrl6g`S628!KWS3`+aujSsp_6_}{TBepuLzdYzT)bZGtC{mi@9+o8ZaZyU#Wy z!3@DDXs?t78^R%A104&*s(BQ&LDU8lL{{0mwjP>P2t!PLVkHtkK%!y3$+{wE)nTIX zD5PF0(gaqsnubN6_EE4YBh89l|MXYvllCdLF5+A4No;@W3Camc9ce{>drnF11&dq$ z&p&YP00C98ln+bt)%fbL14?tkma_wK?P);ddzj)UY1&j;MsFMHxxH4-J)m-eVQtZJVVJ2LroF1u-x>zoH%2-LkdMd0V_g@DNI(Cg49DJE%l4sv$#541=XV-3o~A zNFUEyggcL>G{*B&Z%jeq?kWF3I%&Ty=aDR)AUsvsp~&U834D=njGKR0ScZu2AU}cN z3x~Un1Hx98$cOem^=j6X z)BOVv$h1mMy`Df~TtkmI@`+zz+d`U^@v*hDAN;vzuM99sT3A@!&d5iW=oT{VSX##& zimpR=u=I;1plpNN?liZ9bwiKl3pU`@tT|t5HNo)x8LKihky(?v;=@(C(tM;KS zxGHG^v4EahX06hu4HNs)E0EU>>32^KQZonllt-- zLy_j*{|to|+V_}9OwbpqZ?M4t`EOTO)D@$4(xrs?ziHByNOEjhUleKEegV)@e^c-%qkxMYQpwj{F^h{+(v<-gJQJk&;h=iKx-2@WW$r&bl9qe?ae$ zrI!t_sF)xP`Za0dd!FcnsfNRbv^Z~*e3BgGPnP6+l?2bC2# zGfa@j9*1hwGig58yGx!Ppx7lpa2Z;T`_6jMI*>kN6V@Tr#fFx0?lU&|ol_sf-h^I< z2&N#T`Msk*9V+Cnq>4N7yYRY*Sf4a{BhvJYnxriwv&y@bu=MORV zfk78Yb|7V0LXu;Pk(WY7vvczjp2XNd!c;RQB<&!9jYTvKhd$j4G}PkZz0U!qBVJR| z-8>!eDD|9C$9d{EzCDLE)Q5(59k(c!rlbLI$v5#nY3rQ%T1nN8_iWyiwo9*X{h|^{ zZsdKYKlnxi3a0QXOH!f^+4GBPtB1qJ$Pm6J8#;nDzT6a35H!(0vb=#P!3s}3+O_VJ z96zlSn*!H=Qx3FwoVa3wD<$n&lCf5T*cVoqPW1x~eZ^|m;SR&%PWLdMBgFg3R2Qx? zEk6Tx%M~=;-;En=5Z2Z~yLxQB5rd`suc4M!fAt}K4HB=KS_d0a z?X^b45io2A=CQ`#r!Q5ZD>PQ)y|oe?uC0Th7V%(NARhQipgkDxDBR_+tKb>CI4%TVg(?3(aq>fr`S^W09wWMTI z7h<_eJ=^`8NVh0{4bTso;XWUPWEGR#9C=3QNY5U7l2N#fvgSWct3ACAw+C{llV7pv zQsV;8H0hcpnYP8Q%E}E&JI2tG#w_h^>9%J0-l?BbJ5q+P`4zRcFWRs?Th6c#49tT! zP06B!$9=-+7uW^0PCT~XD2aaW{go*|}I1Bb*vMWSWiif>5K2IBZ6wPnfq zaQ47poDP;m%i1k%YwVNj30-TPErX@qKw8-O99|#x1g9kxQI_w{A<5T`;j5bp$6eA&}`(5*-pzS%o>M;g$hh)XT8@-~iwl^7ecMW@kqInLia#m7^( z*$!j;sivfIgrzud>AJq9H&Lw5<}Eel4XOT5=DR11H^P$-8 zNY7>rPsXtH#OM{8_%}<0S;!rPwr;W<<6dEC32T~gk-PVX{+v*rbVH`Xt=_?(mdRaF zZP|CpI5$IAP<|CqZQ0k(zT04bPPt$~T#PrdrWkksz*F28vHdw)LOHK1@tOvQz$Yp` zJcBKlYKxbsYKESVPQVz@=L!lENabT5+<|?@LG;ltZ6>3jq(ky`aA!B_;RC({QpQLn z^%>y7mjyq`)260PI(m0wP3m-GN09^kMAoX*0CJ^L|k=NQQ3tG;Z+}#QWL2iWD80H zn#x|6dRsvc^!`~t;ADiRC7x7Rf-mfRSELiy#dKre36n!p!|?C)Z~Ap9(YXFDlkBhj z)xHQF*oKyE>~v+r#j&Xe=ty{i78FT8ZCg+=JoazJhWBj41jxDk2^R-KwKQoUrUVj+ z-*}<}2}6W)1Qw>F#Ri5J=YF?y4g~Y?I^9fgAU&+c zDYrsN%akjg;&_q@%Tp+6p6@EZC(67qqmbt4nHNUekALfcRq$L<{qqS=iQB^@M^QWiu;0!&ZT3Cj2KAWG+F;d6!1CyX*{F)qfiuub-k?Qk{j5CddY^nG%v z38?zfzKN}Vu8N9uO_q}r#LlN}GyW;}nT#O4K-tz)fV$ESr`Tl@6COzLGMKB`FyDyt z8HqZA)hKBGT+Q}pb(HkKdOLK#{n~DZYEqUgQIpSi4R*`5n|9!_}7Hf~HH+REDJ8fDaOGoq8Clea? z!aR518HdkP%ngCyE0i=>F~@}C$-lFOL5>KvqnPH*Ki7q!n~r%yXam36whpKqwbFg-KTOc*KTv3hX zFS?OWdn-3OP^n!zj*@0?cJV+@?vJ7yvaIh=km0*~Uws}qwH%(S8BiK$yiyj8&0z=4=X{78(1N*_?^hp}@Y}0j3o{7wYZya}Z z`-Fe{FqP%{T{3av_K^==UmxhTjGS${u0-NVSMiLK2bS3;;XAx3VGHRqq)jv3*X4lQ z1~HW_svj&djI}4wls;sQXic4@zz0p_3I}Zab=HU`+>A>>EpmLSi_~kN&HT>3znpj3 zDk;%+KP|6qVl#^ehG%h~uxtcP9PZg=qpWvq@_1gEiGf164VZw1ny-4tW~=8F=X<#| zOf2&36nA1vT7F+EQYY`oT4}7|dw|V5{2w1jd<`bJ% zbz;(KvTD4Zs)c9Koa9~+xlzRK5(Himkam2^V_#6P4_Go-iY%evO-ftOk?-W@_k8m- z;vuWDl==Cmr9+62$Oq70-3DPl4^t z=fk*Ed(Q~G=5p$@n8Q9z441~~ind4HqJ;}^Zm|Y6{t0b9wB6~5y&fKJ{_*Z5+wVE_ zr{$g|K8p4HjwHTae~ydzT!a`e+#>?wwsYFZ+9tsOi@V%(oDT%P7U=eb^rxt*eexFc zHQVJDcA2iO`8(F4>KeA(>M5cfvaqoE>)lUsx9LdBIm1s^*99Cba5+c$+&WLHo~(@c z4Fc3N%SoSgKM$lDPQmMFTd3dZ_G`L*nv&l}H}&HwN`otIaq=7V+xjtF22Suu5qOlC ze1tf`qeI}4Ve(M{_YuK;G>APCG*2gOV#nm=8V66$Xl84A-sUe~d;=FeV&tBJx0%h? z|Co6)Cq9K4;FGu~y2-~49OPLy`cd;__nj#V2YlweXVg8#-6x{%0Eg~CABJM=l7I!R zcjetsCC;iC6Sev}VAbpopWn-^J}Nf%h*-C{%%19@#{qM7EjBjAiP+&Y+hHEwc|)tf zK6S;*=a|T4A!v%Z0OpiP`r72P9jpOG1|aWjN}9yN7Ls|%`>3>8EZB~lEdL49*Y_#2 z(Ko9TEGkKL_4M-jo1&vq8++@q60`s1Nd9l&=QzNE%C>c5QK>jwp zYB5h>s+rVLZnc2wwjN8?=9yTSp z&&pz(G+&HQOuDnwA2QW&Z?j#ZB~_3<^iNxyz!M=t(J{3&!*`JA6dTyRB-uSdvL3ZG z>(7wrwLa8n&Pqx%zOKE#w8@0wDP)vi-8f!Yx$5MoKR3x^gHxw#Lh2E{@zv_^wGy;I z5j+hk`CLxZpb6{x(pFH1VXAagPXJBu*rgk37Or^mV#SV4(azA4rbD5v$Dmv9Nr`c(CZRy@C_Qe*X z>Q*w+i~e@K=#3HMzBKAcH%M^oiaa&nKtT>a&CNW5O{~?EemaJfX2;r3zLO%=E@h%i zOGk5j#}fQ@=h=N$l&}OLEWwpNv&lSpv2Kan1}lEq)1KHu9er3L+opJ=PtoXBfak8tMs7kJLY+D=GKh+cWZ$V4Sy9 z5oZ4(?%B~@_y730#^?11j@KWS*B`Fe8=M%vv10hf7sEF=F??gi@Qp8qZ*XGx#){z^ zUkv}iiQyks4FB-O@DH3A{$a)N4_^%bz=`1>Rt*2JVyG5mN;FeC(oHSuWZK>1xZPW3 z_g=4pB>NO(^eBuPxT5XIdm@&$LpUi{PdNX{Hi#AToYREa?Ahv3sk5ed)da#9nQYFQ z!Vh6D`8UJeU20oaSCYnTjKEu#6f!-h4f`F*@|<)XLWfgSTFk}>sTVBO>3ZUaql^GB zq>O-g-t-$gr!7Dq(DM=KYtCzjZOLZXmGy3iQzSGw1L6wOKeO}zL+ZSY0X>((oTM>y z7sfs=T_|t{BYqJC4SA61BU@=jn z(7YeF8dHPC1bFAgN!Yk_oREKW=yI~rNc7RP$Wg8{P0rw9L!7Qyx`&~7Bqi_mNuQQ? zLf52%9lnbl%-MN0nQounx1=i>2)BE?cgfh5{{t5RqW>r=u5b1mF0T+r)7JC}^MJ=7 z1U;d+;agl1xMK}1N*sig;r^Yc1%2hmL>(r8)HJ?O>VgcLvgmu9qG&4mBJq}Q^1u`a za;U2!xiiR-GcjoTHBa|5v}x<+c-0(&R$oR(J4CG7Ld$W|;+8>014JwbbHg`zVQ7A4 zZJRye-2xp^8;NecfUTihpewLRTZ(grwpi>^Ux-sXihp^B;m?(fi14rVbkl}5V76#C zSX)gF6^G=&?bSKtkhQxa_2wEm2 zX2FEG_MHF^kFTkq9hbIxtyj&>B7NOj?T{A3x7F>;s$A~C-_YN|2+ic~JHMugI!k*m z(xyq$=Bk|%_A%)*(;COO1nz@~K$@Uj+5{3p07=VR*g|HB(AKqZb|fW1D-yaOCwRwy z1kAg>t$!k21Dc+D^0$10i*b*1>RKl@zv%Csvo1-WUd=EOWyF3NF55edp%zL;I&JUV zVHUI-48=PljOxOpC{J2! z5^tW|Dx@x8ocE5mL5HfK58*}Pm?OWY1QHv0+}yO{!!N?qk4KQZ^QUR&*{3Bt^4K7a0kg#9X_MW% z$HqGn3>MW(Ex%l2^s>t>*$rjZQZD*X1$}LJ=Nix*QDBF6YKK4speq8QuGWMU0HioI zbGzGQ|1)tA3)hf7?1yf_2PLFga1AwQFZ{49U?!0CxM@P88BKBG#&@Kd*<>gKOI$s} z|AudHF?eB0onXhKCGB~lIj;`ieP6eIjxt=?kdnqC%{}FP{ea{7VEH|`UVT<=vo>uR z1V>3aiX?4rVrN%2jXIt)lk?cK+1M?HzR1%@$Ba6oD^2)rjf;WZhORF#zLheyG~1#3 zUNoL8ekut<*U6}(ENOz%V}ddO%pCXS8SW)^z<6vkq)bQm(aqeM|AX?PKO!vNsj?)` zyZ!E|>a)jvvD>rt=8`K(TTX_ArGFgLb%q{3c*3YCH6b}kH%oC!HC%CG>UfBt>{2 z^lOSLl>T&{2=xPS-of}3J(2Leh|v$l=qz^iJRolOF&u_f=AH8HFY97Acv-z^N%j+| zD0pS%OUNC03u)dWfmakfMIe;*Y(ON6qgqo-*d2)13-N|#>cwwpY+tkjHj3Hj>@RBU zV^u77O-yrVU%v+2EBMe2V|0_Pru(yGcRUk2B>7QKs_2H+Bc9rYzi36enr%h>)vfm` z#u%(K>S*Wd4%X3j>CgVgH*fJ_tm40e%36(u}dC6BUN-OYv>H$ zrNhWes$v**z0U}%f*7?dQ-Ae&ae4ZxBe5HO$VIcHTH>RUY-8K8hv{@DCZh$EJ&}98a#EH^ejsIgUedIn zFV^*H3HliPS1vmcmBLTpaffxxFothxLi!SE?(j{0$2@DYO;I9zPZm<;ESFk}!-CQE zq;&LicRQZO-PoV(Ej^m^C@HRL_|4w+PcodtG;=#9td4-}(6Ort*xqlbOgcm2NT z^0LT(5{x-pfH25}g}H{5|6d@~!_obTaj z0ORbung#+JGkwW6>Sqn}_VL;L*f-l%+S8_2O`9R`lBa49pUx3!?-%`YE`k1f(K&{% znSsZ^^;`(P@Pn`4Z^$0c6CQ^El(oV8Ike&>AP9!!xMpP_Wb~4*7|H+UzLv zo2N}O%96h&eO8pGfV3Rshs-?jiYHEDvLDdBco56MpMumi5ifHf{fnMH$=eb3GWB#( zH4Ws%Ml5Y^O#3#wCnYo`PXVZ@t67F=0yI*?XyU98afG5(zlcbMII!=)rl!dfzXzK~ zV%~&($|17wZCI=X)U@?|vBe6PB|1`x6^3rah8aNTs=1N;Df#nk#4-#r+4`hBs&&Yk z=H$SZiL8}b;&WiD?7rBs&8OvceK_);D*ZXsO_}ASJ1w#4A;$NxwC9kD%k;FUmdSY6 zixq~lPF&ihRSE}BPTJu-S!y+r;;M|QMmE~7?B*VK7LGdvO@vW5BAiVUsnDnXs& zolNvYB(3t}(bBE8MStu)x2Sm_&e z3R(7oSs;%?y|o6VntXyhv&3D#TeU+h9|u^$5$}E| z^$Z-5<|lwp@37oKOLvCP_k`5-KZkPpT)YF~A1q8Nk2^-CT2OtD>f-9aBMu3jXq$RK;nkEROYU^S< z$B~MmcBD^h2Tuv>RPXqvTd^sGmN?`;pr?ZvBmSNJ*@B38_DoK9XNxL^%1;&uCY`MIm}0h5L48NqoEDRKXE z_J8cK*wXUbVfuSUO#Z1Wf(-+jZfyQfU4=^y>+}_M10s$tYY?$MWl{6Yf|3>279PT@ z#4%IPw=$~AD{Vs@p5E+W?LgYL!Dbzm-MHSUZDBgBCg&(;a`+pXd~fKJyJO3)pf)x` z;s)3cwK>x0WD!0^d)OzeujW489%lc*`Ze&KYWhdz)6%lj0XDuB8|^R59hKBK$00!- z#(a0|J)*5kTm&j;BhaJ}!h!Tz(zIGZMIGXrrfIWkImaYUcM#Ci354NHmpCr(2URduH$@a~>8w?J*WuDRB(8qvb)Q6fj0o=m&y=)TLXUO_^*0WL`db31 z1dln)6sF1GCQBL>%4hbG}DqU?+e3_D*&lLU+xskg&tlN^N zr#ru6DIR~;OMZ&xoljVPxeuGBn|Ioqg?6Z_q}gRAbagQP#^RgUGLP$={(*N>jTwjm zyh9bb#qxubX7=;T88OnP_;dEg>m(iJbn{Rrss6$Tv6tMH)nR;7H;+g2Z&5q ztaw7&Qb$o$>s_VTS6=|hIlQa$p9!%E=vg4QEHRG2R+ELEKXeu;JT6oV9f}h)O*V9i zuMMW9<@B!fx8BD&9ys)Sm`fy2nm))cr(WD>X}15i>bCVEE9i}cRtW5QB%Q(|Dp;s6JA@eEgqtM-O;D_Ev(&wh~%h_Odsi{3%)4`Ro3;-glWfJsnPy3`|a_hkt)d} zpY{eZ60YpXa!t3r6WfBZ5KnN3NQUA_Bc2O`ATT{0BE={-BEVdCet)e%rMqila_Wk) zP)3~3^STm?oa0ojVQta1uhM*VEF7KGW$q|x(a`$J$KATVYwEJdpAamSmNcaaH!LA+ zd(Qt!Yv51lin|C)(3|$-VbqL0zc*QnaH}`uWGrYJYbV{%G@n17wdLwFgwOU$s5A(| zT~ia&zCsX|wo+f4l#M{Ud&C@K0S81u=xkOb3 zi`eIaZ8AT5aSrDd8GJbQgvX?bT1b4$JJ=E+Vy*b(_Z?AHlZibWSg$^u!|Up<*bQyk zcfC<=!VA31R#y@QR^KmHTX`;Pkn!QvI_a zh+rURM-bAY{{PKdWQ6}_t&ig0St#@1ir%%^0gXcnniy9iHAGQ#Slt@7qQyazz1!{fKwpV`^rQZXhXUewu2=m7ZO%utV?Q zYmpW?GD6f7p!a-Bj3{lA%CMw|MxU$FJ}~WrF|V3QpnntQ?w%EIvBhLk9?R{j#r)I{RK%kBFTp9x-y-CipbZFUFmT+r~jcnOqqJ3 zP1luy$0xdHPTIb>gKkoS;;!k9XMH&)#u3P4Pb!?U7!dYCy^~vgbVakrXyPg!u~QY!}KGeZ52Fu=<3Q)QI8l59;#*a^{kUpaxy?C3LHs))dzFY_slEs@! zef*ap!kYWIq0%Moc(F%^SkR1v`47a91=K|k4P%Q(ipLt0hAVpG#B!&}FAb?a zeE#j%?)Xm9Q9=%Z{_Kd0g|}0?NJE19THa39VDy!5e0@D@tyY%lrmkRu!8i+AQ8 z)p77}=;RZ>8?c4csTMn#y8ec7R7f0hZwskl7$fXy zqppCwD5@Qsz&>@jWk7FSX~GFnN;>_C6Qyviwq94B-&9J=9}Z_oxmMh;K>V02R1 zi*~DjKRPX;r6ezJaFm<4myIW2t#x3F=0%&ActPcI+RA6_cgVY@w;7m21JPee>Z`BG zv;ar)st+N-k-=L2!9JkL61qEmVx#j-rn)$t9qaOGhj`jTPxIypL3{ZdvAWSkbr7B! zsc7^Ak!u=P+D{g(Ydj)j(k``;e3Y9Ux~I}yE7QQ1|RR31@Ry}v#J=5y# zkfQ0YSJ&Grpf5HhC~W7W~RG3f~-BC3OYACm>n*F*W+um5(5 zm4=}r4F7#=)Dq?{YA9ZZGH)o7}=k56$aC z14s4A5K3t@zm!RiXKP9QeiuniW*T~X2ob4hZH z3Pu+j0p8QpTajwH%V}=eny#CyOD|lG;>aQA&1IY3(oIt^iStQL=(;mXsspNg*oeVj zZ1T~RAy6?BTL8X~xl_Nv znxU<|vGsg1Zhn;|<(jPRNDChW59x(g7aL)2Sn4fHwcW*iBi&gDX|5tA;CRRyG*hbO z`d(*Ez?wDf5__&9nl1`!H5xru^6)Nii>9aLJ7pqrpV$a-%TjMys&pTU{3ksG{>i$h zDmN;-<2jf#?|^1uiTvhoJCZ z9y0t~3})a|-mwE|6N)y)Q*pk0Pfmslen5@ zSkf*nALtfiIZgdgb{ep-Hd1lb^mL9Jo*XE=`a$&8#YXMW=GC62cIZ^Lfq0Z1Q$Iqg zhmzNbsp|*?74>lO>egINKtB+k$Eo>nNb1fA2ynL`C2f(F>0FMa3KDHm_Ls2bT5PdtWKm9skV?v1UJD`1 z^Q@;2uA8AJh~`RDjLVciry)AhpMs;4FK`vgE$M?aEEmbPscGxz_bnoiDJ*ASWob7o z?JCHG4`WbF*^BG!1TnFc#aC7$aRLjcBKO`%V)qdCq>SUOq?9px+K#%)kd32$JN8~2 z8ubTcstGG2x5g32-FLZ@uR(xUO6F-sIx;ArW#|86Bk2Hk*HDYzSzj;%=GC&!;%^a-(pV@8ab5LCNMsxDA^n0w8gle z?WDf0X1!->o4#E4q$a02F}P-;GxN7~5nQa2C$+514wpH$Gyk)wc1U$mP+GrD(ll=! z7R~7&7@lo;)Pn<{2 zMf7L@znuI4OHYgXC(Z~K6ZNqe^Mv^iZb`OH8UGVi^)Y?pn;a;%C?QU8q?ELmzk{A= z*XVRd5ZYQpvnSIfZ z*g<3JsR?*^qQ6|oL(mF^C1^neii11|t1Os$7K6VOpts-rt+$D`8-B|z&~BS*wV}7! z{4KVL_F7xxR-dMxVE9(YDo%L_T83DH7DOOBOO0ze)$Nc?{Ui-{5SK6WIxzo8P@nur7Be; zlp)2-R?jnlEPqEV&B`AlIn1qeS!}>8;#em0AhKK@u`FIMpJB!SPWS}u#NXf_Fo79^ z8$Tl*I7tqBX<43jmg*q#xJy?(Pb+GQigyde#c?IMCPxJ8Rpcqoy!<&vGZsAEL5-5g9+;QX)71f%( zB@+o0L-Yk6J)-AJGm$OaE4(B*zs3I$GRajIHuc1mt^S&`qOw$8|;$ExGh1F$ zbR@#xjs4p2H@<+g{5EU0Mc#EUnIb@Q52$C3?6Gko0eU*?iU} zk2KkPgb!pWJ#P^@V&ZO97sjwT8&n@yXSvCTHz0}t>;_NxsgtPQeF5-(MG<=tp^h%q zsciO%N=6)=3*vd%>>W0cmq-K|2|m^4yQzzz)5mlV8p)jq;cGl_<=lKC?9kTqgOi8(A&P* zN_x3y+8Uh4rU;z`c6OHQxOXz_kT&TIkzSg_MU_cUi=nW7OiUripeYe1(5JqsTPH!D z;&6WwHIQ;+eD8Y+t#tKM!P0I4I0D-ga~%_c?8^a;0g*FL>N?O_KNY$=JvJvY{>Yowg~HPshRg%KvOjeS@xFnXhp6ws1Gk-NhpA5?Q#Z@-NBe~JJCJr9Dm$BQ!zP7) zgXbfauj|*Utg|#9ut(zirQ=qGSu+k3NRLAa?#3Cb$lAmsNPNwoc!Z^h5NZ5E%x%#n zIY>PW9rTQ(`Dkf#y?hHkBJsFa50~}Lp$~9ZDaf*1ixmwTmk-H4KQ(mo){I1Ey z$x-MaKv{#NxP)&9UQpUn=$+d)vV|J$a%`3#tu{}`(brS zUYQTz`l>8P&D{3iq8IU#7itkK!|biqT5(y)k{oo0P}c92hA1gb8IFPmLa_3xQxmj) z9+aUE+Bq*~x~HrO%s__kDho-Q*v=wwp$ex()hXm%U#YIzV}M44ygJPF(jHAU-b5yy z71PV|2)qj;r6c5{MYgOT+Bro^0#D?{AKIed*KI+h!9_HMeW~n!2s@@Ey=nHbY<9m9=5fcCQZMuJq^WK21gy7u z%p(Vlu-$fxi-xGAXgrf6;wq(Sa^=;n%=WD9$d%aOw$He)!V*=sEqdV%ENvgd0bIMG z5G$F^{)RAdQFTq)Wseh>M$8v&iV8^`{2_2wd*zJwu&DXAt~<8lSyeP8lNVQ#wp%AK zDnIEW-ZvEwF3;?y+O~J`kTiBDFdqJ8NP`&gi1}0aYvwl<<56umghBy(*INlO=Xn<~ zo|yKd@_pv)es6a!jxbZ6zPBqEAdpNcO#(+}lCV_J#>1`*b8Q5*u8=_r{GsgQ^%QZX zl>HmGUla6amUaFl;_b5TDScO56mdL*+&%f*YVKKBjn{V$SQf%Z7f- zsvef6h%zG%?`yl^5w7hBQ)2aEH?2mE>Pyp$Ednx(L6ExNqx9a{Vg z>r*Oh9M9W%_(2$B62^_G+pJ+}GbIP1Jz?YSR|vN!P<$Xro4gf!5*693>21bFlc&{z zF+@a+T^~l1!9pspwl|xkLDo_5W~uf;Sz_wC9BwPmT9(mCGMHXgEk(dJ4~WVslROtk z@O&Ai<+V6W(iGLIek0T%0eunN`k{V1pyI0QS;H#W0KcYJWPxk{>8$xE4S}%4nR6Fs zbcSp9PTeS*wjLTPJ^|*Ceg;dx+%zRLm^8oCfN5r9@tOJSD6@S%^y$1Klw#$j?5lVV zI7Q1tl+PBJ<`ot+pYyC_)jDev&lW`Rv}a3YbWR$WBwLn0k$mSGNz=k3@?{Ih;p-wR z>kR>?0UP~za?7o-OfX+rf2ZEGcqG1ceVvr&UbSeW47-Y^$u?Lfcenv-rt^BYs%grB zLNbn3S2bD=c01T%S5!|_{mTH-NC5j+ZpV9>kdVKMeqS;g6$;Gaud5|k5N2@`L`%Xe zp)8NKrRBP7j0g+WvWD34x|xF7N7Q~?xmm{fCd`Ns2HiCh0RqVoGwAhUgy8R-j#Q&r z#1Gtbi2SNc^+_-dtGY3+I|7r0bx(cWP_;S^oX!Yo!`qy7$~_bg%IGk7yl27*rf6cE z)&*}^WE5HDkW`@_phGTeFr-5D6M+w9-t4cXrK4Bn5sX(438R!57QLcPJ0Ke%jhWNh zM`KO2I{Bgz1WS|F-VGyIRP*N}lP=#$m4xuh8_B5cld^{z2R_0f8|OK2V+MgOGR6~& z3_I3!No#l*nqn906yK!DCx`VVsw%=@DPmZZ!mA1^Dp|iX#FR239ZZN`GqvI9!;ad0<>~vDXeIH^;qXam$(%o#M0bga5h4isIZ5R zY6xJXjnuFc5FZLS(cwWJIqZmqSjcLfiyP!o#txH2Ry~YZR$fG^2NTu&N%vVypqm_- z9G${VV^k9~25Zchc85>VSW)}ziM91>>VB9*$m+&DZo02u-Q6%_QlhWa{y?#BbHlo% zd;EMLy)R2XMc9P*0y0X0=JEe<&KK0MeClKiUs!xuPm_F=V|f3@dDU zl`5<9ZB3Ca4xYDF?^+nAB~aA@7%D0UuNidmRSB+-ANh!vPLjd&1byHEA4R}nIal!K zwy64U7GWd0lnBaxgU6UKF)_)@9Cco~xL$tUsKDtwTeo!scOciV)Z%<(Pu?vLUW(vp zfz+~4F~>-_0v9Tq#EXQFz}6e?z~F2M3X+y((R4%$^9ZP)M=}IkjMs@bZLy}Vq70^| z=Q9tOuAXRf2Fa4Cyb#gt2jYT*<4b|IzR4m4>4?_g0!SpU(DgW-khh@Il~Y?WZqHAQYkyeId#m6VkyB4>}bB&Uf+& zwm3hlNcmY6^0R81|4RHn^_12@XtkaN2KR^-n$mK+LN#?V1&?K#ATL7F{0rD%Ih3(b~C8_iRIZF_X0=NUNu ztJjQJ#)zxt)8G*ne<#Jjy4qZ9|R!TeNhxL z(BpY9(g~l~UUXMP3s}(17lfEf&41Zm^nM=307QWKn&{!p~jq&nFpI8LW|07?81*6_xy;OdR{DGcsmMld>m? zq3T>3XG!C|$+}_Hrle{qZ8Rm~4{rMW6>lvY*nmW|3D#igTj;YYvK6)|s(edFY@umt zFdacoyWcB@d~ml{Q)Y!&V&e1zxb~&$bVq=7E1K zZ?kn#Q}J40iufKZ5$0jVhiNO`eh?6kSejQDK5&CiOX(gbaElXnha;nsd{85lLyCM% zG9n|RWG*9%5;m}6-u4B>`Opy46LB{N1ah`@+vgOux<=B}>M^9yK~ziRY2a%h&=5eU?8lvb8`5P79DWyvwN)P>qTlIF}zE7x4uBK-1wIp$sp7 z#@a`kPM+PrL%Vh|0>~m`6JX;IypK^1D^-nlWW)w?oaa#$bBBsp(=PUfn0C&urxyN1 zQnIx*8_kvwSy2=1(2Z%e3%v{l>g9qfH}mVj)MwY%mIvrLFfAc0S$94 z<_W@0+?0%55MZKuAYeicr5_;_HWU^2E@S}+A0I8rnI8-_R3&_f+#@G`?Bq0_5qv~M z4CXH(NGAS2%cqCnD@Ph&I^w&dJs%nY4)bm5)TjeOwc`x|#Z=+@;H<=QKN+bW2^p%9 zJJlw%!15OPd()ty9#}s+@V-c=pmE$#*TlrM1wlD+iNc1$CZ;nD0O9OY2pVdN&PiE` zsb*z-NJI@jS7Rk4n?DIK5jBxn6_d2jR-{rmUMS-sTTM&2%Imgb%E@v^F33UGlXzfK z2@Z(k|IO0WdDz-N(&~stjwj&XxLip0bZ~sBb_@Jmx!q2HX`cKh}i-#f6n(_V@%fDJ$4igdmhPqgc>x=P1r_xphq|+)_=^Bk5LwLU6=6x zGL?gk*ls~pttd1*&+eotAb%|yMz+bvM$_bAifrE zhrNXzUZi?l=up{Ghu=duqLJ_o`R^z8b{ak~+}7oq?As3@M-9z&wf>FUBeeieNGT#< zkI}NXe%02m9Yw8cfoWoH`5-MAGtDkNZ-ZWJZ{8R!8~Pd!A!p)xY(jn)SnYG?wojui zs)_&GX5$w`sL2H$FC1;N@pB9`kzJ1AU5pXC6oYIq;f^38!v?YrxZCTFbhRn_*FmQ` z-jjx?J;j8U0eCV;ij74yoC3{?g3p2*e`WO_Zh^z!lk9ocvrXErzA4yH&5a6~RF(Lp#UMj9 z&R1tA>$C0&)|FCw?omvmAMS&W7_QZ_y!0_P)Yy~_`;tw(o@ z7O6CNboyXyGM@%Ag!)u%gz>S>Hl)lNFjVkKg+!FVsU|WN02V5MV^SVFD;depS2%|A zqcr$*usFX@XA>|MnRrIITK33VaNk5kI^y~4_d39nAzWrc;*6v&ap8=JFOJ>QP-Q!| zuIe@0WlgdI8_e+k4%Xkf^;_2X>?uAcZ4isi_?NUJBy~G|AeYVRaGHoj@3gA@xA}XG zzDM4r$$7`6s5V8__3c2@JfWyY%iS3K#RPl8U{XF=2Y?t_SnRM_-gYIl+6C{UB&_d; zP`b0RE3ZeJ$1B{E^PZA8rPn5NyKsj8M%v|Jz}C~SW_d{^z``=@x7-+`e$0llr(?I_ zYyrX^(a^8S_(v#<`{5Sn)s=o%moEg|E}Y@lO^CGn8sMT|s$Xw|S^Qwdb3nNCl<>*q z7M9@_zCoA5=uwyKt;jR7V(-Ek0bivZ|M_K|C#^$xI2Nlkcy!RXiWA`7&@^@1C-eG% zM!@enWGO>DB~8|LjJ@ToNpEBVIHTeY>>st=)6k}!hj3vG=e>RQK}V8~&xsgqFvBa| zr~B-885{wx`0zJdfq(J5S01(q%Kag1rR`b;Du-ghmk`1XZ9!2fP6B)4{%nh|f(!wm z%tPli>6Yt*$euR%oS^S(-FY2@Xj#q*@@%t!LuvOa1XCtUDt)GfxT6aZ2so5sl1x;Z ziM3A*Q_B&?ugZu?;lDv`eW7}3HlnE=K50`#MAFynfi0A2PwZiy+-#kQ!{3FmaDVJ$WKWB3C0h^FU(wRphhT0Bp3zhq^xPVEy;;reQR=zy3k))qX7@lzebS7NV;hD z808|6)pf&;ExK*ivi1Cm9JWBrihuA$JG%-+6VUTVSh}pV!<9KT*j!UW7Q!deIpruu zOq6&uosF3VS!}qNcDE>toK+n=j~t6H5VT$m^MBBSB&24mVKYCsU_r>cVpFkp(UimH zJfAN@iOK5Eq@~9N6djy>m|uY6i3wP!b6DpRGV%q2c;#}A3{f-zJ>0K2JNY)`RW-)q z9Hr6bLWERLi^riX7wfV-gA|)B5L4CuXFR(igc6libp2x7t1-8rkqnhm!(Do3=_feM!zOLl6ZLnzrs)-m~?h=oZbe;w{DOYB0_TVO8CqUztT3 zO4|=b{yz(GWV~sap4psLSV$SjdfsJE^LL{p3qoF=X}n>WP!Z=FZn$irm~++r@rqxE zoNd$-5QdU^Fz^qJJr-~C>v7luF4Dzic@uOmL5 zM<>>obi>l~rtb4?cFJ2&DYafP-O|^WD|UJPnziimkH?GR*Z)0bGY2Ho8ex%Ayy>hg zI=O^WKVoI75Du~V!>TBY6E7YLFtiFE`nBk{mmjmXEO>$XAu9)vaN6Dh>!rvaHXbgx z{5%wEc45~RC*gaQ&E*$qfr2ceT!5SWdVTT^b36I?=0?lKj`dl+`kN0_PkAd=YKi?v zzvbDk>a$Cp=JIx5Wjo$)`NpFzRNRYQy*~Y0;Z?6rFG;`gUsE#m)$GK>Nk2xWv@y9- z*cwq(Tet`)JMHj_523H-FnM%S!!2375WKL7qVUHYnC?7EkH(GC^N_RcNCr$gjG zHPUtE8I))yU&NUdMCpgV8T#4TC5un~JUj6-Mmp#C%_X-+aGr>vVDtZYLE=--IC{3p z&EPqpKS$ob1jMgf#>z9k{eaIC^yBPVusu(M1MAK|JKn&RCpG9MxjpceBb3Ls-d*-$ zkP6W*mk{kjF8aU@nKzaXr|&&<2Heh16pKo4;@2rEP_ig?(9`H<;&Ui0>Xfd-0m`k- zBdLXqndoc=o0t!Fs(vm`n<=gJJHS-iOigQCJknD&HWi#~0-!}VJSHq29ia4CECGoX z>;YoCI+cXmGkguj8H!_lhJx6fp#;9oSOGupPH9zmDl@aUf!PSrq=+^I#=YOaeZAlV zNwIC;pc7tP(eYDWAZuJ&c`yCA zxWXx&!b}IrZns=_Wo8;z+nS4fFRC>g>6HaF9|`!*G}rqlhW&{yk7%6g(hc(|)ykOGUk~og|d4tn7YvWqs0oy^}ty5|=Vql%^#_xfs;OhWF9%R1$n~ J@&80DL4C2Cbmjm6 literal 0 HcmV?d00001 From 28897165f068c3c15ffc20cd68c0e62889ffa874 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 16:43:13 +1000 Subject: [PATCH 2/9] Updated docs conf to be a superset of labscript-suite and lyse docs --- docs/requirements.txt | 4 ++++ docs/source/conf.py | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 11a19a3..33578b2 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,7 @@ PyQt5 +Sphinx==3.0.1 +sphinx-rtd-theme==0.4.3 +recommonmark==0.6.0 +m2r==0.2.1 importlib_metadata setuptools_scm \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 96ba8be..d697832 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -16,18 +16,18 @@ from pkg_resources import get_distribution +from m2r import MdInclude +from recommonmark.transform import AutoStructify # -- Project information ----------------------------------------------------- project = 'labscript-utils' copyright = '2020, labscript suite' -author = 'labscript suite' - -current_labscript_suite_repo = 'labscript-utils' +author = 'labscript suite contributors' # The full version, including alpha/beta/rc tags -version = get_distribution(current_labscript_suite_repo).version +version = get_distribution(project).version release = version @@ -66,7 +66,7 @@ # if not info['module']: # return None # filename = info['module'].replace('.', '/') -# return "https://github.com/labscript-suite/{}/blob/{}/{}.py".format(current_labscript_suite_repo, gh_source_version, filename) +# return "https://github.com/labscript-suite/{}/blob/{}/{}.py".format(project, gh_source_version, filename) # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -79,6 +79,9 @@ # The suffix(es) of source filenames. source_suffix = ['.rst', '.md'] +# The master toctree document. +master_doc = 'index' + # intersphinx allows us to link directly to other repos sphinxdocs. # https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html intersphinx_mapping = { @@ -108,8 +111,8 @@ 'labscript-devices', ] # remove this current repo from the list -if current_labscript_suite_repo in labscript_suite_programs: - labscript_suite_programs.remove(current_labscript_suite_repo) +if project in labscript_suite_programs: + labscript_suite_programs.remove(project) # whether to use stable or latest version labscript_suite_doc_version = 'stable' # 'stable' or 'latest' @@ -127,8 +130,30 @@ # a list of builtin themes. # html_theme = "sphinx_rtd_theme" +# html_logo = "../../art/labscript-suite-rectangular-transparent_276x140.svg" +# html_favicon = "../../art/labscript.ico" +html_title = "labscript suite | {project}".format(project=project if project != 'labscript-suite' else "experiment control and automation") +html_short_title = "labscript suite" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file +html_static_path = ['_static'] + +# Use m2r only for mdinclude and recommonmark for everything else +# https://github.com/readthedocs/recommonmark/issues/191#issuecomment-622369992 +def setup(app): + config = { + # 'url_resolver': lambda url: github_doc_root + url, + 'auto_toc_tree_section': 'Contents', + 'enable_eval_rst': True, + } + app.add_config_value('recommonmark_config', config, True) + app.add_transform(AutoStructify) + + # from m2r to make `mdinclude` work + app.add_config_value('no_underscore_emphasis', False, 'env') + app.add_config_value('m2r_parse_relative_links', False, 'env') + app.add_config_value('m2r_anonymous_references', False, 'env') + app.add_config_value('m2r_disable_inline_math', False, 'env') + app.add_directive('mdinclude', MdInclude) \ No newline at end of file From 804fe94c361e886c769163c6c7063a1ee6150a69 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 16:56:48 +1000 Subject: [PATCH 3/9] Added readthedocs.yaml config This negates the need to manually configure advanced readthedocs options through the web interface. It also negates the need for docs/requirements.txt, which can instead use extras_require options from setup.cfg --- docs/requirements.txt | 7 ------- readthedocs.yaml | 27 +++++++++++++++++++++++++++ setup.cfg | 3 +++ 3 files changed, 30 insertions(+), 7 deletions(-) delete mode 100644 docs/requirements.txt create mode 100644 readthedocs.yaml diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 33578b2..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -PyQt5 -Sphinx==3.0.1 -sphinx-rtd-theme==0.4.3 -recommonmark==0.6.0 -m2r==0.2.1 -importlib_metadata -setuptools_scm \ No newline at end of file diff --git a/readthedocs.yaml b/readthedocs.yaml new file mode 100644 index 0000000..35084d6 --- /dev/null +++ b/readthedocs.yaml @@ -0,0 +1,27 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + builder: dirhtml + configuration: docs/source/conf.py + fail_on_warning: false + +# Optionally build your docs in additional formats such as PDF +formats: + - pdf + - epub + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - method: pip + path: . + extra_requirements: + - docs + system_packages: true + \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index fb59d3a..623bb41 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,6 +34,9 @@ install_requires = setuptools_scm zprocess>=2.18.0 +[options.extras_require] +docs = PyQt5; Sphinx==3.0.1; sphinx-rtd-theme==0.4.3; recommonmark==0.6.0; m2r==0.2.1 + [options.package_data] labscript_profile = ../labscript-suite.pth From 0ad9ec1dbbeceb2576dc78d444b2d0ad4691a7e3 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 17:11:12 +1000 Subject: [PATCH 4/9] swapped the order of toc and text on index page --- docs/source/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index c958626..7956870 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,11 +6,11 @@ labscript-utils =============== +**labscript-utils** contains code shared between multiple programs in the labscript suite. +This documentation is primarily for developers who might want to use this common code in their own custom features. + .. toctree:: :maxdepth: 2 api_reference/index - -**labscript-utils** contains code shared between multiple programs in the labscript suite. -This documentation is primarily for developers who might want to use this common code in their own custom features. From f21e837319bd9f7620d27b1a3708cd98c96c4f9a Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 17:32:12 +1000 Subject: [PATCH 5/9] Added html logo/favicon --- docs/source/conf.py | 4 +- docs/source/img/labscript-utils.ico | Bin 0 -> 98716 bytes docs/source/img/labscript-utils.svg | 112 ++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 docs/source/img/labscript-utils.ico create mode 100644 docs/source/img/labscript-utils.svg diff --git a/docs/source/conf.py b/docs/source/conf.py index d697832..1de8663 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -130,8 +130,8 @@ # a list of builtin themes. # html_theme = "sphinx_rtd_theme" -# html_logo = "../../art/labscript-suite-rectangular-transparent_276x140.svg" -# html_favicon = "../../art/labscript.ico" +html_logo = "img/{}.png".format(project) +html_favicon = "img/{}.ico".format(project) html_title = "labscript suite | {project}".format(project=project if project != 'labscript-suite' else "experiment control and automation") html_short_title = "labscript suite" diff --git a/docs/source/img/labscript-utils.ico b/docs/source/img/labscript-utils.ico new file mode 100644 index 0000000000000000000000000000000000000000..28288fc88c1d3c2808ff74beee2b3e5fed11249d GIT binary patch literal 98716 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 literal 0 HcmV?d00001 diff --git a/docs/source/img/labscript-utils.svg b/docs/source/img/labscript-utils.svg new file mode 100644 index 0000000..24d9ee6 --- /dev/null +++ b/docs/source/img/labscript-utils.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 59ef28cbb93f38b72b485c8fe35ad287023021f3 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Mon, 1 Jun 2020 17:38:31 +1000 Subject: [PATCH 6/9] fixed file extension typo for html logo --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1de8663..515e4ac 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -130,7 +130,7 @@ # a list of builtin themes. # html_theme = "sphinx_rtd_theme" -html_logo = "img/{}.png".format(project) +html_logo = "img/{}.svg".format(project) html_favicon = "img/{}.ico".format(project) html_title = "labscript suite | {project}".format(project=project if project != 'labscript-suite' else "experiment control and automation") html_short_title = "labscript suite" From f2d68573a5c7265d7661844d933d4a442b406ed6 Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Tue, 2 Jun 2020 09:28:27 +1000 Subject: [PATCH 7/9] Split extras_require docs requirements over multiple lines to be consistent --- setup.cfg | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 623bb41..a7433e0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,7 +35,12 @@ install_requires = zprocess>=2.18.0 [options.extras_require] -docs = PyQt5; Sphinx==3.0.1; sphinx-rtd-theme==0.4.3; recommonmark==0.6.0; m2r==0.2.1 +docs = + PyQt5 + Sphinx==3.0.1 + sphinx-rtd-theme==0.4.3 + recommonmark==0.6.0 + m2r==0.2.1 [options.package_data] labscript_profile = ../labscript-suite.pth From d14735d7fd37da0e727e5b5d8f18ea4868562f6e Mon Sep 17 00:00:00 2001 From: philipstarkey Date: Sat, 13 Jun 2020 17:01:56 +1000 Subject: [PATCH 8/9] Made docs conf more general and added custom css file --- docs/source/_static/custom.css | 59 +++++++++++++++++++ docs/source/conf.py | 101 +++++++++++++++++++-------------- 2 files changed, 116 insertions(+), 44 deletions(-) create mode 100644 docs/source/_static/custom.css diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css new file mode 100644 index 0000000..ad5c1a8 --- /dev/null +++ b/docs/source/_static/custom.css @@ -0,0 +1,59 @@ +/* Add space between collapsible details HTML tags */ +details { + margin-bottom: 1em; +} + +/* Darker pygment highlighing of console input/output */ +.highlight .go { + color: #404040; +} + +/* White captions in sidebar */ +.wy-nav-side p.caption { + color: #f5f5f5; +} + +/* labscript blue, alpha = 83% */ +.wy-side-nav-search { + background: #2946bbd3; +} + +.wy-nav-top { + background: #2946bbd3; +} + +/* labscript green, alpha = 75% */ +.rst-content .note .admonition-title { + background: #00804fbf; +} + +/* labscript green, alpha = 25% */ +.rst-content .note { + background: #00804f3f; +} + +/* labscript red, alpha = 75% */ +.rst-content .warning .admonition-title { + background: #bc294cbf +} + +/* labscript red, alpha = 25% */ +.rst-content .warning { + background: #bc294c3b; +} + +/* Elevation +* +* Style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: +* +* https://github.com/material-components/material-components-web +* https://material-components-web.appspot.com/elevation.html +*/ + +.rst-content img.screenshot { + border: none; + /* MD Elevation 8 */ + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), + 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); + margin-bottom: 24px; +} diff --git a/docs/source/conf.py b/docs/source/conf.py index 515e4ac..773418d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -10,63 +10,46 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -from pkg_resources import get_distribution - +import os +import sys from m2r import MdInclude from recommonmark.transform import AutoStructify -# -- Project information ----------------------------------------------------- - -project = 'labscript-utils' -copyright = '2020, labscript suite' -author = 'labscript suite contributors' +# -- Project information (unique to each project) ------------------------------------- +project = "labscript-utils" +copyright = "2020, labscript suite" +author = "labscript suite contributors" # The full version, including alpha/beta/rc tags -version = get_distribution(project).version +from labscript_utils import __version__ as version + release = version +# HTML icons +html_logo = "img/{}.svg".format(project) +html_favicon = "img/{}.ico".format(project) -# -- General configuration --------------------------------------------------- +# -- General configuration (should be identical across all projects) ------------------ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", + "sphinx.ext.autosectionlabel", "sphinx.ext.intersphinx", "sphinx.ext.napoleon", - # "sphinx.ext.linkcode", + "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx_rtd_theme", "recommonmark", ] +autodoc_typehints = 'description' -# -# This code is for sphinx.ext.linkcode to link to GitHub source directly. -# It doesn't link directly to specific lines though so is not as nice as -# I would like right now. You also can't customise the "[source]" text -# in the sphinx docs (if you could, we could have both viewcode and linkcode extensions at the same time) -# -# # get github version/tag -# if '+' in version: -# gh_source_version = version.split('+')[-1][1:] -# else: -# gh_source_version = version - -# # define function for resolving source link -# def linkcode_resolve(domain, info): -# if domain != 'py': -# return None -# if not info['module']: -# return None -# filename = info['module'].replace('.', '/') -# return "https://github.com/labscript-suite/{}/blob/{}/{}.py".format(project, gh_source_version, filename) +# Prefix each autosectionlabel with the name of the document it is in and a colon +autosectionlabel_prefix_document = True # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -90,11 +73,17 @@ 'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None), 'pandas': ('https://pandas.pydata.org/pandas-docs/stable/', None), 'qtutils': ('https://qtutils.readthedocs.io/en/stable/', None), - 'pyqtgraph': ('https://pyqtgraph.readthedocs.io/en/latest/', None), # change to stable once v0.11 is published + 'pyqtgraph': ( + 'https://pyqtgraph.readthedocs.io/en/latest/', + None, + ), # change to stable once v0.11 is published 'matplotlib': ('https://matplotlib.org/', None), 'h5py': ('http://docs.h5py.org/en/stable/', None), 'pydaqmx': ('https://pythonhosted.org/PyDAQmx/', None), - 'qt': ('', 'pyqt5-modified-objects.inv') # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py under MIT License + 'qt': ( + '', + 'pyqt5-modified-objects.inv', + ) # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py under MIT License # TODO # desktop-app # spinapi/pynivision/etc @@ -115,24 +104,47 @@ labscript_suite_programs.remove(project) # whether to use stable or latest version -labscript_suite_doc_version = 'stable' # 'stable' or 'latest' +labscript_suite_doc_version = 'stable' # 'stable' or 'latest' # add intersphinx references for each component for ls_prog in labscript_suite_programs: - intersphinx_mapping[ls_prog] = ('https://docs.labscript_suite.org/projects/{}/en/{}/'.format(ls_prog, labscript_suite_doc_version), None) + intersphinx_mapping[ls_prog] = ( + 'https://docs.labscript_suite.org/projects/{}/en/{}/'.format( + ls_prog, labscript_suite_doc_version + ), + None, + ) # add intersphinx reference for the metapackage -intersphinx_mapping['labscript-suite'] = ('https://docs.labscript_suite.org/en/{}/'.format(labscript_suite_doc_version), None) - +if project != "the labscript suite": + intersphinx_mapping['labscript-suite'] = ( + 'https://docs.labscript_suite.org/en/{}/'.format(labscript_suite_doc_version), + None, + ) + +# Make `some code` equivalent to :code:`some code` +default_role = 'code' + +# hide todo notes if on readthedocs and not building the latest +if os.environ.get('READTHEDOCS') and ( + os.environ.get('READTHEDOCS_VERSION') != 'latest' + or ( + os.environ.get('READTHEDOCS_PROJECT') == project + or os.environ.get('READTHEDOCS_PROJECT') == 'labscriptsuite' + ) +): + todo_include_todos = False +else: + todo_include_todos = True # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "sphinx_rtd_theme" -html_logo = "img/{}.svg".format(project) -html_favicon = "img/{}.ico".format(project) -html_title = "labscript suite | {project}".format(project=project if project != 'labscript-suite' else "experiment control and automation") +html_title = "labscript suite | {project}".format( + project=project if project != "labscript-suite" else "experiment control and automation" +) html_short_title = "labscript suite" # Add any paths that contain custom static files (such as style sheets) here, @@ -156,4 +168,5 @@ def setup(app): app.add_config_value('m2r_parse_relative_links', False, 'env') app.add_config_value('m2r_anonymous_references', False, 'env') app.add_config_value('m2r_disable_inline_math', False, 'env') - app.add_directive('mdinclude', MdInclude) \ No newline at end of file + app.add_directive('mdinclude', MdInclude) + app.add_stylesheet('custom.css') From bd0d527fe8d62f7d568d224f1fcb2d1794f6ff17 Mon Sep 17 00:00:00 2001 From: Russell Anderson <5637107+rpanderson@users.noreply.github.com> Date: Sun, 14 Jun 2020 11:34:15 +1000 Subject: [PATCH 9/9] html_theme_options, removed unused sys, black and flake --- docs/source/conf.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 773418d..a458123 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,7 +11,6 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. # import os -import sys from m2r import MdInclude from recommonmark.transform import AutoStructify @@ -22,7 +21,7 @@ author = "labscript suite contributors" # The full version, including alpha/beta/rc tags -from labscript_utils import __version__ as version +from labscript_utils import __version__ as version # noqa: E402 release = version @@ -80,10 +79,12 @@ 'matplotlib': ('https://matplotlib.org/', None), 'h5py': ('http://docs.h5py.org/en/stable/', None), 'pydaqmx': ('https://pythonhosted.org/PyDAQmx/', None), + # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py + # under MIT License 'qt': ( '', 'pyqt5-modified-objects.inv', - ) # from https://github.com/MSLNZ/msl-qt/blob/master/docs/create_pyqt_objects.py under MIT License + ) # TODO # desktop-app # spinapi/pynivision/etc @@ -143,7 +144,9 @@ # html_theme = "sphinx_rtd_theme" html_title = "labscript suite | {project}".format( - project=project if project != "labscript-suite" else "experiment control and automation" + project=project + if project != "labscript-suite" + else "experiment control and automation" ) html_short_title = "labscript suite" @@ -152,6 +155,10 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +# Customize the html_theme +html_theme_options = {'navigation_depth': 3} + + # Use m2r only for mdinclude and recommonmark for everything else # https://github.com/readthedocs/recommonmark/issues/191#issuecomment-622369992 def setup(app):